agents 0.24.0 → 0.26.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 (170) hide show
  1. package/dist/{agent-routing-B2XLNMxq.d.ts → agent-routing-0DR0Tk2v.d.ts} +205 -132
  2. package/dist/agent-routing.d.ts +1 -1
  3. package/dist/agent-routing.js.map +1 -1
  4. package/dist/agent-tool-types.d.ts +28 -22
  5. package/dist/agent-tool-types.js +23 -1
  6. package/dist/agent-tool-types.js.map +1 -1
  7. package/dist/{agent-tools-y7zLfw4Q.js → agent-tools-CdJC-8Dc.js} +72 -9
  8. package/dist/agent-tools-CdJC-8Dc.js.map +1 -0
  9. package/dist/{agent-tools-Dj5Mzlw7.d.ts → agent-tools-YrATZJu2.d.ts} +34 -20
  10. package/dist/agent-tools.d.ts +20 -18
  11. package/dist/agent-tools.js.map +1 -1
  12. package/dist/ai-fm7xx1BK.js +312 -0
  13. package/dist/ai-fm7xx1BK.js.map +1 -0
  14. package/dist/base64-redaction-C1Uu29t5.js +59 -0
  15. package/dist/base64-redaction-C1Uu29t5.js.map +1 -0
  16. package/dist/browser/ai-sdk.d.ts +90 -0
  17. package/dist/browser/ai-sdk.js +51 -0
  18. package/dist/browser/ai-sdk.js.map +1 -0
  19. package/dist/browser/ai.d.ts +4 -4
  20. package/dist/browser/ai.js +1 -347
  21. package/dist/browser/index.d.ts +81 -79
  22. package/dist/browser/index.js +361 -2
  23. package/dist/browser/index.js.map +1 -0
  24. package/dist/browser/tanstack-ai.d.ts +96 -1
  25. package/dist/browser/tanstack-ai.js +62 -2
  26. package/dist/browser/tanstack-ai.js.map +1 -1
  27. package/dist/browser-DE3d-RLk.d.ts +275 -0
  28. package/dist/browser-tool-CQ10e6Kj.js +480 -0
  29. package/dist/browser-tool-CQ10e6Kj.js.map +1 -0
  30. package/dist/browser-tool-DuNdlwZ9.d.ts +73 -0
  31. package/dist/capability-B4WbF81e.js.map +1 -1
  32. package/dist/{capability-runner-BUBa6Ake.d.ts → capability-runner-DBAnGr6L.d.ts} +7 -2
  33. package/dist/chat/index.d.ts +340 -234
  34. package/dist/chat/index.js +592 -66
  35. package/dist/chat/index.js.map +1 -1
  36. package/dist/chat/react.d.ts +42 -2
  37. package/dist/chat/react.js +191 -35
  38. package/dist/chat/react.js.map +1 -1
  39. package/dist/chat/transport.d.ts +1 -1
  40. package/dist/chat/transport.js +1 -1
  41. package/dist/chat-sdk/index.d.ts +17 -3
  42. package/dist/chat-sdk/index.js +28 -2
  43. package/dist/chat-sdk/index.js.map +1 -1
  44. package/dist/{client-C9DAjZIY.js → client-4OlMIJx-.js} +102 -29
  45. package/dist/client-4OlMIJx-.js.map +1 -0
  46. package/dist/{client-BxdkCuVy.d.ts → client-je3koD9Z.d.ts} +45 -10
  47. package/dist/client.d.ts +7 -5
  48. package/dist/client.js +2 -2
  49. package/dist/{connector-CptFKzRh.js → connector-58XDGvc3.js} +251 -120
  50. package/dist/connector-58XDGvc3.js.map +1 -0
  51. package/dist/{connector-CkQD4MK3.d.ts → connector-Cl-VqPmA.d.ts} +244 -146
  52. package/dist/context/index.d.ts +29 -0
  53. package/dist/context/index.js +64 -17
  54. package/dist/context/index.js.map +1 -1
  55. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  56. package/dist/{current-agent-C4w86kcN.d.ts → current-agent-vAk_5JMt.d.ts} +4 -4
  57. package/dist/{durable-object-lifecycle-ei7M7lqB.d.ts → durable-object-lifecycle-HhgOMWq9.d.ts} +15 -7
  58. package/dist/harness/pi/index.d.ts +344 -0
  59. package/dist/harness/pi/index.js +873 -0
  60. package/dist/harness/pi/index.js.map +1 -0
  61. package/dist/images-iiTDSyRu.js +1631 -0
  62. package/dist/images-iiTDSyRu.js.map +1 -0
  63. package/dist/{index-Dlgtd3Mj.d.ts → index-BreL0YrQ.d.ts} +2 -2
  64. package/dist/index-kbSUIer3.d.ts +343 -0
  65. package/dist/index.d.ts +46 -44
  66. package/dist/index.js +1 -1
  67. package/dist/internal_context.d.ts +1 -1
  68. package/dist/lifecycle/index.d.ts +3 -3
  69. package/dist/lifecycle/index.js +1 -1
  70. package/dist/{lifecycle-Mm_jQh7r.js → lifecycle-CFu6OV03.js} +39 -10
  71. package/dist/{lifecycle-Mm_jQh7r.js.map → lifecycle-CFu6OV03.js.map} +1 -1
  72. package/dist/mcp/client/index.d.ts +20 -20
  73. package/dist/mcp/client/x402.js +21 -19
  74. package/dist/mcp/client/x402.js.map +1 -1
  75. package/dist/mcp/index.d.ts +35 -35
  76. package/dist/mcp/index.js +1 -1
  77. package/dist/{message-builder-BymO4N_D.js → message-builder-DAl9AhHH.js} +89 -4
  78. package/dist/message-builder-DAl9AhHH.js.map +1 -0
  79. package/dist/models/ai-sdk/index.d.ts +353 -0
  80. package/dist/models/ai-sdk/index.js +2443 -0
  81. package/dist/models/ai-sdk/index.js.map +1 -0
  82. package/dist/models/pi-ai/index.d.ts +313 -0
  83. package/dist/models/pi-ai/index.js +1795 -0
  84. package/dist/models/pi-ai/index.js.map +1 -0
  85. package/dist/observability/ai/index.js +20 -4
  86. package/dist/observability/ai/index.js.map +1 -1
  87. package/dist/{protocol-B0nh6KNf.js → protocol-kHsr-f0X.js} +26 -12
  88. package/dist/{protocol-B0nh6KNf.js.map → protocol-kHsr-f0X.js.map} +1 -1
  89. package/dist/queue/index.d.ts +3 -3
  90. package/dist/queue/index.js +1 -1
  91. package/dist/{queue-BC9F5cUo.js → queue-BB-zfIYF.js} +2 -2
  92. package/dist/{queue-BC9F5cUo.js.map → queue-BB-zfIYF.js.map} +1 -1
  93. package/dist/react.d.ts +6 -6
  94. package/dist/react.js +160 -64
  95. package/dist/react.js.map +1 -1
  96. package/dist/{retries-D9B2UCq3.d.ts → retries-CV6AkXmQ.d.ts} +18 -9
  97. package/dist/retries.d.ts +11 -9
  98. package/dist/retries.js +11 -1
  99. package/dist/retries.js.map +1 -1
  100. package/dist/routing/index.d.ts +2 -2
  101. package/dist/routing/index.js +1 -1
  102. package/dist/{scheduler-D_KHqxBa.js → scheduler-DZ3xQfeK.js} +2 -2
  103. package/dist/{scheduler-D_KHqxBa.js.map → scheduler-DZ3xQfeK.js.map} +1 -1
  104. package/dist/{scheduler-BGq6M5Kd.d.ts → scheduler-RdACNXDP.d.ts} +3 -3
  105. package/dist/schedules/index.d.ts +1 -1
  106. package/dist/schedules/index.js +1 -1
  107. package/dist/serializable.d.ts +1 -1
  108. package/dist/sessions/index.d.ts +70 -3
  109. package/dist/sessions/index.js +276 -67
  110. package/dist/sessions/index.js.map +1 -1
  111. package/dist/skills/index.d.ts +29 -314
  112. package/dist/socket-address.d.ts +16 -0
  113. package/dist/socket-address.js +19 -0
  114. package/dist/socket-address.js.map +1 -0
  115. package/dist/{src-BNU3ZiJM.js → src-BZeu-SCD.js} +423 -115
  116. package/dist/src-BZeu-SCD.js.map +1 -0
  117. package/dist/state/index.d.ts +1 -1
  118. package/dist/state/index.js +1 -1
  119. package/dist/streams/index.d.ts +1 -1
  120. package/dist/streams/index.js +1 -1
  121. package/dist/{streams-BcE8JP2X.d.ts → streams-Cmkj9QfW.d.ts} +4 -2
  122. package/dist/{streams-CCPRV6dt.js → streams-DW-UCOUc.js} +9 -2
  123. package/dist/streams-DW-UCOUc.js.map +1 -0
  124. package/dist/sub-routing.d.ts +12 -12
  125. package/dist/tasks/index.d.ts +1 -1
  126. package/dist/tasks/index.js +1 -1
  127. package/dist/{tasks-D4nLqVSI.js → tasks-68DESxf0.js} +2 -2
  128. package/dist/{tasks-D4nLqVSI.js.map → tasks-68DESxf0.js.map} +1 -1
  129. package/dist/{tasks-V2lCT8ZV.d.ts → tasks-9YxYtByh.d.ts} +2 -2
  130. package/dist/transport-PfFnt-Ld.d.ts +525 -0
  131. package/dist/{types-DCD6BNZH.d.ts → types-BA4anrjI.d.ts} +2 -2
  132. package/dist/voice/index.d.ts +2 -2
  133. package/dist/websockets/index.d.ts +23 -6
  134. package/dist/websockets/index.js +1 -1
  135. package/dist/{websockets-D7IzWbZb.js → websockets-Ci-LZFHH.js} +45 -20
  136. package/dist/{websockets-D7IzWbZb.js.map → websockets-Ci-LZFHH.js.map} +1 -1
  137. package/dist/wire-types-CnMt6_HR.js.map +1 -1
  138. package/dist/wire-types-CrjKvDyi.d.ts +300 -0
  139. package/dist/workflow-types.d.ts +25 -25
  140. package/dist/workflows.d.ts +21 -21
  141. package/dist/workflows.js +1 -1
  142. package/dist/{ws-chat-transport-UNRIS2xl.d.ts → ws-chat-transport-BbT1A5Lc.d.ts} +51 -2
  143. package/dist/{ws-chat-transport-rWwta645.js → ws-chat-transport-cqMKq3IY.js} +143 -16
  144. package/dist/ws-chat-transport-cqMKq3IY.js.map +1 -0
  145. package/docs/agent-tools.md +29 -4
  146. package/docs/browse-the-web.md +87 -5
  147. package/docs/chat-agents.md +124 -16
  148. package/docs/context.md +27 -0
  149. package/docs/durable-execution.md +2 -0
  150. package/docs/harnesses/pi.md +173 -0
  151. package/docs/human-in-the-loop.md +4 -0
  152. package/docs/index.md +3 -0
  153. package/docs/lifecycle.md +20 -4
  154. package/docs/models-pi-ai.md +325 -0
  155. package/docs/models.md +504 -0
  156. package/docs/resumable-streaming.md +2 -0
  157. package/docs/routing.md +13 -13
  158. package/docs/sessions.md +36 -1
  159. package/docs/state.md +1 -0
  160. package/docs/sub-agents.md +9 -0
  161. package/package.json +40 -2
  162. package/dist/agent-tools-y7zLfw4Q.js.map +0 -1
  163. package/dist/browser/ai.js.map +0 -1
  164. package/dist/client-C9DAjZIY.js.map +0 -1
  165. package/dist/client-tools-aIBO0Fk7.d.ts +0 -53
  166. package/dist/connector-CptFKzRh.js.map +0 -1
  167. package/dist/message-builder-BymO4N_D.js.map +0 -1
  168. package/dist/src-BNU3ZiJM.js.map +0 -1
  169. package/dist/streams-CCPRV6dt.js.map +0 -1
  170. package/dist/ws-chat-transport-rWwta645.js.map +0 -1
@@ -1,348 +1,2 @@
1
- import { t as __DO_NOT_USE_WILL_BREAK__agentContext } from "../current-agent-DhoDkSnH.js";
2
- import "../internal_context.js";
3
- import { c as browserLinks, d as browserScrape, i as DurableBrowserSessionStore, l as browserMarkdown, o as browserContent, s as browserExtract, t as BrowserConnector } from "../connector-CptFKzRh.js";
4
- import { tool } from "ai";
5
- import { z } from "zod";
6
- import { DynamicWorkerExecutor, createCodemodeRuntime, truncateResult } from "@cloudflare/codemode";
7
- //#region src/browser/ai.ts
8
- let didWarnExperimental = false;
9
- let didDebugQuickActionSkip = false;
10
- function browserScreenshotOutput(value) {
11
- const outer = typeof value === "object" && value !== null ? value : null;
12
- const result = outer && typeof outer.result === "object" && outer.result !== null ? outer.result : outer;
13
- if (result?.type !== "browser_screenshot" || typeof result.mediaType !== "string" || typeof result.data !== "string") return null;
14
- return result;
15
- }
16
- const BASE64_REDACTION_THRESHOLD = 4096;
17
- const MAX_REDACTION_DEPTH = 20;
18
- const MAX_REDACTION_NODES = 1e4;
19
- function base64Details(value, minimumLength = BASE64_REDACTION_THRESHOLD) {
20
- if (value.length < minimumLength) return null;
21
- const dataUrl = /^data:([^;,]+)(?:;[^;,]*)*;base64,([A-Za-z0-9+/]*={0,2})$/i.exec(value);
22
- const encoded = dataUrl?.[2] ?? value;
23
- if (encoded.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) return null;
24
- const padding = encoded.endsWith("==") ? 2 : encoded.endsWith("=") ? 1 : 0;
25
- return {
26
- mediaType: dataUrl?.[1],
27
- chars: encoded.length,
28
- bytes: encoded.length / 4 * 3 - padding
29
- };
30
- }
31
- function base64Redaction(value, mediaType, minimumLength) {
32
- const details = base64Details(value, minimumLength);
33
- if (!details) return value;
34
- const type = mediaType ?? details.mediaType;
35
- return `[base64${type ? ` ${type}` : ""} data omitted: ${details.chars.toLocaleString()} chars, approximately ${details.bytes.toLocaleString()} bytes]`;
36
- }
37
- function redactBase64Payloads(value) {
38
- const ancestors = /* @__PURE__ */ new WeakSet();
39
- let nodes = 0;
40
- function visit(current, depth) {
41
- if (depth > MAX_REDACTION_DEPTH) return "[nested value omitted]";
42
- if (++nodes > MAX_REDACTION_NODES) return "[remaining values omitted]";
43
- if (typeof current === "string") return base64Redaction(current);
44
- if (typeof current !== "object" || current === null) return current;
45
- if (current instanceof ArrayBuffer || ArrayBuffer.isView(current) || current instanceof Date || current instanceof Map || current instanceof Set) return current;
46
- if (ancestors.has(current)) return "[circular reference omitted]";
47
- ancestors.add(current);
48
- try {
49
- if (Array.isArray(current)) return current.map((entry) => visit(entry, depth + 1));
50
- const record = current;
51
- const screenshot = record.type === "browser_screenshot" && typeof record.mediaType === "string";
52
- return Object.fromEntries(Object.entries(record).map(([key, entry]) => [key, screenshot && key === "data" && typeof entry === "string" ? base64Redaction(entry, record.mediaType, 0) : visit(entry, depth + 1)]));
53
- } finally {
54
- ancestors.delete(current);
55
- }
56
- }
57
- return visit(value, 0);
58
- }
59
- function transformBrowserResult(value) {
60
- return browserScreenshotOutput(value) ? value : truncateResult(redactBase64Payloads(value));
61
- }
62
- function browserExecuteModelOutput(output) {
63
- const screenshot = browserScreenshotOutput(output);
64
- if (screenshot) {
65
- const approximateBytes = Math.floor(screenshot.data.length * 3 / 4);
66
- return {
67
- type: "text",
68
- value: `Screenshot captured successfully (${screenshot.mediaType}, approximately ${approximateBytes.toLocaleString()} bytes); the image is kept for the UI and omitted here.`
69
- };
70
- }
71
- const redacted = redactBase64Payloads(typeof output === "object" && output !== null && !Array.isArray(output) ? (({ calls: _calls, ...rest }) => ({
72
- ...rest,
73
- ...Array.isArray(rest.logs) ? { logs: truncateResult(rest.logs) } : {}
74
- }))(output) : output);
75
- try {
76
- const serialized = JSON.stringify(redacted);
77
- return {
78
- type: "json",
79
- value: serialized === void 0 ? null : JSON.parse(serialized)
80
- };
81
- } catch {
82
- return {
83
- type: "text",
84
- value: "Browser execution completed, but its result could not be serialized for model context."
85
- };
86
- }
87
- }
88
- /**
89
- * The Durable Object state to build the runtime in: the explicit `ctx` if
90
- * given, otherwise the current Agent's `ctx` (via `getCurrentAgent()`), so
91
- * `createBrowserRuntime` can be called from an Agent method without threading
92
- * `this.ctx` through.
93
- */
94
- function resolveCtx(options) {
95
- if (options.ctx) return options.ctx;
96
- return (__DO_NOT_USE_WILL_BREAK__agentContext.getStore()?.agent)?.ctx;
97
- }
98
- function connectorOptions(options, ctx) {
99
- if (options.cdpUrl) return {
100
- cdpUrl: options.cdpUrl,
101
- cdpHeaders: options.cdpHeaders,
102
- timeout: options.timeout
103
- };
104
- if (!options.browser) throw new Error("Either 'browser' (Fetcher binding) or 'cdpUrl' must be provided");
105
- return {
106
- browser: options.browser,
107
- store: options.store ?? new DurableBrowserSessionStore(ctx.storage),
108
- session: options.session,
109
- timeout: options.timeout
110
- };
111
- }
112
- /**
113
- * Create the browser codemode runtime: the `browser_execute` tool plus the
114
- * runtime handle and connector for host-side wiring (approvals, session info,
115
- * sweeps).
116
- *
117
- * @example
118
- * ```ts
119
- * export class MyAgent extends Agent<Env> {
120
- * get browser() {
121
- * return createBrowserRuntime({
122
- * ctx: this.ctx,
123
- * browser: this.env.BROWSER,
124
- * loader: this.env.LOADER,
125
- * session: { mode: "dynamic" }
126
- * });
127
- * }
128
- *
129
- * @callable()
130
- * async closeBrowserSession() {
131
- * await this.browser.connector.closeSession();
132
- * }
133
- * }
134
- * ```
135
- */
136
- function createBrowserRuntime(options) {
137
- if (!didWarnExperimental) {
138
- didWarnExperimental = true;
139
- console.warn("[agents/browser] Browser tools are experimental and may change in a future release.");
140
- }
141
- const ctx = resolveCtx(options);
142
- if (!ctx) throw new Error("createBrowserRuntime requires a Durable Object 'ctx' — pass it explicitly, or call from within an Agent so it can be resolved via getCurrentAgent()");
143
- const connector = new BrowserConnector(ctx, connectorOptions(options, ctx));
144
- const runtime = createCodemodeRuntime({
145
- ctx,
146
- executor: new DynamicWorkerExecutor({
147
- loader: options.loader,
148
- timeout: options.timeout
149
- }),
150
- connectors: [connector],
151
- name: options.name ?? "browser",
152
- transformResult: transformBrowserResult
153
- });
154
- const isKitesurf = !options.cdpUrl && options.session?.browser === "kitesurf";
155
- const tools = { browser_execute: {
156
- ...runtime.tool({ connectorHints: { cdp: isKitesurf ? "Kitesurf one-shot Browser CDP. Call codemode.describe(\"cdp\") for connector types and Kitesurf execution rules. codemode.search indexes connector methods and snippets, not underlying CDP commands. Complete the task in one execution and do not pause. Return screenshots as { type: \"browser_screenshot\", mediaType: \"image/png\", data: screenshot.data }." : "Browser CDP. Return screenshots as { type: 'browser_screenshot', mediaType: 'image/png', data: screenshot.data }; the UI keeps the image while the model receives a compact summary." } }),
157
- toModelOutput: ({ output }) => browserExecuteModelOutput(output)
158
- } };
159
- if (options.quickActions !== false && (!isKitesurf || options.quickActions !== void 0)) {
160
- const qa = typeof options.quickActions === "object" ? options.quickActions : {};
161
- const quickActionBrowser = qa.browser ?? options.browser;
162
- if (quickActionBrowser) Object.assign(tools, createQuickActionTools({
163
- browser: quickActionBrowser,
164
- actions: qa.actions,
165
- maxChars: qa.maxChars,
166
- options: qa.options
167
- }));
168
- else if (options.quickActions) throw new Error("quickActions requires a Browser Run binding — set 'browser' (env.BROWSER) or 'quickActions.browser'");
169
- else if (!didDebugQuickActionSkip) {
170
- didDebugQuickActionSkip = true;
171
- console.debug("[agents/browser] Quick Action tools skipped — no Browser Run binding (only 'cdpUrl' is set). Pass 'browser' or 'quickActions.browser' to enable them.");
172
- }
173
- }
174
- return {
175
- runtime,
176
- connector,
177
- tools
178
- };
179
- }
180
- /**
181
- * Create AI SDK tools for browser automation via CDP code mode.
182
- *
183
- * Returns a `ToolSet` with a single durable `browser_execute` tool backed by
184
- * a codemode runtime: the model writes TypeScript against the `cdp` connector
185
- * (`cdp.send`, `cdp.attachToTarget`, `cdp.spec`, …), executions are recorded
186
- * for abort-and-replay, and browser sessions survive pauses.
187
- *
188
- * @example
189
- * ```ts
190
- * import { createBrowserTools } from "agents/browser/ai";
191
- * import { generateText } from "ai";
192
- *
193
- * // inside a Durable Object / Agent:
194
- * const browserTools = createBrowserTools({
195
- * ctx: this.ctx,
196
- * browser: this.env.BROWSER,
197
- * loader: this.env.LOADER,
198
- * });
199
- *
200
- * const result = await generateText({
201
- * model,
202
- * tools: { ...browserTools, ...otherTools },
203
- * messages,
204
- * });
205
- * ```
206
- */
207
- function createBrowserTools(options) {
208
- return createBrowserRuntime(options).tools;
209
- }
210
- const DEFAULT_QUICK_ACTION_TOOLS = [
211
- "markdown",
212
- "extract",
213
- "links",
214
- "scrape"
215
- ];
216
- const DEFAULT_QUICK_ACTION_MAX_CHARS = 5e4;
217
- const pageInputSchema = z.object({
218
- url: z.string().url().optional().describe("URL of the page to load"),
219
- html: z.string().optional().describe("Raw HTML to render instead of loading a URL")
220
- }).refine((value) => Boolean(value.url) || Boolean(value.html), { message: "Provide either 'url' or 'html'" });
221
- function toPage(input, options) {
222
- const page = input.url ? { url: input.url } : { html: input.html };
223
- return {
224
- ...options,
225
- ...page
226
- };
227
- }
228
- function truncate(text, maxChars) {
229
- if (maxChars <= 0 || text.length <= maxChars) return text;
230
- return `${text.slice(0, maxChars)}\n\n[truncated ${text.length - maxChars} characters]`;
231
- }
232
- /**
233
- * Keep a tool result within a rough character budget so a single browse cannot
234
- * blow the model's context window — while preserving the result's shape so the
235
- * model sees a consistent type across calls:
236
- *
237
- * - strings (markdown/content) are truncated to a string;
238
- * - arrays (links/scrape) are trimmed from the end but stay arrays;
239
- * - only an opaque oversized object (e.g. a sprawling `extract`) degrades to a
240
- * `{ truncated, note, preview }` summary, since it cannot be trimmed safely.
241
- */
242
- function boundResult(value, maxChars) {
243
- if (maxChars <= 0) return value;
244
- if (typeof value === "string") return truncate(value, maxChars);
245
- let json;
246
- try {
247
- json = JSON.stringify(value);
248
- } catch {
249
- return value;
250
- }
251
- if (json.length <= maxChars) return value;
252
- if (Array.isArray(value)) {
253
- const trimmed = boundArray(value, maxChars);
254
- if (trimmed.length > 0) return trimmed;
255
- }
256
- return {
257
- truncated: true,
258
- note: `Result is too large (${json.length} characters); narrow the request.`,
259
- preview: `${json.slice(0, maxChars)}…`
260
- };
261
- }
262
- /**
263
- * Take as many leading items as fit within `maxChars` (measured against their
264
- * JSON length), returning a trimmed array of the same element type. Silent by
265
- * design: the model gets fewer, valid items rather than a reshaped result.
266
- */
267
- function boundArray(value, maxChars) {
268
- const out = [];
269
- let size = 2;
270
- for (const item of value) {
271
- const itemSize = JSON.stringify(item).length + 1;
272
- if (size + itemSize > maxChars) break;
273
- out.push(item);
274
- size += itemSize;
275
- }
276
- return out;
277
- }
278
- /**
279
- * Create AI SDK tools for Browser Run [Quick Actions](https://developers.cloudflare.com/browser-run/quick-actions/):
280
- * stateless one-shot browsing (read a page as Markdown, extract structured
281
- * data with AI, list links, scrape elements). Unlike `createBrowserTools`,
282
- * these need only the `browser` binding — no Durable Object, loader, or
283
- * sandbox — so they work from any Worker.
284
- *
285
- * @example
286
- * ```ts
287
- * import { createQuickActionTools } from "agents/browser/ai";
288
- *
289
- * const tools = createQuickActionTools({ browser: this.env.BROWSER });
290
- * const result = await generateText({ model, tools, messages });
291
- * ```
292
- */
293
- function createQuickActionTools(options) {
294
- const { browser } = options;
295
- const requestOptions = options.options;
296
- const enabled = new Set(options.actions ?? DEFAULT_QUICK_ACTION_TOOLS);
297
- const maxChars = options.maxChars ?? DEFAULT_QUICK_ACTION_MAX_CHARS;
298
- const tools = {};
299
- if (enabled.has("markdown")) tools.browser_markdown = tool({
300
- description: "Load a web page (or render raw HTML) and return its content as Markdown. Best for reading articles, docs, or any page as text.",
301
- inputSchema: pageInputSchema,
302
- execute: async (input) => boundResult(await browserMarkdown(browser, toPage(input, requestOptions)), maxChars)
303
- });
304
- if (enabled.has("extract")) tools.browser_extract = tool({
305
- description: "Extract structured data from a web page using AI. Describe what you want in 'prompt'. Passing a JSON Schema in 'schema' is strongly recommended — without one the extractor often fails to produce JSON.",
306
- inputSchema: z.object({
307
- url: z.string().url().optional().describe("URL of the page to load"),
308
- html: z.string().optional().describe("Raw HTML to render instead of loading a URL"),
309
- prompt: z.string().optional().describe("What to extract, in natural language"),
310
- schema: z.record(z.string(), z.unknown(), { error: "Schema must be a JSON object" }).optional().describe("Optional JSON Schema describing the desired output")
311
- }).refine((value) => Boolean(value.url) || Boolean(value.html), { message: "Provide either 'url' or 'html'" }).refine((value) => Boolean(value.prompt) || Boolean(value.schema), { message: "Provide either 'prompt' or 'schema'" }),
312
- execute: async (input) => boundResult(await browserExtract(browser, {
313
- ...toPage(input, requestOptions),
314
- prompt: input.prompt,
315
- response_format: input.schema ? {
316
- type: "json_schema",
317
- json_schema: input.schema
318
- } : void 0
319
- }), maxChars)
320
- });
321
- if (enabled.has("links")) tools.browser_links = tool({
322
- description: "Return every link found on a web page (including ones not visible). Useful for discovering pages to follow.",
323
- inputSchema: pageInputSchema,
324
- execute: async (input) => boundResult(await browserLinks(browser, toPage(input, requestOptions)), maxChars)
325
- });
326
- if (enabled.has("scrape")) tools.browser_scrape = tool({
327
- description: "Scrape specific elements from a web page by CSS selector. Returns the matched elements' text, HTML, and attributes.",
328
- inputSchema: z.object({
329
- url: z.string().url().optional().describe("URL of the page to load"),
330
- html: z.string().optional().describe("Raw HTML to render instead of loading a URL"),
331
- selectors: z.array(z.string()).min(1).describe("CSS selectors to extract")
332
- }).refine((value) => Boolean(value.url) || Boolean(value.html), { message: "Provide either 'url' or 'html'" }),
333
- execute: async (input) => boundResult(await browserScrape(browser, {
334
- ...toPage(input, requestOptions),
335
- elements: input.selectors.map((selector) => ({ selector }))
336
- }), maxChars)
337
- });
338
- if (enabled.has("content")) tools.browser_content = tool({
339
- description: "Load a web page and return its fully rendered HTML (after JavaScript runs). Prefer 'browser_markdown' unless you need the raw HTML.",
340
- inputSchema: pageInputSchema,
341
- execute: async (input) => boundResult(await browserContent(browser, toPage(input, requestOptions)), maxChars)
342
- });
343
- return tools;
344
- }
345
- //#endregion
1
+ import { n as createBrowserTools, r as createQuickActionTools, t as createBrowserRuntime } from "../ai-fm7xx1BK.js";
346
2
  export { createBrowserRuntime, createBrowserTools, createQuickActionTools };
347
-
348
- //# sourceMappingURL=ai.js.map
@@ -1,93 +1,82 @@
1
1
  import {
2
- A as browserMarkdown,
3
- B as BrowserTargetInfo,
4
- C as QuickActionScrapeInput,
5
- D as browserContent,
6
- E as QuickActionSnapshot,
7
- F as runQuickAction,
8
- G as deleteBrowserSession,
9
- H as connectBrowser,
2
+ $ as CdpConnection,
3
+ A as DurableBrowserSessionStore,
4
+ B as BrowserSessionInfo,
5
+ C as browserScrape,
6
+ D as BrowserSessionLock,
7
+ E as runQuickAction,
8
+ F as LiveViewMode,
9
+ G as ConnectKitesurfBrowserOptions,
10
+ H as ConnectBrowserOptions,
10
11
  I as BrowserBinding,
11
- J as CdpAttachOptions,
12
- K as getBrowserRecording,
12
+ J as createBrowserSession,
13
+ K as connectBrowser,
13
14
  L as BrowserRecording,
14
- M as browserScrape,
15
- N as browserScreenshot,
16
- O as browserExtract,
17
- P as browserSnapshot,
15
+ M as BrowserLiveView,
16
+ N as BrowserLiveViewTarget,
17
+ O as BrowserSessionStore,
18
+ P as BrowserLiveViewUrl,
19
+ Q as CdpAttachOptions,
18
20
  R as BrowserRenderingError,
19
- S as QuickActionPage,
20
- T as QuickActionScreenshotInput,
21
- U as connectBrowserSession,
22
- V as ConnectBrowserOptions,
23
- W as createBrowserSession,
24
- X as CdpSession,
25
- Y as CdpSendOptions,
26
- Z as connectUrl,
27
- _ as QuickActionBinary,
21
+ S as browserPdf,
22
+ T as browserSnapshot,
23
+ U as ConnectBrowserSessionOptions,
24
+ V as BrowserTargetInfo,
25
+ W as ConnectChromiumBrowserOptions,
26
+ X as getBrowserRecording,
27
+ Y as deleteBrowserSession,
28
+ Z as listBrowserTargets,
29
+ _ as QuickActionSnapshot,
28
30
  a as BrowserConnectorSweepResult,
29
- b as QuickActionExtractInput,
30
- c as BrowserLiveViewUrl,
31
- d as BrowserSessionLock,
32
- f as BrowserSessionStore,
33
- g as QuickAction,
34
- h as StoredBrowserSession,
31
+ b as browserLinks,
32
+ c as QuickActionBinary,
33
+ d as QuickActionExtractInput,
34
+ et as CdpConnectionOptions,
35
+ f as QuickActionInput,
36
+ g as QuickActionScreenshotInput,
37
+ h as QuickActionScrapeResult,
35
38
  i as BrowserConnectorSweepOptions,
36
- j as browserPdf,
37
- k as browserLinks,
38
- l as DEFAULT_EXEC_SWEEP_IDLE_MS,
39
- m as DurableBrowserSessionStore,
39
+ j as StoredBrowserSession,
40
+ k as DEFAULT_SWEEP_IDLE_MS,
41
+ l as QuickActionBinding,
42
+ m as QuickActionScrapeInput,
40
43
  n as BrowserConnectorOptions,
41
- o as BrowserLiveView,
42
- p as DEFAULT_SWEEP_IDLE_MS,
43
- q as listBrowserTargets,
44
+ nt as CdpSession,
45
+ o as DEFAULT_EXEC_SWEEP_IDLE_MS,
46
+ p as QuickActionPage,
47
+ q as connectBrowserSession,
44
48
  r as BrowserConnectorSessionOptions,
45
- s as BrowserLiveViewTarget,
49
+ rt as connectUrl,
50
+ s as QuickAction,
46
51
  t as BrowserConnector,
47
- u as LiveViewMode,
48
- v as QuickActionBinding,
49
- w as QuickActionScrapeResult,
50
- x as QuickActionInput,
51
- y as QuickActionCommonOptions,
52
- z as BrowserSessionInfo
53
- } from "../connector-CkQD4MK3.js";
52
+ tt as CdpSendOptions,
53
+ u as QuickActionCommonOptions,
54
+ v as browserContent,
55
+ w as browserScreenshot,
56
+ x as browserMarkdown,
57
+ y as browserExtract,
58
+ z as BrowserSessionGuardrails
59
+ } from "../connector-Cl-VqPmA.js";
60
+ import {
61
+ a as BrowserRunOptions,
62
+ c as browserRun,
63
+ d as CdpSpecSource,
64
+ f as SearchableCdpSpec,
65
+ i as BrowserProvider,
66
+ l as CdpField,
67
+ n as BrowserConnection,
68
+ o as BrowserRunProvider,
69
+ p as loadCdpSpec,
70
+ r as BrowserOptions,
71
+ s as ResolvedBrowser,
72
+ t as Browser,
73
+ u as CdpItems
74
+ } from "../browser-DE3d-RLk.js";
54
75
  import { CodemodeRuntime } from "@cloudflare/codemode";
55
-
56
- //#region src/browser/spec.d.ts
57
- interface SearchableCdpSpec {
58
- domains: Array<{
59
- name: string;
60
- description?: string;
61
- commands: Array<{
62
- name: string;
63
- method: string;
64
- description?: string;
65
- }>;
66
- events: Array<{
67
- name: string;
68
- event: string;
69
- description?: string;
70
- }>;
71
- types: Array<{
72
- id: string;
73
- name: string;
74
- description?: string;
75
- }>;
76
- }>;
77
- }
78
- interface CdpSpecSource {
79
- /** Browser Rendering binding (Fetcher) — used in production */
80
- browser?: BrowserBinding;
81
- /** CDP base URL override (e.g. http://localhost:9222) */
82
- cdpUrl?: string;
83
- /** Headers to send with CDP URL discovery requests */
84
- cdpHeaders?: Record<string, string>;
85
- }
86
- /** Load the (cached) searchable CDP spec for a browser source. */
87
- declare function loadCdpSpec(source: CdpSpecSource): Promise<SearchableCdpSpec>;
88
- //#endregion
89
76
  export {
77
+ Browser,
90
78
  type BrowserBinding,
79
+ type BrowserConnection,
91
80
  BrowserConnector,
92
81
  type BrowserConnectorOptions,
93
82
  type BrowserConnectorSessionOptions,
@@ -96,18 +85,30 @@ export {
96
85
  type BrowserLiveView,
97
86
  type BrowserLiveViewTarget,
98
87
  type BrowserLiveViewUrl,
88
+ type BrowserOptions,
89
+ type BrowserProvider,
99
90
  type BrowserRecording,
100
91
  BrowserRenderingError,
92
+ type BrowserRunOptions,
93
+ type BrowserRunProvider,
94
+ type BrowserSessionGuardrails,
101
95
  type BrowserSessionInfo,
102
96
  type BrowserSessionLock,
103
97
  type BrowserSessionStore,
104
98
  type BrowserTargetInfo,
105
99
  type CdpAttachOptions,
100
+ CdpConnection,
101
+ type CdpConnectionOptions,
102
+ type CdpField,
103
+ type CdpItems,
106
104
  type CdpSendOptions,
107
105
  CdpSession,
108
106
  type CdpSpecSource,
109
107
  CodemodeRuntime,
110
108
  type ConnectBrowserOptions,
109
+ type ConnectBrowserSessionOptions,
110
+ type ConnectChromiumBrowserOptions,
111
+ type ConnectKitesurfBrowserOptions,
111
112
  DEFAULT_EXEC_SWEEP_IDLE_MS,
112
113
  DEFAULT_SWEEP_IDLE_MS,
113
114
  DurableBrowserSessionStore,
@@ -123,6 +124,7 @@ export {
123
124
  type QuickActionScrapeResult,
124
125
  type QuickActionScreenshotInput,
125
126
  type QuickActionSnapshot,
127
+ type ResolvedBrowser,
126
128
  type SearchableCdpSpec,
127
129
  type StoredBrowserSession,
128
130
  browserContent,
@@ -130,6 +132,7 @@ export {
130
132
  browserLinks,
131
133
  browserMarkdown,
132
134
  browserPdf,
135
+ browserRun,
133
136
  browserScrape,
134
137
  browserScreenshot,
135
138
  browserSnapshot,
@@ -143,4 +146,3 @@ export {
143
146
  loadCdpSpec,
144
147
  runQuickAction
145
148
  };
146
- //# sourceMappingURL=index.d.ts.map