agents 0.15.0 → 0.16.0

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 (53) hide show
  1. package/dist/{agent-tool-types-VPsjVYL0.d.ts → agent-tool-types-NofdbL9X.d.ts} +57 -4
  2. package/dist/agent-tool-types.d.ts +1 -1
  3. package/dist/{agent-tools-BGpgfpJT.d.ts → agent-tools-DLquv-dp.d.ts} +2 -2
  4. package/dist/agent-tools.d.ts +1 -1
  5. package/dist/browser/ai.d.ts +126 -7
  6. package/dist/browser/ai.js +73 -29
  7. package/dist/browser/ai.js.map +1 -1
  8. package/dist/browser/index.d.ts +81 -69
  9. package/dist/browser/index.js +3 -2
  10. package/dist/browser/tanstack-ai.d.ts +13 -7
  11. package/dist/browser/tanstack-ai.js +18 -19
  12. package/dist/browser/tanstack-ai.js.map +1 -1
  13. package/dist/chat/index.d.ts +111 -5
  14. package/dist/chat/index.js +207 -35
  15. package/dist/chat/index.js.map +1 -1
  16. package/dist/chat-sdk/index.d.ts +1 -1
  17. package/dist/{classPrivateFieldGet2-Beqsfu2Z.js → classPrivateFieldGet2-CZ7QjTXN.js} +5 -5
  18. package/dist/{classPrivateMethodInitSpec-B5ko1s2R.js → classPrivateMethodInitSpec-D-0__zd9.js} +2 -2
  19. package/dist/client.d.ts +19 -2
  20. package/dist/client.js +31 -11
  21. package/dist/client.js.map +1 -1
  22. package/dist/{compaction-helpers-BEUILPss.d.ts → compaction-helpers-DVcu5lPN.d.ts} +91 -12
  23. package/dist/connector-D6yYzYHg.js +1080 -0
  24. package/dist/connector-D6yYzYHg.js.map +1 -0
  25. package/dist/connector-DXursxV5.d.ts +340 -0
  26. package/dist/experimental/memory/session/index.d.ts +75 -12
  27. package/dist/experimental/memory/session/index.js +226 -21
  28. package/dist/experimental/memory/session/index.js.map +1 -1
  29. package/dist/experimental/memory/utils/index.d.ts +2 -2
  30. package/dist/{index-CPe1OtI0.d.ts → index-B7IbEeze.d.ts} +32 -1
  31. package/dist/index.d.ts +8 -2
  32. package/dist/index.js +116 -45
  33. package/dist/index.js.map +1 -1
  34. package/dist/mcp/client.d.ts +1 -1
  35. package/dist/mcp/index.d.ts +1 -1
  36. package/dist/mcp/index.js +1 -1
  37. package/dist/mcp/index.js.map +1 -1
  38. package/dist/observability/index.d.ts +1 -1
  39. package/dist/react.d.ts +12 -1
  40. package/dist/react.js +101 -30
  41. package/dist/react.js.map +1 -1
  42. package/dist/{retries-CF_HKSlJ.d.ts → retries-CwlpAGet.d.ts} +35 -5
  43. package/dist/retries.d.ts +9 -5
  44. package/dist/retries.js +87 -1
  45. package/dist/retries.js.map +1 -1
  46. package/dist/serializable.d.ts +1 -1
  47. package/dist/skills/index.js +2 -2
  48. package/dist/sub-routing.d.ts +1 -1
  49. package/dist/workflows.d.ts +1 -1
  50. package/package.json +10 -10
  51. package/dist/shared-4CAYLCTO.d.ts +0 -34
  52. package/dist/shared-wyII629d.js +0 -432
  53. package/dist/shared-wyII629d.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import { n as AgentEmail } from "./internal_context-Dg4Cgjcu.js";
2
- import { t as RetryOptions } from "./retries-CF_HKSlJ.js";
2
+ import { t as RetryOptions } from "./retries-CwlpAGet.js";
3
3
  import {
4
4
  n as Observability,
5
5
  r as ObservabilityEvent,
6
6
  s as MCPObservabilityEvent
7
- } from "./index-CPe1OtI0.js";
7
+ } from "./index-B7IbEeze.js";
8
8
  import { t as AgentMcpOAuthProvider } from "./do-oauth-client-provider-D4ZwyBDu.js";
9
9
  import {
10
10
  _ as WorkflowPage,
@@ -2343,7 +2343,15 @@ interface AgentStaticOptions {
2343
2343
  /**
2344
2344
  * Maximum age in milliseconds of an unmanaged interrupted-fiber row before
2345
2345
  * recovery stops retrying a repeatedly-throwing `onFiberRecovered()` hook
2346
- * and discards the row. Set to `0` to retain rows indefinitely.
2346
+ * and discards the row (emitting `fiber:recovery:skipped` with reason
2347
+ * `max_age_exceeded`). Defaults to 24h.
2348
+ *
2349
+ * Set to `0` to retain rows indefinitely. NOTE: with `0`, a hook that keeps
2350
+ * throwing is retried forever — the recovery alarm backs off exponentially
2351
+ * (capped at 5 minutes) so it is not a busy-loop, but the Durable Object
2352
+ * stays warm (never idle-evicts) for as long as the un-recoverable row
2353
+ * exists. Prefer a finite age unless you intend to inspect/clear such rows
2354
+ * yourself.
2347
2355
  */
2348
2356
  fiberRecoveryMaxAgeMs?: number;
2349
2357
  /**
@@ -2467,6 +2475,13 @@ declare class Agent<
2467
2475
  private _managedFiberTerminalWaiters;
2468
2476
  /** @internal Prevents re-entrant recovery from overlapping alarm ticks. */
2469
2477
  private _runFiberRecoveryInProgress;
2478
+ /**
2479
+ * @internal Consecutive runFiber-recovery scans that made NO forward progress
2480
+ * while work was still pending. Drives the exponential backoff of the
2481
+ * recovery follow-up alarm so a repeatedly-throwing recovery hook does not
2482
+ * busy-loop the DO. Reset to 0 whenever a scan recovers anything.
2483
+ */
2484
+ private _recoveryNoProgressScans;
2470
2485
  /** @internal Single-flight background recovery for parent agent-tool rows. */
2471
2486
  private _agentToolRunRecoveryPromise;
2472
2487
  private _ParentClass;
@@ -3296,6 +3311,18 @@ declare class Agent<
3296
3311
  targetPath: ReadonlyArray<AgentPathStep>
3297
3312
  ): Promise<void>;
3298
3313
  private _executeScheduleCallback;
3314
+ /**
3315
+ * Whether any runFiber recovery work is still outstanding: orphaned
3316
+ * `cf_agents_runs` rows left by a dead process (excluding fibers currently
3317
+ * executing in memory, which already hold a keepAlive ref) or managed
3318
+ * ledger fibers stuck in a non-terminal state with no live run row.
3319
+ *
3320
+ * Used by `_scheduleNextAlarm` to arm a follow-up alarm so multi-pass
3321
+ * recovery (e.g. after a scan-deadline yield, or while retrying a throwing
3322
+ * recovery hook) resumes instead of starving.
3323
+ * @internal
3324
+ */
3325
+ private _hasPendingFiberRecovery;
3299
3326
  private _scheduleNextAlarm;
3300
3327
  /**
3301
3328
  * Override PartyServer's onAlarm hook as a no-op.
@@ -3861,6 +3888,32 @@ declare class Agent<
3861
3888
  * callers should treat it as fire-and-forget.
3862
3889
  */
3863
3890
  destroy(): Promise<void>;
3891
+ /**
3892
+ * @internal Defer this agent's destruction to its own alarm invocation
3893
+ * instead of running it inline (#1625).
3894
+ *
3895
+ * `destroy()` is a multi-step I/O sequence (drop tables, delete alarm,
3896
+ * delete all storage, dispose connections). Running it on the `waitUntil`
3897
+ * of a request whose client has already disconnected — the MCP
3898
+ * Streamable-HTTP session-DELETE path — gives it little to no
3899
+ * post-invocation grace, so the runtime routinely cancels it mid-flight.
3900
+ * This method instead performs two fast storage writes (a durable
3901
+ * "condemned" marker and an immediate alarm) that the caller can await
3902
+ * before responding; the alarm then fires as a fresh invocation with its
3903
+ * own full execution budget and runs `destroy()` there. If even that
3904
+ * invocation is interrupted, the marker survives and the next wake
3905
+ * finishes teardown — see the `alarm()` preamble.
3906
+ *
3907
+ * Unlike `destroy()`, this method does not abort the isolate, so RPC
3908
+ * callers don't need to swallow an abort error.
3909
+ */
3910
+ _cf_scheduleDestroy(): Promise<void>;
3911
+ /**
3912
+ * Whether a (deferred or interrupted) destroy is pending. Reads the
3913
+ * durable marker directly — the in-memory `_isFacet` flag may not be
3914
+ * hydrated yet at the call sites, but facets never write the marker.
3915
+ */
3916
+ private _hasPendingDestroy;
3864
3917
  /** @internal Drop every internal Agents SDK table during top-level destroy. */
3865
3918
  protected _dropInternalTablesForDestroy(): void;
3866
3919
  /**
@@ -4794,4 +4847,4 @@ export {
4794
4847
  MCPServer as z,
4795
4848
  WorkerTransport as zt
4796
4849
  };
4797
- //# sourceMappingURL=agent-tool-types-VPsjVYL0.d.ts.map
4850
+ //# sourceMappingURL=agent-tool-types-NofdbL9X.d.ts.map
@@ -16,7 +16,7 @@ import {
16
16
  s as AgentToolInterruptedReason,
17
17
  t as AgentToolChildAdapter,
18
18
  u as AgentToolRunInspection
19
- } from "./agent-tool-types-VPsjVYL0.js";
19
+ } from "./agent-tool-types-NofdbL9X.js";
20
20
  export {
21
21
  AgentToolChildAdapter,
22
22
  AgentToolDisplayMetadata,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  a as AgentToolEventState,
3
3
  i as AgentToolEventMessage
4
- } from "./agent-tool-types-VPsjVYL0.js";
4
+ } from "./agent-tool-types-NofdbL9X.js";
5
5
 
6
6
  //#region src/chat/agent-tools.d.ts
7
7
  declare function createAgentToolEventState(): AgentToolEventState;
@@ -11,4 +11,4 @@ declare function applyAgentToolEvent(
11
11
  ): AgentToolEventState;
12
12
  //#endregion
13
13
  export { createAgentToolEventState as n, applyAgentToolEvent as t };
14
- //# sourceMappingURL=agent-tools-BGpgfpJT.d.ts.map
14
+ //# sourceMappingURL=agent-tools-DLquv-dp.d.ts.map
@@ -16,7 +16,7 @@ import {
16
16
  s as AgentToolInterruptedReason,
17
17
  t as AgentToolChildAdapter,
18
18
  u as AgentToolRunInspection
19
- } from "./agent-tool-types-VPsjVYL0.js";
19
+ } from "./agent-tool-types-NofdbL9X.js";
20
20
  import { Tool } from "ai";
21
21
 
22
22
  //#region src/agent-tools.d.ts
@@ -1,21 +1,133 @@
1
- import { t as BrowserToolsOptions } from "../shared-4CAYLCTO.js";
1
+ import {
2
+ c as BrowserSessionStore,
3
+ f as BrowserBinding,
4
+ r as BrowserConnectorSessionOptions,
5
+ t as BrowserConnector
6
+ } from "../connector-DXursxV5.js";
2
7
  import { ToolSet } from "ai";
8
+ import { CodemodeRuntimeHandle } from "@cloudflare/codemode";
3
9
 
4
10
  //#region src/browser/ai.d.ts
11
+ interface CreateBrowserToolsOptions {
12
+ /**
13
+ * Durable Object state. The codemode runtime that backs the browser tool
14
+ * lives in a facet of this DO, and browser session ids are stored in its
15
+ * storage — so the tool must be created from inside a Durable Object
16
+ * (e.g. an Agent).
17
+ *
18
+ * The worker must export the `CodemodeRuntime` class (the
19
+ * `@cloudflare/codemode/vite` plugin does this automatically, or add
20
+ * `export { CodemodeRuntime } from "@cloudflare/codemode"` to your entry).
21
+ */
22
+ ctx: DurableObjectState;
23
+ /**
24
+ * WorkerLoader binding for sandboxed code execution.
25
+ *
26
+ * Requires `"worker_loaders": [{ "binding": "LOADER" }]` in wrangler.jsonc.
27
+ */
28
+ loader: WorkerLoader;
29
+ /**
30
+ * Browser Rendering binding (Fetcher).
31
+ *
32
+ * This is the primary way to connect — works both locally in
33
+ * `wrangler dev` and when deployed to Cloudflare Workers.
34
+ *
35
+ * Requires `"browser": { "binding": "BROWSER" }` in wrangler.jsonc.
36
+ */
37
+ browser?: BrowserBinding;
38
+ /**
39
+ * Optional CDP base URL override (e.g. `http://localhost:9222`).
40
+ *
41
+ * Use when connecting to a manually managed Chrome instance or
42
+ * a remote CDP endpoint behind a tunnel.
43
+ */
44
+ cdpUrl?: string;
45
+ /**
46
+ * Headers to send with CDP URL discovery requests.
47
+ * Useful when the CDP endpoint requires authentication
48
+ * (e.g. Cloudflare Access headers).
49
+ */
50
+ cdpHeaders?: Record<string, string>;
51
+ /**
52
+ * Browser session lifecycle (binding-backed only). Defaults to one fresh
53
+ * session per codemode execution (`one-shot`).
54
+ */
55
+ session?: BrowserConnectorSessionOptions;
56
+ /**
57
+ * Durable store for Browser Run session ids. Defaults to a
58
+ * {@link DurableBrowserSessionStore} over `ctx.storage`.
59
+ */
60
+ store?: BrowserSessionStore;
61
+ /**
62
+ * Sandbox execution timeout in milliseconds. Defaults to 30000 (30s).
63
+ * Also used as the per-CDP-command timeout.
64
+ */
65
+ timeout?: number;
66
+ /**
67
+ * Codemode runtime name — the durable identity of the tool's executions
68
+ * and snippets. Defaults to `"browser"`.
69
+ */
70
+ name?: string;
71
+ }
72
+ /**
73
+ * The browser tool's moving parts, for hosts that need more than the tools:
74
+ *
75
+ * - `runtime` — the codemode runtime handle (approve/reject paused runs,
76
+ * `expirePaused`, audit via `executions()`, snippets).
77
+ * - `connector` — host-side session helpers: `sessionInfo()`,
78
+ * `closeSession()`, and `sweep()` for a recurring cleanup task.
79
+ * - `tools` — what `createBrowserTools` returns.
80
+ */
81
+ interface BrowserRuntime {
82
+ runtime: CodemodeRuntimeHandle;
83
+ connector: BrowserConnector;
84
+ tools: ToolSet;
85
+ }
86
+ /**
87
+ * Create the browser codemode runtime: the `browser_execute` tool plus the
88
+ * runtime handle and connector for host-side wiring (approvals, session info,
89
+ * sweeps).
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * export class MyAgent extends Agent<Env> {
94
+ * get browser() {
95
+ * return createBrowserRuntime({
96
+ * ctx: this.ctx,
97
+ * browser: this.env.BROWSER,
98
+ * loader: this.env.LOADER,
99
+ * session: { mode: "dynamic" }
100
+ * });
101
+ * }
102
+ *
103
+ * @callable()
104
+ * async closeBrowserSession() {
105
+ * await this.browser.connector.closeSession();
106
+ * }
107
+ * }
108
+ * ```
109
+ */
110
+ declare function createBrowserRuntime(
111
+ options: CreateBrowserToolsOptions
112
+ ): BrowserRuntime;
5
113
  /**
6
114
  * Create AI SDK tools for browser automation via CDP code mode.
7
115
  *
8
- * Returns a `ToolSet` with `search` (query the CDP spec) and
9
- * `execute` (run CDP commands against a live browser).
116
+ * Returns a `ToolSet` with a single durable `browser_execute` tool backed by
117
+ * a codemode runtime: the model writes TypeScript against the `cdp` connector
118
+ * (`cdp.send`, `cdp.attachToTarget`, `cdp.spec`, …), executions are recorded
119
+ * for abort-and-replay, and browser sessions survive pauses.
10
120
  *
11
121
  * @example
12
122
  * ```ts
13
123
  * import { createBrowserTools } from "agents/browser/ai";
14
124
  * import { generateText } from "ai";
15
125
  *
126
+ * // inside a Durable Object / Agent:
16
127
  * const browserTools = createBrowserTools({
17
- * browser: env.BROWSER,
18
- * loader: env.LOADER,
128
+ * ctx: this.ctx,
129
+ * browser: this.env.BROWSER,
130
+ * loader: this.env.LOADER,
19
131
  * });
20
132
  *
21
133
  * const result = await generateText({
@@ -25,7 +137,14 @@ import { ToolSet } from "ai";
25
137
  * });
26
138
  * ```
27
139
  */
28
- declare function createBrowserTools(options: BrowserToolsOptions): ToolSet;
140
+ declare function createBrowserTools(
141
+ options: CreateBrowserToolsOptions
142
+ ): ToolSet;
29
143
  //#endregion
30
- export { type BrowserToolsOptions, createBrowserTools };
144
+ export {
145
+ BrowserRuntime,
146
+ CreateBrowserToolsOptions,
147
+ createBrowserRuntime,
148
+ createBrowserTools
149
+ };
31
150
  //# sourceMappingURL=ai.d.ts.map
@@ -1,21 +1,85 @@
1
- import { n as SEARCH_DESCRIPTION, r as createBrowserToolHandlers, t as EXECUTE_DESCRIPTION } from "../shared-wyII629d.js";
2
- import { tool } from "ai";
3
- import { z } from "zod";
1
+ import { i as DurableBrowserSessionStore, t as BrowserConnector } from "../connector-D6yYzYHg.js";
2
+ import { DynamicWorkerExecutor, createCodemodeRuntime, truncateResult } from "@cloudflare/codemode";
4
3
  //#region src/browser/ai.ts
4
+ let didWarnExperimental = false;
5
+ function connectorOptions(options) {
6
+ if (options.cdpUrl) return {
7
+ cdpUrl: options.cdpUrl,
8
+ cdpHeaders: options.cdpHeaders,
9
+ timeout: options.timeout
10
+ };
11
+ if (!options.browser) throw new Error("Either 'browser' (Fetcher binding) or 'cdpUrl' must be provided");
12
+ return {
13
+ browser: options.browser,
14
+ store: options.store ?? new DurableBrowserSessionStore(options.ctx.storage),
15
+ session: options.session,
16
+ timeout: options.timeout
17
+ };
18
+ }
19
+ /**
20
+ * Create the browser codemode runtime: the `browser_execute` tool plus the
21
+ * runtime handle and connector for host-side wiring (approvals, session info,
22
+ * sweeps).
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * export class MyAgent extends Agent<Env> {
27
+ * get browser() {
28
+ * return createBrowserRuntime({
29
+ * ctx: this.ctx,
30
+ * browser: this.env.BROWSER,
31
+ * loader: this.env.LOADER,
32
+ * session: { mode: "dynamic" }
33
+ * });
34
+ * }
35
+ *
36
+ * @callable()
37
+ * async closeBrowserSession() {
38
+ * await this.browser.connector.closeSession();
39
+ * }
40
+ * }
41
+ * ```
42
+ */
43
+ function createBrowserRuntime(options) {
44
+ if (!didWarnExperimental) {
45
+ didWarnExperimental = true;
46
+ console.warn("[agents/browser] Browser tools are experimental and may change in a future release.");
47
+ }
48
+ const connector = new BrowserConnector(options.ctx, connectorOptions(options));
49
+ const runtime = createCodemodeRuntime({
50
+ ctx: options.ctx,
51
+ executor: new DynamicWorkerExecutor({
52
+ loader: options.loader,
53
+ timeout: options.timeout
54
+ }),
55
+ connectors: [connector],
56
+ name: options.name ?? "browser",
57
+ transformResult: truncateResult
58
+ });
59
+ return {
60
+ runtime,
61
+ connector,
62
+ tools: { browser_execute: runtime.tool() }
63
+ };
64
+ }
5
65
  /**
6
66
  * Create AI SDK tools for browser automation via CDP code mode.
7
67
  *
8
- * Returns a `ToolSet` with `search` (query the CDP spec) and
9
- * `execute` (run CDP commands against a live browser).
68
+ * Returns a `ToolSet` with a single durable `browser_execute` tool backed by
69
+ * a codemode runtime: the model writes TypeScript against the `cdp` connector
70
+ * (`cdp.send`, `cdp.attachToTarget`, `cdp.spec`, …), executions are recorded
71
+ * for abort-and-replay, and browser sessions survive pauses.
10
72
  *
11
73
  * @example
12
74
  * ```ts
13
75
  * import { createBrowserTools } from "agents/browser/ai";
14
76
  * import { generateText } from "ai";
15
77
  *
78
+ * // inside a Durable Object / Agent:
16
79
  * const browserTools = createBrowserTools({
17
- * browser: env.BROWSER,
18
- * loader: env.LOADER,
80
+ * ctx: this.ctx,
81
+ * browser: this.env.BROWSER,
82
+ * loader: this.env.LOADER,
19
83
  * });
20
84
  *
21
85
  * const result = await generateText({
@@ -26,29 +90,9 @@ import { z } from "zod";
26
90
  * ```
27
91
  */
28
92
  function createBrowserTools(options) {
29
- const handlers = createBrowserToolHandlers(options);
30
- return {
31
- browser_search: tool({
32
- description: SEARCH_DESCRIPTION,
33
- inputSchema: z.object({ code: z.string().describe("JavaScript async arrow function that queries the CDP spec") }),
34
- execute: async ({ code }) => {
35
- const result = await handlers.search(code);
36
- if (result.isError) throw new Error(result.text);
37
- return result.text;
38
- }
39
- }),
40
- browser_execute: tool({
41
- description: EXECUTE_DESCRIPTION,
42
- inputSchema: z.object({ code: z.string().describe("JavaScript async arrow function that uses the cdp helper") }),
43
- execute: async ({ code }) => {
44
- const result = await handlers.execute(code);
45
- if (result.isError) throw new Error(result.text);
46
- return result.text;
47
- }
48
- })
49
- };
93
+ return createBrowserRuntime(options).tools;
50
94
  }
51
95
  //#endregion
52
- export { createBrowserTools };
96
+ export { createBrowserRuntime, createBrowserTools };
53
97
 
54
98
  //# sourceMappingURL=ai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","names":[],"sources":["../../src/browser/ai.ts"],"sourcesContent":["import { tool } from \"ai\";\nimport type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport {\n createBrowserToolHandlers,\n SEARCH_DESCRIPTION,\n EXECUTE_DESCRIPTION,\n type BrowserToolsOptions\n} from \"./shared\";\n\nexport type { BrowserToolsOptions } from \"./shared\";\n\n/**\n * Create AI SDK tools for browser automation via CDP code mode.\n *\n * Returns a `ToolSet` with `search` (query the CDP spec) and\n * `execute` (run CDP commands against a live browser).\n *\n * @example\n * ```ts\n * import { createBrowserTools } from \"agents/browser/ai\";\n * import { generateText } from \"ai\";\n *\n * const browserTools = createBrowserTools({\n * browser: env.BROWSER,\n * loader: env.LOADER,\n * });\n *\n * const result = await generateText({\n * model,\n * tools: { ...browserTools, ...otherTools },\n * messages,\n * });\n * ```\n */\nexport function createBrowserTools(options: BrowserToolsOptions): ToolSet {\n const handlers = createBrowserToolHandlers(options);\n\n return {\n browser_search: tool({\n description: SEARCH_DESCRIPTION,\n inputSchema: z.object({\n code: z\n .string()\n .describe(\"JavaScript async arrow function that queries the CDP spec\")\n }),\n execute: async ({ code }) => {\n const result = await handlers.search(code);\n if (result.isError) {\n throw new Error(result.text);\n }\n return result.text;\n }\n }),\n\n browser_execute: tool({\n description: EXECUTE_DESCRIPTION,\n inputSchema: z.object({\n code: z\n .string()\n .describe(\"JavaScript async arrow function that uses the cdp helper\")\n }),\n execute: async ({ code }) => {\n const result = await handlers.execute(code);\n if (result.isError) {\n throw new Error(result.text);\n }\n return result.text;\n }\n })\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,mBAAmB,SAAuC;CACxE,MAAM,WAAW,0BAA0B,OAAO;CAElD,OAAO;EACL,gBAAgB,KAAK;GACnB,aAAa;GACb,aAAa,EAAE,OAAO,EACpB,MAAM,EACH,OAAO,CAAC,CACR,SAAS,2DAA2D,EACzE,CAAC;GACD,SAAS,OAAO,EAAE,WAAW;IAC3B,MAAM,SAAS,MAAM,SAAS,OAAO,IAAI;IACzC,IAAI,OAAO,SACT,MAAM,IAAI,MAAM,OAAO,IAAI;IAE7B,OAAO,OAAO;GAChB;EACF,CAAC;EAED,iBAAiB,KAAK;GACpB,aAAa;GACb,aAAa,EAAE,OAAO,EACpB,MAAM,EACH,OAAO,CAAC,CACR,SAAS,0DAA0D,EACxE,CAAC;GACD,SAAS,OAAO,EAAE,WAAW;IAC3B,MAAM,SAAS,MAAM,SAAS,QAAQ,IAAI;IAC1C,IAAI,OAAO,SACT,MAAM,IAAI,MAAM,OAAO,IAAI;IAE7B,OAAO,OAAO;GAChB;EACF,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"ai.js","names":[],"sources":["../../src/browser/ai.ts"],"sourcesContent":["import type { ToolSet } from \"ai\";\nimport {\n createCodemodeRuntime,\n DynamicWorkerExecutor,\n truncateResult,\n type CodemodeRuntimeHandle\n} from \"@cloudflare/codemode\";\nimport type { BrowserBinding } from \"./browser-run\";\nimport {\n BrowserConnector,\n type BrowserConnectorOptions,\n type BrowserConnectorSessionOptions\n} from \"./connector\";\nimport {\n DurableBrowserSessionStore,\n type BrowserSessionStore\n} from \"./session-manager\";\n\nexport interface CreateBrowserToolsOptions {\n /**\n * Durable Object state. The codemode runtime that backs the browser tool\n * lives in a facet of this DO, and browser session ids are stored in its\n * storage so the tool must be created from inside a Durable Object\n * (e.g. an Agent).\n *\n * The worker must export the `CodemodeRuntime` class (the\n * `@cloudflare/codemode/vite` plugin does this automatically, or add\n * `export { CodemodeRuntime } from \"@cloudflare/codemode\"` to your entry).\n */\n ctx: DurableObjectState;\n\n /**\n * WorkerLoader binding for sandboxed code execution.\n *\n * Requires `\"worker_loaders\": [{ \"binding\": \"LOADER\" }]` in wrangler.jsonc.\n */\n loader: WorkerLoader;\n\n /**\n * Browser Rendering binding (Fetcher).\n *\n * This is the primary way to connect — works both locally in\n * `wrangler dev` and when deployed to Cloudflare Workers.\n *\n * Requires `\"browser\": { \"binding\": \"BROWSER\" }` in wrangler.jsonc.\n */\n browser?: BrowserBinding;\n\n /**\n * Optional CDP base URL override (e.g. `http://localhost:9222`).\n *\n * Use when connecting to a manually managed Chrome instance or\n * a remote CDP endpoint behind a tunnel.\n */\n cdpUrl?: string;\n\n /**\n * Headers to send with CDP URL discovery requests.\n * Useful when the CDP endpoint requires authentication\n * (e.g. Cloudflare Access headers).\n */\n cdpHeaders?: Record<string, string>;\n\n /**\n * Browser session lifecycle (binding-backed only). Defaults to one fresh\n * session per codemode execution (`one-shot`).\n */\n session?: BrowserConnectorSessionOptions;\n\n /**\n * Durable store for Browser Run session ids. Defaults to a\n * {@link DurableBrowserSessionStore} over `ctx.storage`.\n */\n store?: BrowserSessionStore;\n\n /**\n * Sandbox execution timeout in milliseconds. Defaults to 30000 (30s).\n * Also used as the per-CDP-command timeout.\n */\n timeout?: number;\n\n /**\n * Codemode runtime name — the durable identity of the tool's executions\n * and snippets. Defaults to `\"browser\"`.\n */\n name?: string;\n}\n\n/**\n * The browser tool's moving parts, for hosts that need more than the tools:\n *\n * - `runtime` — the codemode runtime handle (approve/reject paused runs,\n * `expirePaused`, audit via `executions()`, snippets).\n * - `connector` — host-side session helpers: `sessionInfo()`,\n * `closeSession()`, and `sweep()` for a recurring cleanup task.\n * - `tools` — what `createBrowserTools` returns.\n */\nexport interface BrowserRuntime {\n runtime: CodemodeRuntimeHandle;\n connector: BrowserConnector;\n tools: ToolSet;\n}\n\nlet didWarnExperimental = false;\n\nfunction connectorOptions(\n options: CreateBrowserToolsOptions\n): BrowserConnectorOptions {\n if (options.cdpUrl) {\n return {\n cdpUrl: options.cdpUrl,\n cdpHeaders: options.cdpHeaders,\n timeout: options.timeout\n };\n }\n if (!options.browser) {\n throw new Error(\n \"Either 'browser' (Fetcher binding) or 'cdpUrl' must be provided\"\n );\n }\n return {\n browser: options.browser,\n store: options.store ?? new DurableBrowserSessionStore(options.ctx.storage),\n session: options.session,\n timeout: options.timeout\n };\n}\n\n/**\n * Create the browser codemode runtime: the `browser_execute` tool plus the\n * runtime handle and connector for host-side wiring (approvals, session info,\n * sweeps).\n *\n * @example\n * ```ts\n * export class MyAgent extends Agent<Env> {\n * get browser() {\n * return createBrowserRuntime({\n * ctx: this.ctx,\n * browser: this.env.BROWSER,\n * loader: this.env.LOADER,\n * session: { mode: \"dynamic\" }\n * });\n * }\n *\n * @callable()\n * async closeBrowserSession() {\n * await this.browser.connector.closeSession();\n * }\n * }\n * ```\n */\nexport function createBrowserRuntime(\n options: CreateBrowserToolsOptions\n): BrowserRuntime {\n if (!didWarnExperimental) {\n didWarnExperimental = true;\n console.warn(\n \"[agents/browser] Browser tools are experimental and may change in a future release.\"\n );\n }\n\n const connector = new BrowserConnector(\n options.ctx,\n connectorOptions(options)\n );\n const runtime = createCodemodeRuntime({\n ctx: options.ctx,\n executor: new DynamicWorkerExecutor({\n loader: options.loader,\n timeout: options.timeout\n }),\n connectors: [connector],\n name: options.name ?? \"browser\",\n transformResult: truncateResult\n });\n\n return {\n runtime,\n connector,\n tools: { browser_execute: runtime.tool() }\n };\n}\n\n/**\n * Create AI SDK tools for browser automation via CDP code mode.\n *\n * Returns a `ToolSet` with a single durable `browser_execute` tool backed by\n * a codemode runtime: the model writes TypeScript against the `cdp` connector\n * (`cdp.send`, `cdp.attachToTarget`, `cdp.spec`, …), executions are recorded\n * for abort-and-replay, and browser sessions survive pauses.\n *\n * @example\n * ```ts\n * import { createBrowserTools } from \"agents/browser/ai\";\n * import { generateText } from \"ai\";\n *\n * // inside a Durable Object / Agent:\n * const browserTools = createBrowserTools({\n * ctx: this.ctx,\n * browser: this.env.BROWSER,\n * loader: this.env.LOADER,\n * });\n *\n * const result = await generateText({\n * model,\n * tools: { ...browserTools, ...otherTools },\n * messages,\n * });\n * ```\n */\nexport function createBrowserTools(\n options: CreateBrowserToolsOptions\n): ToolSet {\n return createBrowserRuntime(options).tools;\n}\n"],"mappings":";;;AAuGA,IAAI,sBAAsB;AAE1B,SAAS,iBACP,SACyB;CACzB,IAAI,QAAQ,QACV,OAAO;EACL,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACpB,SAAS,QAAQ;CACnB;CAEF,IAAI,CAAC,QAAQ,SACX,MAAM,IAAI,MACR,iEACF;CAEF,OAAO;EACL,SAAS,QAAQ;EACjB,OAAO,QAAQ,SAAS,IAAI,2BAA2B,QAAQ,IAAI,OAAO;EAC1E,SAAS,QAAQ;EACjB,SAAS,QAAQ;CACnB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,qBACd,SACgB;CAChB,IAAI,CAAC,qBAAqB;EACxB,sBAAsB;EACtB,QAAQ,KACN,qFACF;CACF;CAEA,MAAM,YAAY,IAAI,iBACpB,QAAQ,KACR,iBAAiB,OAAO,CAC1B;CACA,MAAM,UAAU,sBAAsB;EACpC,KAAK,QAAQ;EACb,UAAU,IAAI,sBAAsB;GAClC,QAAQ,QAAQ;GAChB,SAAS,QAAQ;EACnB,CAAC;EACD,YAAY,CAAC,SAAS;EACtB,MAAM,QAAQ,QAAQ;EACtB,iBAAiB;CACnB,CAAC;CAED,OAAO;EACL;EACA;EACA,OAAO,EAAE,iBAAiB,QAAQ,KAAK,EAAE;CAC3C;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,mBACd,SACS;CACT,OAAO,qBAAqB,OAAO,CAAC,CAAC;AACvC"}
@@ -1,82 +1,94 @@
1
1
  import {
2
- a as createBrowserToolHandlers,
3
- i as ToolResult,
4
- n as EXECUTE_DESCRIPTION,
5
- r as SEARCH_DESCRIPTION,
6
- t as BrowserToolsOptions
7
- } from "../shared-4CAYLCTO.js";
2
+ C as CdpSendOptions,
3
+ S as CdpAttachOptions,
4
+ T as connectUrl,
5
+ _ as connectBrowser,
6
+ a as BrowserConnectorSweepResult,
7
+ b as deleteBrowserSession,
8
+ c as BrowserSessionStore,
9
+ d as StoredBrowserSession,
10
+ f as BrowserBinding,
11
+ g as ConnectBrowserOptions,
12
+ h as BrowserTargetInfo,
13
+ i as BrowserConnectorSweepOptions,
14
+ l as DEFAULT_SWEEP_IDLE_MS,
15
+ m as BrowserSessionInfo,
16
+ n as BrowserConnectorOptions,
17
+ o as DEFAULT_EXEC_SWEEP_IDLE_MS,
18
+ p as BrowserRenderingError,
19
+ r as BrowserConnectorSessionOptions,
20
+ s as BrowserSessionLock,
21
+ t as BrowserConnector,
22
+ u as DurableBrowserSessionStore,
23
+ v as connectBrowserSession,
24
+ w as CdpSession,
25
+ x as listBrowserTargets,
26
+ y as createBrowserSession
27
+ } from "../connector-DXursxV5.js";
28
+ import { CodemodeRuntime } from "@cloudflare/codemode";
8
29
 
9
- //#region src/browser/cdp-session.d.ts
10
- interface DebugEntry {
11
- at: string;
12
- type: string;
13
- [key: string]: unknown;
30
+ //#region src/browser/spec.d.ts
31
+ interface SearchableCdpSpec {
32
+ domains: Array<{
33
+ name: string;
34
+ description?: string;
35
+ commands: Array<{
36
+ name: string;
37
+ method: string;
38
+ description?: string;
39
+ }>;
40
+ events: Array<{
41
+ name: string;
42
+ event: string;
43
+ description?: string;
44
+ }>;
45
+ types: Array<{
46
+ id: string;
47
+ name: string;
48
+ description?: string;
49
+ }>;
50
+ }>;
14
51
  }
15
- interface CdpSendOptions {
16
- timeoutMs?: number;
17
- sessionId?: string;
52
+ interface CdpSpecSource {
53
+ /** Browser Rendering binding (Fetcher) — used in production */
54
+ browser?: BrowserBinding;
55
+ /** CDP base URL override (e.g. http://localhost:9222) */
56
+ cdpUrl?: string;
57
+ /** Headers to send with CDP URL discovery requests */
58
+ cdpHeaders?: Record<string, string>;
18
59
  }
19
- interface CdpAttachOptions {
20
- timeoutMs?: number;
21
- }
22
- /**
23
- * A CDP session over an open WebSocket. Manages command correlation,
24
- * timeouts, target sessions, and a debug event ring buffer.
25
- *
26
- * Used host-side (not in the sandbox) — the sandbox calls into this
27
- * via DynamicWorkerExecutor's ToolDispatcher RPC.
28
- */
29
- declare class CdpSession {
30
- #private;
31
- constructor(
32
- socket: WebSocket,
33
- defaultTimeoutMs?: number,
34
- dispose?: () => void
35
- );
36
- send(
37
- method: string,
38
- params?: unknown,
39
- options?: CdpSendOptions
40
- ): Promise<unknown>;
41
- attachToTarget(targetId: string, options?: CdpAttachOptions): Promise<string>;
42
- getDebugLog(limit?: number): DebugEntry[];
43
- clearDebugLog(): void;
44
- close(): void;
45
- }
46
- /**
47
- * Connect to a browser via the Browser Rendering binding (Fetcher).
48
- * Establishes a CDP WebSocket through the binding's fetch interface.
49
- */
50
- declare function connectBrowser(
51
- browser: Fetcher,
52
- timeoutMs?: number
53
- ): Promise<CdpSession>;
54
- /**
55
- * Connect to a browser via a CDP base URL (e.g. http://localhost:9222).
56
- * Discovers the WebSocket debugger URL via /json/version,
57
- * rewrites localhost URLs to the base URL host, and opens the WebSocket.
58
- *
59
- * Useful for local development with `chrome --remote-debugging-port=9222`
60
- * or when connecting through a tunnel.
61
- */
62
- declare function connectUrl(
63
- baseUrl: string,
64
- options?: {
65
- timeoutMs?: number;
66
- headers?: Record<string, string>;
67
- }
68
- ): Promise<CdpSession>;
60
+ /** Load the (cached) searchable CDP spec for a browser source. */
61
+ declare function loadCdpSpec(source: CdpSpecSource): Promise<SearchableCdpSpec>;
69
62
  //#endregion
70
63
  export {
71
- type BrowserToolsOptions,
64
+ type BrowserBinding,
65
+ BrowserConnector,
66
+ type BrowserConnectorOptions,
67
+ type BrowserConnectorSessionOptions,
68
+ type BrowserConnectorSweepOptions,
69
+ type BrowserConnectorSweepResult,
70
+ BrowserRenderingError,
71
+ type BrowserSessionInfo,
72
+ type BrowserSessionLock,
73
+ type BrowserSessionStore,
74
+ type BrowserTargetInfo,
72
75
  type CdpAttachOptions,
73
76
  type CdpSendOptions,
74
77
  CdpSession,
75
- EXECUTE_DESCRIPTION,
76
- SEARCH_DESCRIPTION,
77
- type ToolResult,
78
+ type CdpSpecSource,
79
+ CodemodeRuntime,
80
+ type ConnectBrowserOptions,
81
+ DEFAULT_EXEC_SWEEP_IDLE_MS,
82
+ DEFAULT_SWEEP_IDLE_MS,
83
+ DurableBrowserSessionStore,
84
+ type SearchableCdpSpec,
85
+ type StoredBrowserSession,
78
86
  connectBrowser,
87
+ connectBrowserSession,
79
88
  connectUrl,
80
- createBrowserToolHandlers
89
+ createBrowserSession,
90
+ deleteBrowserSession,
91
+ listBrowserTargets,
92
+ loadCdpSpec
81
93
  };
82
94
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,3 @@
1
- import { a as connectBrowser, i as CdpSession, n as SEARCH_DESCRIPTION, o as connectUrl, r as createBrowserToolHandlers, t as EXECUTE_DESCRIPTION } from "../shared-wyII629d.js";
2
- export { CdpSession, EXECUTE_DESCRIPTION, SEARCH_DESCRIPTION, connectBrowser, connectUrl, createBrowserToolHandlers };
1
+ import { a as loadCdpSpec, c as connectBrowserSession, d as listBrowserTargets, f as CdpSession, i as DurableBrowserSessionStore, l as createBrowserSession, n as DEFAULT_EXEC_SWEEP_IDLE_MS, o as BrowserRenderingError, p as connectUrl, r as DEFAULT_SWEEP_IDLE_MS, s as connectBrowser, t as BrowserConnector, u as deleteBrowserSession } from "../connector-D6yYzYHg.js";
2
+ import { CodemodeRuntime } from "@cloudflare/codemode";
3
+ export { BrowserConnector, BrowserRenderingError, CdpSession, CodemodeRuntime, DEFAULT_EXEC_SWEEP_IDLE_MS, DEFAULT_SWEEP_IDLE_MS, DurableBrowserSessionStore, connectBrowser, connectBrowserSession, connectUrl, createBrowserSession, deleteBrowserSession, listBrowserTargets, loadCdpSpec };
@@ -1,21 +1,25 @@
1
- import { t as BrowserToolsOptions } from "../shared-4CAYLCTO.js";
1
+ import { CreateBrowserToolsOptions } from "./ai.js";
2
2
  import { ServerTool } from "@tanstack/ai";
3
3
 
4
4
  //#region src/browser/tanstack-ai.d.ts
5
5
  /**
6
6
  * Create TanStack AI tools for browser automation via CDP code mode.
7
7
  *
8
- * Returns an array of `ServerTool`s: `browser_search` (query the CDP spec)
9
- * and `browser_execute` (run CDP commands against a live browser).
8
+ * Returns an array with a single durable `browser_execute` `ServerTool`
9
+ * backed by the same codemode runtime as `agents/browser/ai` — the model
10
+ * writes TypeScript against the `cdp` connector and browser sessions
11
+ * survive pauses.
10
12
  *
11
13
  * @example
12
14
  * ```ts
13
15
  * import { createBrowserTools } from "agents/browser/tanstack-ai";
14
16
  * import { chat } from "@tanstack/ai";
15
17
  *
18
+ * // inside a Durable Object / Agent:
16
19
  * const browserTools = createBrowserTools({
17
- * browser: env.BROWSER,
18
- * loader: env.LOADER,
20
+ * ctx: this.ctx,
21
+ * browser: this.env.BROWSER,
22
+ * loader: this.env.LOADER,
19
23
  * });
20
24
  *
21
25
  * const stream = chat({
@@ -25,7 +29,9 @@ import { ServerTool } from "@tanstack/ai";
25
29
  * });
26
30
  * ```
27
31
  */
28
- declare function createBrowserTools(options: BrowserToolsOptions): ServerTool[];
32
+ declare function createBrowserTools(
33
+ options: CreateBrowserToolsOptions
34
+ ): ServerTool[];
29
35
  //#endregion
30
- export { type BrowserToolsOptions, createBrowserTools };
36
+ export { type CreateBrowserToolsOptions, createBrowserTools };
31
37
  //# sourceMappingURL=tanstack-ai.d.ts.map