agents 0.27.0 → 0.28.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 (193) hide show
  1. package/dist/abortable-C1SpfVoi.js +21 -0
  2. package/dist/abortable-C1SpfVoi.js.map +1 -0
  3. package/dist/{agent-routing-Bhdbvf7s.d.ts → agent-routing-QDcchcQP.d.ts} +10 -15
  4. package/dist/agent-routing.d.ts +1 -1
  5. package/dist/agent-tool-types.d.ts +1 -1
  6. package/dist/{agent-tools-bJZwBMfq.d.ts → agent-tools-DHL2XI7u.d.ts} +2 -2
  7. package/dist/agent-tools.d.ts +1 -1
  8. package/dist/ai-ahruGw7e.d.ts +239 -0
  9. package/dist/{ai-sdk-OoGkFy3s.js → ai-sdk-Bdsf6mSA.js} +2 -2
  10. package/dist/{ai-sdk-OoGkFy3s.js.map → ai-sdk-Bdsf6mSA.js.map} +1 -1
  11. package/dist/browser/ai.d.ts +8 -227
  12. package/dist/browser/ai.js +259 -1
  13. package/dist/browser/ai.js.map +1 -0
  14. package/dist/browser/index.d.ts +56 -46
  15. package/dist/browser/index.js +4 -361
  16. package/dist/browser/{ai-sdk.d.ts → tools/ai-sdk.d.ts} +7 -7
  17. package/dist/browser/{ai-sdk.js → tools/ai-sdk.js} +5 -4
  18. package/dist/browser/tools/ai-sdk.js.map +1 -0
  19. package/dist/browser/tools/pi.d.ts +111 -0
  20. package/dist/browser/tools/pi.js +119 -0
  21. package/dist/browser/tools/pi.js.map +1 -0
  22. package/dist/browser/{tanstack-ai.d.ts → tools/tanstack-ai.d.ts} +39 -37
  23. package/dist/browser/{tanstack-ai.js → tools/tanstack-ai.js} +73 -59
  24. package/dist/browser/tools/tanstack-ai.js.map +1 -0
  25. package/dist/browser-CEdNlsaD.js +481 -0
  26. package/dist/browser-CEdNlsaD.js.map +1 -0
  27. package/dist/{browser-tmkcAAI3.d.ts → browser-D30VlpcA.d.ts} +63 -37
  28. package/dist/{browser-tool-CBqs6hqa.js → browser-tool-4iomavs_.js} +145 -49
  29. package/dist/browser-tool-4iomavs_.js.map +1 -0
  30. package/dist/{browser-tool-Bn-nzJQI.d.ts → browser-tool-vtrPOV8e.d.ts} +24 -5
  31. package/dist/{capability-B4WbF81e.js → capability-DBAKc6UZ.js} +1 -3
  32. package/dist/capability-DBAKc6UZ.js.map +1 -0
  33. package/dist/{capability-runner-O5VbQzqg.d.ts → capability-runner-BiVUtjqC.d.ts} +1 -7
  34. package/dist/chat/index.d.ts +4 -4
  35. package/dist/chat/index.js +1 -1
  36. package/dist/chat-sdk/index.d.ts +1 -1
  37. package/dist/chat-sdk/index.js +1 -1
  38. package/dist/{client-DS3Dz9l0.d.ts → client-BGIQKJhX.d.ts} +2 -2
  39. package/dist/{client-1tEQ1Oqz.js → client-BnYbNT3z.js} +3 -4
  40. package/dist/client-BnYbNT3z.js.map +1 -0
  41. package/dist/client.d.ts +1 -1
  42. package/dist/{connector-58XDGvc3.js → connector-CtZylXdk.js} +3 -603
  43. package/dist/connector-CtZylXdk.js.map +1 -0
  44. package/dist/{connector-Cl-VqPmA.d.ts → connector-DEXzVoaY.d.ts} +9 -374
  45. package/dist/{conversations-DH0ut_8n.d.ts → conversations-FjHDRZyD.d.ts} +4 -4
  46. package/dist/{current-agent-C07C5o5Y.d.ts → current-agent-CKgT5d1O.d.ts} +3 -5
  47. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  48. package/dist/{durable-object-lifecycle-DRqp475_.d.ts → durable-object-lifecycle-DOI_bzCH.d.ts} +2 -2
  49. package/dist/experimental/channels/index.d.ts +2 -2
  50. package/dist/experimental/channels/index.js +2 -2
  51. package/dist/experimental/channels/web/index.d.ts +2 -2
  52. package/dist/experimental/channels/web/index.js +1 -1
  53. package/dist/{gateway-BDC07gYO.d.ts → gateway-BFO6vRDn.d.ts} +2 -2
  54. package/dist/harness/ai-sdk/index.d.ts +2 -2
  55. package/dist/harness/ai-sdk/index.js +1 -1
  56. package/dist/harness/container/index.d.ts +2 -2
  57. package/dist/harness/container/index.js +3 -3
  58. package/dist/harness/opencode/index.d.ts +1 -1
  59. package/dist/harness/opencode/index.js +2 -2
  60. package/dist/harness/pi/index.d.ts +2 -2
  61. package/dist/harness/pi/index.js +3 -3
  62. package/dist/harness/store/index.d.ts +1 -1
  63. package/dist/harness/store/index.js +1 -1
  64. package/dist/harness/think/index.d.ts +2 -2
  65. package/dist/harness/think/index.js +363 -171
  66. package/dist/harness/think/index.js.map +1 -1
  67. package/dist/{index-D0A5tbWu.d.ts → index-BEL3ZV-s.d.ts} +2 -6
  68. package/dist/{index-Ib_4dwOo.d.ts → index-CBt8oRJt.d.ts} +3 -5
  69. package/dist/index.d.ts +4 -4
  70. package/dist/index.js +2 -2
  71. package/dist/input-schema-BQykTEp_.js +20 -0
  72. package/dist/input-schema-BQykTEp_.js.map +1 -0
  73. package/dist/{input-schema-DNrpTu49.js → input-schema-D2QAtHZH.js} +3 -3
  74. package/dist/input-schema-D2QAtHZH.js.map +1 -0
  75. package/dist/internal_context.d.ts +1 -1
  76. package/dist/lifecycle/index.d.ts +3 -3
  77. package/dist/lifecycle/index.js +2 -2
  78. package/dist/{lifecycle-CFu6OV03.js → lifecycle-DGorpAmA.js} +2 -4
  79. package/dist/lifecycle-DGorpAmA.js.map +1 -0
  80. package/dist/mcp/client/index.d.ts +1 -1
  81. package/dist/mcp/client/index.js +1 -1
  82. package/dist/mcp/index.d.ts +1 -1
  83. package/dist/mcp/index.js +2 -2
  84. package/dist/models/ai-sdk/index.js +1 -1
  85. package/dist/models/opencode/index.js +1 -1
  86. package/dist/models/pi-ai/index.js +1 -1
  87. package/dist/{options-pwTNq9z6.d.ts → options-CiIsJHXR.d.ts} +2 -6
  88. package/dist/queue/index.d.ts +1 -1
  89. package/dist/queue/index.js +1 -1
  90. package/dist/{queue-BB-zfIYF.js → queue-CcIjVYTE.js} +2 -2
  91. package/dist/{queue-BB-zfIYF.js.map → queue-CcIjVYTE.js.map} +1 -1
  92. package/dist/react.d.ts +2 -2
  93. package/dist/routing/index.d.ts +2 -2
  94. package/dist/routing/index.js +1 -1
  95. package/dist/{scheduler-CrFCnv_J.d.ts → scheduler-BCLESHSC.d.ts} +2 -12
  96. package/dist/{scheduler-DZ3xQfeK.js → scheduler-FIHv2-kJ.js} +2 -4
  97. package/dist/scheduler-FIHv2-kJ.js.map +1 -0
  98. package/dist/schedules/index.d.ts +1 -1
  99. package/dist/schedules/index.js +1 -1
  100. package/dist/serializable.d.ts +1 -1
  101. package/dist/session-store-Do4xkDcf.js +606 -0
  102. package/dist/session-store-Do4xkDcf.js.map +1 -0
  103. package/dist/session-store-DoPY12xM.d.ts +383 -0
  104. package/dist/sessions/index.d.ts +1 -1
  105. package/dist/sessions/index.js +1 -1
  106. package/dist/{sessions-B9pNuxdT.js → sessions-_vN5BEZX.js} +2 -2
  107. package/dist/{sessions-B9pNuxdT.js.map → sessions-_vN5BEZX.js.map} +1 -1
  108. package/dist/{src-DgCbZtIR.js → src-CQxJFv4l.js} +8 -8
  109. package/dist/src-CQxJFv4l.js.map +1 -0
  110. package/dist/state/index.d.ts +1 -1
  111. package/dist/state/index.js +1 -3
  112. package/dist/state/index.js.map +1 -1
  113. package/dist/{store-DLeqKuj3.d.ts → store-BKM4Xm9M.d.ts} +23 -1
  114. package/dist/{store-vgcPYo8K.js → store-CslVzfN7.js} +28 -2
  115. package/dist/store-CslVzfN7.js.map +1 -0
  116. package/dist/streams/index.d.ts +1 -1
  117. package/dist/streams/index.js +1 -1
  118. package/dist/{streams-CITClVer.js → streams-lsHMJhRW.js} +2 -2
  119. package/dist/{streams-CITClVer.js.map → streams-lsHMJhRW.js.map} +1 -1
  120. package/dist/{streams-fbG61qM8.d.ts → streams-vrCtbUIn.d.ts} +2 -2
  121. package/dist/sub-routing.d.ts +1 -1
  122. package/dist/tasks/index.d.ts +1 -1
  123. package/dist/tasks/index.js +1 -1
  124. package/dist/{tasks-CkTZNaV1.js → tasks-BN_5AWqI.js} +2 -2
  125. package/dist/{tasks-CkTZNaV1.js.map → tasks-BN_5AWqI.js.map} +1 -1
  126. package/dist/{tasks-PtlB4Uyn.d.ts → tasks-E89KdwkS.d.ts} +2 -2
  127. package/dist/{tool-BPJEbwaX.d.ts → tool-CTp72Jb_.d.ts} +4 -4
  128. package/dist/tool-CxKsvxjm.js +1126 -0
  129. package/dist/tool-CxKsvxjm.js.map +1 -0
  130. package/dist/tool-DoVberpN.d.ts +301 -0
  131. package/dist/{tool-3PA8xjB_.js → tool-cQRkwSZZ.js} +6 -17
  132. package/dist/tool-cQRkwSZZ.js.map +1 -0
  133. package/dist/tool-helpers-O5BDVEAY.js +58 -0
  134. package/dist/tool-helpers-O5BDVEAY.js.map +1 -0
  135. package/dist/voice/index.d.ts +2 -2
  136. package/dist/web/fetch/index.d.ts +89 -0
  137. package/dist/web/fetch/index.js +20 -0
  138. package/dist/web/fetch/index.js.map +1 -0
  139. package/dist/web/fetch/tools/ai-sdk.d.ts +80 -0
  140. package/dist/web/fetch/tools/ai-sdk.js +47 -0
  141. package/dist/web/fetch/tools/ai-sdk.js.map +1 -0
  142. package/dist/web/fetch/tools/pi.d.ts +84 -0
  143. package/dist/web/fetch/tools/pi.js +88 -0
  144. package/dist/web/fetch/tools/pi.js.map +1 -0
  145. package/dist/web/fetch/tools/tanstack-ai.d.ts +78 -0
  146. package/dist/web/fetch/tools/tanstack-ai.js +45 -0
  147. package/dist/web/fetch/tools/tanstack-ai.js.map +1 -0
  148. package/dist/{websearch → web/search}/index.d.ts +1 -1
  149. package/dist/{websearch → web/search}/index.js +1 -1
  150. package/dist/{websearch → web/search}/tools/ai-sdk.d.ts +2 -2
  151. package/dist/{websearch → web/search}/tools/ai-sdk.js +3 -3
  152. package/dist/web/search/tools/ai-sdk.js.map +1 -0
  153. package/dist/{websearch → web/search}/tools/pi.d.ts +3 -3
  154. package/dist/{websearch → web/search}/tools/pi.js +2 -2
  155. package/dist/web/search/tools/pi.js.map +1 -0
  156. package/dist/{websearch → web/search}/tools/tanstack-ai.d.ts +2 -2
  157. package/dist/{websearch → web/search}/tools/tanstack-ai.js +3 -3
  158. package/dist/web/search/tools/tanstack-ai.js.map +1 -0
  159. package/dist/websockets/index.d.ts +2 -2
  160. package/dist/websockets/index.js +1 -1
  161. package/dist/{websockets-CmENGb-Z.js → websockets-C3zy8YR0.js} +3 -5
  162. package/dist/websockets-C3zy8YR0.js.map +1 -0
  163. package/dist/workflow-types.d.ts +1 -1
  164. package/dist/workflows.d.ts +1 -1
  165. package/dist/workflows.js +1 -1
  166. package/docs/browse-the-web.md +26 -1
  167. package/docs/fetch-the-web.md +276 -0
  168. package/docs/harnesses/pi.md +25 -0
  169. package/docs/index.md +99 -76
  170. package/docs/lifecycle.md +2 -3
  171. package/docs/queue.md +2 -3
  172. package/docs/scheduling.md +2 -6
  173. package/docs/search-the-web.md +2 -0
  174. package/package.json +44 -19
  175. package/dist/ai-fm7xx1BK.js +0 -312
  176. package/dist/ai-fm7xx1BK.js.map +0 -1
  177. package/dist/browser/ai-sdk.js.map +0 -1
  178. package/dist/browser/index.js.map +0 -1
  179. package/dist/browser/tanstack-ai.js.map +0 -1
  180. package/dist/browser-tool-CBqs6hqa.js.map +0 -1
  181. package/dist/capability-B4WbF81e.js.map +0 -1
  182. package/dist/client-1tEQ1Oqz.js.map +0 -1
  183. package/dist/connector-58XDGvc3.js.map +0 -1
  184. package/dist/input-schema-DNrpTu49.js.map +0 -1
  185. package/dist/lifecycle-CFu6OV03.js.map +0 -1
  186. package/dist/scheduler-DZ3xQfeK.js.map +0 -1
  187. package/dist/src-DgCbZtIR.js.map +0 -1
  188. package/dist/store-vgcPYo8K.js.map +0 -1
  189. package/dist/tool-3PA8xjB_.js.map +0 -1
  190. package/dist/websearch/tools/ai-sdk.js.map +0 -1
  191. package/dist/websearch/tools/pi.js.map +0 -1
  192. package/dist/websearch/tools/tanstack-ai.js.map +0 -1
  193. package/dist/websockets-CmENGb-Z.js.map +0 -1
@@ -1,391 +1,7 @@
1
1
  import { i as _classPrivateFieldInitSpec, n as _classPrivateFieldSet2, r as _assertClassBrand, t as _classPrivateFieldGet2 } from "./classPrivateFieldGet2-DZBYAB34.js";
2
2
  import { t as _classPrivateMethodInitSpec } from "./classPrivateMethodInitSpec-qMjJ6sHQ.js";
3
+ import { a as applyLiveViewMode, b as connectUrl, c as BrowserRenderingError, d as createBrowserSession, f as deleteBrowserSession, h as listBrowserTargets, i as LIVE_VIEW_URL_TTL_MS, l as connectBrowser, o as createLiveView, r as loadCdpSpec, s as validateConnectorArgs, u as connectBrowserSession, v as CdpProtocolError } from "./session-store-Do4xkDcf.js";
3
4
  import { CodemodeConnector } from "@cloudflare/codemode";
4
- import { Validator } from "@cfworker/json-schema";
5
- //#region src/browser/connector-validation.ts
6
- function formatToolValidationError(connector, tool, errors) {
7
- const specific = errors.filter((error) => error.keyword !== "properties");
8
- return `Invalid arguments for ${connector}.${tool}${(specific.length > 0 ? specific : errors).map((error) => {
9
- const location = error.instanceLocation.replace(/^#\/?/, "").replaceAll("~1", "/").replaceAll("~0", "~").replaceAll("/", ".");
10
- return `${location ? ` at ${location}` : ""}: ${error.error}`;
11
- }).join(";")}`;
12
- }
13
- /**
14
- * Validate a connector tool's arguments against its input schema before it
15
- * runs, so the model gets a precise error instead of a failure deep inside
16
- * browser work. An omitted argument counts as `{}`: argumentless tools are
17
- * documented as `cdp.spec()`.
18
- */
19
- function validateConnectorArgs(connector, name, tool) {
20
- if (!tool.inputSchema) return tool;
21
- const schema = tool.inputSchema;
22
- const validator = new Validator(schema, "7", false);
23
- return {
24
- ...tool,
25
- execute: async (args, ctx) => {
26
- const input = args === void 0 ? {} : args;
27
- const result = validator.validate(input);
28
- if (!result.valid) throw new Error(formatToolValidationError(connector, name, result.errors));
29
- return await tool.execute(input, ctx);
30
- }
31
- };
32
- }
33
- //#endregion
34
- //#region src/browser/cdp-connection.ts
35
- const DEFAULT_TIMEOUT_MS = 1e4;
36
- /** JSON-RPC's "method not found" code, which Chrome also uses for CDP. */
37
- const CDP_METHOD_NOT_FOUND = -32601;
38
- /** The browser answered a command with a JSON-RPC error. */
39
- var CdpProtocolError = class extends Error {
40
- constructor(method, code, message) {
41
- super(`CDP error ${code ?? "unknown"}: ${message} for ${method}`);
42
- this.name = "CdpProtocolError";
43
- this.code = code;
44
- this.method = method;
45
- }
46
- };
47
- const MAX_DEBUG_ENTRIES = 400;
48
- var _socket$1 = /* @__PURE__ */ new WeakMap();
49
- var _nextId = /* @__PURE__ */ new WeakMap();
50
- var _pending = /* @__PURE__ */ new WeakMap();
51
- var _debugLog = /* @__PURE__ */ new WeakMap();
52
- var _defaultTimeoutMs = /* @__PURE__ */ new WeakMap();
53
- var _dispose = /* @__PURE__ */ new WeakMap();
54
- var _disposed = /* @__PURE__ */ new WeakMap();
55
- var _onActivity = /* @__PURE__ */ new WeakMap();
56
- var _CdpConnection_brand = /* @__PURE__ */ new WeakSet();
57
- /**
58
- * One Chrome DevTools Protocol connection over an open WebSocket. Manages
59
- * command correlation, timeouts, per-tab CDP sessions, and a debug event
60
- * ring buffer.
61
- *
62
- * Used host-side (not in the sandbox) — the sandbox calls into this
63
- * via DynamicWorkerExecutor's ToolDispatcher RPC.
64
- */
65
- var CdpConnection = class {
66
- constructor(socket, optionsOrTimeoutMs, onClose, sessionId) {
67
- _classPrivateMethodInitSpec(this, _CdpConnection_brand);
68
- _classPrivateFieldInitSpec(this, _socket$1, void 0);
69
- _classPrivateFieldInitSpec(this, _nextId, 1);
70
- _classPrivateFieldInitSpec(this, _pending, /* @__PURE__ */ new Map());
71
- _classPrivateFieldInitSpec(this, _debugLog, []);
72
- _classPrivateFieldInitSpec(this, _defaultTimeoutMs, void 0);
73
- _classPrivateFieldInitSpec(this, _dispose, void 0);
74
- _classPrivateFieldInitSpec(this, _disposed, false);
75
- _classPrivateFieldInitSpec(this, _onActivity, void 0);
76
- const options = typeof optionsOrTimeoutMs === "object" ? optionsOrTimeoutMs : {
77
- timeoutMs: optionsOrTimeoutMs,
78
- onClose,
79
- sessionId
80
- };
81
- _classPrivateFieldSet2(_socket$1, this, socket);
82
- _classPrivateFieldSet2(_defaultTimeoutMs, this, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
83
- _classPrivateFieldSet2(_dispose, this, options.onClose);
84
- this.sessionId = options.sessionId;
85
- _classPrivateFieldSet2(_onActivity, this, options.onActivity);
86
- socket.addEventListener("message", (event) => _assertClassBrand(_CdpConnection_brand, this, _handleMessage).call(this, event));
87
- socket.addEventListener("error", () => {
88
- _assertClassBrand(_CdpConnection_brand, this, _rejectAll).call(this, /* @__PURE__ */ new Error("CDP socket error"));
89
- _assertClassBrand(_CdpConnection_brand, this, _runDispose).call(this);
90
- });
91
- socket.addEventListener("close", () => {
92
- _assertClassBrand(_CdpConnection_brand, this, _rejectAll).call(this, /* @__PURE__ */ new Error("CDP connection closed"));
93
- _assertClassBrand(_CdpConnection_brand, this, _runDispose).call(this);
94
- });
95
- }
96
- send(method, params, options = {}) {
97
- var _this$nextId, _this$nextId2;
98
- _classPrivateFieldGet2(_onActivity, this)?.call(this);
99
- const id = (_classPrivateFieldSet2(_nextId, this, (_this$nextId = _classPrivateFieldGet2(_nextId, this), _this$nextId2 = _this$nextId++, _this$nextId)), _this$nextId2);
100
- const timeoutMs = options.timeoutMs ?? _classPrivateFieldGet2(_defaultTimeoutMs, this);
101
- const sessionId = typeof options.sessionId === "string" && options.sessionId.length > 0 ? options.sessionId : void 0;
102
- const domain = typeof method === "string" ? method.split(".")[0] : "";
103
- if (!sessionId && domain && !["Browser", "Target"].includes(domain)) _assertClassBrand(_CdpConnection_brand, this, _recordDebug).call(this, "warning", {
104
- id,
105
- method,
106
- reason: "target-scoped method sent without sessionId"
107
- });
108
- const result = new Promise((resolve, reject) => {
109
- const startedAt = performance.now();
110
- const timeoutId = setTimeout(() => {
111
- _classPrivateFieldGet2(_pending, this).delete(id);
112
- reject(/* @__PURE__ */ new Error(`CDP command timed out after ${timeoutMs}ms: ${method}`));
113
- }, timeoutMs);
114
- _classPrivateFieldGet2(_pending, this).set(id, {
115
- resolve,
116
- reject,
117
- timeoutId,
118
- method,
119
- sessionId,
120
- startedAt
121
- });
122
- });
123
- _assertClassBrand(_CdpConnection_brand, this, _recordDebug).call(this, "send", {
124
- id,
125
- method,
126
- sessionId,
127
- timeoutMs
128
- });
129
- try {
130
- _classPrivateFieldGet2(_socket$1, this).send(JSON.stringify({
131
- id,
132
- method,
133
- params,
134
- sessionId
135
- }));
136
- } catch (error) {
137
- const pending = _classPrivateFieldGet2(_pending, this).get(id);
138
- if (pending) {
139
- clearTimeout(pending.timeoutId);
140
- _classPrivateFieldGet2(_pending, this).delete(id);
141
- pending.reject(error instanceof Error ? error : new Error(String(error)));
142
- }
143
- }
144
- return result;
145
- }
146
- async attachToTarget(targetId, options = {}) {
147
- if (typeof targetId !== "string" || !targetId) throw new Error("attachToTarget requires a targetId — list open tabs with send('Target.getTargets') or create one with send('Target.createTarget', { url })");
148
- const sessionId = (await this.send("Target.attachToTarget", {
149
- targetId,
150
- flatten: true
151
- }, { timeoutMs: options.timeoutMs }))?.sessionId ?? "";
152
- if (!sessionId) throw new Error(`Target.attachToTarget did not return a sessionId for target ${targetId}`);
153
- _assertClassBrand(_CdpConnection_brand, this, _recordDebug).call(this, "attach", {
154
- targetId,
155
- sessionId
156
- });
157
- return sessionId;
158
- }
159
- getDebugLog(limit = 50) {
160
- const normalized = Number.isFinite(limit) ? Math.max(1, Math.floor(limit)) : 50;
161
- return _classPrivateFieldGet2(_debugLog, this).slice(-normalized);
162
- }
163
- clearDebugLog() {
164
- _classPrivateFieldSet2(_debugLog, this, []);
165
- }
166
- disconnect() {
167
- _assertClassBrand(_CdpConnection_brand, this, _rejectAll).call(this, /* @__PURE__ */ new Error("CDP session disconnected"));
168
- try {
169
- _classPrivateFieldGet2(_socket$1, this).close(1e3, "Done");
170
- } catch {}
171
- }
172
- close() {
173
- this.disconnect();
174
- _assertClassBrand(_CdpConnection_brand, this, _runDispose).call(this);
175
- }
176
- };
177
- /**
178
- * Run the dispose callback exactly once, on the first terminal event —
179
- * an explicit {@link close}, peer closure, or a socket error.
180
- */
181
- function _runDispose() {
182
- if (_classPrivateFieldGet2(_disposed, this)) return;
183
- _classPrivateFieldSet2(_disposed, this, true);
184
- _classPrivateFieldGet2(_dispose, this)?.call(this);
185
- }
186
- function _rejectAll(error) {
187
- for (const [id, pending] of _classPrivateFieldGet2(_pending, this).entries()) {
188
- clearTimeout(pending.timeoutId);
189
- _classPrivateFieldGet2(_pending, this).delete(id);
190
- pending.reject(error);
191
- }
192
- }
193
- function _handleMessage(event) {
194
- if (typeof event.data !== "string") return;
195
- let payload;
196
- try {
197
- payload = JSON.parse(event.data);
198
- } catch {
199
- return;
200
- }
201
- _assertClassBrand(_CdpConnection_brand, this, _recordDebug).call(this, "receive", {
202
- id: payload.id,
203
- method: payload.method,
204
- sessionId: payload.sessionId,
205
- hasError: !!payload.error
206
- });
207
- if (typeof payload.id !== "number") return;
208
- const pending = _classPrivateFieldGet2(_pending, this).get(payload.id);
209
- if (!pending) return;
210
- clearTimeout(pending.timeoutId);
211
- _classPrivateFieldGet2(_pending, this).delete(payload.id);
212
- if (payload.error) {
213
- const err = payload.error;
214
- pending.reject(new CdpProtocolError(pending.method, typeof err.code === "number" ? err.code : void 0, err.message ?? "CDP error"));
215
- return;
216
- }
217
- pending.resolve(payload.result);
218
- }
219
- function _recordDebug(type, data) {
220
- _classPrivateFieldGet2(_debugLog, this).push({
221
- at: (/* @__PURE__ */ new Date()).toISOString(),
222
- type,
223
- ...data
224
- });
225
- if (_classPrivateFieldGet2(_debugLog, this).length > MAX_DEBUG_ENTRIES) _classPrivateFieldGet2(_debugLog, this).splice(0, _classPrivateFieldGet2(_debugLog, this).length - MAX_DEBUG_ENTRIES);
226
- }
227
- const LOCALHOST_HOSTS = /* @__PURE__ */ new Set([
228
- "localhost",
229
- "127.0.0.1",
230
- "0.0.0.0",
231
- "::1",
232
- "[::1]"
233
- ]);
234
- /**
235
- * Connect to a browser via a CDP base URL (e.g. http://localhost:9222).
236
- * Discovers the WebSocket debugger URL via /json/version,
237
- * rewrites localhost URLs to the base URL host, and opens the WebSocket.
238
- *
239
- * Useful for local development with `chrome --remote-debugging-port=9222`
240
- * or when connecting through a tunnel.
241
- */
242
- async function connectUrl(baseUrl, options) {
243
- const endpoint = new URL("/json/version", baseUrl).toString();
244
- const response = await fetch(endpoint, { headers: options?.headers });
245
- if (!response.ok) throw new Error(`Failed to discover CDP endpoint at ${endpoint}: ${response.status}`);
246
- const payload = await response.json();
247
- if (!payload.webSocketDebuggerUrl) throw new Error("CDP /json/version did not include webSocketDebuggerUrl");
248
- let wsUrl = payload.webSocketDebuggerUrl;
249
- const parsed = new URL(wsUrl);
250
- if (LOCALHOST_HOSTS.has(parsed.hostname)) {
251
- const base = new URL(baseUrl);
252
- parsed.hostname = base.hostname;
253
- parsed.port = base.port;
254
- parsed.protocol = base.protocol;
255
- } else parsed.protocol = parsed.protocol === "wss:" ? "https:" : "http:";
256
- const fetchUrl = parsed.toString();
257
- const wsResponse = await fetch(fetchUrl, { headers: {
258
- ...options?.headers,
259
- Upgrade: "websocket"
260
- } });
261
- const ws = wsResponse.webSocket;
262
- if (!ws) throw new Error(`Failed to establish CDP WebSocket at ${fetchUrl} (status ${wsResponse.status})`);
263
- ws.accept();
264
- return new CdpConnection(ws, { timeoutMs: options?.timeoutMs });
265
- }
266
- /** @deprecated Renamed to {@link CdpConnection}. */
267
- const CdpSession = CdpConnection;
268
- //#endregion
269
- //#region src/browser/browser-run.ts
270
- var BrowserRenderingError = class extends Error {
271
- constructor(message, status) {
272
- super(message);
273
- this.status = status;
274
- this.name = "BrowserRenderingError";
275
- }
276
- };
277
- /**
278
- * Whether an error means the platform session is gone: Browser Run uses 404
279
- * for unknown ids and 410 after `keep_alive` expiry.
280
- */
281
- function isMissingBrowserSession$1(error) {
282
- return error instanceof BrowserRenderingError && (error.status === 404 || error.status === 410);
283
- }
284
- function browserSessionEndpoint(sessionId, options) {
285
- const path = sessionId ? `/v1/devtools/browser/${sessionId}` : "/v1/devtools/browser";
286
- const url = new URL(`https://localhost${path}`);
287
- if (options?.keepAliveMs !== void 0) url.searchParams.set("keep_alive", String(options.keepAliveMs));
288
- if (options?.includeTargets) url.searchParams.set("targets", "true");
289
- if (options?.recording) url.searchParams.set("recording", "true");
290
- if (options?.browser) url.searchParams.set("browser", options.browser);
291
- return url.toString();
292
- }
293
- async function parseBrowserSessionInfo(response) {
294
- const payload = await response.json();
295
- const sessionId = typeof payload.sessionId === "string" ? payload.sessionId : "";
296
- if (!sessionId) throw new Error("Browser Rendering response did not include a sessionId");
297
- return {
298
- sessionId,
299
- targets: Array.isArray(payload.targets) ? payload.targets : void 0,
300
- webSocketDebuggerUrl: typeof payload.webSocketDebuggerUrl === "string" ? payload.webSocketDebuggerUrl : void 0
301
- };
302
- }
303
- async function createBrowserSession(browser, options) {
304
- const response = await browser.fetch(browserSessionEndpoint(void 0, options), {
305
- method: "POST",
306
- headers: { "Content-Type": "application/json" },
307
- body: JSON.stringify(options?.guardrails ? { guardrails: options.guardrails } : {})
308
- });
309
- if (!response.ok) throw new BrowserRenderingError(`Failed to create Browser Rendering session: ${response.status}`, response.status);
310
- return parseBrowserSessionInfo(response);
311
- }
312
- async function listBrowserTargets(browser, sessionId) {
313
- const response = await browser.fetch(`https://localhost/v1/devtools/browser/${sessionId}/json/list`);
314
- if (!response.ok) throw new BrowserRenderingError(`Failed to list Browser Rendering targets for ${sessionId}: ${response.status}`, response.status);
315
- const payload = await response.json();
316
- return Array.isArray(payload) ? payload : [];
317
- }
318
- async function deleteBrowserSession(browser, sessionId) {
319
- const response = await browser.fetch(`https://localhost/v1/devtools/browser/${sessionId}`, { method: "DELETE" });
320
- if (!response.ok && response.status !== 404) throw new BrowserRenderingError(`Failed to delete Browser Rendering session ${sessionId}: ${response.status}`, response.status);
321
- }
322
- /**
323
- * Connect to a Browser Rendering session and delete it when closed.
324
- */
325
- async function connectBrowser(browser, options) {
326
- const normalizedOptions = typeof options === "number" ? { timeoutMs: options } : options ?? {};
327
- if (normalizedOptions.browser === "kitesurf") {
328
- const smuggled = normalizedOptions;
329
- if (smuggled.keepAliveMs || smuggled.includeTargets || smuggled.recording) throw new Error("Kitesurf does not support keepAliveMs, includeTargets, or recording");
330
- }
331
- const response = await browser.fetch(browserSessionEndpoint(void 0, normalizedOptions.browser === "kitesurf" ? { browser: "kitesurf" } : {
332
- keepAliveMs: normalizedOptions.keepAliveMs,
333
- includeTargets: normalizedOptions.includeTargets,
334
- recording: normalizedOptions.recording
335
- }), { headers: { Upgrade: "websocket" } });
336
- const ws = response.webSocket;
337
- if (!ws) throw new Error("Browser Rendering binding did not return a WebSocket. Ensure the 'browser' binding is configured in wrangler.jsonc.");
338
- if (normalizedOptions.browser === "kitesurf") {
339
- ws.accept();
340
- return new CdpConnection(ws, { timeoutMs: normalizedOptions.timeoutMs });
341
- }
342
- const sessionId = response.headers.get("cf-browser-session-id");
343
- if (!sessionId) throw new Error("Browser Rendering binding did not include a session ID when opening the CDP WebSocket");
344
- ws.accept();
345
- return new CdpConnection(ws, {
346
- timeoutMs: normalizedOptions.timeoutMs,
347
- onClose: () => {
348
- deleteBrowserSession(browser, sessionId).catch((error) => {
349
- console.warn(`[agents/browser] Failed to delete one-shot Browser Run session ${sessionId}`, error);
350
- });
351
- },
352
- sessionId
353
- });
354
- }
355
- /**
356
- * Fetch a Browser Run [session recording](https://developers.cloudflare.com/browser-run/features/session-recording/)
357
- * by session id, via the Browser Rendering REST API.
358
- *
359
- * A recording is only available **after** the session closes (explicit
360
- * `closeSession()`, idle `keep_alive` expiry, or sweep) and is retained for 30
361
- * days. Capture the session id while the session is alive — e.g. from
362
- * `connector.liveView()`/`sessionInfo()` — then call this once it has ended.
363
- *
364
- * Unlike the binding-based helpers, this hits `api.cloudflare.com` directly, so
365
- * it needs an account id and an API token with `Browser Rendering` read access
366
- * (the Workers Browser Run binding cannot read recordings).
367
- */
368
- async function getBrowserRecording(options) {
369
- const { accountId, apiToken, sessionId } = options;
370
- const response = await (options.fetchImpl ?? fetch)(`https://api.cloudflare.com/client/v4/accounts/${accountId}/browser-rendering/recording/${sessionId}`, { headers: { Authorization: `Bearer ${apiToken}` } });
371
- if (!response.ok) throw new BrowserRenderingError(`Failed to fetch Browser Run recording for ${sessionId}: ${response.status}`, response.status);
372
- const payload = await response.json();
373
- return "result" in payload && payload.result ? payload.result : payload;
374
- }
375
- async function connectBrowserSession(browser, sessionId, options) {
376
- const normalized = typeof options === "number" ? { timeoutMs: options } : options ?? {};
377
- const response = await browser.fetch(browserSessionEndpoint(sessionId), { headers: { Upgrade: "websocket" } });
378
- const ws = response.webSocket;
379
- if (!ws) throw new BrowserRenderingError(`Browser Rendering binding did not return a WebSocket for session ${sessionId} (${response.status})`, response.status);
380
- ws.accept();
381
- return new CdpConnection(ws, {
382
- timeoutMs: normalized.timeoutMs,
383
- onClose: normalized.onClose,
384
- sessionId,
385
- onActivity: normalized.onActivity
386
- });
387
- }
388
- //#endregion
389
5
  //#region src/browser/quick-actions.ts
390
6
  function runQuickAction(browser, action, params) {
391
7
  return browser.quickAction(action, params);
@@ -467,222 +83,6 @@ function browserPdf(browser, input) {
467
83
  return quickActionBinary(browser, "pdf", input);
468
84
  }
469
85
  //#endregion
470
- //#region src/browser/live-view.ts
471
- /**
472
- * Browser Run mints `devtoolsFrontendUrl`s (the Live View links) that are
473
- * valid for ~5 minutes. We surface the window so callers can decide how long
474
- * a shared link is good for before re-listing targets.
475
- */
476
- const LIVE_VIEW_URL_TTL_MS = 300 * 1e3;
477
- /**
478
- * Rewrite the hosted Live View UI's `mode` query param (`tab` | `devtools`).
479
- * The raw `devtoolsFrontendUrl` is returned unchanged when no mode is asked
480
- * for or the URL can't be parsed.
481
- */
482
- function applyLiveViewMode(rawUrl, mode) {
483
- if (!mode) return rawUrl;
484
- try {
485
- const url = new URL(rawUrl);
486
- url.searchParams.set("mode", mode === "devtools" ? "devtools" : "tab");
487
- return url.toString();
488
- } catch {
489
- return rawUrl;
490
- }
491
- }
492
- /**
493
- * Project a fresh target listing into Live View links — one per tab that has
494
- * a `devtoolsFrontendUrl`. Pure; the caller supplies just-listed targets.
495
- */
496
- function createLiveView(sessionId, targets, mode) {
497
- return {
498
- sessionId,
499
- targets: targets.filter((target) => target.devtoolsFrontendUrl).map((target) => ({
500
- targetId: target.id,
501
- url: applyLiveViewMode(target.devtoolsFrontendUrl, mode),
502
- pageUrl: target.url,
503
- title: target.title,
504
- type: target.type
505
- })),
506
- expiresInMs: LIVE_VIEW_URL_TTL_MS
507
- };
508
- }
509
- //#endregion
510
- //#region src/browser/spec.ts
511
- const MISSING_BROWSER_CONFIG = "Either 'browser' (Fetcher binding) or 'cdpUrl' must be provided";
512
- const urlSpecCache = /* @__PURE__ */ new Map();
513
- const bindingSpecCache = /* @__PURE__ */ new WeakMap();
514
- const CACHE_TTL_MS = 300 * 1e3;
515
- /** Qualify a same-domain `$ref` (`"FrameId"` → `"Page.FrameId"`). */
516
- function qualifyRef(domain, ref) {
517
- if (ref === void 0) return void 0;
518
- return ref.includes(".") ? ref : `${domain}.${ref}`;
519
- }
520
- function normalizeItems(domain, items) {
521
- if (!items) return void 0;
522
- return {
523
- type: items.type,
524
- $ref: qualifyRef(domain, items.$ref),
525
- enum: items.enum
526
- };
527
- }
528
- function normalizeFields(domain, fields) {
529
- return (fields ?? []).map((field) => ({
530
- name: field.name,
531
- description: field.description,
532
- optional: field.optional,
533
- experimental: field.experimental,
534
- deprecated: field.deprecated,
535
- type: field.type,
536
- $ref: qualifyRef(domain, field.$ref),
537
- enum: field.enum,
538
- items: normalizeItems(domain, field.items)
539
- }));
540
- }
541
- function normalizeCdpSpec(spec) {
542
- return { domains: (spec.domains ?? []).map(({ domain, ...raw }) => ({
543
- name: domain,
544
- description: raw.description,
545
- experimental: raw.experimental,
546
- deprecated: raw.deprecated,
547
- commands: (raw.commands ?? []).map((command) => ({
548
- name: command.name,
549
- method: `${domain}.${command.name}`,
550
- description: command.description,
551
- experimental: command.experimental,
552
- deprecated: command.deprecated,
553
- parameters: normalizeFields(domain, command.parameters),
554
- returns: normalizeFields(domain, command.returns)
555
- })),
556
- events: (raw.events ?? []).map((event) => ({
557
- name: event.name,
558
- event: `${domain}.${event.name}`,
559
- description: event.description,
560
- experimental: event.experimental,
561
- deprecated: event.deprecated,
562
- parameters: normalizeFields(domain, event.parameters)
563
- })),
564
- types: (raw.types ?? []).map((type) => ({
565
- id: type.id,
566
- name: `${domain}.${type.id}`,
567
- description: type.description,
568
- experimental: type.experimental,
569
- deprecated: type.deprecated,
570
- type: type.type,
571
- enum: type.enum,
572
- properties: normalizeFields(domain, type.properties),
573
- items: normalizeItems(domain, type.items)
574
- }))
575
- })) };
576
- }
577
- function getSpecCacheKey(source, headers) {
578
- const headerEntries = Object.entries(headers ?? {}).sort(([a], [b]) => a.localeCompare(b));
579
- return `${source}:${JSON.stringify(headerEntries)}`;
580
- }
581
- async function getCachedSpec(cache, key, load) {
582
- const cached = cache.get(key);
583
- if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) return cached.spec;
584
- const spec = normalizeCdpSpec(await load());
585
- cache.set(key, {
586
- spec,
587
- cachedAt: Date.now()
588
- });
589
- return spec;
590
- }
591
- async function fetchCdpSpecFromUrl(cdpBaseUrl, headers) {
592
- const endpoint = new URL("/json/protocol", cdpBaseUrl).toString();
593
- return getCachedSpec(urlSpecCache, getSpecCacheKey(endpoint, headers), async () => {
594
- const response = await fetch(endpoint, { headers });
595
- if (!response.ok) throw new Error(`Failed to fetch CDP spec from ${endpoint}: ${response.status}`);
596
- return await response.json();
597
- });
598
- }
599
- async function fetchCdpSpecFromSession(browser, sessionId) {
600
- return getCachedSpec(bindingSpecCache, browser, async () => {
601
- const response = await browser.fetch(`https://localhost/v1/devtools/browser/${sessionId}/json/protocol`);
602
- if (!response.ok) throw new Error(`Failed to fetch CDP spec from Browser Rendering: ${response.status}`);
603
- return await response.json();
604
- });
605
- }
606
- async function fetchCdpSpecFromBrowser(browser) {
607
- return getCachedSpec(bindingSpecCache, browser, async () => {
608
- const createResponse = await browser.fetch("https://localhost/v1/devtools/browser", { method: "POST" });
609
- if (!createResponse.ok) throw new Error(`Failed to create Browser Rendering session for protocol fetch: ${createResponse.status}`);
610
- const sessionId = (await createResponse.json()).sessionId;
611
- if (!sessionId) throw new Error("Browser Rendering session response did not include a sessionId");
612
- try {
613
- const response = await browser.fetch(`https://localhost/v1/devtools/browser/${sessionId}/json/protocol`);
614
- if (!response.ok) throw new Error(`Failed to fetch CDP spec from Browser Rendering: ${response.status}`);
615
- return await response.json();
616
- } finally {
617
- try {
618
- await browser.fetch(`https://localhost/v1/devtools/browser/${sessionId}`, { method: "DELETE" });
619
- } catch {}
620
- }
621
- });
622
- }
623
- /** Load the (cached) searchable CDP spec for a browser source. */
624
- async function loadCdpSpec(source) {
625
- if (source.cdpUrl) return fetchCdpSpecFromUrl(source.cdpUrl, source.cdpHeaders);
626
- if (source.browser && source.sessionId) return fetchCdpSpecFromSession(source.browser, source.sessionId);
627
- if (source.browser) return fetchCdpSpecFromBrowser(source.browser);
628
- throw new Error(MISSING_BROWSER_CONFIG);
629
- }
630
- //#endregion
631
- //#region src/browser/session-store.ts
632
- var _DurableBrowserSessionStore_brand = /* @__PURE__ */ new WeakSet();
633
- var DurableBrowserSessionStore = class {
634
- constructor(storage) {
635
- this.storage = storage;
636
- _classPrivateMethodInitSpec(this, _DurableBrowserSessionStore_brand);
637
- }
638
- async acquireLock(key) {
639
- let queues = _queues._.get(this.storage);
640
- if (!queues) {
641
- queues = /* @__PURE__ */ new Map();
642
- _queues._.set(this.storage, queues);
643
- }
644
- const previous = queues.get(key) ?? Promise.resolve();
645
- let releaseQueue = () => void 0;
646
- const current = previous.then(() => new Promise((resolve) => {
647
- releaseQueue = resolve;
648
- }));
649
- queues.set(key, current);
650
- await previous;
651
- let released = false;
652
- return { release: () => {
653
- if (released) return;
654
- released = true;
655
- if (queues.get(key) === current) queues.delete(key);
656
- releaseQueue();
657
- } };
658
- }
659
- async get(key) {
660
- return this.storage.get(_assertClassBrand(_DurableBrowserSessionStore_brand, this, _storageKey).call(this, key));
661
- }
662
- async set(key, session) {
663
- await this.storage.put(_assertClassBrand(_DurableBrowserSessionStore_brand, this, _storageKey).call(this, key), session);
664
- }
665
- async delete(key) {
666
- await this.storage.delete(_assertClassBrand(_DurableBrowserSessionStore_brand, this, _storageKey).call(this, key));
667
- }
668
- async list(prefix) {
669
- const storagePrefix = _assertClassBrand(_DurableBrowserSessionStore_brand, this, _storageKey).call(this, prefix);
670
- const entries = await this.storage.list({ prefix: storagePrefix });
671
- const result = /* @__PURE__ */ new Map();
672
- for (const [storageKey, value] of entries) result.set(storageKey.slice(16), value);
673
- return result;
674
- }
675
- };
676
- function _storageKey(key) {
677
- return `browser-session:${key}`;
678
- }
679
- var _queues = { _: /* @__PURE__ */ new WeakMap() };
680
- /**
681
- * Default idle window used by {@link BrowserConnector.sweep} for the shared
682
- * (reuse/promoted) session entry.
683
- */
684
- const DEFAULT_SWEEP_IDLE_MS = 600 * 1e3;
685
- //#endregion
686
86
  //#region src/browser/connector.ts
687
87
  const EXEC_KEY_PREFIX = "cdp:exec:";
688
88
  /**
@@ -1535,6 +935,6 @@ async function _closeStoredSession(key) {
1535
935
  if (stored) await deleteBrowserSession(browser, stored.sessionId);
1536
936
  }
1537
937
  //#endregion
1538
- export { listBrowserTargets as C, CdpSession as D, CdpProtocolError as E, connectUrl as O, isMissingBrowserSession$1 as S, CdpConnection as T, connectBrowser as _, loadCdpSpec as a, deleteBrowserSession as b, browserExtract as c, browserPdf as d, browserScrape as f, BrowserRenderingError as g, runQuickAction as h, DurableBrowserSessionStore as i, validateConnectorArgs as k, browserLinks as l, browserSnapshot as m, DEFAULT_EXEC_SWEEP_IDLE_MS as n, createLiveView as o, browserScreenshot as p, DEFAULT_SWEEP_IDLE_MS as r, browserContent as s, BrowserConnector as t, browserMarkdown as u, connectBrowserSession as v, CDP_METHOD_NOT_FOUND as w, getBrowserRecording as x, createBrowserSession as y };
938
+ export { browserLinks as a, browserScrape as c, runQuickAction as d, browserExtract as i, browserScreenshot as l, DEFAULT_EXEC_SWEEP_IDLE_MS as n, browserMarkdown as o, browserContent as r, browserPdf as s, BrowserConnector as t, browserSnapshot as u };
1539
939
 
1540
- //# sourceMappingURL=connector-58XDGvc3.js.map
940
+ //# sourceMappingURL=connector-CtZylXdk.js.map