@5ss/ai-tools 2.11.1

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 (342) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +221 -0
  4. package/dist/ai-sdk/index.d.ts +15 -0
  5. package/dist/ai-sdk/index.d.ts.map +1 -0
  6. package/dist/ai-sdk/index.js +24 -0
  7. package/dist/ai-sdk/index.js.map +1 -0
  8. package/dist/artifact-D064mHfK.js +44 -0
  9. package/dist/artifact-D064mHfK.js.map +1 -0
  10. package/dist/artifacts-O8g-40Pw.js +404 -0
  11. package/dist/artifacts-O8g-40Pw.js.map +1 -0
  12. package/dist/aws-json-CecFqzqX.js +23 -0
  13. package/dist/aws-json-CecFqzqX.js.map +1 -0
  14. package/dist/aws-service-msttbPrz.js +58 -0
  15. package/dist/aws-service-msttbPrz.js.map +1 -0
  16. package/dist/batch-BMM5dXqL.d.ts +22 -0
  17. package/dist/batch-BMM5dXqL.d.ts.map +1 -0
  18. package/dist/batch-Co1ujeAW.js +67 -0
  19. package/dist/batch-Co1ujeAW.js.map +1 -0
  20. package/dist/bedrock-agentcore-browser-a_qOs-NR.js +182 -0
  21. package/dist/bedrock-agentcore-browser-a_qOs-NR.js.map +1 -0
  22. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js +357 -0
  23. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js.map +1 -0
  24. package/dist/bytes-BxpimpQx.js +45 -0
  25. package/dist/bytes-BxpimpQx.js.map +1 -0
  26. package/dist/client-CCKGsTeI.js +743 -0
  27. package/dist/client-CCKGsTeI.js.map +1 -0
  28. package/dist/cloudflare/index.d.ts +37 -0
  29. package/dist/cloudflare/index.d.ts.map +1 -0
  30. package/dist/cloudflare/index.js +41 -0
  31. package/dist/cloudflare/index.js.map +1 -0
  32. package/dist/cloudflare-browser-B6Yolpin.js +428 -0
  33. package/dist/cloudflare-browser-B6Yolpin.js.map +1 -0
  34. package/dist/cloudflare-email-Dy0KHeDf.js +197 -0
  35. package/dist/cloudflare-email-Dy0KHeDf.js.map +1 -0
  36. package/dist/cloudflare-sandbox-Dp_uNaqW.js +982 -0
  37. package/dist/cloudflare-sandbox-Dp_uNaqW.js.map +1 -0
  38. package/dist/content-type-CORxaxcv.js +49 -0
  39. package/dist/content-type-CORxaxcv.js.map +1 -0
  40. package/dist/core/index.d.ts +4 -0
  41. package/dist/core/index.js +204 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/define-CvpJ_pNP.js +115 -0
  44. package/dist/define-CvpJ_pNP.js.map +1 -0
  45. package/dist/errors-DoSpNHvs.js +20 -0
  46. package/dist/errors-DoSpNHvs.js.map +1 -0
  47. package/dist/errors-aKhko9T1.d.ts +18 -0
  48. package/dist/errors-aKhko9T1.d.ts.map +1 -0
  49. package/dist/eventbridge-scheduler-Bh6GqZY2.js +349 -0
  50. package/dist/eventbridge-scheduler-Bh6GqZY2.js.map +1 -0
  51. package/dist/framework-context-DVIIY8ZO.js +24 -0
  52. package/dist/framework-context-DVIIY8ZO.js.map +1 -0
  53. package/dist/gotenberg-NuJjxyln.js +291 -0
  54. package/dist/gotenberg-NuJjxyln.js.map +1 -0
  55. package/dist/http/index.d.ts +47 -0
  56. package/dist/http/index.d.ts.map +1 -0
  57. package/dist/http/index.js +3 -0
  58. package/dist/http-service-DDNCO1s4.js +254 -0
  59. package/dist/http-service-DDNCO1s4.js.map +1 -0
  60. package/dist/http-service-T7E5UjP8.d.ts +80 -0
  61. package/dist/http-service-T7E5UjP8.d.ts.map +1 -0
  62. package/dist/imessage-BSAFOI8Z.js +154 -0
  63. package/dist/imessage-BSAFOI8Z.js.map +1 -0
  64. package/dist/index-BU4gmYO8.d.ts +254 -0
  65. package/dist/index-BU4gmYO8.d.ts.map +1 -0
  66. package/dist/index-CCivzmxO.d.ts +188 -0
  67. package/dist/index-CCivzmxO.d.ts.map +1 -0
  68. package/dist/index-CLmTrcu5.d.ts +22 -0
  69. package/dist/index-CLmTrcu5.d.ts.map +1 -0
  70. package/dist/index-CZX5OeOF.d.ts +235 -0
  71. package/dist/index-CZX5OeOF.d.ts.map +1 -0
  72. package/dist/index-CdFmEfZO.d.ts +359 -0
  73. package/dist/index-CdFmEfZO.d.ts.map +1 -0
  74. package/dist/index-Cuh6eMWc.d.ts +285 -0
  75. package/dist/index-Cuh6eMWc.d.ts.map +1 -0
  76. package/dist/index-DuOGj7vc.d.ts +107 -0
  77. package/dist/index-DuOGj7vc.d.ts.map +1 -0
  78. package/dist/index-ccZ1XOHw.d.ts +69 -0
  79. package/dist/index-ccZ1XOHw.d.ts.map +1 -0
  80. package/dist/index-n8JTpNf1.d.ts +247 -0
  81. package/dist/index-n8JTpNf1.d.ts.map +1 -0
  82. package/dist/index-pwW1OsOx.d.ts +134 -0
  83. package/dist/index-pwW1OsOx.d.ts.map +1 -0
  84. package/dist/index-zK1ZwS4m.d.ts +347 -0
  85. package/dist/index-zK1ZwS4m.d.ts.map +1 -0
  86. package/dist/limits-hjrO8zUG.js +80 -0
  87. package/dist/limits-hjrO8zUG.js.map +1 -0
  88. package/dist/mastra/index.d.ts +14 -0
  89. package/dist/mastra/index.d.ts.map +1 -0
  90. package/dist/mastra/index.js +26 -0
  91. package/dist/mastra/index.js.map +1 -0
  92. package/dist/mastra-vector-Dhc6XZ8l.js +234 -0
  93. package/dist/mastra-vector-Dhc6XZ8l.js.map +1 -0
  94. package/dist/mcp/index.d.ts +80 -0
  95. package/dist/mcp/index.d.ts.map +1 -0
  96. package/dist/mcp/index.js +97 -0
  97. package/dist/mcp/index.js.map +1 -0
  98. package/dist/modules/artifacts/index.d.ts +337 -0
  99. package/dist/modules/artifacts/index.d.ts.map +1 -0
  100. package/dist/modules/artifacts/index.js +348 -0
  101. package/dist/modules/artifacts/index.js.map +1 -0
  102. package/dist/modules/browser/index.d.ts +516 -0
  103. package/dist/modules/browser/index.d.ts.map +1 -0
  104. package/dist/modules/browser/index.js +475 -0
  105. package/dist/modules/browser/index.js.map +1 -0
  106. package/dist/modules/calendar/index.d.ts +93 -0
  107. package/dist/modules/calendar/index.d.ts.map +1 -0
  108. package/dist/modules/calendar/index.js +131 -0
  109. package/dist/modules/calendar/index.js.map +1 -0
  110. package/dist/modules/code-sandbox/index.d.ts +317 -0
  111. package/dist/modules/code-sandbox/index.d.ts.map +1 -0
  112. package/dist/modules/code-sandbox/index.js +537 -0
  113. package/dist/modules/code-sandbox/index.js.map +1 -0
  114. package/dist/modules/content-type/index.d.ts +22 -0
  115. package/dist/modules/content-type/index.d.ts.map +1 -0
  116. package/dist/modules/content-type/index.js +66 -0
  117. package/dist/modules/content-type/index.js.map +1 -0
  118. package/dist/modules/crypto/index.d.ts +115 -0
  119. package/dist/modules/crypto/index.d.ts.map +1 -0
  120. package/dist/modules/crypto/index.js +139 -0
  121. package/dist/modules/crypto/index.js.map +1 -0
  122. package/dist/modules/document/index.d.ts +575 -0
  123. package/dist/modules/document/index.d.ts.map +1 -0
  124. package/dist/modules/document/index.js +444 -0
  125. package/dist/modules/document/index.js.map +1 -0
  126. package/dist/modules/document-extract/index.d.ts +438 -0
  127. package/dist/modules/document-extract/index.d.ts.map +1 -0
  128. package/dist/modules/document-extract/index.js +127 -0
  129. package/dist/modules/document-extract/index.js.map +1 -0
  130. package/dist/modules/document-render/index.d.ts +336 -0
  131. package/dist/modules/document-render/index.d.ts.map +1 -0
  132. package/dist/modules/document-render/index.js +155 -0
  133. package/dist/modules/document-render/index.js.map +1 -0
  134. package/dist/modules/email/index.d.ts +311 -0
  135. package/dist/modules/email/index.d.ts.map +1 -0
  136. package/dist/modules/email/index.js +167 -0
  137. package/dist/modules/email/index.js.map +1 -0
  138. package/dist/modules/email-message/index.d.ts +95 -0
  139. package/dist/modules/email-message/index.d.ts.map +1 -0
  140. package/dist/modules/email-message/index.js +264 -0
  141. package/dist/modules/email-message/index.js.map +1 -0
  142. package/dist/modules/file-convert/index.d.ts +273 -0
  143. package/dist/modules/file-convert/index.d.ts.map +1 -0
  144. package/dist/modules/file-convert/index.js +103 -0
  145. package/dist/modules/file-convert/index.js.map +1 -0
  146. package/dist/modules/files/index.d.ts +452 -0
  147. package/dist/modules/files/index.d.ts.map +1 -0
  148. package/dist/modules/files/index.js +733 -0
  149. package/dist/modules/files/index.js.map +1 -0
  150. package/dist/modules/image/index.d.ts +342 -0
  151. package/dist/modules/image/index.d.ts.map +1 -0
  152. package/dist/modules/image/index.js +281 -0
  153. package/dist/modules/image/index.js.map +1 -0
  154. package/dist/modules/messaging/index.d.ts +608 -0
  155. package/dist/modules/messaging/index.d.ts.map +1 -0
  156. package/dist/modules/messaging/index.js +1067 -0
  157. package/dist/modules/messaging/index.js.map +1 -0
  158. package/dist/modules/pdf/index.d.ts +287 -0
  159. package/dist/modules/pdf/index.d.ts.map +1 -0
  160. package/dist/modules/pdf/index.js +259 -0
  161. package/dist/modules/pdf/index.js.map +1 -0
  162. package/dist/modules/presentation/index.d.ts +247 -0
  163. package/dist/modules/presentation/index.d.ts.map +1 -0
  164. package/dist/modules/presentation/index.js +12657 -0
  165. package/dist/modules/presentation/index.js.map +1 -0
  166. package/dist/modules/queue/index.d.ts +129 -0
  167. package/dist/modules/queue/index.d.ts.map +1 -0
  168. package/dist/modules/queue/index.js +131 -0
  169. package/dist/modules/queue/index.js.map +1 -0
  170. package/dist/modules/rag/index.d.ts +250 -0
  171. package/dist/modules/rag/index.d.ts.map +1 -0
  172. package/dist/modules/rag/index.js +366 -0
  173. package/dist/modules/rag/index.js.map +1 -0
  174. package/dist/modules/scheduler/index.d.ts +216 -0
  175. package/dist/modules/scheduler/index.d.ts.map +1 -0
  176. package/dist/modules/scheduler/index.js +153 -0
  177. package/dist/modules/scheduler/index.js.map +1 -0
  178. package/dist/modules/skills/index.d.ts +205 -0
  179. package/dist/modules/skills/index.d.ts.map +1 -0
  180. package/dist/modules/skills/index.js +203 -0
  181. package/dist/modules/skills/index.js.map +1 -0
  182. package/dist/modules/tasks/index.d.ts +287 -0
  183. package/dist/modules/tasks/index.d.ts.map +1 -0
  184. package/dist/modules/tasks/index.js +207 -0
  185. package/dist/modules/tasks/index.js.map +1 -0
  186. package/dist/modules/vector-store/index.d.ts +3 -0
  187. package/dist/modules/vector-store/index.js +3 -0
  188. package/dist/modules/web-fetch/index.d.ts +99 -0
  189. package/dist/modules/web-fetch/index.d.ts.map +1 -0
  190. package/dist/modules/web-fetch/index.js +242 -0
  191. package/dist/modules/web-fetch/index.js.map +1 -0
  192. package/dist/object-artifact-store-CMTzCm_G.d.ts +7 -0
  193. package/dist/object-artifact-store-CMTzCm_G.d.ts.map +1 -0
  194. package/dist/object-artifact-store-wZ2j9cto.js +28 -0
  195. package/dist/object-artifact-store-wZ2j9cto.js.map +1 -0
  196. package/dist/pinecone-umY4t6OF.js +190 -0
  197. package/dist/pinecone-umY4t6OF.js.map +1 -0
  198. package/dist/provider-CgDAlg6K.js +34 -0
  199. package/dist/provider-CgDAlg6K.js.map +1 -0
  200. package/dist/qdrant-DMp4NhKR.js +253 -0
  201. package/dist/qdrant-DMp4NhKR.js.map +1 -0
  202. package/dist/resend-BAC38_dA.js +155 -0
  203. package/dist/resend-BAC38_dA.js.map +1 -0
  204. package/dist/s3-CsOaPWMP.js +955 -0
  205. package/dist/s3-CsOaPWMP.js.map +1 -0
  206. package/dist/schemas-ChOAhdo9.js +192 -0
  207. package/dist/schemas-ChOAhdo9.js.map +1 -0
  208. package/dist/slack-Di5BBNpt.js +1455 -0
  209. package/dist/slack-Di5BBNpt.js.map +1 -0
  210. package/dist/sqs-DCwS1i2N.js +225 -0
  211. package/dist/sqs-DCwS1i2N.js.map +1 -0
  212. package/dist/supabase-vector-Dpp9mmJR.js +218 -0
  213. package/dist/supabase-vector-Dpp9mmJR.js.map +1 -0
  214. package/dist/tanstack/index.d.ts +15 -0
  215. package/dist/tanstack/index.d.ts.map +1 -0
  216. package/dist/tanstack/index.js +28 -0
  217. package/dist/tanstack/index.js.map +1 -0
  218. package/dist/teams-DYAHNb39.js +835 -0
  219. package/dist/teams-DYAHNb39.js.map +1 -0
  220. package/dist/telegram-DDXWzkfL.js +734 -0
  221. package/dist/telegram-DDXWzkfL.js.map +1 -0
  222. package/dist/textract-CPLiB22H.js +554 -0
  223. package/dist/textract-CPLiB22H.js.map +1 -0
  224. package/dist/transport-B4vn-XiQ.js +157 -0
  225. package/dist/transport-B4vn-XiQ.js.map +1 -0
  226. package/dist/transport-i96ACAI_.d.ts +46 -0
  227. package/dist/transport-i96ACAI_.d.ts.map +1 -0
  228. package/dist/types-Ccb0DXY9.d.ts +150 -0
  229. package/dist/types-Ccb0DXY9.d.ts.map +1 -0
  230. package/dist/unique-EwBH1JPB.js +19 -0
  231. package/dist/unique-EwBH1JPB.js.map +1 -0
  232. package/dist/vector-store-C3nEO80e.js +193 -0
  233. package/dist/vector-store-C3nEO80e.js.map +1 -0
  234. package/dist/vendors/amazon-sp-api/index.d.ts +526 -0
  235. package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -0
  236. package/dist/vendors/amazon-sp-api/index.js +975 -0
  237. package/dist/vendors/amazon-sp-api/index.js.map +1 -0
  238. package/dist/vendors/bedrock-agentcore-browser/index.d.ts +2 -0
  239. package/dist/vendors/bedrock-agentcore-browser/index.js +2 -0
  240. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +228 -0
  241. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts.map +1 -0
  242. package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +2 -0
  243. package/dist/vendors/cloudflare-browser/index.d.ts +2 -0
  244. package/dist/vendors/cloudflare-browser/index.js +2 -0
  245. package/dist/vendors/cloudflare-email/index.d.ts +260 -0
  246. package/dist/vendors/cloudflare-email/index.d.ts.map +1 -0
  247. package/dist/vendors/cloudflare-email/index.js +3 -0
  248. package/dist/vendors/cloudflare-sandbox/index.d.ts +565 -0
  249. package/dist/vendors/cloudflare-sandbox/index.d.ts.map +1 -0
  250. package/dist/vendors/cloudflare-sandbox/index.js +2 -0
  251. package/dist/vendors/eventbridge-scheduler/index.d.ts +2 -0
  252. package/dist/vendors/eventbridge-scheduler/index.js +2 -0
  253. package/dist/vendors/gotenberg/index.d.ts +306 -0
  254. package/dist/vendors/gotenberg/index.d.ts.map +1 -0
  255. package/dist/vendors/gotenberg/index.js +2 -0
  256. package/dist/vendors/imessage/index.d.ts +420 -0
  257. package/dist/vendors/imessage/index.d.ts.map +1 -0
  258. package/dist/vendors/imessage/index.js +4 -0
  259. package/dist/vendors/katana/index.d.ts +1570 -0
  260. package/dist/vendors/katana/index.d.ts.map +1 -0
  261. package/dist/vendors/katana/index.js +1639 -0
  262. package/dist/vendors/katana/index.js.map +1 -0
  263. package/dist/vendors/mastra-vector/index.d.ts +120 -0
  264. package/dist/vendors/mastra-vector/index.d.ts.map +1 -0
  265. package/dist/vendors/mastra-vector/index.js +3 -0
  266. package/dist/vendors/pinecone/index.d.ts +75 -0
  267. package/dist/vendors/pinecone/index.d.ts.map +1 -0
  268. package/dist/vendors/pinecone/index.js +3 -0
  269. package/dist/vendors/qdrant/index.d.ts +75 -0
  270. package/dist/vendors/qdrant/index.d.ts.map +1 -0
  271. package/dist/vendors/qdrant/index.js +3 -0
  272. package/dist/vendors/resend/index.d.ts +3 -0
  273. package/dist/vendors/resend/index.js +3 -0
  274. package/dist/vendors/s3/index.d.ts +2 -0
  275. package/dist/vendors/s3/index.js +2 -0
  276. package/dist/vendors/slack/index.d.ts +576 -0
  277. package/dist/vendors/slack/index.d.ts.map +1 -0
  278. package/dist/vendors/slack/index.js +3 -0
  279. package/dist/vendors/sqs/index.d.ts +2 -0
  280. package/dist/vendors/sqs/index.js +2 -0
  281. package/dist/vendors/supabase-vector/index.d.ts +89 -0
  282. package/dist/vendors/supabase-vector/index.d.ts.map +1 -0
  283. package/dist/vendors/supabase-vector/index.js +3 -0
  284. package/dist/vendors/teams/index.d.ts +303 -0
  285. package/dist/vendors/teams/index.d.ts.map +1 -0
  286. package/dist/vendors/teams/index.js +3 -0
  287. package/dist/vendors/telegram/index.d.ts +319 -0
  288. package/dist/vendors/telegram/index.d.ts.map +1 -0
  289. package/dist/vendors/telegram/index.js +3 -0
  290. package/dist/vendors/textract/index.d.ts +2 -0
  291. package/dist/vendors/textract/index.js +2 -0
  292. package/dist/vendors/woocommerce/index.d.ts +1700 -0
  293. package/dist/vendors/woocommerce/index.d.ts.map +1 -0
  294. package/dist/vendors/woocommerce/index.js +1427 -0
  295. package/dist/vendors/woocommerce/index.js.map +1 -0
  296. package/dist/with-auth-CpKqTrGK.js +240 -0
  297. package/dist/with-auth-CpKqTrGK.js.map +1 -0
  298. package/logos/LUCIDE-ATTRIBUTION.txt +4 -0
  299. package/logos/README.md +89 -0
  300. package/logos/amazon.svg +6 -0
  301. package/logos/artifacts.svg +9 -0
  302. package/logos/browser.svg +9 -0
  303. package/logos/calendar.svg +15 -0
  304. package/logos/cloudflare-browser.svg +5 -0
  305. package/logos/cloudflare-email.svg +5 -0
  306. package/logos/cloudflare.svg +4 -0
  307. package/logos/code-sandbox.svg +8 -0
  308. package/logos/content-type.svg +10 -0
  309. package/logos/crypto.svg +7 -0
  310. package/logos/document-extract.svg +12 -0
  311. package/logos/document-render.svg +8 -0
  312. package/logos/document.svg +10 -0
  313. package/logos/email-message.svg +8 -0
  314. package/logos/email.svg +7 -0
  315. package/logos/file-convert.svg +9 -0
  316. package/logos/files.svg +6 -0
  317. package/logos/gotenberg.svg +340 -0
  318. package/logos/image.svg +8 -0
  319. package/logos/imessage.svg +7 -0
  320. package/logos/katana.svg +13 -0
  321. package/logos/mastra.svg +7 -0
  322. package/logos/messaging.svg +7 -0
  323. package/logos/pack-logos.json +48 -0
  324. package/logos/pdf.svg +10 -0
  325. package/logos/pinecone.svg +25 -0
  326. package/logos/presentation.svg +8 -0
  327. package/logos/qdrant.svg +4 -0
  328. package/logos/queue.svg +11 -0
  329. package/logos/rag.svg +18 -0
  330. package/logos/resend.svg +5 -0
  331. package/logos/scheduler.svg +7 -0
  332. package/logos/skills.svg +10 -0
  333. package/logos/slack.svg +14 -0
  334. package/logos/supabase.svg +4 -0
  335. package/logos/tasks.svg +10 -0
  336. package/logos/teams.svg +6 -0
  337. package/logos/telegram.svg +10 -0
  338. package/logos/textract.svg +5 -0
  339. package/logos/vector-store.svg +8 -0
  340. package/logos/web-fetch.svg +8 -0
  341. package/logos/woocommerce.svg +4 -0
  342. package/package.json +373 -0
@@ -0,0 +1,428 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ import { n as defineModule, r as defineTool } from "./define-CvpJ_pNP.js";
3
+ import { n as requireAuth } from "./provider-CgDAlg6K.js";
4
+ import { t as artifactRefSchema } from "./artifact-D064mHfK.js";
5
+ import { t as HttpService } from "./http-service-DDNCO1s4.js";
6
+ import { m as s3AuthSchema, p as S3Client } from "./s3-CsOaPWMP.js";
7
+ import { isNumber, isPlainObject, isString } from "es-toolkit";
8
+ import { z } from "zod";
9
+ import { compile } from "html-to-text";
10
+ //#region src/vendors/cloudflare-browser/contracts.ts
11
+ const MAX_HTML_CHARS = 2e6;
12
+ /**
13
+ * Cloudflare Browser Run engine (`?browser=`).
14
+ * `chromium` is the product default (omit query). `kitesurf` is the lightweight Workers engine.
15
+ */
16
+ const cloudflareBrowserEngineSchema = z.enum(["chromium", "kitesurf"]).describe("Browser engine: kitesurf for cheaper agent screenshots/HTML extraction; chromium for pixel-perfect or complex sites (default)");
17
+ const cloudflareBrowserSessionAuthSchema = z.object({
18
+ account_id: z.string().min(1).describe("Cloudflare account id"),
19
+ api_token: z.string().min(1).describe("Cloudflare API token with Browser Rendering permission"),
20
+ browser: cloudflareBrowserEngineSchema.optional().describe("Default Browser Run engine for sessions and quick actions (chromium | kitesurf). Per-call browser overrides this when set.")
21
+ });
22
+ const cloudflareBrowserClientAuthSchema = cloudflareBrowserSessionAuthSchema.extend({ storage: s3AuthSchema.optional().describe("Object storage required for rendered ArtifactRef output") });
23
+ const cloudflareBrowserAuthSchema = cloudflareBrowserSessionAuthSchema.extend({ storage: s3AuthSchema.describe("Object storage for rendered ArtifactRef output") });
24
+ const cloudflareBrowserStartSessionInputSchema = z.object({
25
+ keep_alive_seconds: z.int().min(60).max(600).optional().describe("How long the browser session remains available, from 60 to 600 seconds"),
26
+ browser: cloudflareBrowserEngineSchema.optional().describe("Override auth default engine for this session")
27
+ });
28
+ const cloudflareBrowserSessionIdInputSchema = z.object({ session_id: z.string().uuid().describe("Cloudflare browser session id") });
29
+ const cloudflareBrowserSessionOutputSchema = z.object({
30
+ session_id: z.string().describe("Cloudflare browser session id"),
31
+ status: z.string().optional().describe("Current session status"),
32
+ websocket_debugger_url: z.string().optional().describe("WebSocket endpoint for Chrome DevTools Protocol"),
33
+ devtools_frontend_url: z.string().optional().describe("Hosted DevTools and live-view URL")
34
+ });
35
+ const cloudflareBrowserViewportSchema = z.object({
36
+ width: z.int().min(1).max(8e3).describe("Viewport width in CSS pixels"),
37
+ height: z.int().min(1).max(8e3).describe("Viewport height in CSS pixels"),
38
+ device_scale_factor: z.number().min(.1).max(4).optional().describe("Device scale factor (default 1)")
39
+ });
40
+ const cloudflareBrowserRenderSourceSchema = z.object({
41
+ html: z.string().min(1).max(MAX_HTML_CHARS).optional().describe("HTML document body to render"),
42
+ url: z.url().optional().describe("Absolute http(s) URL to open and render")
43
+ }).refine((v) => Boolean(v.html?.trim() || v.url), { message: "Provide html or url" }).refine((v) => !(v.html && v.url), { message: "Provide only one of html or url" });
44
+ const cloudflareBrowserRenderPdfInputSchema = z.object({
45
+ source: cloudflareBrowserRenderSourceSchema.describe("HTML string or URL to print"),
46
+ output_key: z.string().min(1).optional().describe("Object key for the PDF. Defaults under renders/"),
47
+ filename: z.string().min(1).optional().describe("Display filename for the result ArtifactRef"),
48
+ browser: cloudflareBrowserEngineSchema.optional().describe("Override auth default engine for this render")
49
+ });
50
+ const cloudflareBrowserRenderScreenshotInputSchema = z.object({
51
+ source: cloudflareBrowserRenderSourceSchema.describe("HTML string or URL to capture"),
52
+ output_key: z.string().min(1).optional().describe("Object key for the PNG. Defaults under renders/"),
53
+ filename: z.string().min(1).optional().describe("Display filename for the result ArtifactRef"),
54
+ viewport: cloudflareBrowserViewportSchema.optional().describe("Optional screenshot viewport"),
55
+ browser: cloudflareBrowserEngineSchema.optional().describe("Override auth default engine for this capture")
56
+ });
57
+ const cloudflareBrowserRenderOutputSchema = z.object({
58
+ result: artifactRefSchema,
59
+ kind: z.enum(["pdf", "screenshot"])
60
+ });
61
+ //#endregion
62
+ //#region src/vendors/cloudflare-browser/domain.ts
63
+ /**
64
+ * Cloudflare Browser Rendering payload helpers (no HTTP).
65
+ * HTML → text / title via html-to-text (edge + node). No hand-rolled HTML parsers.
66
+ */
67
+ /**
68
+ * Query bag for Browser Run `?browser=`.
69
+ * Only emits when non-default (kitesurf); chromium is the API default when omitted.
70
+ */
71
+ function browserEngineQuery(engine) {
72
+ if (engine === "kitesurf") return { browser: "kitesurf" };
73
+ return {};
74
+ }
75
+ /** Prefer per-call engine, then host auth default. */
76
+ function resolveBrowserEngine(override, authDefault) {
77
+ return override ?? authDefault;
78
+ }
79
+ const htmlToPlainText = compile({
80
+ decodeEntities: true,
81
+ preserveNewlines: false,
82
+ wordwrap: false,
83
+ selectors: [
84
+ {
85
+ selector: "script",
86
+ format: "skip"
87
+ },
88
+ {
89
+ selector: "style",
90
+ format: "skip"
91
+ },
92
+ {
93
+ selector: "noscript",
94
+ format: "skip"
95
+ }
96
+ ]
97
+ });
98
+ const htmlToTitle = compile({
99
+ decodeEntities: true,
100
+ wordwrap: false,
101
+ baseElements: {
102
+ selectors: ["title"],
103
+ orderBy: "occurrence",
104
+ returnDomByDefault: false
105
+ },
106
+ selectors: [{
107
+ selector: "title",
108
+ format: "inline"
109
+ }]
110
+ });
111
+ function sourceBody(source) {
112
+ if (source.html) return { html: source.html };
113
+ if (source.url) return { url: source.url };
114
+ throw new ToolError("Provide html or url", { code: "bad_input" });
115
+ }
116
+ function assertBinaryPrefix(bytes, kind) {
117
+ if (kind === "pdf") {
118
+ const sig = new TextEncoder().encode("%PDF-");
119
+ if (!(bytes.byteLength >= sig.byteLength && sig.every((b, i) => bytes[i] === b))) throw new ToolError("Cloudflare Browser returned non-PDF body", { code: "upstream" });
120
+ return;
121
+ }
122
+ const png = new Uint8Array([
123
+ 137,
124
+ 80,
125
+ 78,
126
+ 71,
127
+ 13,
128
+ 10,
129
+ 26,
130
+ 10
131
+ ]);
132
+ if (!(bytes.byteLength >= png.byteLength && png.every((b, i) => bytes[i] === b))) throw new ToolError("Cloudflare Browser returned non-PNG body", { code: "upstream" });
133
+ }
134
+ function defaultRenderKey(kind, outputKey) {
135
+ if (outputKey) return outputKey;
136
+ const stamp = Date.now();
137
+ return kind === "pdf" ? `renders/${stamp}.pdf` : `renders/${stamp}.png`;
138
+ }
139
+ /** Document title via html-to-text (not a hand-rolled HTML parser). */
140
+ function titleFromHtml(html) {
141
+ const title = htmlToTitle(html).trim();
142
+ return title.length > 0 ? title : void 0;
143
+ }
144
+ /** Visible page text via html-to-text. */
145
+ function plainTextFromHtml(html) {
146
+ return htmlToPlainText(html).trim();
147
+ }
148
+ //#endregion
149
+ //#region src/vendors/cloudflare-browser/client.ts
150
+ /**
151
+ * Cloudflare Browser Rendering vendor client (HTML/URL → PDF or screenshot).
152
+ * Host: `new CloudflareBrowserClient(auth)`. Agent tools: `fromContext(ctx)`.
153
+ */
154
+ var CloudflareBrowserClient = class CloudflareBrowserClient {
155
+ #auth;
156
+ #http;
157
+ #storage;
158
+ constructor(auth, options = {}) {
159
+ const parsed = cloudflareBrowserClientAuthSchema.safeParse(auth);
160
+ if (!parsed.success) throw new ToolError("Invalid Cloudflare Browser auth credentials", {
161
+ code: "bad_auth",
162
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
163
+ });
164
+ this.#auth = parsed.data;
165
+ this.#http = new HttpService({
166
+ ...options,
167
+ baseURL: `https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(this.#auth.account_id)}`,
168
+ headers: { Authorization: `Bearer ${this.#auth.api_token}` },
169
+ timeout: 6e4,
170
+ label: "Cloudflare Browser"
171
+ });
172
+ if (this.#auth.storage) this.#storage = new S3Client(this.#auth.storage, options);
173
+ }
174
+ static fromContext(ctx) {
175
+ const auth = requireAuth(ctx, cloudflareBrowserClientAuthSchema);
176
+ return new CloudflareBrowserClient(auth, {
177
+ ...ctx.fetch && { fetch: ctx.fetch },
178
+ ...ctx.signal && { signal: ctx.signal }
179
+ });
180
+ }
181
+ async startSession(input = {}) {
182
+ const { data } = await this.#http.post("/browser-rendering/devtools/browser", void 0, { query: {
183
+ ...input.keep_alive_seconds !== void 0 && { keep_alive: input.keep_alive_seconds * 1e3 },
184
+ ...browserEngineQuery(this.#engine(input.browser))
185
+ } });
186
+ return this.#mapSession(data, void 0, "active");
187
+ }
188
+ async getSession(input) {
189
+ const { data } = await this.#http.get(`/browser-rendering/devtools/session/${encodeURIComponent(input.session_id)}`);
190
+ return this.#mapSession(data, input.session_id, "active");
191
+ }
192
+ async stopSession(input) {
193
+ const { data } = await this.#http.delete(`/browser-rendering/devtools/browser/${encodeURIComponent(input.session_id)}`);
194
+ return this.#mapSession(data, input.session_id, "closing");
195
+ }
196
+ /** Browser Rendering PDF; store result in object storage. */
197
+ async renderPdf(input) {
198
+ return this.#renderAndStore("pdf", input);
199
+ }
200
+ /** Browser Rendering screenshot (PNG); store result in object storage. */
201
+ async renderScreenshot(input) {
202
+ return this.#renderAndStore("screenshot", input);
203
+ }
204
+ /**
205
+ * One-shot rendered HTML for a URL or HTML source (Browser Rendering content API).
206
+ * Not session-bound CDP; used for seam navigate/snapshot on Cloudflare.
207
+ */
208
+ async fetchContent(input) {
209
+ const body = {
210
+ ...sourceBody({
211
+ ...input.url && { url: input.url },
212
+ ...input.html && { html: input.html }
213
+ }),
214
+ setJavaScriptEnabled: true
215
+ };
216
+ const { data } = await this.#http.post("/browser-rendering/content", body, {
217
+ label: "Cloudflare Browser content",
218
+ headers: {
219
+ "Content-Type": "application/json",
220
+ Accept: "text/html, application/json"
221
+ },
222
+ query: browserEngineQuery(this.#engine(input.browser))
223
+ });
224
+ if (isString(data)) {
225
+ const out = { html: data };
226
+ const title = titleFromHtml(data);
227
+ if (title) out.title = title;
228
+ return out;
229
+ }
230
+ if (isPlainObject(data)) {
231
+ const result = data["result"];
232
+ const html = isString(result) ? result : isString(data["html"]) ? data["html"] : void 0;
233
+ if (html) {
234
+ const out = { html };
235
+ const title = titleFromHtml(html);
236
+ if (title) out.title = title;
237
+ return out;
238
+ }
239
+ }
240
+ throw new ToolError("Cloudflare Browser content response missing HTML", { code: "upstream" });
241
+ }
242
+ async #renderAndStore(kind, input) {
243
+ const body = {
244
+ ...sourceBody(input.source),
245
+ setJavaScriptEnabled: true
246
+ };
247
+ if (kind === "pdf") {
248
+ body["preferCSSPageSize"] = true;
249
+ body["printBackground"] = true;
250
+ } else {
251
+ body["fullPage"] = true;
252
+ body["type"] = "png";
253
+ if ("viewport" in input && input.viewport) {
254
+ const viewport = {
255
+ width: input.viewport.width,
256
+ height: input.viewport.height
257
+ };
258
+ if (input.viewport.device_scale_factor !== void 0) viewport["deviceScaleFactor"] = input.viewport.device_scale_factor;
259
+ body["viewport"] = viewport;
260
+ }
261
+ }
262
+ const path = kind === "pdf" ? "/browser-rendering/pdf" : "/browser-rendering/screenshot";
263
+ const accept = kind === "pdf" ? "application/pdf" : "image/png";
264
+ const { bytes } = await this.#http.bytes("POST", path, {
265
+ label: `Cloudflare Browser ${kind}`,
266
+ body,
267
+ headers: {
268
+ "Content-Type": "application/json",
269
+ Accept: accept
270
+ },
271
+ query: browserEngineQuery(this.#engine(input.browser))
272
+ });
273
+ assertBinaryPrefix(bytes, kind);
274
+ const mediaType = kind === "pdf" ? "application/pdf" : "image/png";
275
+ const key = defaultRenderKey(kind, input.output_key);
276
+ const filename = input.filename ?? (kind === "pdf" ? "render.pdf" : "render.png");
277
+ const storage = this.#storage;
278
+ if (!storage) throw new ToolError("Cloudflare Browser rendering requires object storage", { code: "bad_auth" });
279
+ await storage.putBytes(key, bytes, mediaType);
280
+ const result = artifactRefSchema.parse({
281
+ store: "object",
282
+ key,
283
+ media_type: mediaType,
284
+ filename,
285
+ byte_length: bytes.byteLength
286
+ });
287
+ return cloudflareBrowserRenderOutputSchema.parse({
288
+ result,
289
+ kind
290
+ });
291
+ }
292
+ #engine(override) {
293
+ return resolveBrowserEngine(override, this.#auth.browser);
294
+ }
295
+ #mapSession(data, fallbackSessionId, fallbackStatus) {
296
+ const payload = isPlainObject(data) && isPlainObject(data["result"]) ? data["result"] : data;
297
+ if (!isPlainObject(payload)) throw new ToolError("Unexpected Cloudflare Browser session response", { code: "upstream" });
298
+ const sessionId = isString(payload["sessionId"]) ? payload["sessionId"] : fallbackSessionId;
299
+ if (!sessionId) throw new ToolError("Cloudflare Browser session response missing sessionId", { code: "upstream" });
300
+ const output = { session_id: sessionId };
301
+ if (isString(payload["status"])) output.status = payload["status"];
302
+ else if (isString(payload["closeReason"]) || isNumber(payload["endTime"])) output.status = "closed";
303
+ else if (fallbackStatus) output.status = fallbackStatus;
304
+ if (isString(payload["webSocketDebuggerUrl"])) output.websocket_debugger_url = payload["webSocketDebuggerUrl"];
305
+ if (isString(payload["devtoolsFrontendUrl"])) output.devtools_frontend_url = payload["devtoolsFrontendUrl"];
306
+ return cloudflareBrowserSessionOutputSchema.parse(output);
307
+ }
308
+ };
309
+ //#endregion
310
+ //#region src/vendors/cloudflare-browser/cdp.ts
311
+ /**
312
+ * Cloudflare Browser Rendering CDP mint (no HTTP).
313
+ * Turns a session payload into Playwright / AgentBrowser connection options.
314
+ */
315
+ /**
316
+ * Append engine query params without clobbering existing search keys.
317
+ */
318
+ function withBrowserQuery(websocketUrl, engine) {
319
+ const extra = browserEngineQuery(engine);
320
+ if (!("browser" in extra)) return websocketUrl;
321
+ const url = new URL(websocketUrl);
322
+ if (!url.searchParams.has("browser")) url.searchParams.set("browser", extra.browser);
323
+ return url.toString();
324
+ }
325
+ /**
326
+ * Mint CDP connection options from a Cloudflare Browser session (startSession / getSession).
327
+ */
328
+ function mintCloudflareBrowserCdpConnection(session, options = {}) {
329
+ const rawUrl = session.websocket_debugger_url?.trim();
330
+ if (!rawUrl) throw new ToolError("Cloudflare Browser session has no websocket_debugger_url; start or get the session first", {
331
+ code: "bad_input",
332
+ details: { session_id: session.session_id }
333
+ });
334
+ const headers = {};
335
+ if (options.api_token) headers["Authorization"] = `Bearer ${options.api_token}`;
336
+ if (options.headers) Object.assign(headers, options.headers);
337
+ const out = {
338
+ session_id: session.session_id,
339
+ websocket_url: withBrowserQuery(rawUrl, options.browser),
340
+ headers
341
+ };
342
+ if (session.devtools_frontend_url) out.live_view_url = session.devtools_frontend_url;
343
+ if (session.status) out.status = session.status;
344
+ return out;
345
+ }
346
+ //#endregion
347
+ //#region src/vendors/cloudflare-browser/module.ts
348
+ const cloudflareBrowserRenderPdfTool = defineTool({
349
+ id: "cloudflare-browser-render-pdf",
350
+ name: "cloudflareBrowserRenderPdf",
351
+ description: "Render HTML or a URL to a PDF via Cloudflare Browser Rendering. Writes the PDF to object storage and returns an ArtifactRef.",
352
+ inputSchema: cloudflareBrowserRenderPdfInputSchema,
353
+ outputSchema: cloudflareBrowserRenderOutputSchema,
354
+ sideEffect: "write",
355
+ runtime: "both",
356
+ execute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).renderPdf(input)
357
+ });
358
+ const cloudflareBrowserRenderScreenshotTool = defineTool({
359
+ id: "cloudflare-browser-render-screenshot",
360
+ name: "cloudflareBrowserRenderScreenshot",
361
+ description: "Capture a PNG screenshot of HTML or a URL via Cloudflare Browser Rendering. Writes the image to object storage and returns an ArtifactRef.",
362
+ inputSchema: cloudflareBrowserRenderScreenshotInputSchema,
363
+ outputSchema: cloudflareBrowserRenderOutputSchema,
364
+ sideEffect: "write",
365
+ runtime: "both",
366
+ execute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).renderScreenshot(input)
367
+ });
368
+ const cloudflareBrowserStartSessionTool = defineTool({
369
+ id: "cloudflare-browser-start-session",
370
+ name: "cloudflareBrowserStartSession",
371
+ description: "Start a Cloudflare Browser Run session for interactive browser control and return its connection metadata. This creates a session; it does not navigate or render content.",
372
+ inputSchema: cloudflareBrowserStartSessionInputSchema,
373
+ outputSchema: cloudflareBrowserSessionOutputSchema,
374
+ sideEffect: "write",
375
+ runtime: "both",
376
+ network: true,
377
+ execute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).startSession(input)
378
+ });
379
+ const cloudflareBrowserGetSessionTool = defineTool({
380
+ id: "cloudflare-browser-get-session",
381
+ name: "cloudflareBrowserGetSession",
382
+ description: "Get the status and connection metadata for an existing Cloudflare Browser Run session. Use this to reconnect or check whether the session is still available.",
383
+ inputSchema: cloudflareBrowserSessionIdInputSchema,
384
+ outputSchema: cloudflareBrowserSessionOutputSchema,
385
+ sideEffect: "read",
386
+ runtime: "both",
387
+ network: true,
388
+ execute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).getSession(input)
389
+ });
390
+ const cloudflareBrowserStopSessionTool = defineTool({
391
+ id: "cloudflare-browser-stop-session",
392
+ name: "cloudflareBrowserStopSession",
393
+ description: "Close a Cloudflare Browser Run session by session id.",
394
+ inputSchema: cloudflareBrowserSessionIdInputSchema,
395
+ outputSchema: cloudflareBrowserSessionOutputSchema,
396
+ sideEffect: "write",
397
+ runtime: "both",
398
+ network: true,
399
+ execute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).stopSession(input)
400
+ });
401
+ const cloudflareBrowserModule = defineModule({
402
+ id: "cloudflare-browser",
403
+ title: "Cloudflare Browser Run",
404
+ description: "Cloudflare Browser Run vendor pack for browser sessions plus HTML/URL PDF and screenshot quick actions.",
405
+ runtime: "both",
406
+ auth: {
407
+ type: "custom",
408
+ schema: cloudflareBrowserClientAuthSchema
409
+ },
410
+ categories: ["browser", "cloudflare"],
411
+ classification: "standard",
412
+ tags: [
413
+ "render",
414
+ "cdp",
415
+ "session"
416
+ ],
417
+ tools: [
418
+ cloudflareBrowserStartSessionTool,
419
+ cloudflareBrowserGetSessionTool,
420
+ cloudflareBrowserStopSessionTool,
421
+ cloudflareBrowserRenderPdfTool,
422
+ cloudflareBrowserRenderScreenshotTool
423
+ ]
424
+ });
425
+ //#endregion
426
+ export { cloudflareBrowserViewportSchema as C, cloudflareBrowserStartSessionInputSchema as S, cloudflareBrowserRenderScreenshotInputSchema as _, cloudflareBrowserStartSessionTool as a, cloudflareBrowserSessionIdInputSchema as b, CloudflareBrowserClient as c, MAX_HTML_CHARS as d, cloudflareBrowserAuthSchema as f, cloudflareBrowserRenderPdfInputSchema as g, cloudflareBrowserRenderOutputSchema as h, cloudflareBrowserRenderScreenshotTool as i, plainTextFromHtml as l, cloudflareBrowserEngineSchema as m, cloudflareBrowserModule as n, cloudflareBrowserStopSessionTool as o, cloudflareBrowserClientAuthSchema as p, cloudflareBrowserRenderPdfTool as r, mintCloudflareBrowserCdpConnection as s, cloudflareBrowserGetSessionTool as t, titleFromHtml as u, cloudflareBrowserRenderSourceSchema as v, cloudflareBrowserSessionOutputSchema as x, cloudflareBrowserSessionAuthSchema as y };
427
+
428
+ //# sourceMappingURL=cloudflare-browser-B6Yolpin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-browser-B6Yolpin.js","names":["#auth","#http","#storage","#engine","#mapSession","#renderAndStore"],"sources":["../src/vendors/cloudflare-browser/contracts.ts","../src/vendors/cloudflare-browser/domain.ts","../src/vendors/cloudflare-browser/client.ts","../src/vendors/cloudflare-browser/cdp.ts","../src/vendors/cloudflare-browser/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { artifactRefSchema } from '../../shared/artifact'\nimport { s3AuthSchema } from '../s3'\n\nexport const MAX_HTML_CHARS = 2_000_000\n\n/**\n * Cloudflare Browser Run engine (`?browser=`).\n * `chromium` is the product default (omit query). `kitesurf` is the lightweight Workers engine.\n */\nexport const cloudflareBrowserEngineSchema = z\n\t.enum(['chromium', 'kitesurf'])\n\t.describe(\n\t\t'Browser engine: kitesurf for cheaper agent screenshots/HTML extraction; chromium for pixel-perfect or complex sites (default)'\n\t)\n\nexport type CloudflareBrowserEngine = z.infer<typeof cloudflareBrowserEngineSchema>\n\nexport const cloudflareBrowserSessionAuthSchema = z.object({\n\taccount_id: z.string().min(1).describe('Cloudflare account id'),\n\tapi_token: z.string().min(1).describe('Cloudflare API token with Browser Rendering permission'),\n\tbrowser: cloudflareBrowserEngineSchema\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Default Browser Run engine for sessions and quick actions (chromium | kitesurf). Per-call browser overrides this when set.'\n\t\t)\n})\n\nexport const cloudflareBrowserClientAuthSchema = cloudflareBrowserSessionAuthSchema.extend({\n\tstorage: s3AuthSchema.optional().describe('Object storage required for rendered ArtifactRef output')\n})\n\nexport const cloudflareBrowserAuthSchema = cloudflareBrowserSessionAuthSchema.extend({\n\tstorage: s3AuthSchema.describe('Object storage for rendered ArtifactRef output')\n})\n\nexport type CloudflareBrowserAuth = z.infer<typeof cloudflareBrowserAuthSchema>\nexport type CloudflareBrowserClientAuth = z.infer<typeof cloudflareBrowserClientAuthSchema>\nexport type CloudflareBrowserSessionAuth = z.infer<typeof cloudflareBrowserSessionAuthSchema>\n\nexport const cloudflareBrowserStartSessionInputSchema = z.object({\n\tkeep_alive_seconds: z\n\t\t.int()\n\t\t.min(60)\n\t\t.max(600)\n\t\t.optional()\n\t\t.describe('How long the browser session remains available, from 60 to 600 seconds'),\n\tbrowser: cloudflareBrowserEngineSchema.optional().describe('Override auth default engine for this session')\n})\n\nexport const cloudflareBrowserSessionIdInputSchema = z.object({\n\tsession_id: z.string().uuid().describe('Cloudflare browser session id')\n})\n\nexport const cloudflareBrowserSessionOutputSchema = z.object({\n\tsession_id: z.string().describe('Cloudflare browser session id'),\n\tstatus: z.string().optional().describe('Current session status'),\n\twebsocket_debugger_url: z.string().optional().describe('WebSocket endpoint for Chrome DevTools Protocol'),\n\tdevtools_frontend_url: z.string().optional().describe('Hosted DevTools and live-view URL')\n})\n\nexport type CloudflareBrowserStartSessionInput = z.infer<typeof cloudflareBrowserStartSessionInputSchema>\nexport type CloudflareBrowserSessionIdInput = z.infer<typeof cloudflareBrowserSessionIdInputSchema>\nexport type CloudflareBrowserSessionOutput = z.infer<typeof cloudflareBrowserSessionOutputSchema>\n\nexport const cloudflareBrowserViewportSchema = z.object({\n\twidth: z.int().min(1).max(8_000).describe('Viewport width in CSS pixels'),\n\theight: z.int().min(1).max(8_000).describe('Viewport height in CSS pixels'),\n\tdevice_scale_factor: z.number().min(0.1).max(4).optional().describe('Device scale factor (default 1)')\n})\n\nexport const cloudflareBrowserRenderSourceSchema = z\n\t.object({\n\t\thtml: z.string().min(1).max(MAX_HTML_CHARS).optional().describe('HTML document body to render'),\n\t\turl: z.url().optional().describe('Absolute http(s) URL to open and render')\n\t})\n\t.refine((v) => Boolean(v.html?.trim() || v.url), {\n\t\tmessage: 'Provide html or url'\n\t})\n\t.refine((v) => !(v.html && v.url), {\n\t\tmessage: 'Provide only one of html or url'\n\t})\n\nexport const cloudflareBrowserRenderPdfInputSchema = z.object({\n\tsource: cloudflareBrowserRenderSourceSchema.describe('HTML string or URL to print'),\n\toutput_key: z.string().min(1).optional().describe('Object key for the PDF. Defaults under renders/'),\n\tfilename: z.string().min(1).optional().describe('Display filename for the result ArtifactRef'),\n\tbrowser: cloudflareBrowserEngineSchema.optional().describe('Override auth default engine for this render')\n})\n\nexport const cloudflareBrowserRenderScreenshotInputSchema = z.object({\n\tsource: cloudflareBrowserRenderSourceSchema.describe('HTML string or URL to capture'),\n\toutput_key: z.string().min(1).optional().describe('Object key for the PNG. Defaults under renders/'),\n\tfilename: z.string().min(1).optional().describe('Display filename for the result ArtifactRef'),\n\tviewport: cloudflareBrowserViewportSchema.optional().describe('Optional screenshot viewport'),\n\tbrowser: cloudflareBrowserEngineSchema.optional().describe('Override auth default engine for this capture')\n})\n\nexport const cloudflareBrowserRenderOutputSchema = z.object({\n\tresult: artifactRefSchema,\n\tkind: z.enum(['pdf', 'screenshot'])\n})\n\nexport type CloudflareBrowserViewport = z.infer<typeof cloudflareBrowserViewportSchema>\nexport type CloudflareBrowserRenderSource = z.infer<typeof cloudflareBrowserRenderSourceSchema>\nexport type CloudflareBrowserRenderPdfInput = z.infer<typeof cloudflareBrowserRenderPdfInputSchema>\nexport type CloudflareBrowserRenderScreenshotInput = z.infer<typeof cloudflareBrowserRenderScreenshotInputSchema>\nexport type CloudflareBrowserRenderOutput = z.infer<typeof cloudflareBrowserRenderOutputSchema>\n","/**\n * Cloudflare Browser Rendering payload helpers (no HTTP).\n * HTML → text / title via html-to-text (edge + node). No hand-rolled HTML parsers.\n */\n\nimport { compile } from 'html-to-text'\n\nimport { ToolError } from '../../core/errors'\nimport type { CloudflareBrowserEngine, CloudflareBrowserRenderSource } from './contracts'\n\n/**\n * Query bag for Browser Run `?browser=`.\n * Only emits when non-default (kitesurf); chromium is the API default when omitted.\n */\nexport function browserEngineQuery(\n\tengine: CloudflareBrowserEngine | undefined\n): { browser: 'kitesurf' } | Record<string, never> {\n\tif (engine === 'kitesurf') return { browser: 'kitesurf' }\n\treturn {}\n}\n\n/** Prefer per-call engine, then host auth default. */\nexport function resolveBrowserEngine(\n\toverride: CloudflareBrowserEngine | undefined,\n\tauthDefault: CloudflareBrowserEngine | undefined\n): CloudflareBrowserEngine | undefined {\n\treturn override ?? authDefault\n}\n\n/** Resource types blocked by default (no network subresources). */\nexport const blockedBrowserResourceTypes = [\n\t'document',\n\t'stylesheet',\n\t'image',\n\t'media',\n\t'font',\n\t'script',\n\t'texttrack',\n\t'xhr',\n\t'fetch',\n\t'prefetch',\n\t'eventsource',\n\t'websocket',\n\t'manifest',\n\t'signedexchange',\n\t'ping',\n\t'cspviolationreport',\n\t'preflight',\n\t'other'\n] as const\n\nconst htmlToPlainText = compile({\n\tdecodeEntities: true,\n\tpreserveNewlines: false,\n\twordwrap: false,\n\tselectors: [\n\t\t{ selector: 'script', format: 'skip' },\n\t\t{ selector: 'style', format: 'skip' },\n\t\t{ selector: 'noscript', format: 'skip' }\n\t]\n})\n\nconst htmlToTitle = compile({\n\tdecodeEntities: true,\n\twordwrap: false,\n\tbaseElements: { selectors: ['title'], orderBy: 'occurrence', returnDomByDefault: false },\n\tselectors: [{ selector: 'title', format: 'inline' }]\n})\n\nexport function sourceBody(source: CloudflareBrowserRenderSource): Record<string, unknown> {\n\tif (source.html) return { html: source.html }\n\tif (source.url) return { url: source.url }\n\tthrow new ToolError('Provide html or url', { code: 'bad_input' })\n}\n\nexport function assertBinaryPrefix(bytes: Uint8Array, kind: 'pdf' | 'screenshot'): void {\n\tif (kind === 'pdf') {\n\t\tconst sig = new TextEncoder().encode('%PDF-')\n\t\tconst ok = bytes.byteLength >= sig.byteLength && sig.every((b, i) => bytes[i] === b)\n\t\tif (!ok) throw new ToolError('Cloudflare Browser returned non-PDF body', { code: 'upstream' })\n\t\treturn\n\t}\n\tconst png = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])\n\tconst ok = bytes.byteLength >= png.byteLength && png.every((b, i) => bytes[i] === b)\n\tif (!ok) throw new ToolError('Cloudflare Browser returned non-PNG body', { code: 'upstream' })\n}\n\nexport function defaultRenderKey(kind: 'pdf' | 'screenshot', outputKey: string | undefined): string {\n\tif (outputKey) return outputKey\n\tconst stamp = Date.now()\n\treturn kind === 'pdf' ? `renders/${stamp}.pdf` : `renders/${stamp}.png`\n}\n\n/** Document title via html-to-text (not a hand-rolled HTML parser). */\nexport function titleFromHtml(html: string): string | undefined {\n\tconst title = htmlToTitle(html).trim()\n\treturn title.length > 0 ? title : undefined\n}\n\n/** Visible page text via html-to-text. */\nexport function plainTextFromHtml(html: string): string {\n\treturn htmlToPlainText(html).trim()\n}\n","/**\n * Cloudflare Browser Rendering vendor client (HTML/URL → PDF or screenshot).\n * Host: `new CloudflareBrowserClient(auth)`. Agent tools: `fromContext(ctx)`.\n */\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { isNumber, isPlainObject, isString } from 'es-toolkit'\nimport { artifactRefSchema } from '../../shared/artifact'\nimport { HttpService } from '../../transport/http-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport { S3Client } from '../s3'\nimport type {\n\tCloudflareBrowserClientAuth,\n\tCloudflareBrowserEngine,\n\tCloudflareBrowserRenderOutput,\n\tCloudflareBrowserRenderPdfInput,\n\tCloudflareBrowserRenderScreenshotInput,\n\tCloudflareBrowserSessionIdInput,\n\tCloudflareBrowserSessionOutput,\n\tCloudflareBrowserStartSessionInput\n} from './contracts'\nimport {\n\tcloudflareBrowserClientAuthSchema,\n\tcloudflareBrowserRenderOutputSchema,\n\tcloudflareBrowserSessionOutputSchema\n} from './contracts'\nimport {\n\tassertBinaryPrefix,\n\tbrowserEngineQuery,\n\tdefaultRenderKey,\n\tresolveBrowserEngine,\n\tsourceBody,\n\ttitleFromHtml\n} from './domain'\n\nexport type CloudflareBrowserClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class CloudflareBrowserClient {\n\treadonly #auth: CloudflareBrowserClientAuth\n\treadonly #http: HttpService\n\treadonly #storage?: S3Client\n\n\tconstructor(auth: CloudflareBrowserClientAuth, options: CloudflareBrowserClientOptions = {}) {\n\t\tconst parsed = cloudflareBrowserClientAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Cloudflare Browser auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#auth = parsed.data\n\t\tthis.#http = new HttpService({\n\t\t\t...options,\n\t\t\tbaseURL: `https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(this.#auth.account_id)}`,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.#auth.api_token}`\n\t\t\t},\n\t\t\ttimeout: 60_000,\n\t\t\tlabel: 'Cloudflare Browser'\n\t\t})\n\t\tif (this.#auth.storage) this.#storage = new S3Client(this.#auth.storage, options)\n\t}\n\n\tstatic fromContext(ctx: ToolContext): CloudflareBrowserClient {\n\t\tconst auth = requireAuth(ctx, cloudflareBrowserClientAuthSchema)\n\t\treturn new CloudflareBrowserClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\tasync startSession(input: CloudflareBrowserStartSessionInput = {}): Promise<CloudflareBrowserSessionOutput> {\n\t\tconst { data } = await this.#http.post('/browser-rendering/devtools/browser', undefined, {\n\t\t\tquery: {\n\t\t\t\t...(input.keep_alive_seconds !== undefined && { keep_alive: input.keep_alive_seconds * 1_000 }),\n\t\t\t\t...browserEngineQuery(this.#engine(input.browser))\n\t\t\t}\n\t\t})\n\t\treturn this.#mapSession(data, undefined, 'active')\n\t}\n\n\tasync getSession(input: CloudflareBrowserSessionIdInput): Promise<CloudflareBrowserSessionOutput> {\n\t\tconst { data } = await this.#http.get(`/browser-rendering/devtools/session/${encodeURIComponent(input.session_id)}`)\n\t\treturn this.#mapSession(data, input.session_id, 'active')\n\t}\n\n\tasync stopSession(input: CloudflareBrowserSessionIdInput): Promise<CloudflareBrowserSessionOutput> {\n\t\tconst { data } = await this.#http.delete(\n\t\t\t`/browser-rendering/devtools/browser/${encodeURIComponent(input.session_id)}`\n\t\t)\n\t\treturn this.#mapSession(data, input.session_id, 'closing')\n\t}\n\n\t/** Browser Rendering PDF; store result in object storage. */\n\tasync renderPdf(input: CloudflareBrowserRenderPdfInput): Promise<CloudflareBrowserRenderOutput> {\n\t\treturn this.#renderAndStore('pdf', input)\n\t}\n\n\t/** Browser Rendering screenshot (PNG); store result in object storage. */\n\tasync renderScreenshot(input: CloudflareBrowserRenderScreenshotInput): Promise<CloudflareBrowserRenderOutput> {\n\t\treturn this.#renderAndStore('screenshot', input)\n\t}\n\n\t/**\n\t * One-shot rendered HTML for a URL or HTML source (Browser Rendering content API).\n\t * Not session-bound CDP; used for seam navigate/snapshot on Cloudflare.\n\t */\n\tasync fetchContent(input: {\n\t\turl?: string\n\t\thtml?: string\n\t\tbrowser?: CloudflareBrowserEngine\n\t}): Promise<{ html: string; title?: string }> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\t...sourceBody({\n\t\t\t\t...(input.url && { url: input.url }),\n\t\t\t\t...(input.html && { html: input.html })\n\t\t\t}),\n\t\t\tsetJavaScriptEnabled: true\n\t\t}\n\t\tconst { data } = await this.#http.post('/browser-rendering/content', body, {\n\t\t\tlabel: 'Cloudflare Browser content',\n\t\t\theaders: { 'Content-Type': 'application/json', Accept: 'text/html, application/json' },\n\t\t\tquery: browserEngineQuery(this.#engine(input.browser))\n\t\t})\n\t\tif (isString(data)) {\n\t\t\tconst out: { html: string; title?: string } = { html: data }\n\t\t\tconst title = titleFromHtml(data)\n\t\t\tif (title) out.title = title\n\t\t\treturn out\n\t\t}\n\t\tif (isPlainObject(data)) {\n\t\t\tconst result = data['result']\n\t\t\tconst html = isString(result) ? result : isString(data['html']) ? data['html'] : undefined\n\t\t\tif (html) {\n\t\t\t\tconst out: { html: string; title?: string } = { html }\n\t\t\t\tconst title = titleFromHtml(html)\n\t\t\t\tif (title) out.title = title\n\t\t\t\treturn out\n\t\t\t}\n\t\t}\n\t\tthrow new ToolError('Cloudflare Browser content response missing HTML', { code: 'upstream' })\n\t}\n\n\tasync #renderAndStore(\n\t\tkind: 'pdf' | 'screenshot',\n\t\tinput: CloudflareBrowserRenderPdfInput | CloudflareBrowserRenderScreenshotInput\n\t): Promise<CloudflareBrowserRenderOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\t...sourceBody(input.source),\n\t\t\tsetJavaScriptEnabled: true\n\t\t}\n\t\tif (kind === 'pdf') {\n\t\t\tbody['preferCSSPageSize'] = true\n\t\t\tbody['printBackground'] = true\n\t\t} else {\n\t\t\tbody['fullPage'] = true\n\t\t\tbody['type'] = 'png'\n\t\t\tif ('viewport' in input && input.viewport) {\n\t\t\t\tconst viewport: Record<string, unknown> = {\n\t\t\t\t\twidth: input.viewport.width,\n\t\t\t\t\theight: input.viewport.height\n\t\t\t\t}\n\t\t\t\tif (input.viewport.device_scale_factor !== undefined) {\n\t\t\t\t\tviewport['deviceScaleFactor'] = input.viewport.device_scale_factor\n\t\t\t\t}\n\t\t\t\tbody['viewport'] = viewport\n\t\t\t}\n\t\t}\n\n\t\tconst path = kind === 'pdf' ? '/browser-rendering/pdf' : '/browser-rendering/screenshot'\n\t\tconst accept = kind === 'pdf' ? 'application/pdf' : 'image/png'\n\t\tconst { bytes } = await this.#http.bytes('POST', path, {\n\t\t\tlabel: `Cloudflare Browser ${kind}`,\n\t\t\tbody,\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: accept\n\t\t\t},\n\t\t\tquery: browserEngineQuery(this.#engine(input.browser))\n\t\t})\n\t\tassertBinaryPrefix(bytes, kind)\n\n\t\tconst mediaType = kind === 'pdf' ? 'application/pdf' : 'image/png'\n\t\tconst key = defaultRenderKey(kind, input.output_key)\n\t\tconst filename = input.filename ?? (kind === 'pdf' ? 'render.pdf' : 'render.png')\n\t\tconst storage = this.#storage\n\t\tif (!storage) {\n\t\t\tthrow new ToolError('Cloudflare Browser rendering requires object storage', { code: 'bad_auth' })\n\t\t}\n\t\tawait storage.putBytes(key, bytes, mediaType)\n\n\t\tconst result = artifactRefSchema.parse({\n\t\t\tstore: 'object',\n\t\t\tkey,\n\t\t\tmedia_type: mediaType,\n\t\t\tfilename,\n\t\t\tbyte_length: bytes.byteLength\n\t\t})\n\t\treturn cloudflareBrowserRenderOutputSchema.parse({ result, kind })\n\t}\n\n\t#engine(override?: CloudflareBrowserEngine): CloudflareBrowserEngine | undefined {\n\t\treturn resolveBrowserEngine(override, this.#auth.browser)\n\t}\n\n\t#mapSession(data: unknown, fallbackSessionId?: string, fallbackStatus?: string): CloudflareBrowserSessionOutput {\n\t\tconst payload = isPlainObject(data) && isPlainObject(data['result']) ? data['result'] : data\n\t\tif (!isPlainObject(payload)) {\n\t\t\tthrow new ToolError('Unexpected Cloudflare Browser session response', { code: 'upstream' })\n\t\t}\n\t\tconst sessionId = isString(payload['sessionId']) ? payload['sessionId'] : fallbackSessionId\n\t\tif (!sessionId) {\n\t\t\tthrow new ToolError('Cloudflare Browser session response missing sessionId', { code: 'upstream' })\n\t\t}\n\t\tconst output: CloudflareBrowserSessionOutput = { session_id: sessionId }\n\t\tif (isString(payload['status'])) {\n\t\t\toutput.status = payload['status']\n\t\t} else if (isString(payload['closeReason']) || isNumber(payload['endTime'])) {\n\t\t\toutput.status = 'closed'\n\t\t} else if (fallbackStatus) {\n\t\t\toutput.status = fallbackStatus\n\t\t}\n\t\tif (isString(payload['webSocketDebuggerUrl'])) {\n\t\t\toutput.websocket_debugger_url = payload['webSocketDebuggerUrl']\n\t\t}\n\t\tif (isString(payload['devtoolsFrontendUrl'])) {\n\t\t\toutput.devtools_frontend_url = payload['devtoolsFrontendUrl']\n\t\t}\n\t\treturn cloudflareBrowserSessionOutputSchema.parse(output)\n\t}\n}\n","/**\n * Cloudflare Browser Rendering CDP mint (no HTTP).\n * Turns a session payload into Playwright / AgentBrowser connection options.\n */\n\nimport { ToolError } from '../../core/errors'\nimport type { CloudflareBrowserEngine, CloudflareBrowserSessionOutput } from './contracts'\nimport { browserEngineQuery } from './domain'\n\nexport type CloudflareBrowserCdpConnection = {\n\tsession_id: string\n\twebsocket_url: string\n\t/**\n\t * Headers for the WebSocket upgrade when the host must attach the API token.\n\t * Cloudflare's webSocketDebuggerUrl is often self-contained; pass api_token when your\n\t * runtime requires Authorization on the upgrade.\n\t */\n\theaders: Record<string, string>\n\tlive_view_url?: string\n\tstatus?: string\n}\n\nexport type MintCloudflareBrowserCdpOptions = {\n\t/** Cloudflare API token — sets Authorization: Bearer when provided. */\n\tapi_token?: string\n\t/** Extra headers; caller keys win over defaults. */\n\theaders?: Record<string, string>\n\t/**\n\t * Ensure `browser=kitesurf` on the WebSocket URL when the session was started with Kitesurf\n\t * and the upstream URL omitted the query (idempotent if already present).\n\t */\n\tbrowser?: CloudflareBrowserEngine\n}\n\n/**\n * Append engine query params without clobbering existing search keys.\n */\nfunction withBrowserQuery(websocketUrl: string, engine: CloudflareBrowserEngine | undefined): string {\n\tconst extra = browserEngineQuery(engine)\n\tif (!('browser' in extra)) return websocketUrl\n\tconst url = new URL(websocketUrl)\n\tif (!url.searchParams.has('browser')) {\n\t\turl.searchParams.set('browser', extra.browser)\n\t}\n\treturn url.toString()\n}\n\n/**\n * Mint CDP connection options from a Cloudflare Browser session (startSession / getSession).\n */\nexport function mintCloudflareBrowserCdpConnection(\n\tsession: CloudflareBrowserSessionOutput,\n\toptions: MintCloudflareBrowserCdpOptions = {}\n): CloudflareBrowserCdpConnection {\n\tconst rawUrl = session.websocket_debugger_url?.trim()\n\tif (!rawUrl) {\n\t\tthrow new ToolError('Cloudflare Browser session has no websocket_debugger_url; start or get the session first', {\n\t\t\tcode: 'bad_input',\n\t\t\tdetails: { session_id: session.session_id }\n\t\t})\n\t}\n\n\tconst headers: Record<string, string> = {}\n\tif (options.api_token) {\n\t\theaders['Authorization'] = `Bearer ${options.api_token}`\n\t}\n\tif (options.headers) {\n\t\tObject.assign(headers, options.headers)\n\t}\n\n\tconst out: CloudflareBrowserCdpConnection = {\n\t\tsession_id: session.session_id,\n\t\twebsocket_url: withBrowserQuery(rawUrl, options.browser),\n\t\theaders\n\t}\n\tif (session.devtools_frontend_url) out.live_view_url = session.devtools_frontend_url\n\tif (session.status) out.status = session.status\n\treturn out\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { CloudflareBrowserClient } from './client'\nimport {\n\tcloudflareBrowserClientAuthSchema,\n\tcloudflareBrowserRenderOutputSchema,\n\tcloudflareBrowserRenderPdfInputSchema,\n\tcloudflareBrowserRenderScreenshotInputSchema,\n\tcloudflareBrowserSessionIdInputSchema,\n\tcloudflareBrowserSessionOutputSchema,\n\tcloudflareBrowserStartSessionInputSchema\n} from './contracts'\n\nexport const cloudflareBrowserRenderPdfTool = defineTool({\n\tid: 'cloudflare-browser-render-pdf',\n\tname: 'cloudflareBrowserRenderPdf',\n\tdescription:\n\t\t'Render HTML or a URL to a PDF via Cloudflare Browser Rendering. Writes the PDF to object storage and returns an ArtifactRef.',\n\tinputSchema: cloudflareBrowserRenderPdfInputSchema,\n\toutputSchema: cloudflareBrowserRenderOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).renderPdf(input)\n})\n\nexport const cloudflareBrowserRenderScreenshotTool = defineTool({\n\tid: 'cloudflare-browser-render-screenshot',\n\tname: 'cloudflareBrowserRenderScreenshot',\n\tdescription:\n\t\t'Capture a PNG screenshot of HTML or a URL via Cloudflare Browser Rendering. Writes the image to object storage and returns an ArtifactRef.',\n\tinputSchema: cloudflareBrowserRenderScreenshotInputSchema,\n\toutputSchema: cloudflareBrowserRenderOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).renderScreenshot(input)\n})\n\nexport const cloudflareBrowserStartSessionTool = defineTool({\n\tid: 'cloudflare-browser-start-session',\n\tname: 'cloudflareBrowserStartSession',\n\tdescription:\n\t\t'Start a Cloudflare Browser Run session for interactive browser control and return its connection metadata. This creates a session; it does not navigate or render content.',\n\tinputSchema: cloudflareBrowserStartSessionInputSchema,\n\toutputSchema: cloudflareBrowserSessionOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).startSession(input)\n})\n\nexport const cloudflareBrowserGetSessionTool = defineTool({\n\tid: 'cloudflare-browser-get-session',\n\tname: 'cloudflareBrowserGetSession',\n\tdescription:\n\t\t'Get the status and connection metadata for an existing Cloudflare Browser Run session. Use this to reconnect or check whether the session is still available.',\n\tinputSchema: cloudflareBrowserSessionIdInputSchema,\n\toutputSchema: cloudflareBrowserSessionOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).getSession(input)\n})\n\nexport const cloudflareBrowserStopSessionTool = defineTool({\n\tid: 'cloudflare-browser-stop-session',\n\tname: 'cloudflareBrowserStopSession',\n\tdescription: 'Close a Cloudflare Browser Run session by session id.',\n\tinputSchema: cloudflareBrowserSessionIdInputSchema,\n\toutputSchema: cloudflareBrowserSessionOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => CloudflareBrowserClient.fromContext(ctx).stopSession(input)\n})\n\nexport const cloudflareBrowserModule = defineModule({\n\tid: 'cloudflare-browser',\n\ttitle: 'Cloudflare Browser Run',\n\tdescription:\n\t\t'Cloudflare Browser Run vendor pack for browser sessions plus HTML/URL PDF and screenshot quick actions.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: cloudflareBrowserClientAuthSchema },\n\tcategories: ['browser', 'cloudflare'],\n\tclassification: 'standard',\n\ttags: ['render', 'cdp', 'session'],\n\ttools: [\n\t\tcloudflareBrowserStartSessionTool,\n\t\tcloudflareBrowserGetSessionTool,\n\t\tcloudflareBrowserStopSessionTool,\n\t\tcloudflareBrowserRenderPdfTool,\n\t\tcloudflareBrowserRenderScreenshotTool\n\t]\n})\n"],"mappings":"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"}