agents 0.30.1 → 0.32.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 (182) hide show
  1. package/README.md +2 -1
  2. package/dist/{agent-routing-CDbpVjYq.d.ts → agent-routing-vVMA7m8Y.d.ts} +69 -608
  3. package/dist/agent-routing.d.ts +1 -1
  4. package/dist/agent-tool-types.d.ts +1 -1
  5. package/dist/{agent-tools-C8DH8Yii.d.ts → agent-tools-gGXXkf1z.d.ts} +2 -2
  6. package/dist/agent-tools.d.ts +1 -1
  7. package/dist/agent-tools.js +0 -1
  8. package/dist/agent-tools.js.map +1 -1
  9. package/dist/{ai-iXw0uOGj.d.ts → ai-CDn3Abax.d.ts} +30 -4
  10. package/dist/{ai-sdk-DRPh2rRa.js → ai-sdk-Kon40i0q.js} +2 -36
  11. package/dist/ai-sdk-Kon40i0q.js.map +1 -0
  12. package/dist/browser/ai.d.ts +1 -1
  13. package/dist/browser/ai.js +16 -3
  14. package/dist/browser/ai.js.map +1 -1
  15. package/dist/browser/index.d.ts +64 -16
  16. package/dist/browser/index.js +4 -4
  17. package/dist/browser/tools/ai-sdk.d.ts +7 -5
  18. package/dist/browser/tools/ai-sdk.js +4 -4
  19. package/dist/browser/tools/ai-sdk.js.map +1 -1
  20. package/dist/browser/tools/pi.d.ts +9 -15
  21. package/dist/browser/tools/pi.js +6 -14
  22. package/dist/browser/tools/pi.js.map +1 -1
  23. package/dist/browser/tools/tanstack-ai.d.ts +48 -25
  24. package/dist/browser/tools/tanstack-ai.js +8 -4
  25. package/dist/browser/tools/tanstack-ai.js.map +1 -1
  26. package/dist/{browser-DccPw_wW.js → browser-1eUbPvC2.js} +413 -14
  27. package/dist/browser-1eUbPvC2.js.map +1 -0
  28. package/dist/{browser-DlXhSAdf.d.ts → browser-D9RNpJuT.d.ts} +254 -20
  29. package/dist/browser-tool-BhjCcNVE.d.ts +71 -0
  30. package/dist/browser-tool-DRan7Lk6.js +497 -0
  31. package/dist/browser-tool-DRan7Lk6.js.map +1 -0
  32. package/dist/capability-id-B3J8Nok_.js +13 -0
  33. package/dist/capability-id-B3J8Nok_.js.map +1 -0
  34. package/dist/catalog-BpOejOsE.js +239 -0
  35. package/dist/catalog-BpOejOsE.js.map +1 -0
  36. package/dist/catalog-BpiVV1OF.d.ts +173 -0
  37. package/dist/chat/index.d.ts +2 -2
  38. package/dist/chat-sdk/index.d.ts +3 -3
  39. package/dist/chat-sdk/index.js +1 -1
  40. package/dist/client-4OlMIJx-.js.map +1 -1
  41. package/dist/{client-BnYbNT3z.js → client-DMWujQJ1.js} +68 -244
  42. package/dist/client-DMWujQJ1.js.map +1 -0
  43. package/dist/{client-C27CtRZr.d.ts → client-eSfgYvd3.d.ts} +9 -7
  44. package/dist/client.d.ts +1 -1
  45. package/dist/{cloudflare-Dzvc7V2N.js → cloudflare-CUUm_9q9.js} +26 -4
  46. package/dist/cloudflare-CUUm_9q9.js.map +1 -0
  47. package/dist/{connector-DAXBOIIi.js → connector-CM-uuxKM.js} +96 -8
  48. package/dist/connector-CM-uuxKM.js.map +1 -0
  49. package/dist/{connector-20DJ6p4k.d.ts → connector-DZ71EjE-.d.ts} +109 -9
  50. package/dist/{do-oauth-client-provider-DfsUcpc3.d.ts → do-oauth-client-provider-DtNqv7oj.d.ts} +26 -2
  51. package/dist/{index-YSKgfgg9.d.ts → emitter-BJZtCVjQ.d.ts} +6 -140
  52. package/dist/emitter-DPOVcCln.js +15 -0
  53. package/dist/emitter-DPOVcCln.js.map +1 -0
  54. package/dist/experimental/channels/web/index.js +1 -1
  55. package/dist/experimental/webmcp.js +1 -1
  56. package/dist/{handler-stateless-Bly_nSH3.js → handler-stateless-B5hU3dxK.js} +35 -2
  57. package/dist/handler-stateless-B5hU3dxK.js.map +1 -0
  58. package/dist/{handler-stateless-DxYpJ_XF.d.ts → handler-stateless-C90kD5_R.d.ts} +3 -47
  59. package/dist/harness/container/index.d.ts +15 -15
  60. package/dist/harness/container/index.js +0 -1
  61. package/dist/harness/container/index.js.map +1 -1
  62. package/dist/harness/container/runtime/index.js +2 -2
  63. package/dist/harness/opencode/index.js +0 -1
  64. package/dist/harness/opencode/index.js.map +1 -1
  65. package/dist/harness/pi/index.d.ts +15 -7
  66. package/dist/harness/pi/index.js +74 -151
  67. package/dist/harness/pi/index.js.map +1 -1
  68. package/dist/harness/think/index.d.ts +2 -1
  69. package/dist/{images-xaDv2Fqe.js → images-CfuRCjwq.js} +1 -5
  70. package/dist/images-CfuRCjwq.js.map +1 -0
  71. package/dist/{index-DCxk3OSJ.d.ts → index-8k4qsX1T.d.ts} +2 -28
  72. package/dist/index.d.ts +15 -16
  73. package/dist/index.js +3 -3
  74. package/dist/internal-hosts-Kfp5A392.d.ts +230 -0
  75. package/dist/internal-kmw70xwR.js.map +1 -1
  76. package/dist/invoker-BC1SZ3q1.js +26 -0
  77. package/dist/invoker-BC1SZ3q1.js.map +1 -0
  78. package/dist/invoker-DoLFPJZV.d.ts +21 -0
  79. package/dist/markdown-BZ-VLtA1.js +86 -0
  80. package/dist/markdown-BZ-VLtA1.js.map +1 -0
  81. package/dist/mcp/client/do-oauth-client-provider.d.ts +4 -2
  82. package/dist/mcp/client/do-oauth-client-provider.js +15 -1
  83. package/dist/mcp/client/do-oauth-client-provider.js.map +1 -1
  84. package/dist/mcp/client/index.d.ts +15 -1
  85. package/dist/mcp/client/index.js +2 -2
  86. package/dist/mcp/client/x402.d.ts +7 -5
  87. package/dist/mcp/client/x402.js +34 -1
  88. package/dist/mcp/client/x402.js.map +1 -1
  89. package/dist/mcp/index.d.ts +561 -27
  90. package/dist/mcp/index.js +180 -3
  91. package/dist/mcp/index.js.map +1 -1
  92. package/dist/mcp/server/index.d.ts +1 -1
  93. package/dist/mcp/server/index.js +1 -1
  94. package/dist/models/ai-sdk/index.d.ts +2 -2
  95. package/dist/models/ai-sdk/index.js +1 -1
  96. package/dist/models/opencode/index.d.ts +2 -2
  97. package/dist/models/opencode/index.js +1 -1
  98. package/dist/models/pi-ai/index.d.ts +3 -28
  99. package/dist/models/pi-ai/index.js +160 -18
  100. package/dist/models/pi-ai/index.js.map +1 -1
  101. package/dist/observability/ai/index.js +1 -2
  102. package/dist/observability/ai/index.js.map +1 -1
  103. package/dist/observability/index.d.ts +170 -9
  104. package/dist/observability/index.js +386 -11
  105. package/dist/observability/index.js.map +1 -1
  106. package/dist/protocol-BEgrJYC5.d.ts +29 -29
  107. package/dist/react.d.ts +2 -2
  108. package/dist/resource-B59OV2a2.js +325 -0
  109. package/dist/resource-B59OV2a2.js.map +1 -0
  110. package/dist/routing/index.d.ts +1 -1
  111. package/dist/script-CFDLTk5b.d.ts +91 -0
  112. package/dist/script-workspace-BpdAYq1R.d.ts +41 -0
  113. package/dist/serializable.d.ts +1 -1
  114. package/dist/{session-store-yvwq1f9x.js → session-7CDgVE0z.js} +455 -33
  115. package/dist/session-7CDgVE0z.js.map +1 -0
  116. package/dist/{session-store-_IK6dV-w.d.ts → session-store-B7Ca-u1t.d.ts} +8 -1
  117. package/dist/settings-Dk2il2Hf.js.map +1 -1
  118. package/dist/skill-DRBcIBjC.d.ts +221 -0
  119. package/dist/skills/index.d.ts +275 -36
  120. package/dist/skills/index.js +265 -1534
  121. package/dist/skills/index.js.map +1 -1
  122. package/dist/skills/runner.d.ts +37 -0
  123. package/dist/skills/runner.js +912 -0
  124. package/dist/skills/runner.js.map +1 -0
  125. package/dist/skills/tools/ai-sdk.d.ts +36 -0
  126. package/dist/skills/tools/ai-sdk.js +94 -0
  127. package/dist/skills/tools/ai-sdk.js.map +1 -0
  128. package/dist/source-9RQzlEhM.d.ts +112 -0
  129. package/dist/{src-DfLzdwlK.js → src-DoGNJ4Ud.js} +21 -6
  130. package/dist/src-DoGNJ4Ud.js.map +1 -0
  131. package/dist/sub-routing.d.ts +12 -12
  132. package/dist/tool-CTp72Jb_.d.ts +10 -10
  133. package/dist/tool-CxKsvxjm.js.map +1 -1
  134. package/dist/tool-DkT_DJBm.js.map +1 -1
  135. package/dist/tool-DoVberpN.d.ts +22 -22
  136. package/dist/tool-helpers-BI7ifO2S.js +255 -0
  137. package/dist/tool-helpers-BI7ifO2S.js.map +1 -0
  138. package/dist/{transport-CPh7YGiw.d.ts → transport-5moD2pW5.d.ts} +1 -43
  139. package/dist/types-D2naO3rA.d.ts +49 -0
  140. package/dist/vite.d.ts +2 -2
  141. package/dist/vite.js +10 -258
  142. package/dist/vite.js.map +1 -1
  143. package/dist/voice/index.d.ts +1 -1
  144. package/dist/websockets/index.js +1 -1
  145. package/dist/{websockets-CyoeosdO.js → websockets-C6SJtWCJ.js} +1 -2
  146. package/dist/{websockets-CyoeosdO.js.map → websockets-C6SJtWCJ.js.map} +1 -1
  147. package/dist/workflow-types.d.ts +1 -1
  148. package/dist/workflows.d.ts +1 -1
  149. package/dist/workflows.js +0 -1
  150. package/dist/workflows.js.map +1 -1
  151. package/docs/browse-the-web.md +247 -413
  152. package/docs/harnesses/pi.md +36 -30
  153. package/docs/index.md +4 -4
  154. package/docs/mcp-client.md +25 -1
  155. package/docs/mcp-servers.md +26 -7
  156. package/docs/models-pi-ai.md +9 -11
  157. package/docs/models.md +1 -8
  158. package/docs/observability.md +5 -3
  159. package/docs/securing-mcp-servers.md +113 -302
  160. package/package.json +31 -17
  161. package/dist/ai-sdk-DRPh2rRa.js.map +0 -1
  162. package/dist/browser-DccPw_wW.js.map +0 -1
  163. package/dist/browser-tool-B1mhifin.js +0 -616
  164. package/dist/browser-tool-B1mhifin.js.map +0 -1
  165. package/dist/browser-tool-Cxjk5sgG.d.ts +0 -92
  166. package/dist/client-BnYbNT3z.js.map +0 -1
  167. package/dist/cloudflare-Dzvc7V2N.js.map +0 -1
  168. package/dist/connector-DAXBOIIi.js.map +0 -1
  169. package/dist/handler-stateless-Bly_nSH3.js.map +0 -1
  170. package/dist/images-xaDv2Fqe.js.map +0 -1
  171. package/dist/index-iv9FTXX9.d.ts +0 -311
  172. package/dist/invoker-CG0_p_Wq.d.ts +0 -20
  173. package/dist/invoker-CHMnoxIA.js +0 -57
  174. package/dist/invoker-CHMnoxIA.js.map +0 -1
  175. package/dist/session-store-yvwq1f9x.js.map +0 -1
  176. package/dist/skills/compile.d.ts +0 -40
  177. package/dist/skills/compile.js +0 -65
  178. package/dist/skills/compile.js.map +0 -1
  179. package/dist/src-DfLzdwlK.js.map +0 -1
  180. package/dist/tool-helpers-O5BDVEAY.js +0 -58
  181. package/dist/tool-helpers-O5BDVEAY.js.map +0 -1
  182. package/skills-module.d.ts +0 -22
@@ -1,311 +0,0 @@
1
- import { ToolSet } from "ai";
2
-
3
- //#region src/skills/frontmatter.d.ts
4
- interface ParsedSkillMarkdown {
5
- data: Record<string, unknown>;
6
- body: string;
7
- }
8
- declare function parseSkillFrontmatter(raw: string): ParsedSkillMarkdown;
9
- declare function parseSkillMarkdown(raw: string): {
10
- name: string;
11
- description: string;
12
- body: string;
13
- compatibility?: string;
14
- license?: string;
15
- allowedTools?: string;
16
- metadata?: Record<string, unknown>;
17
- } | null;
18
- //#endregion
19
- //#region src/skills/types.d.ts
20
- interface SkillDescriptor {
21
- name: string;
22
- description: string;
23
- compatibility?: string;
24
- license?: string;
25
- allowedTools?: string;
26
- metadata?: Record<string, unknown>;
27
- sourceId?: string;
28
- version?: string;
29
- }
30
- interface SkillContent extends SkillDescriptor {
31
- body: string;
32
- rawContent?: string;
33
- resources?: SkillResourceDescriptor[];
34
- }
35
- interface SkillResourceDescriptor {
36
- path: string;
37
- kind: "reference" | "script" | "asset" | "file";
38
- size?: number;
39
- encoding?: "text" | "base64";
40
- mimeType?: string;
41
- /**
42
- * Set when a script resource was compiled to a self-contained JavaScript
43
- * module ahead of time — by the Agents Vite plugin for bundled skills, or via
44
- * `compileSkillScript` from `agents/skills/compile` for R2/dynamic skills. The
45
- * runtime runs precompiled scripts directly; the runtime ships no in-Worker
46
- * bundler, so non-precompiled TypeScript or multi-file scripts cannot run.
47
- */
48
- precompiled?: boolean;
49
- }
50
- interface SkillResource extends SkillResourceDescriptor {
51
- content: string;
52
- }
53
- interface SkillScriptContext {
54
- skill: SkillDescriptor;
55
- }
56
- /**
57
- * The `ctx` object passed as the second argument to function-style JS/TS
58
- * skill scripts (`export default async function run(input, ctx)`).
59
- *
60
- * Capabilities are gated by the runner: `workspace` throws unless workspace
61
- * access is enabled, and `tools` only resolves tools the runner was given.
62
- */
63
- interface SkillRunContext {
64
- /** Metadata for the skill that owns this script. */
65
- skill: SkillDescriptor;
66
- /** Text bundled resources by relative path (e.g. `references/style-guide.md`). */
67
- files: Record<string, string>;
68
- /** Workspace access, gated by the runner's `workspace` permission. */
69
- workspace: {
70
- readFile(path: string): Promise<string | null>;
71
- listFiles(path?: string): Promise<unknown>;
72
- glob(pattern: string): Promise<unknown>;
73
- stat(path: string): Promise<{
74
- type: string;
75
- size: number;
76
- } | null>;
77
- writeFile(path: string, content: string): Promise<void>;
78
- };
79
- /** Explicitly granted tools: `tools.call(name, input)` or `tools.<name>(input)`. */
80
- tools: {
81
- call(name: string, input?: unknown): Promise<unknown>;
82
- } & Record<string, (input?: unknown) => Promise<unknown>>;
83
- /** Scratch artifacts returned to the model as `outputFiles`. */
84
- output: {
85
- writeFile(name: string, content: string): Promise<void>;
86
- };
87
- }
88
- interface SkillScriptRequest {
89
- skill: SkillContent;
90
- path: string;
91
- source: string;
92
- input: unknown;
93
- resources?: SkillResource[];
94
- }
95
- interface SkillScriptRunner {
96
- run(request: SkillScriptRequest): Promise<unknown>;
97
- }
98
- interface SkillSource {
99
- id: string;
100
- fingerprint: string;
101
- list(): Promise<SkillDescriptor[]>;
102
- load(name: string): Promise<SkillContent | null>;
103
- readResource?(name: string, path: string): Promise<SkillResource | null>;
104
- refresh?(): Promise<void>;
105
- }
106
- interface SkillManifestResource extends SkillResourceDescriptor {
107
- content: string;
108
- }
109
- interface SkillManifestEntry {
110
- name: string;
111
- description: string;
112
- body: string;
113
- rawContent?: string;
114
- compatibility?: string;
115
- license?: string;
116
- allowedTools?: string;
117
- metadata?: Record<string, unknown>;
118
- version?: string;
119
- resources?: SkillManifestResource[];
120
- }
121
- interface SkillManifest {
122
- id: string;
123
- fingerprint: string;
124
- skills: SkillManifestEntry[];
125
- }
126
- interface SkillRegistrySnapshot {
127
- fingerprint: string;
128
- catalogPrompt: string | null;
129
- }
130
- //#endregion
131
- //#region src/skills/manifest.d.ts
132
- declare function fromManifest(manifest: SkillManifest): SkillSource;
133
- //#endregion
134
- //#region src/skills/r2.d.ts
135
- interface R2SkillSourceOptions {
136
- prefix?: string;
137
- skills?: string[];
138
- id?: string;
139
- fingerprint?: "metadata" | "content";
140
- refreshIntervalMs?: number;
141
- }
142
- declare function r2(
143
- bucket: R2Bucket,
144
- options?: R2SkillSourceOptions
145
- ): SkillSource;
146
- //#endregion
147
- //#region src/skills/workspace.d.ts
148
- /**
149
- * The Workspace Agent Skills read and write: a `Workspace` from
150
- * `@cloudflare/computer`, or anything with the same `fs` methods.
151
- */
152
- interface SkillWorkspace {
153
- readonly fs: {
154
- stat(path: string): Promise<{
155
- size: number;
156
- isDirectory: boolean;
157
- }>;
158
- readFile(path: string): Promise<ReadableStream<Uint8Array>>;
159
- writeFile(path: string, content: Uint8Array): Promise<void>;
160
- mkdir(
161
- path: string,
162
- options?: {
163
- recursive?: boolean;
164
- }
165
- ): Promise<void>;
166
- readdir(path: string): Promise<
167
- Array<{
168
- name: string;
169
- size: number;
170
- isDirectory: boolean;
171
- }>
172
- >;
173
- find(
174
- directory: string,
175
- pattern?: string
176
- ): Promise<
177
- Array<{
178
- path: string;
179
- type: "file" | "dir";
180
- }>
181
- >;
182
- };
183
- }
184
- /** Options for projecting Agent Skills into a Workspace. */
185
- interface SkillWorkspaceSeedOptions {
186
- /** Destination directory. Defaults to `/workspace/.agents/skills`. */
187
- readonly root?: string;
188
- /** Existing-file policy. Default `"preserve"` keeps Workspace edits. */
189
- readonly onConflict?: "preserve" | "replace";
190
- }
191
- /** Summary returned after projecting Agent Skills into a Workspace. */
192
- interface SkillWorkspaceSeedResult {
193
- /** Files written from source content. */
194
- readonly written: number;
195
- /** Existing files preserved without a write. */
196
- readonly preserved: number;
197
- /** Files skipped because their source content could not be read or written. */
198
- readonly skipped: number;
199
- /** Non-fatal per-file diagnostics. */
200
- readonly warnings: readonly string[];
201
- /** Absolute Workspace directory containing the projected skills. */
202
- readonly root: string;
203
- }
204
- //#endregion
205
- //#region src/skills/runner.d.ts
206
- /**
207
- * Options for {@link runner}.
208
- *
209
- * @experimental Skill script execution is experimental and the option shape
210
- * may change before stabilizing.
211
- */
212
- interface WorkerSkillScriptRunnerOptions {
213
- loader: WorkerLoader;
214
- timeout?: number;
215
- network?: boolean;
216
- workspace?: "none" | "read" | "read-write";
217
- workspaceInstance?: SkillWorkspace;
218
- tools?: ToolSet | (() => ToolSet | Promise<ToolSet>);
219
- }
220
- /**
221
- * Create a skill script runner backed by a Worker Loader.
222
- *
223
- * Capabilities are opt-in and enforced by a single host bridge: no network and
224
- * no tools by default, read-only workspace access when `workspaceInstance` is
225
- * provided. JS/TS scripts are function-style (`export default run(input, ctx)`)
226
- * and receive `ctx = { skill, files, workspace, tools, output }`. Python and
227
- * Bash use the path-based `/skill`, `/input.json`, `/output` contract.
228
- *
229
- * @experimental Skill script execution is experimental and may change before
230
- * stabilizing.
231
- */
232
- declare function runner(
233
- options: WorkerSkillScriptRunnerOptions
234
- ): SkillScriptRunner;
235
- //#endregion
236
- //#region src/skills/registry.d.ts
237
- declare class SkillRegistry {
238
- readonly contextLabel = "think_skills";
239
- /**
240
- * Non-fatal diagnostics collected during the most recent {@link load} or
241
- * {@link refresh} (duplicate skill names, sources that failed to list).
242
- * Reset on every load so it never grows unbounded across refreshes.
243
- */
244
- readonly warnings: string[];
245
- private sources;
246
- private scriptRunner;
247
- private descriptors;
248
- private sourceBySkill;
249
- private loaded;
250
- private workspaceFiles;
251
- private workspaceSkillNames;
252
- private workspaceResources;
253
- constructor(sources: SkillSource[], scriptRunner?: SkillScriptRunner | null);
254
- get fingerprint(): string;
255
- load(): Promise<void>;
256
- refresh(): Promise<void>;
257
- /**
258
- * Seed resolved Agent Skills into a Workspace.
259
- * Existing files are preserved by default, and become authoritative for
260
- * activation, resource reads, and script execution.
261
- */
262
- seedWorkspace(
263
- workspace: SkillWorkspace,
264
- options?: SkillWorkspaceSeedOptions
265
- ): Promise<SkillWorkspaceSeedResult>;
266
- /**
267
- * Route skill reads through an already-seeded Workspace without probing or
268
- * rewriting its files. Hosts use this when the durable source fingerprint
269
- * matches the recorded projection fingerprint.
270
- */
271
- useWorkspace(
272
- workspace: SkillWorkspace,
273
- options?: SkillWorkspaceSeedOptions
274
- ): Promise<void>;
275
- private writeSeedFile;
276
- snapshot(): Promise<SkillRegistrySnapshot>;
277
- systemPrompt(): Promise<string | null>;
278
- loadSkill(name: string): Promise<SkillContent | null>;
279
- private resolveResourceTarget;
280
- private readResource;
281
- private readSkillResources;
282
- tools(): ToolSet;
283
- }
284
- //#endregion
285
- export {
286
- parseSkillFrontmatter as C,
287
- SkillSource as S,
288
- SkillResourceDescriptor as _,
289
- SkillWorkspaceSeedOptions as a,
290
- SkillScriptRequest as b,
291
- r2 as c,
292
- SkillDescriptor as d,
293
- SkillManifest as f,
294
- SkillResource as g,
295
- SkillRegistrySnapshot as h,
296
- SkillWorkspace as i,
297
- fromManifest as l,
298
- SkillManifestResource as m,
299
- WorkerSkillScriptRunnerOptions as n,
300
- SkillWorkspaceSeedResult as o,
301
- SkillManifestEntry as p,
302
- runner as r,
303
- R2SkillSourceOptions as s,
304
- SkillRegistry as t,
305
- SkillContent as u,
306
- SkillRunContext as v,
307
- parseSkillMarkdown as w,
308
- SkillScriptRunner as x,
309
- SkillScriptContext as y
310
- };
311
- //# sourceMappingURL=index-iv9FTXX9.d.ts.map
@@ -1,20 +0,0 @@
1
- import {
2
- CallToolRequest,
3
- CallToolRequestOptions,
4
- Client
5
- } from "@modelcontextprotocol/client";
6
- import {
7
- CallToolResult,
8
- CallToolResultSchema,
9
- CompatibilityCallToolResultSchema
10
- } from "@modelcontextprotocol/sdk/types.js";
11
- import { Client as Client$1 } from "@modelcontextprotocol/sdk/client/index.js";
12
-
13
- //#region src/mcp/client/invoker.d.ts
14
- type LegacyCallToolResultSchema =
15
- | typeof CallToolResultSchema
16
- | typeof CompatibilityCallToolResultSchema;
17
- type CompatibleMcpClient = Client | Client$1;
18
- //#endregion
19
- export { LegacyCallToolResultSchema as n, CompatibleMcpClient as t };
20
- //# sourceMappingURL=invoker-CG0_p_Wq.d.ts.map
@@ -1,57 +0,0 @@
1
- //#region src/mcp/client/invoker.ts
2
- function isLegacyResultSchema(value) {
3
- return typeof value?.parse === "function";
4
- }
5
- function normalizeCallToolArguments(schemaOrOptions, options) {
6
- return isLegacyResultSchema(schemaOrOptions) ? {
7
- schema: schemaOrOptions,
8
- options
9
- } : { options: schemaOrOptions ?? options };
10
- }
11
- /**
12
- * Invoke SDK v2 while preserving the deprecated v1 result-schema overload.
13
- * The v2 request funnel still owns decoding and automatic MRTR.
14
- */
15
- function callV2Tool(client, params, schemaOrOptions, options) {
16
- const normalized = normalizeCallToolArguments(schemaOrOptions, options);
17
- if (normalized.schema) return client.request({
18
- method: "tools/call",
19
- params
20
- }, normalized.schema, normalized.options);
21
- return client.callTool(params, normalized.options);
22
- }
23
- /**
24
- * Bind the original methods before decorators such as x402 replace them. All
25
- * generation-specific calling conventions stay behind this small interface.
26
- */
27
- function bindMcpClient(client) {
28
- if ("getProtocolEra" in client && typeof client.getProtocolEra === "function") {
29
- const v2Client = client;
30
- const listTools = v2Client.listTools.bind(v2Client);
31
- const callTool = v2Client.callTool.bind(v2Client);
32
- return {
33
- listTools: (params, options) => listTools(params, options),
34
- callTool: (params, schemaOrOptions, options) => {
35
- const normalized = normalizeCallToolArguments(schemaOrOptions, options);
36
- return normalized.schema ? v2Client.request({
37
- method: "tools/call",
38
- params
39
- }, normalized.schema, normalized.options) : callTool(params, normalized.options);
40
- }
41
- };
42
- }
43
- const legacy = client;
44
- const listTools = legacy.listTools.bind(legacy);
45
- const callTool = legacy.callTool.bind(legacy);
46
- return {
47
- listTools: (params, options) => listTools(params, options),
48
- callTool: (params, schemaOrOptions, options) => {
49
- const normalized = normalizeCallToolArguments(schemaOrOptions, options);
50
- return callTool(params, normalized.schema, normalized.options);
51
- }
52
- };
53
- }
54
- //#endregion
55
- export { callV2Tool as n, bindMcpClient as t };
56
-
57
- //# sourceMappingURL=invoker-CHMnoxIA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoker-CHMnoxIA.js","names":[],"sources":["../src/mcp/client/invoker.ts"],"sourcesContent":["import type {\n CallToolRequest,\n CallToolRequestOptions,\n CallToolResult,\n Client,\n ListToolsResult\n} from \"@modelcontextprotocol/client\";\nimport type { Client as LegacyClient } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type {\n CallToolResult as LegacyCallToolResult,\n CallToolResultSchema,\n CompatibilityCallToolResultSchema,\n ListToolsRequest\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { RequestOptions as LegacyRequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\n\nexport type LegacyCallToolResultSchema =\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema;\n\nexport type CallToolSchemaOrOptions =\n | LegacyCallToolResultSchema\n | CallToolRequestOptions;\n\nexport type CompatibleMcpClient = Client | LegacyClient;\n\nexport interface BoundMcpClientInvoker {\n listTools(\n params?: ListToolsRequest[\"params\"],\n options?: CallToolRequestOptions\n ): Promise<ListToolsResult>;\n callTool(\n params: CallToolRequest[\"params\"],\n schemaOrOptions?: CallToolSchemaOrOptions,\n options?: CallToolRequestOptions\n ): Promise<LegacyCallToolResult>;\n}\n\nfunction isLegacyResultSchema(\n value: CallToolSchemaOrOptions | undefined\n): value is LegacyCallToolResultSchema {\n return (\n typeof (value as { parse?: unknown } | undefined)?.parse === \"function\"\n );\n}\n\nfunction normalizeCallToolArguments(\n schemaOrOptions?: CallToolSchemaOrOptions,\n options?: CallToolRequestOptions\n): {\n schema?: LegacyCallToolResultSchema;\n options?: CallToolRequestOptions;\n} {\n return isLegacyResultSchema(schemaOrOptions)\n ? { schema: schemaOrOptions, options }\n : { options: schemaOrOptions ?? options };\n}\n\n/**\n * Invoke SDK v2 while preserving the deprecated v1 result-schema overload.\n * The v2 request funnel still owns decoding and automatic MRTR.\n */\nexport function callV2Tool(\n client: Client,\n params: CallToolRequest[\"params\"],\n schemaOrOptions?: CallToolSchemaOrOptions,\n options?: CallToolRequestOptions\n): Promise<CallToolResult> {\n const normalized = normalizeCallToolArguments(schemaOrOptions, options);\n if (normalized.schema) {\n return client.request(\n { method: \"tools/call\", params },\n normalized.schema as never,\n normalized.options\n ) as Promise<CallToolResult>;\n }\n return client.callTool(params, normalized.options);\n}\n\n/**\n * Bind the original methods before decorators such as x402 replace them. All\n * generation-specific calling conventions stay behind this small interface.\n */\nexport function bindMcpClient(\n client: CompatibleMcpClient\n): BoundMcpClientInvoker {\n const isV2 =\n \"getProtocolEra\" in client &&\n typeof (client as { getProtocolEra?: unknown }).getProtocolEra ===\n \"function\";\n\n if (isV2) {\n const v2Client = client as Client;\n const listTools = v2Client.listTools.bind(v2Client);\n const callTool = v2Client.callTool.bind(v2Client);\n return {\n listTools: (params, options) => listTools(params, options),\n callTool: (params, schemaOrOptions, options) => {\n const normalized = normalizeCallToolArguments(schemaOrOptions, options);\n const pending = normalized.schema\n ? v2Client.request(\n { method: \"tools/call\", params },\n normalized.schema as never,\n normalized.options\n )\n : callTool(params, normalized.options);\n return pending as Promise<LegacyCallToolResult>;\n }\n };\n }\n\n const legacy = client as LegacyClient;\n const listTools = legacy.listTools.bind(legacy);\n const callTool = legacy.callTool.bind(legacy);\n return {\n listTools: (params, options) =>\n listTools(\n params,\n options as LegacyRequestOptions\n ) as Promise<ListToolsResult>,\n callTool: (params, schemaOrOptions, options) => {\n const normalized = normalizeCallToolArguments(schemaOrOptions, options);\n return callTool(\n params as Parameters<LegacyClient[\"callTool\"]>[0],\n normalized.schema,\n normalized.options as LegacyRequestOptions\n ) as Promise<LegacyCallToolResult>;\n }\n };\n}\n"],"mappings":";AAsCA,SAAS,qBACP,OACqC;CACrC,OACE,OAAQ,OAA2C,UAAU;AAEjE;AAEA,SAAS,2BACP,iBACA,SAIA;CACA,OAAO,qBAAqB,eAAe,IACvC;EAAE,QAAQ;EAAiB;CAAQ,IACnC,EAAE,SAAS,mBAAmB,QAAQ;AAC5C;;;;;AAMA,SAAgB,WACd,QACA,QACA,iBACA,SACyB;CACzB,MAAM,aAAa,2BAA2B,iBAAiB,OAAO;CACtE,IAAI,WAAW,QACb,OAAO,OAAO,QACZ;EAAE,QAAQ;EAAc;CAAO,GAC/B,WAAW,QACX,WAAW,OACb;CAEF,OAAO,OAAO,SAAS,QAAQ,WAAW,OAAO;AACnD;;;;;AAMA,SAAgB,cACd,QACuB;CAMvB,IAJE,oBAAoB,UACpB,OAAQ,OAAwC,mBAC9C,YAEM;EACR,MAAM,WAAW;EACjB,MAAM,YAAY,SAAS,UAAU,KAAK,QAAQ;EAClD,MAAM,WAAW,SAAS,SAAS,KAAK,QAAQ;EAChD,OAAO;GACL,YAAY,QAAQ,YAAY,UAAU,QAAQ,OAAO;GACzD,WAAW,QAAQ,iBAAiB,YAAY;IAC9C,MAAM,aAAa,2BAA2B,iBAAiB,OAAO;IAQtE,OAPgB,WAAW,SACvB,SAAS,QACP;KAAE,QAAQ;KAAc;IAAO,GAC/B,WAAW,QACX,WAAW,OACb,IACA,SAAS,QAAQ,WAAW,OAAO;GAEzC;EACF;CACF;CAEA,MAAM,SAAS;CACf,MAAM,YAAY,OAAO,UAAU,KAAK,MAAM;CAC9C,MAAM,WAAW,OAAO,SAAS,KAAK,MAAM;CAC5C,OAAO;EACL,YAAY,QAAQ,YAClB,UACE,QACA,OACF;EACF,WAAW,QAAQ,iBAAiB,YAAY;GAC9C,MAAM,aAAa,2BAA2B,iBAAiB,OAAO;GACtE,OAAO,SACL,QACA,WAAW,QACX,WAAW,OACb;EACF;CACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-store-yvwq1f9x.js","names":[],"sources":["../src/browser/cdp-connection.ts","../src/browser/browser-run.ts","../src/browser/connector-validation.ts","../src/browser/live-view.ts","../src/browser/spec.ts","../src/browser/session-store.ts"],"sourcesContent":["interface PendingCommand {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n method: string;\n sessionId?: string;\n startedAt: number;\n}\n\ninterface DebugEntry {\n at: string;\n type: string;\n [key: string]: unknown;\n}\n\nexport interface CdpSendOptions {\n timeoutMs?: number;\n sessionId?: string;\n}\n\nexport interface CdpAttachOptions {\n timeoutMs?: number;\n}\n\n/** Construction options for {@link CdpConnection}. */\nexport interface CdpConnectionOptions {\n /** Default per-command timeout. Defaults to 10 seconds. */\n timeoutMs?: number;\n /**\n * Invoked exactly once when the session reaches a terminal state — an\n * explicit `close()`, peer closure, or a socket error.\n */\n onClose?: () => void;\n /** Browser Run session id, when connected to a session-scoped browser. */\n sessionId?: string;\n /** Invoked on every CDP command sent — an activity signal for idle tracking. */\n onActivity?: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n/** JSON-RPC's \"method not found\" code, which Chrome also uses for CDP. */\nexport const CDP_METHOD_NOT_FOUND = -32601;\n\n/** The browser answered a command with a JSON-RPC error. */\nexport class CdpProtocolError extends Error {\n override readonly name = \"CdpProtocolError\";\n /** JSON-RPC error code, e.g. {@link CDP_METHOD_NOT_FOUND}. */\n readonly code: number | undefined;\n /** The CDP method that failed. */\n readonly method: string;\n\n constructor(method: string, code: number | undefined, message: string) {\n super(`CDP error ${code ?? \"unknown\"}: ${message} for ${method}`);\n this.code = code;\n this.method = method;\n }\n}\nconst MAX_DEBUG_ENTRIES = 400;\n\n/**\n * One Chrome DevTools Protocol connection over an open WebSocket. Manages\n * command correlation, timeouts, per-tab CDP sessions, and a debug event\n * ring buffer.\n *\n * Used host-side (not in the sandbox) — the sandbox calls into this\n * via DynamicWorkerExecutor's ToolDispatcher RPC.\n */\nexport class CdpConnection {\n #socket: WebSocket;\n #nextId = 1;\n #pending = new Map<number, PendingCommand>();\n #debugLog: DebugEntry[] = [];\n #defaultTimeoutMs: number;\n #dispose?: () => void;\n #disposed = false;\n #onActivity?: () => void;\n readonly sessionId?: string;\n\n constructor(socket: WebSocket, options?: CdpConnectionOptions);\n /**\n * @deprecated Pass a {@link CdpConnectionOptions} object instead —\n * `new CdpConnection(socket, { timeoutMs, onClose, sessionId })`. The\n * positional form will be removed.\n */\n constructor(\n socket: WebSocket,\n timeoutMs?: number,\n onClose?: () => void,\n sessionId?: string\n );\n constructor(\n socket: WebSocket,\n optionsOrTimeoutMs?: CdpConnectionOptions | number,\n onClose?: () => void,\n sessionId?: string\n ) {\n const options: CdpConnectionOptions =\n typeof optionsOrTimeoutMs === \"object\"\n ? optionsOrTimeoutMs\n : { timeoutMs: optionsOrTimeoutMs, onClose, sessionId };\n this.#socket = socket;\n this.#defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.#dispose = options.onClose;\n this.sessionId = options.sessionId;\n this.#onActivity = options.onActivity;\n\n socket.addEventListener(\"message\", (event) => this.#handleMessage(event));\n socket.addEventListener(\"error\", () => {\n this.#rejectAll(new Error(\"CDP socket error\"));\n this.#runDispose();\n });\n socket.addEventListener(\"close\", () => {\n this.#rejectAll(new Error(\"CDP connection closed\"));\n this.#runDispose();\n });\n }\n\n send(\n method: string,\n params?: unknown,\n options: CdpSendOptions = {}\n ): Promise<unknown> {\n this.#onActivity?.();\n const id = this.#nextId++;\n const timeoutMs = options.timeoutMs ?? this.#defaultTimeoutMs;\n const sessionId =\n typeof options.sessionId === \"string\" && options.sessionId.length > 0\n ? options.sessionId\n : undefined;\n\n const domain = typeof method === \"string\" ? method.split(\".\")[0] : \"\";\n if (!sessionId && domain && ![\"Browser\", \"Target\"].includes(domain)) {\n this.#recordDebug(\"warning\", {\n id,\n method,\n reason: \"target-scoped method sent without sessionId\"\n });\n }\n\n const result = new Promise<unknown>((resolve, reject) => {\n const startedAt = performance.now();\n const timeoutId = setTimeout(() => {\n this.#pending.delete(id);\n reject(\n new Error(`CDP command timed out after ${timeoutMs}ms: ${method}`)\n );\n }, timeoutMs);\n this.#pending.set(id, {\n resolve,\n reject,\n timeoutId,\n method,\n sessionId,\n startedAt\n });\n });\n\n this.#recordDebug(\"send\", { id, method, sessionId, timeoutMs });\n try {\n this.#socket.send(JSON.stringify({ id, method, params, sessionId }));\n } catch (error) {\n // A closed socket throws on send: fail this command now rather than\n // leave it pending until it times out.\n const pending = this.#pending.get(id);\n if (pending) {\n clearTimeout(pending.timeoutId);\n this.#pending.delete(id);\n pending.reject(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n return result;\n }\n\n async attachToTarget(\n targetId: string,\n options: CdpAttachOptions = {}\n ): Promise<string> {\n if (typeof targetId !== \"string\" || !targetId) {\n throw new Error(\n \"attachToTarget requires a targetId — list open tabs with \" +\n \"send('Target.getTargets') or create one with \" +\n \"send('Target.createTarget', { url })\"\n );\n }\n\n const result = (await this.send(\n \"Target.attachToTarget\",\n {\n targetId,\n flatten: true\n },\n { timeoutMs: options.timeoutMs }\n )) as { sessionId?: string };\n\n const sessionId = result?.sessionId ?? \"\";\n if (!sessionId) {\n throw new Error(\n `Target.attachToTarget did not return a sessionId for target ${targetId}`\n );\n }\n\n this.#recordDebug(\"attach\", { targetId, sessionId });\n return sessionId;\n }\n\n getDebugLog(limit = 50): DebugEntry[] {\n const normalized = Number.isFinite(limit)\n ? Math.max(1, Math.floor(limit))\n : 50;\n return this.#debugLog.slice(-normalized);\n }\n\n clearDebugLog(): void {\n this.#debugLog = [];\n }\n\n disconnect(): void {\n this.#rejectAll(new Error(\"CDP session disconnected\"));\n try {\n this.#socket.close(1000, \"Done\");\n } catch {\n // socket may already be closed\n }\n }\n\n close(): void {\n this.disconnect();\n this.#runDispose();\n }\n\n /**\n * Run the dispose callback exactly once, on the first terminal event —\n * an explicit {@link close}, peer closure, or a socket error.\n */\n #runDispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#dispose?.();\n }\n\n #rejectAll(error: Error): void {\n for (const [id, pending] of this.#pending.entries()) {\n clearTimeout(pending.timeoutId);\n this.#pending.delete(id);\n pending.reject(error);\n }\n }\n\n #handleMessage(event: MessageEvent): void {\n if (typeof event.data !== \"string\") {\n return;\n }\n\n let payload: Record<string, unknown>;\n try {\n payload = JSON.parse(event.data) as Record<string, unknown>;\n } catch {\n return;\n }\n\n this.#recordDebug(\"receive\", {\n id: payload.id,\n method: payload.method,\n sessionId: payload.sessionId,\n hasError: !!payload.error\n });\n\n if (typeof payload.id !== \"number\") {\n return;\n }\n\n const pending = this.#pending.get(payload.id);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timeoutId);\n this.#pending.delete(payload.id);\n\n if (payload.error) {\n const err = payload.error as { code?: unknown; message?: string };\n pending.reject(\n new CdpProtocolError(\n pending.method,\n typeof err.code === \"number\" ? err.code : undefined,\n err.message ?? \"CDP error\"\n )\n );\n return;\n }\n\n pending.resolve(payload.result);\n }\n\n #recordDebug(type: string, data: Record<string, unknown>): void {\n this.#debugLog.push({\n at: new Date().toISOString(),\n type,\n ...data\n });\n if (this.#debugLog.length > MAX_DEBUG_ENTRIES) {\n this.#debugLog.splice(0, this.#debugLog.length - MAX_DEBUG_ENTRIES);\n }\n }\n}\n\nconst LOCALHOST_HOSTS = new Set([\n \"localhost\",\n \"127.0.0.1\",\n \"0.0.0.0\",\n \"::1\",\n \"[::1]\"\n]);\n\n/**\n * Connect to a browser via a CDP base URL (e.g. http://localhost:9222).\n * Discovers the WebSocket debugger URL via /json/version,\n * rewrites localhost URLs to the base URL host, and opens the WebSocket.\n *\n * Useful for local development with `chrome --remote-debugging-port=9222`\n * or when connecting through a tunnel.\n */\nexport async function connectUrl(\n baseUrl: string,\n options?: { timeoutMs?: number; headers?: Record<string, string> }\n): Promise<CdpConnection> {\n const endpoint = new URL(\"/json/version\", baseUrl).toString();\n const response = await fetch(endpoint, {\n headers: options?.headers\n });\n if (!response.ok) {\n throw new Error(\n `Failed to discover CDP endpoint at ${endpoint}: ${response.status}`\n );\n }\n\n const payload = (await response.json()) as {\n webSocketDebuggerUrl?: string;\n };\n if (!payload.webSocketDebuggerUrl) {\n throw new Error(\"CDP /json/version did not include webSocketDebuggerUrl\");\n }\n\n let wsUrl = payload.webSocketDebuggerUrl;\n const parsed = new URL(wsUrl);\n if (LOCALHOST_HOSTS.has(parsed.hostname)) {\n const base = new URL(baseUrl);\n parsed.hostname = base.hostname;\n parsed.port = base.port;\n parsed.protocol = base.protocol;\n } else {\n // Workers runtime requires fetch + Upgrade header for outbound WebSockets\n parsed.protocol = parsed.protocol === \"wss:\" ? \"https:\" : \"http:\";\n }\n const fetchUrl = parsed.toString();\n\n const wsResponse = await fetch(fetchUrl, {\n headers: { ...options?.headers, Upgrade: \"websocket\" }\n });\n const ws = wsResponse.webSocket;\n if (!ws) {\n throw new Error(\n `Failed to establish CDP WebSocket at ${fetchUrl} (status ${wsResponse.status})`\n );\n }\n ws.accept();\n\n return new CdpConnection(ws, { timeoutMs: options?.timeoutMs });\n}\n\n/** @deprecated Renamed to {@link CdpConnection}. */\nexport const CdpSession = CdpConnection;\n/** @deprecated Renamed to {@link CdpConnection}. */\nexport type CdpSession = CdpConnection;\n","import { CdpConnection } from \"./cdp-connection\";\n\n/**\n * A Browser Rendering binding. Structural so it accepts both the classic\n * `Fetcher`-typed binding and the newer `BrowserRun` type generated by\n * `wrangler types`.\n *\n * `fetch` is always used. `acquire` and `closeSession` are Browser Run's\n * typed binding methods; {@link acquireBrowserSession} and\n * {@link closeBrowserSession} use them when the binding has them.\n */\nexport interface BrowserBinding {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n // Spelled out rather than taken from workers-types, so bindings typed by\n // older workers-types versions still fit. Only the options we send.\n acquire?(options?: {\n keepAlive?: number;\n recording?: boolean;\n guardrails?: BrowserSessionGuardrails;\n }): Promise<{ sessionId: string }>;\n closeSession?(sessionId: string): Promise<unknown>;\n}\n\n/**\n * Browser Run [hostname guardrails](https://developers.cloudflare.com/browser-run/features/guardrails/):\n * restrict which hostnames the session's HTTP/HTTPS requests may reach. Fixed\n * at session launch for every connection to the session, including Live View.\n * Omitted entirely, the platform default applies: all hostnames are allowed.\n * Not supported by Kitesurf.\n */\nexport interface BrowserSessionGuardrails {\n /**\n * Hostname patterns the browser may request — bare hostnames only (no\n * protocol, port, or path). `*.example.com` matches subdomains; add\n * `example.com` separately to allow the apex.\n */\n allowedDomains?: string[];\n /** Named Cloudflare-maintained domain sets, e.g. `\"common-cdns\"`. */\n allowedDomainSets?: string[];\n}\n\nexport interface BrowserTargetInfo {\n id: string;\n type?: string;\n url?: string;\n title?: string;\n description?: string;\n devtoolsFrontendUrl?: string;\n webSocketDebuggerUrl?: string;\n}\n\nexport interface BrowserSessionInfo {\n sessionId: string;\n targets?: BrowserTargetInfo[];\n webSocketDebuggerUrl?: string;\n}\n\n/** {@link connectBrowser} options for the default Chromium engine. */\nexport interface ConnectChromiumBrowserOptions {\n /** Select the browser engine. Defaults to Chromium. */\n browser?: \"chromium\";\n timeoutMs?: number;\n keepAliveMs?: number;\n includeTargets?: boolean;\n /**\n * Opt into Browser Run [session recording](https://developers.cloudflare.com/browser-run/features/session-recording/):\n * an rrweb capture of DOM changes, input, and navigation, finalized when the\n * session closes. Set at session-launch time. Retrieve later with\n * {@link getBrowserRecording}.\n */\n recording?: boolean;\n}\n\n/**\n * {@link connectBrowser} options for Kitesurf, Cloudflare's connection-scoped,\n * agent-first browser engine. A Kitesurf browser lives and dies with its\n * WebSocket, so the Chromium-only options (`keepAliveMs`, `includeTargets`,\n * `recording`) do not exist on this arm.\n */\nexport interface ConnectKitesurfBrowserOptions {\n browser: \"kitesurf\";\n timeoutMs?: number;\n}\n\n/**\n * Engine-discriminated {@link connectBrowser} options: selecting\n * `browser: \"kitesurf\"` removes the Chromium-only options at the type level.\n */\nexport type ConnectBrowserOptions =\n | ConnectChromiumBrowserOptions\n | ConnectKitesurfBrowserOptions;\n\n/** An rrweb session recording for a closed Browser Run session. */\nexport interface BrowserRecording {\n sessionId: string;\n /** Recording length in milliseconds. */\n duration: number;\n /**\n * rrweb event arrays keyed by CDP target id (one per tab). Each value can be\n * passed directly to `rrweb-player` to replay that tab.\n */\n events: Record<string, unknown[]>;\n}\n\nexport class BrowserRenderingError extends Error {\n constructor(\n message: string,\n readonly status: number\n ) {\n super(message);\n this.name = \"BrowserRenderingError\";\n }\n}\n\n/**\n * Whether an error means the platform session is gone: Browser Run uses 404\n * for unknown ids and 410 after `keep_alive` expiry.\n */\nexport function isMissingBrowserSession(error: unknown): boolean {\n return (\n error instanceof BrowserRenderingError &&\n (error.status === 404 || error.status === 410)\n );\n}\n\nfunction browserSessionEndpoint(\n sessionId?: string,\n options?: {\n keepAliveMs?: number;\n includeTargets?: boolean;\n recording?: boolean;\n browser?: \"kitesurf\";\n }\n): string {\n const path = sessionId\n ? `/v1/devtools/browser/${sessionId}`\n : \"/v1/devtools/browser\";\n const url = new URL(`https://localhost${path}`);\n\n if (options?.keepAliveMs !== undefined) {\n url.searchParams.set(\"keep_alive\", String(options.keepAliveMs));\n }\n if (options?.includeTargets) {\n url.searchParams.set(\"targets\", \"true\");\n }\n if (options?.recording) {\n url.searchParams.set(\"recording\", \"true\");\n }\n if (options?.browser) {\n url.searchParams.set(\"browser\", options.browser);\n }\n\n return url.toString();\n}\n\nasync function parseBrowserSessionInfo(\n response: Response\n): Promise<BrowserSessionInfo> {\n const payload = (await response.json()) as {\n sessionId?: unknown;\n targets?: unknown;\n webSocketDebuggerUrl?: unknown;\n };\n const sessionId =\n typeof payload.sessionId === \"string\" ? payload.sessionId : \"\";\n\n if (!sessionId) {\n throw new Error(\"Browser Rendering response did not include a sessionId\");\n }\n\n return {\n sessionId,\n targets: Array.isArray(payload.targets)\n ? (payload.targets as BrowserTargetInfo[])\n : undefined,\n webSocketDebuggerUrl:\n typeof payload.webSocketDebuggerUrl === \"string\"\n ? payload.webSocketDebuggerUrl\n : undefined\n };\n}\n\nexport async function createBrowserSession(\n browser: BrowserBinding,\n options?: {\n keepAliveMs?: number;\n includeTargets?: boolean;\n recording?: boolean;\n guardrails?: BrowserSessionGuardrails;\n }\n): Promise<BrowserSessionInfo> {\n // Guardrails ride the acquire request's JSON body (the query string only\n // carries scalar options). The endpoint accepts an empty `{}` body —\n // verified against the live acquire API — so the request shape stays\n // uniform whether or not guardrails are set.\n const response = await browser.fetch(\n browserSessionEndpoint(undefined, options),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(\n options?.guardrails ? { guardrails: options.guardrails } : {}\n )\n }\n );\n\n if (!response.ok) {\n throw new BrowserRenderingError(\n `Failed to create Browser Rendering session: ${response.status}`,\n response.status\n );\n }\n\n return parseBrowserSessionInfo(response);\n}\n\nexport async function listBrowserTargets(\n browser: BrowserBinding,\n sessionId: string\n): Promise<BrowserTargetInfo[]> {\n const response = await browser.fetch(\n `https://localhost/v1/devtools/browser/${sessionId}/json/list`\n );\n\n if (!response.ok) {\n throw new BrowserRenderingError(\n `Failed to list Browser Rendering targets for ${sessionId}: ${response.status}`,\n response.status\n );\n }\n\n const payload = (await response.json()) as unknown;\n return Array.isArray(payload) ? (payload as BrowserTargetInfo[]) : [];\n}\n\nexport async function deleteBrowserSession(\n browser: BrowserBinding,\n sessionId: string\n): Promise<void> {\n const response = await browser.fetch(\n `https://localhost/v1/devtools/browser/${sessionId}`,\n { method: \"DELETE\" }\n );\n\n if (!response.ok && response.status !== 404) {\n throw new BrowserRenderingError(\n `Failed to delete Browser Rendering session ${sessionId}: ${response.status}`,\n response.status\n );\n }\n}\n\n/**\n * Whether a typed binding call failed because the binding doesn't have that\n * method. Fully local dev (Miniflare) has only `fetch`: every other method\n * still looks like a function, then throws this when called.\n */\nfunction isUnimplementedBindingMethod(error: unknown, method: string): boolean {\n return (\n error instanceof TypeError &&\n error.message ===\n `The RPC receiver does not implement the method \"${method}\".`\n );\n}\n\n/**\n * Create a session with the binding's typed `acquire()`. Falls back to the\n * HTTP API ({@link createBrowserSession}) when the binding doesn't have\n * `acquire()`, as in fully local dev.\n */\nexport async function acquireBrowserSession(\n browser: BrowserBinding,\n options: {\n keepAliveMs?: number;\n recording?: boolean;\n guardrails?: BrowserSessionGuardrails;\n } = {}\n): Promise<{ sessionId: string }> {\n if (browser.acquire) {\n try {\n const { sessionId } = await browser.acquire({\n keepAlive: options.keepAliveMs,\n recording: options.recording,\n guardrails: options.guardrails\n });\n return { sessionId };\n } catch (error) {\n if (!isUnimplementedBindingMethod(error, \"acquire\")) throw error;\n }\n }\n const { sessionId } = await createBrowserSession(browser, options);\n return { sessionId };\n}\n\n/**\n * The HTTP status in a typed binding method's error. Browser Run's binding\n * errors carry it only in the message, e.g. `Not Found (status=404)`.\n */\nfunction bindingErrorStatus(error: unknown): number | undefined {\n if (!(error instanceof Error)) return undefined;\n const match = /\\(status=(\\d{3})[,)]/.exec(error.message);\n return match ? Number(match[1]) : undefined;\n}\n\n/**\n * Close a session with the binding's typed `closeSession()`. A session\n * Browser Run no longer knows (404 or 410) counts as closed. Falls back to\n * the HTTP API ({@link deleteBrowserSession}) when the binding doesn't have\n * `closeSession()`, as in fully local dev.\n */\nexport async function closeBrowserSession(\n browser: BrowserBinding,\n sessionId: string\n): Promise<void> {\n if (browser.closeSession) {\n try {\n await browser.closeSession(sessionId);\n return;\n } catch (error) {\n const status = bindingErrorStatus(error);\n if (status === 404 || status === 410) return;\n if (!isUnimplementedBindingMethod(error, \"closeSession\")) throw error;\n }\n }\n await deleteBrowserSession(browser, sessionId);\n}\n\n/**\n * Connect to a Browser Rendering session and delete it when closed.\n */\nexport async function connectBrowser(\n browser: BrowserBinding,\n options?: number | ConnectBrowserOptions\n): Promise<CdpConnection> {\n const normalizedOptions: ConnectBrowserOptions =\n typeof options === \"number\" ? { timeoutMs: options } : (options ?? {});\n if (normalizedOptions.browser === \"kitesurf\") {\n // The options union already rejects these at the type level for literal\n // call sites; plain-JS callers and spreads can still smuggle them in.\n // Explicitly disabled values are tolerated but never sent — `keep_alive=0`\n // is not a valid Kitesurf query parameter.\n const smuggled = normalizedOptions as {\n keepAliveMs?: number;\n includeTargets?: boolean;\n recording?: boolean;\n };\n if (smuggled.keepAliveMs || smuggled.includeTargets || smuggled.recording) {\n throw new Error(\n \"Kitesurf does not support keepAliveMs, includeTargets, or recording\"\n );\n }\n }\n\n const response = await browser.fetch(\n browserSessionEndpoint(\n undefined,\n normalizedOptions.browser === \"kitesurf\"\n ? { browser: \"kitesurf\" }\n : {\n keepAliveMs: normalizedOptions.keepAliveMs,\n includeTargets: normalizedOptions.includeTargets,\n recording: normalizedOptions.recording\n }\n ),\n { headers: { Upgrade: \"websocket\" } }\n );\n\n const ws = response.webSocket;\n if (!ws) {\n throw new Error(\n \"Browser Rendering binding did not return a WebSocket. \" +\n \"Ensure the 'browser' binding is configured in wrangler.jsonc.\"\n );\n }\n\n if (normalizedOptions.browser === \"kitesurf\") {\n // A Kitesurf browser is scoped to this WebSocket. Browser Run may return\n // an ID for analytics correlation, but it cannot be used with the\n // session-scoped reconnect or delete endpoints.\n ws.accept();\n return new CdpConnection(ws, { timeoutMs: normalizedOptions.timeoutMs });\n }\n\n const sessionId = response.headers.get(\"cf-browser-session-id\");\n if (!sessionId) {\n throw new Error(\n \"Browser Rendering binding did not include a session ID when opening the CDP WebSocket\"\n );\n }\n\n ws.accept();\n return new CdpConnection(ws, {\n timeoutMs: normalizedOptions.timeoutMs,\n onClose: () => {\n deleteBrowserSession(browser, sessionId).catch((error: unknown) => {\n console.warn(\n `[agents/browser] Failed to delete one-shot Browser Run session ${sessionId}`,\n error\n );\n });\n },\n sessionId\n });\n}\n\n/**\n * Fetch a Browser Run [session recording](https://developers.cloudflare.com/browser-run/features/session-recording/)\n * by session id, via the Browser Rendering REST API.\n *\n * A recording is only available **after** the session closes (explicit\n * `closeSession()`, idle `keep_alive` expiry, or sweep) and is retained for 30\n * days. Capture the session id while the session is alive — e.g. from\n * `connector.liveView()`/`sessionInfo()` — then call this once it has ended.\n *\n * Unlike the binding-based helpers, this hits `api.cloudflare.com` directly, so\n * it needs an account id and an API token with `Browser Rendering` read access\n * (the Workers Browser Run binding cannot read recordings).\n */\nexport async function getBrowserRecording(options: {\n accountId: string;\n apiToken: string;\n sessionId: string;\n /** Override for testing; defaults to the global `fetch`. */\n fetchImpl?: typeof fetch;\n}): Promise<BrowserRecording> {\n const { accountId, apiToken, sessionId } = options;\n const fetchImpl = options.fetchImpl ?? fetch;\n const endpoint = `https://api.cloudflare.com/client/v4/accounts/${accountId}/browser-rendering/recording/${sessionId}`;\n\n const response = await fetchImpl(endpoint, {\n headers: { Authorization: `Bearer ${apiToken}` }\n });\n\n if (!response.ok) {\n throw new BrowserRenderingError(\n `Failed to fetch Browser Run recording for ${sessionId}: ${response.status}`,\n response.status\n );\n }\n\n // The recording endpoint returns the recording object directly; tolerate a\n // standard v4 `{ result }` envelope in case that changes.\n const payload = (await response.json()) as\n | BrowserRecording\n | { result?: BrowserRecording };\n const recording =\n \"result\" in payload && payload.result ? payload.result : payload;\n\n return recording as BrowserRecording;\n}\n\nexport interface ConnectBrowserSessionOptions {\n timeoutMs?: number;\n /**\n * Invoked once when the returned {@link CdpConnection} reaches a terminal\n * state — an explicit `close()`, peer closure, or a socket error. The\n * session itself is never deleted on close — pass an `onClose` that\n * deletes it for one-shot (create-and-close) semantics.\n */\n onClose?: () => void;\n /**\n * Invoked on every CDP command sent over the returned {@link CdpConnection} —\n * an activity signal for idle tracking. Keep it cheap and synchronous;\n * throttle any I/O it triggers.\n */\n onActivity?: () => void;\n}\n\n/**\n * Connect to an existing Browser Rendering session without deleting it on close.\n */\nexport async function connectBrowserSession(\n browser: BrowserBinding,\n sessionId: string,\n options?: ConnectBrowserSessionOptions\n): Promise<CdpConnection>;\n/**\n * @deprecated Pass `{ timeoutMs }` instead of a bare number — the numeric\n * form will be removed.\n */\nexport async function connectBrowserSession(\n browser: BrowserBinding,\n sessionId: string,\n timeoutMs?: number\n): Promise<CdpConnection>;\nexport async function connectBrowserSession(\n browser: BrowserBinding,\n sessionId: string,\n options?: number | ConnectBrowserSessionOptions\n): Promise<CdpConnection> {\n const normalized =\n typeof options === \"number\" ? { timeoutMs: options } : (options ?? {});\n const response = await browser.fetch(browserSessionEndpoint(sessionId), {\n headers: { Upgrade: \"websocket\" }\n });\n\n const ws = response.webSocket;\n if (!ws) {\n // Carry the upgrade status: a 404/410 here means the browser expired\n // after the caller last saw it alive (see isMissingBrowserSession).\n throw new BrowserRenderingError(\n `Browser Rendering binding did not return a WebSocket for session ${sessionId} (${response.status})`,\n response.status\n );\n }\n\n ws.accept();\n return new CdpConnection(ws, {\n timeoutMs: normalized.timeoutMs,\n onClose: normalized.onClose,\n sessionId,\n onActivity: normalized.onActivity\n });\n}\n\n/** One-shot session options for the default Chromium engine. */\nexport interface OneShotChromiumSessionOptions {\n /** Select the browser engine. Defaults to Chromium. */\n browser?: \"chromium\";\n timeoutMs?: number;\n /** Platform `keep_alive` in milliseconds. */\n keepAliveMs?: number;\n /** Opt into Browser Run session recording (rrweb capture). */\n recording?: boolean;\n /** Hostname guardrails, fixed at launch. */\n guardrails?: BrowserSessionGuardrails;\n}\n\n/**\n * One-shot session options for Kitesurf. The Chromium-only options —\n * `guardrails`, `keepAliveMs`, `recording` — do not exist on this arm:\n * Kitesurf does not support them.\n */\nexport interface OneShotKitesurfSessionOptions {\n browser: \"kitesurf\";\n timeoutMs?: number;\n}\n\n/**\n * Engine-discriminated {@link openOneShotBrowserSession} options: selecting\n * `browser: \"kitesurf\"` removes the Chromium-only options at the type level.\n */\nexport type OneShotBrowserSessionOptions =\n | OneShotChromiumSessionOptions\n | OneShotKitesurfSessionOptions;\n\n/**\n * Open a one-shot browser session: create, connect, and delete the platform\n * session when the returned {@link CdpConnection} closes. No store involved —\n * one-shot sessions have no name and no durability.\n */\nexport async function openOneShotBrowserSession(\n browser: BrowserBinding,\n options: OneShotBrowserSessionOptions = {}\n): Promise<CdpConnection> {\n if (options.browser === \"kitesurf\") {\n // The options union already rejects these at the type level for literal\n // call sites; plain-JS callers and spreads can still smuggle them in, so\n // fail loudly in one place with one message.\n const smuggled = options as {\n guardrails?: unknown;\n keepAliveMs?: unknown;\n recording?: unknown;\n };\n if (smuggled.guardrails || smuggled.keepAliveMs || smuggled.recording) {\n throw new Error(\n \"Kitesurf does not support guardrails, keepAliveMs, or recording\"\n );\n }\n // Kitesurf browsers are scoped to their WebSocket — connectBrowser is\n // already one-shot there.\n return connectBrowser(browser, {\n browser: \"kitesurf\",\n timeoutMs: options.timeoutMs\n });\n }\n\n const info = await createBrowserSession(browser, {\n keepAliveMs: options.keepAliveMs,\n recording: options.recording,\n guardrails: options.guardrails\n });\n try {\n return await connectBrowserSession(browser, info.sessionId, {\n timeoutMs: options.timeoutMs,\n onClose: () => {\n deleteBrowserSession(browser, info.sessionId).catch(\n (error: unknown) => {\n console.warn(\n `[agents/browser] Failed to delete one-shot Browser Run session ${info.sessionId}`,\n error\n );\n }\n );\n }\n });\n } catch (error) {\n // The session was allocated but never got its delete-on-close owner —\n // reclaim it now instead of leaving it to expire.\n try {\n await deleteBrowserSession(browser, info.sessionId);\n } catch {\n // Best-effort: keep_alive expiry reclaims it.\n }\n throw error;\n }\n}\n","import { Validator, type OutputUnit, type Schema } from \"@cfworker/json-schema\";\nimport type { ConnectorTool } from \"@cloudflare/codemode\";\n\nfunction formatToolValidationError(\n connector: string,\n tool: string,\n errors: OutputUnit[]\n): string {\n // A failing property emits both a generic parent `properties` error and a\n // specific child error. Prefer the latter so the model sees what to fix.\n const specific = errors.filter((error) => error.keyword !== \"properties\");\n const relevant = specific.length > 0 ? specific : errors;\n const details = relevant.map((error) => {\n const location = error.instanceLocation\n .replace(/^#\\/?/, \"\")\n .replaceAll(\"~1\", \"/\")\n .replaceAll(\"~0\", \"~\")\n .replaceAll(\"/\", \".\");\n return `${location ? ` at ${location}` : \"\"}: ${error.error}`;\n });\n return `Invalid arguments for ${connector}.${tool}${details.join(\";\")}`;\n}\n\n/**\n * Validate a connector tool's arguments against its input schema before it\n * runs, so the model gets a precise error instead of a failure deep inside\n * browser work. An omitted argument counts as `{}`: argumentless tools are\n * documented as `cdp.spec()`.\n */\nexport function validateConnectorArgs(\n connector: string,\n name: string,\n tool: ConnectorTool\n): ConnectorTool {\n if (!tool.inputSchema) return tool;\n\n // Both types describe draft-7 schemas, but @cfworker's `Schema` type is\n // narrower than JSONSchema7 around boolean subschemas.\n const schema = tool.inputSchema as unknown as Schema;\n const validator = new Validator(schema, \"7\", false);\n return {\n ...tool,\n execute: async (args, ctx) => {\n const input = args === undefined ? {} : args;\n const result = validator.validate(input);\n if (!result.valid) {\n throw new Error(\n formatToolValidationError(connector, name, result.errors)\n );\n }\n return await tool.execute(input, ctx);\n }\n };\n}\n","/**\n * Live View vocabulary shared by every host-side surface that mints links:\n * the connector's `getLiveViewUrl` tool and `Browser.liveView()`. Live View\n * URLs are bearer credentials — mint them fresh from a target listing when a\n * human is about to view, and never persist them.\n */\n\nimport type { BrowserTargetInfo } from \"./browser-run\";\n\n/**\n * Live View rendering mode (the `mode` query param the hosted UI at\n * `live.browser.run` understands):\n *\n * - `\"tab\"` — a standalone, interactive page view (best for handing control\n * to a human).\n * - `\"devtools\"` — the full DevTools inspector panel (Elements, Console,\n * Network, …).\n *\n * Omit it to use whatever mode the binding's `devtoolsFrontendUrl` defaults\n * to.\n */\nexport type LiveViewMode = \"tab\" | \"devtools\";\n\n/** A single tab's Live View URL. */\nexport interface BrowserLiveViewUrl {\n /** Open this in a browser to watch/control the tab in real time. */\n url: string;\n /** CDP target (tab) id the URL points at. */\n targetId: string;\n /** Milliseconds the URL stays valid from when it was generated (~5 min). */\n expiresInMs: number;\n}\n\nexport interface BrowserLiveViewTarget {\n targetId: string;\n /** Embeddable Live View URL (the `devtoolsFrontendUrl`) for this tab. */\n url: string;\n /** The page the tab is currently showing (e.g. `https://example.com`). */\n pageUrl?: string;\n title?: string;\n type?: string;\n}\n\n/** Live View URLs for every tab in a session. */\nexport interface BrowserLiveView {\n sessionId: string;\n targets: BrowserLiveViewTarget[];\n /** Milliseconds the URLs stay valid from when they were generated (~5 min). */\n expiresInMs: number;\n}\n\n/**\n * Browser Run mints `devtoolsFrontendUrl`s (the Live View links) that are\n * valid for ~5 minutes. We surface the window so callers can decide how long\n * a shared link is good for before re-listing targets.\n */\nexport const LIVE_VIEW_URL_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Rewrite the hosted Live View UI's `mode` query param (`tab` | `devtools`).\n * The raw `devtoolsFrontendUrl` is returned unchanged when no mode is asked\n * for or the URL can't be parsed.\n */\nexport function applyLiveViewMode(rawUrl: string, mode?: LiveViewMode): string {\n if (!mode) return rawUrl;\n try {\n const url = new URL(rawUrl);\n url.searchParams.set(\"mode\", mode === \"devtools\" ? \"devtools\" : \"tab\");\n return url.toString();\n } catch {\n return rawUrl;\n }\n}\n\n/**\n * Project a fresh target listing into Live View links — one per tab that has\n * a `devtoolsFrontendUrl`. Pure; the caller supplies just-listed targets.\n */\nexport function createLiveView(\n sessionId: string,\n targets: BrowserTargetInfo[],\n mode?: LiveViewMode\n): BrowserLiveView {\n return {\n sessionId,\n targets: targets\n .filter((target) => target.devtoolsFrontendUrl)\n .map((target) => ({\n targetId: target.id,\n url: applyLiveViewMode(target.devtoolsFrontendUrl!, mode),\n pageUrl: target.url,\n title: target.title,\n type: target.type\n })),\n expiresInMs: LIVE_VIEW_URL_TTL_MS\n };\n}\n","/**\n * Chrome DevTools Protocol spec fetching + caching.\n *\n * The raw `/json/protocol` payload is normalized into a searchable shape and\n * cached per source: `cdpUrl` specs by endpoint + headers, Browser Rendering\n * specs by the binding itself (a WeakMap) so two different bindings in the\n * same isolate don't share an entry. The CDP protocol is identical across\n * bindings, but per-binding keys avoid surprising cross-binding cache reads.\n */\n\nimport type { BrowserBinding } from \"./browser-run\";\n\n/** A parameter, return value, or type property in the raw protocol. */\ninterface RawCdpField {\n name: string;\n description?: string;\n optional?: boolean;\n experimental?: boolean;\n deprecated?: boolean;\n type?: string;\n $ref?: string;\n enum?: string[];\n items?: { type?: string; $ref?: string; enum?: string[] };\n}\n\ninterface RawCdpCommand {\n name: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n parameters?: RawCdpField[];\n returns?: RawCdpField[];\n}\n\ninterface RawCdpEvent {\n name: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n parameters?: RawCdpField[];\n}\n\ninterface RawCdpType {\n id: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n type?: string;\n enum?: string[];\n properties?: RawCdpField[];\n items?: { type?: string; $ref?: string; enum?: string[] };\n}\n\n/** Raw CDP protocol domain from `/json/protocol` */\ninterface RawCdpDomain {\n domain: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n commands?: RawCdpCommand[];\n events?: RawCdpEvent[];\n types?: RawCdpType[];\n}\n\n/**\n * The element type of an array field or type. `$ref` is always\n * domain-qualified (`\"Network.Cookie\"`), matching a type's `name`.\n */\nexport interface CdpItems {\n type?: string;\n $ref?: string;\n enum?: string[];\n}\n\n/**\n * A command parameter, return value, event parameter, or type property.\n * Either `type` (a JSON type such as `\"string\"` or `\"array\"`) or `$ref`\n * (a domain-qualified type name matching a type's `name`) is set.\n */\nexport interface CdpField {\n name: string;\n description?: string;\n optional?: boolean;\n experimental?: boolean;\n deprecated?: boolean;\n type?: string;\n $ref?: string;\n enum?: string[];\n items?: CdpItems;\n}\n\nexport interface SearchableCdpSpec {\n domains: Array<{\n name: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n commands: Array<{\n name: string;\n method: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n parameters: CdpField[];\n returns: CdpField[];\n }>;\n events: Array<{\n name: string;\n event: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n parameters: CdpField[];\n }>;\n types: Array<{\n id: string;\n name: string;\n description?: string;\n experimental?: boolean;\n deprecated?: boolean;\n /** JSON type of the value, e.g. `\"string\"`, `\"object\"`, `\"array\"`. */\n type?: string;\n enum?: string[];\n properties: CdpField[];\n items?: CdpItems;\n }>;\n }>;\n}\n\nexport interface CdpSpecSource {\n /** Browser Rendering binding (Fetcher) — used in production */\n browser?: BrowserBinding;\n /** CDP base URL override (e.g. http://localhost:9222) */\n cdpUrl?: string;\n /** Headers to send with CDP URL discovery requests */\n cdpHeaders?: Record<string, string>;\n /**\n * An existing Browser Run session to read the protocol from. Without it,\n * loading through the binding creates (and deletes) a throwaway session.\n */\n sessionId?: string;\n}\n\nconst MISSING_BROWSER_CONFIG =\n \"Either 'browser' (Fetcher binding) or 'cdpUrl' must be provided\";\n\ninterface SpecCacheEntry {\n spec: SearchableCdpSpec;\n cachedAt: number;\n}\n\nconst urlSpecCache = new Map<string, SpecCacheEntry>();\nconst bindingSpecCache = new WeakMap<BrowserBinding, SpecCacheEntry>();\n\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n/** Qualify a same-domain `$ref` (`\"FrameId\"` → `\"Page.FrameId\"`). */\nfunction qualifyRef(domain: string, ref: string | undefined) {\n if (ref === undefined) return undefined;\n return ref.includes(\".\") ? ref : `${domain}.${ref}`;\n}\n\nfunction normalizeItems(\n domain: string,\n items: RawCdpType[\"items\"]\n): CdpItems | undefined {\n if (!items) return undefined;\n return {\n type: items.type,\n $ref: qualifyRef(domain, items.$ref),\n enum: items.enum\n };\n}\n\nfunction normalizeFields(\n domain: string,\n fields: RawCdpField[] | undefined\n): CdpField[] {\n return (fields ?? []).map((field) => ({\n name: field.name,\n description: field.description,\n optional: field.optional,\n experimental: field.experimental,\n deprecated: field.deprecated,\n type: field.type,\n $ref: qualifyRef(domain, field.$ref),\n enum: field.enum,\n items: normalizeItems(domain, field.items)\n }));\n}\n\nfunction normalizeCdpSpec(spec: {\n domains?: RawCdpDomain[];\n}): SearchableCdpSpec {\n return {\n domains: (spec.domains ?? []).map(({ domain, ...raw }) => ({\n name: domain,\n description: raw.description,\n experimental: raw.experimental,\n deprecated: raw.deprecated,\n commands: (raw.commands ?? []).map((command) => ({\n name: command.name,\n method: `${domain}.${command.name}`,\n description: command.description,\n experimental: command.experimental,\n deprecated: command.deprecated,\n parameters: normalizeFields(domain, command.parameters),\n returns: normalizeFields(domain, command.returns)\n })),\n events: (raw.events ?? []).map((event) => ({\n name: event.name,\n event: `${domain}.${event.name}`,\n description: event.description,\n experimental: event.experimental,\n deprecated: event.deprecated,\n parameters: normalizeFields(domain, event.parameters)\n })),\n types: (raw.types ?? []).map((type) => ({\n id: type.id,\n name: `${domain}.${type.id}`,\n description: type.description,\n experimental: type.experimental,\n deprecated: type.deprecated,\n type: type.type,\n enum: type.enum,\n properties: normalizeFields(domain, type.properties),\n items: normalizeItems(domain, type.items)\n }))\n }))\n };\n}\n\nfunction getSpecCacheKey(\n source: string,\n headers?: Record<string, string>\n): string {\n const headerEntries = Object.entries(headers ?? {}).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n return `${source}:${JSON.stringify(headerEntries)}`;\n}\n\nasync function getCachedSpec<K>(\n cache: {\n get(key: K): SpecCacheEntry | undefined;\n set(key: K, entry: SpecCacheEntry): void;\n },\n key: K,\n load: () => Promise<{ domains?: RawCdpDomain[] }>\n): Promise<SearchableCdpSpec> {\n const cached = cache.get(key);\n if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) {\n return cached.spec;\n }\n\n const spec = normalizeCdpSpec(await load());\n cache.set(key, { spec, cachedAt: Date.now() });\n return spec;\n}\n\nasync function fetchCdpSpecFromUrl(\n cdpBaseUrl: string,\n headers?: Record<string, string>\n): Promise<SearchableCdpSpec> {\n const endpoint = new URL(\"/json/protocol\", cdpBaseUrl).toString();\n\n return getCachedSpec(\n urlSpecCache,\n getSpecCacheKey(endpoint, headers),\n async () => {\n const response = await fetch(endpoint, { headers });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch CDP spec from ${endpoint}: ${response.status}`\n );\n }\n\n return (await response.json()) as { domains?: RawCdpDomain[] };\n }\n );\n}\n\nasync function fetchCdpSpecFromSession(\n browser: BrowserBinding,\n sessionId: string\n): Promise<SearchableCdpSpec> {\n return getCachedSpec(bindingSpecCache, browser, async () => {\n const response = await browser.fetch(\n `https://localhost/v1/devtools/browser/${sessionId}/json/protocol`\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch CDP spec from Browser Rendering: ${response.status}`\n );\n }\n return (await response.json()) as { domains?: RawCdpDomain[] };\n });\n}\n\nasync function fetchCdpSpecFromBrowser(\n browser: BrowserBinding\n): Promise<SearchableCdpSpec> {\n return getCachedSpec(bindingSpecCache, browser, async () => {\n const createResponse = await browser.fetch(\n \"https://localhost/v1/devtools/browser\",\n {\n method: \"POST\"\n }\n );\n\n if (!createResponse.ok) {\n throw new Error(\n \"Failed to create Browser Rendering session for protocol fetch: \" +\n `${createResponse.status}`\n );\n }\n\n const payload = (await createResponse.json()) as { sessionId?: string };\n const sessionId = payload.sessionId;\n if (!sessionId) {\n throw new Error(\n \"Browser Rendering session response did not include a sessionId\"\n );\n }\n\n try {\n const response = await browser.fetch(\n `https://localhost/v1/devtools/browser/${sessionId}/json/protocol`\n );\n\n if (!response.ok) {\n throw new Error(\n \"Failed to fetch CDP spec from Browser Rendering: \" +\n `${response.status}`\n );\n }\n\n return (await response.json()) as { domains?: RawCdpDomain[] };\n } finally {\n try {\n await browser.fetch(\n `https://localhost/v1/devtools/browser/${sessionId}`,\n {\n method: \"DELETE\"\n }\n );\n } catch {\n // Cleanup failure should not mask the original result or error\n }\n }\n });\n}\n\n/** Load the (cached) searchable CDP spec for a browser source. */\nexport async function loadCdpSpec(\n source: CdpSpecSource\n): Promise<SearchableCdpSpec> {\n if (source.cdpUrl) {\n return fetchCdpSpecFromUrl(source.cdpUrl, source.cdpHeaders);\n }\n if (source.browser && source.sessionId) {\n return fetchCdpSpecFromSession(source.browser, source.sessionId);\n }\n if (source.browser) {\n return fetchCdpSpecFromBrowser(source.browser);\n }\n throw new Error(MISSING_BROWSER_CONFIG);\n}\n","type MaybePromise<T> = T | Promise<T>;\n\nexport interface StoredBrowserSession {\n sessionId: string;\n createdAt: number;\n updatedAt: number;\n /**\n * Set when a sweep closed this entry's Browser Run session but kept the\n * entry as a tombstone, so a later resume of the owning execution fails\n * loudly instead of silently continuing in a fresh browser.\n */\n closedAt?: number;\n /**\n * Browser scope records only: the tab (CDP `targetId`) the scope last\n * worked in, so `sessionId: \"active\"` in a later execution lands on the\n * same page. CDP session ids die with each connection; target ids live as\n * long as the tab.\n */\n activeTargetId?: string;\n}\n\nexport interface BrowserSessionLock {\n release(): MaybePromise<void>;\n}\n\nexport interface BrowserSessionStore {\n /**\n * Acquire an exclusive lock for this session key. The lock must serialize\n * all holders using the same key. Held only around storage reads/writes —\n * never across Browser Rendering network calls.\n */\n acquireLock(key: string): MaybePromise<BrowserSessionLock>;\n get(key: string): MaybePromise<StoredBrowserSession | undefined>;\n set(key: string, session: StoredBrowserSession): MaybePromise<void>;\n delete(key: string): MaybePromise<void>;\n /**\n * List stored sessions by key prefix. Optional — used by sweeps to find\n * orphaned per-execution sessions; without it only the shared session key\n * is swept.\n */\n list?(prefix: string): MaybePromise<Map<string, StoredBrowserSession>>;\n}\n\n/**\n * A {@link BrowserSessionStore} that can list by prefix, as `Browser` needs:\n * it lists a browser's scope records to cap them and to see which tabs\n * other scopes are working in.\n */\nexport type ListableBrowserSessionStore = BrowserSessionStore &\n Required<Pick<BrowserSessionStore, \"list\">>;\n\nexport class DurableBrowserSessionStore implements BrowserSessionStore {\n static #queues = new WeakMap<\n DurableObjectStorage,\n Map<string, Promise<void>>\n >();\n\n constructor(private readonly storage: DurableObjectStorage) {}\n\n async acquireLock(key: string): Promise<BrowserSessionLock> {\n let queues = DurableBrowserSessionStore.#queues.get(this.storage);\n if (!queues) {\n queues = new Map();\n DurableBrowserSessionStore.#queues.set(this.storage, queues);\n }\n\n const previous = queues.get(key) ?? Promise.resolve();\n let releaseQueue: () => void = () => undefined;\n const current = previous.then(\n () =>\n new Promise<void>((resolve) => {\n releaseQueue = resolve;\n })\n );\n queues.set(key, current);\n await previous;\n\n let released = false;\n return {\n release: () => {\n if (released) return;\n released = true;\n if (queues.get(key) === current) {\n queues.delete(key);\n }\n releaseQueue();\n }\n };\n }\n\n async get(key: string): Promise<StoredBrowserSession | undefined> {\n return this.storage.get<StoredBrowserSession>(this.#storageKey(key));\n }\n\n async set(key: string, session: StoredBrowserSession): Promise<void> {\n await this.storage.put(this.#storageKey(key), session);\n }\n\n async delete(key: string): Promise<void> {\n await this.storage.delete(this.#storageKey(key));\n }\n\n async list(prefix: string): Promise<Map<string, StoredBrowserSession>> {\n const storagePrefix = this.#storageKey(prefix);\n const entries = await this.storage.list<StoredBrowserSession>({\n prefix: storagePrefix\n });\n const result = new Map<string, StoredBrowserSession>();\n for (const [storageKey, value] of entries) {\n result.set(storageKey.slice(\"browser-session:\".length), value);\n }\n return result;\n }\n\n #storageKey(key: string): string {\n return `browser-session:${key}`;\n }\n}\n\n/**\n * Default idle window used by {@link BrowserConnector.sweep} for the shared\n * (reuse/promoted) session entry.\n */\nexport const DEFAULT_SWEEP_IDLE_MS = 10 * 60 * 1000;\n"],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- //#region src/skills/compile.d.ts
2
- interface CompiledSkillScript {
3
- /** Self-contained ESM source, ready to embed and run without a bundler. */
4
- content: string;
5
- /** Always `true`; mirrors the `precompiled` flag on skill resources. */
6
- precompiled: true;
7
- }
8
- interface CompileSkillScriptOptions {
9
- /**
10
- * JavaScript target for the emitted bundle. Defaults to `es2022`, which the
11
- * Workers runtime supports.
12
- */
13
- target?: string;
14
- }
15
- /**
16
- * Whether a resource path is a skill script that should be compiled ahead of
17
- * time (i.e. has a `.js`, `.mjs`, `.ts`, or `.tsx` extension).
18
- */
19
- declare function isCompilableSkillScript(path: string): boolean;
20
- /**
21
- * Compile a skill script file into a single self-contained ESM module.
22
- *
23
- * Resolves and inlines sibling imports relative to `entryPath`, strips
24
- * TypeScript types, and emits ESM so the script can run in the Worker sandbox
25
- * without an in-Worker bundler.
26
- *
27
- * @param entryPath Absolute path to the skill script file on disk.
28
- */
29
- declare function compileSkillScript(
30
- entryPath: string,
31
- options?: CompileSkillScriptOptions
32
- ): Promise<CompiledSkillScript>;
33
- //#endregion
34
- export {
35
- CompileSkillScriptOptions,
36
- CompiledSkillScript,
37
- compileSkillScript,
38
- isCompilableSkillScript
39
- };
40
- //# sourceMappingURL=compile.d.ts.map