pi-cloudflare 0.1.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 (410) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +67 -0
  3. package/bin/setup.mjs +103 -0
  4. package/dist/auth-flow.d.ts +15 -0
  5. package/dist/auth-flow.d.ts.map +1 -0
  6. package/dist/auth-flow.js +90 -0
  7. package/dist/auth-flow.js.map +1 -0
  8. package/dist/client.d.ts +18 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +47 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/config.d.ts +13 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +10 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/index.d.ts +24 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +109 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/oauth.d.ts +44 -0
  21. package/dist/oauth.d.ts.map +1 -0
  22. package/dist/oauth.js +135 -0
  23. package/dist/oauth.js.map +1 -0
  24. package/dist/proxy.d.ts +29 -0
  25. package/dist/proxy.d.ts.map +1 -0
  26. package/dist/proxy.js +39 -0
  27. package/dist/proxy.js.map +1 -0
  28. package/dist/servers.d.ts +19 -0
  29. package/dist/servers.d.ts.map +1 -0
  30. package/dist/servers.js +40 -0
  31. package/dist/servers.js.map +1 -0
  32. package/dist/token-store.d.ts +23 -0
  33. package/dist/token-store.d.ts.map +1 -0
  34. package/dist/token-store.js +47 -0
  35. package/dist/token-store.js.map +1 -0
  36. package/package.json +67 -0
  37. package/skills/agents-sdk/SKILL.md +221 -0
  38. package/skills/agents-sdk/references/browse-the-web.md +63 -0
  39. package/skills/agents-sdk/references/callable.md +92 -0
  40. package/skills/agents-sdk/references/client-sdk.md +110 -0
  41. package/skills/agents-sdk/references/codemode.md +110 -0
  42. package/skills/agents-sdk/references/configuration.md +72 -0
  43. package/skills/agents-sdk/references/durable-execution.md +51 -0
  44. package/skills/agents-sdk/references/email.md +146 -0
  45. package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
  46. package/skills/agents-sdk/references/mcp.md +188 -0
  47. package/skills/agents-sdk/references/observability.md +44 -0
  48. package/skills/agents-sdk/references/queue-retries.md +79 -0
  49. package/skills/agents-sdk/references/routing.md +75 -0
  50. package/skills/agents-sdk/references/server-driven-messages.md +63 -0
  51. package/skills/agents-sdk/references/state-scheduling.md +171 -0
  52. package/skills/agents-sdk/references/streaming-chat.md +198 -0
  53. package/skills/agents-sdk/references/think.md +112 -0
  54. package/skills/agents-sdk/references/voice.md +68 -0
  55. package/skills/agents-sdk/references/webhooks-push.md +86 -0
  56. package/skills/agents-sdk/references/workflows.md +132 -0
  57. package/skills/cloudflare/SKILL.md +248 -0
  58. package/skills/cloudflare/references/agents-sdk/README.md +89 -0
  59. package/skills/cloudflare/references/agents-sdk/api.md +190 -0
  60. package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
  61. package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
  62. package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
  63. package/skills/cloudflare/references/ai-gateway/README.md +175 -0
  64. package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
  65. package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
  66. package/skills/cloudflare/references/ai-gateway/features.md +96 -0
  67. package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
  68. package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
  69. package/skills/cloudflare/references/ai-search/README.md +138 -0
  70. package/skills/cloudflare/references/ai-search/api.md +87 -0
  71. package/skills/cloudflare/references/ai-search/configuration.md +88 -0
  72. package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
  73. package/skills/cloudflare/references/ai-search/patterns.md +85 -0
  74. package/skills/cloudflare/references/analytics-engine/README.md +94 -0
  75. package/skills/cloudflare/references/analytics-engine/api.md +112 -0
  76. package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
  77. package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
  78. package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
  79. package/skills/cloudflare/references/api/README.md +66 -0
  80. package/skills/cloudflare/references/api/api.md +204 -0
  81. package/skills/cloudflare/references/api/configuration.md +160 -0
  82. package/skills/cloudflare/references/api/gotchas.md +225 -0
  83. package/skills/cloudflare/references/api/patterns.md +204 -0
  84. package/skills/cloudflare/references/api-shield/README.md +44 -0
  85. package/skills/cloudflare/references/api-shield/api.md +141 -0
  86. package/skills/cloudflare/references/api-shield/configuration.md +192 -0
  87. package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
  88. package/skills/cloudflare/references/api-shield/patterns.md +180 -0
  89. package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
  90. package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
  91. package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
  92. package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
  93. package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
  94. package/skills/cloudflare/references/artifacts/README.md +79 -0
  95. package/skills/cloudflare/references/artifacts/api.md +128 -0
  96. package/skills/cloudflare/references/artifacts/configuration.md +92 -0
  97. package/skills/cloudflare/references/bindings/README.md +122 -0
  98. package/skills/cloudflare/references/bindings/api.md +203 -0
  99. package/skills/cloudflare/references/bindings/configuration.md +188 -0
  100. package/skills/cloudflare/references/bindings/gotchas.md +208 -0
  101. package/skills/cloudflare/references/bindings/patterns.md +200 -0
  102. package/skills/cloudflare/references/bot-management/README.md +94 -0
  103. package/skills/cloudflare/references/bot-management/api.md +169 -0
  104. package/skills/cloudflare/references/bot-management/configuration.md +163 -0
  105. package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
  106. package/skills/cloudflare/references/bot-management/patterns.md +182 -0
  107. package/skills/cloudflare/references/browser-rendering/README.md +78 -0
  108. package/skills/cloudflare/references/browser-rendering/api.md +108 -0
  109. package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
  110. package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
  111. package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
  112. package/skills/cloudflare/references/c3/README.md +111 -0
  113. package/skills/cloudflare/references/c3/api.md +71 -0
  114. package/skills/cloudflare/references/c3/configuration.md +81 -0
  115. package/skills/cloudflare/references/c3/gotchas.md +92 -0
  116. package/skills/cloudflare/references/c3/patterns.md +82 -0
  117. package/skills/cloudflare/references/cache-reserve/README.md +147 -0
  118. package/skills/cloudflare/references/cache-reserve/api.md +194 -0
  119. package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
  120. package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
  121. package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
  122. package/skills/cloudflare/references/containers/README.md +85 -0
  123. package/skills/cloudflare/references/containers/api.md +187 -0
  124. package/skills/cloudflare/references/containers/configuration.md +188 -0
  125. package/skills/cloudflare/references/containers/gotchas.md +178 -0
  126. package/skills/cloudflare/references/containers/patterns.md +202 -0
  127. package/skills/cloudflare/references/cron-triggers/README.md +99 -0
  128. package/skills/cloudflare/references/cron-triggers/api.md +196 -0
  129. package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
  130. package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
  131. package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
  132. package/skills/cloudflare/references/d1/README.md +133 -0
  133. package/skills/cloudflare/references/d1/api.md +196 -0
  134. package/skills/cloudflare/references/d1/configuration.md +191 -0
  135. package/skills/cloudflare/references/d1/gotchas.md +98 -0
  136. package/skills/cloudflare/references/d1/patterns.md +189 -0
  137. package/skills/cloudflare/references/ddos/README.md +41 -0
  138. package/skills/cloudflare/references/ddos/api.md +164 -0
  139. package/skills/cloudflare/references/ddos/configuration.md +93 -0
  140. package/skills/cloudflare/references/ddos/gotchas.md +107 -0
  141. package/skills/cloudflare/references/ddos/patterns.md +174 -0
  142. package/skills/cloudflare/references/do-storage/README.md +75 -0
  143. package/skills/cloudflare/references/do-storage/api.md +102 -0
  144. package/skills/cloudflare/references/do-storage/configuration.md +112 -0
  145. package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
  146. package/skills/cloudflare/references/do-storage/patterns.md +194 -0
  147. package/skills/cloudflare/references/do-storage/testing.md +183 -0
  148. package/skills/cloudflare/references/durable-objects/README.md +185 -0
  149. package/skills/cloudflare/references/durable-objects/api.md +187 -0
  150. package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
  151. package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
  152. package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
  153. package/skills/cloudflare/references/email-routing/README.md +89 -0
  154. package/skills/cloudflare/references/email-routing/api.md +195 -0
  155. package/skills/cloudflare/references/email-routing/configuration.md +186 -0
  156. package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
  157. package/skills/cloudflare/references/email-routing/patterns.md +229 -0
  158. package/skills/cloudflare/references/email-workers/README.md +151 -0
  159. package/skills/cloudflare/references/email-workers/api.md +237 -0
  160. package/skills/cloudflare/references/email-workers/configuration.md +112 -0
  161. package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
  162. package/skills/cloudflare/references/email-workers/patterns.md +102 -0
  163. package/skills/cloudflare/references/flagship/README.md +59 -0
  164. package/skills/cloudflare/references/flagship/api.md +390 -0
  165. package/skills/cloudflare/references/flagship/configuration.md +202 -0
  166. package/skills/cloudflare/references/flagship/gotchas.md +178 -0
  167. package/skills/cloudflare/references/flagship/patterns.md +469 -0
  168. package/skills/cloudflare/references/graphql-api/README.md +147 -0
  169. package/skills/cloudflare/references/graphql-api/api.md +175 -0
  170. package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
  171. package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
  172. package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
  173. package/skills/cloudflare/references/hyperdrive/README.md +82 -0
  174. package/skills/cloudflare/references/hyperdrive/api.md +143 -0
  175. package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
  176. package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
  177. package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
  178. package/skills/cloudflare/references/images/README.md +61 -0
  179. package/skills/cloudflare/references/images/api.md +96 -0
  180. package/skills/cloudflare/references/images/configuration.md +211 -0
  181. package/skills/cloudflare/references/images/gotchas.md +99 -0
  182. package/skills/cloudflare/references/images/patterns.md +115 -0
  183. package/skills/cloudflare/references/kv/README.md +89 -0
  184. package/skills/cloudflare/references/kv/api.md +160 -0
  185. package/skills/cloudflare/references/kv/configuration.md +144 -0
  186. package/skills/cloudflare/references/kv/gotchas.md +131 -0
  187. package/skills/cloudflare/references/kv/patterns.md +196 -0
  188. package/skills/cloudflare/references/miniflare/README.md +105 -0
  189. package/skills/cloudflare/references/miniflare/api.md +187 -0
  190. package/skills/cloudflare/references/miniflare/configuration.md +173 -0
  191. package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
  192. package/skills/cloudflare/references/miniflare/patterns.md +181 -0
  193. package/skills/cloudflare/references/network-interconnect/README.md +99 -0
  194. package/skills/cloudflare/references/network-interconnect/api.md +199 -0
  195. package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
  196. package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
  197. package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
  198. package/skills/cloudflare/references/observability/README.md +88 -0
  199. package/skills/cloudflare/references/observability/api.md +164 -0
  200. package/skills/cloudflare/references/observability/configuration.md +169 -0
  201. package/skills/cloudflare/references/observability/gotchas.md +115 -0
  202. package/skills/cloudflare/references/observability/patterns.md +105 -0
  203. package/skills/cloudflare/references/pages/README.md +88 -0
  204. package/skills/cloudflare/references/pages/api.md +204 -0
  205. package/skills/cloudflare/references/pages/configuration.md +201 -0
  206. package/skills/cloudflare/references/pages/gotchas.md +203 -0
  207. package/skills/cloudflare/references/pages/patterns.md +204 -0
  208. package/skills/cloudflare/references/pages-functions/README.md +98 -0
  209. package/skills/cloudflare/references/pages-functions/api.md +143 -0
  210. package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
  211. package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
  212. package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
  213. package/skills/cloudflare/references/pipelines/README.md +90 -0
  214. package/skills/cloudflare/references/pipelines/api.md +124 -0
  215. package/skills/cloudflare/references/pipelines/configuration.md +155 -0
  216. package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
  217. package/skills/cloudflare/references/pipelines/patterns.md +130 -0
  218. package/skills/cloudflare/references/pulumi/README.md +100 -0
  219. package/skills/cloudflare/references/pulumi/api.md +200 -0
  220. package/skills/cloudflare/references/pulumi/configuration.md +198 -0
  221. package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
  222. package/skills/cloudflare/references/pulumi/patterns.md +191 -0
  223. package/skills/cloudflare/references/queues/README.md +96 -0
  224. package/skills/cloudflare/references/queues/api.md +206 -0
  225. package/skills/cloudflare/references/queues/configuration.md +144 -0
  226. package/skills/cloudflare/references/queues/gotchas.md +206 -0
  227. package/skills/cloudflare/references/queues/patterns.md +220 -0
  228. package/skills/cloudflare/references/r2/README.md +95 -0
  229. package/skills/cloudflare/references/r2/api.md +200 -0
  230. package/skills/cloudflare/references/r2/configuration.md +165 -0
  231. package/skills/cloudflare/references/r2/gotchas.md +190 -0
  232. package/skills/cloudflare/references/r2/patterns.md +193 -0
  233. package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
  234. package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
  235. package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
  236. package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
  237. package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
  238. package/skills/cloudflare/references/r2-sql/README.md +64 -0
  239. package/skills/cloudflare/references/r2-sql/api.md +121 -0
  240. package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
  241. package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
  242. package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
  243. package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
  244. package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
  245. package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
  246. package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
  247. package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
  248. package/skills/cloudflare/references/realtimekit/README.md +113 -0
  249. package/skills/cloudflare/references/realtimekit/api.md +212 -0
  250. package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
  251. package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
  252. package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
  253. package/skills/cloudflare/references/sandbox/README.md +96 -0
  254. package/skills/cloudflare/references/sandbox/api.md +198 -0
  255. package/skills/cloudflare/references/sandbox/configuration.md +143 -0
  256. package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
  257. package/skills/cloudflare/references/sandbox/patterns.md +201 -0
  258. package/skills/cloudflare/references/secrets-store/README.md +74 -0
  259. package/skills/cloudflare/references/secrets-store/api.md +200 -0
  260. package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
  261. package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
  262. package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
  263. package/skills/cloudflare/references/smart-placement/README.md +138 -0
  264. package/skills/cloudflare/references/smart-placement/api.md +183 -0
  265. package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
  266. package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
  267. package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
  268. package/skills/cloudflare/references/snippets/README.md +68 -0
  269. package/skills/cloudflare/references/snippets/api.md +198 -0
  270. package/skills/cloudflare/references/snippets/configuration.md +227 -0
  271. package/skills/cloudflare/references/snippets/gotchas.md +86 -0
  272. package/skills/cloudflare/references/snippets/patterns.md +135 -0
  273. package/skills/cloudflare/references/spectrum/README.md +52 -0
  274. package/skills/cloudflare/references/spectrum/api.md +181 -0
  275. package/skills/cloudflare/references/spectrum/configuration.md +194 -0
  276. package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
  277. package/skills/cloudflare/references/spectrum/patterns.md +196 -0
  278. package/skills/cloudflare/references/static-assets/README.md +65 -0
  279. package/skills/cloudflare/references/static-assets/api.md +199 -0
  280. package/skills/cloudflare/references/static-assets/configuration.md +186 -0
  281. package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
  282. package/skills/cloudflare/references/static-assets/patterns.md +189 -0
  283. package/skills/cloudflare/references/stream/README.md +114 -0
  284. package/skills/cloudflare/references/stream/api-live.md +195 -0
  285. package/skills/cloudflare/references/stream/api.md +199 -0
  286. package/skills/cloudflare/references/stream/configuration.md +141 -0
  287. package/skills/cloudflare/references/stream/gotchas.md +130 -0
  288. package/skills/cloudflare/references/stream/patterns.md +184 -0
  289. package/skills/cloudflare/references/tail-workers/README.md +89 -0
  290. package/skills/cloudflare/references/tail-workers/api.md +200 -0
  291. package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
  292. package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
  293. package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
  294. package/skills/cloudflare/references/terraform/README.md +102 -0
  295. package/skills/cloudflare/references/terraform/api.md +178 -0
  296. package/skills/cloudflare/references/terraform/configuration.md +197 -0
  297. package/skills/cloudflare/references/terraform/gotchas.md +150 -0
  298. package/skills/cloudflare/references/terraform/patterns.md +174 -0
  299. package/skills/cloudflare/references/tunnel/README.md +129 -0
  300. package/skills/cloudflare/references/tunnel/api.md +193 -0
  301. package/skills/cloudflare/references/tunnel/configuration.md +157 -0
  302. package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
  303. package/skills/cloudflare/references/tunnel/networking.md +168 -0
  304. package/skills/cloudflare/references/tunnel/patterns.md +192 -0
  305. package/skills/cloudflare/references/turn/README.md +82 -0
  306. package/skills/cloudflare/references/turn/api.md +239 -0
  307. package/skills/cloudflare/references/turn/configuration.md +179 -0
  308. package/skills/cloudflare/references/turn/gotchas.md +231 -0
  309. package/skills/cloudflare/references/turn/patterns.md +213 -0
  310. package/skills/cloudflare/references/turnstile/README.md +99 -0
  311. package/skills/cloudflare/references/turnstile/api.md +240 -0
  312. package/skills/cloudflare/references/turnstile/configuration.md +222 -0
  313. package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
  314. package/skills/cloudflare/references/turnstile/patterns.md +193 -0
  315. package/skills/cloudflare/references/vectorize/README.md +133 -0
  316. package/skills/cloudflare/references/vectorize/api.md +88 -0
  317. package/skills/cloudflare/references/vectorize/configuration.md +88 -0
  318. package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
  319. package/skills/cloudflare/references/vectorize/patterns.md +90 -0
  320. package/skills/cloudflare/references/waf/README.md +113 -0
  321. package/skills/cloudflare/references/waf/api.md +202 -0
  322. package/skills/cloudflare/references/waf/configuration.md +203 -0
  323. package/skills/cloudflare/references/waf/gotchas.md +204 -0
  324. package/skills/cloudflare/references/waf/patterns.md +197 -0
  325. package/skills/cloudflare/references/web-analytics/README.md +141 -0
  326. package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
  327. package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
  328. package/skills/cloudflare/references/web-analytics/integration.md +60 -0
  329. package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
  330. package/skills/cloudflare/references/workerd/README.md +78 -0
  331. package/skills/cloudflare/references/workerd/api.md +185 -0
  332. package/skills/cloudflare/references/workerd/configuration.md +183 -0
  333. package/skills/cloudflare/references/workerd/gotchas.md +139 -0
  334. package/skills/cloudflare/references/workerd/patterns.md +192 -0
  335. package/skills/cloudflare/references/workers/README.md +108 -0
  336. package/skills/cloudflare/references/workers/api.md +195 -0
  337. package/skills/cloudflare/references/workers/configuration.md +185 -0
  338. package/skills/cloudflare/references/workers/frameworks.md +197 -0
  339. package/skills/cloudflare/references/workers/gotchas.md +137 -0
  340. package/skills/cloudflare/references/workers/patterns.md +198 -0
  341. package/skills/cloudflare/references/workers-ai/README.md +197 -0
  342. package/skills/cloudflare/references/workers-ai/api.md +112 -0
  343. package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
  344. package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
  345. package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
  346. package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
  347. package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
  348. package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
  349. package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
  350. package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
  351. package/skills/cloudflare/references/workers-playground/README.md +127 -0
  352. package/skills/cloudflare/references/workers-playground/api.md +101 -0
  353. package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
  354. package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
  355. package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
  356. package/skills/cloudflare/references/workers-vpc/README.md +127 -0
  357. package/skills/cloudflare/references/workers-vpc/api.md +202 -0
  358. package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
  359. package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
  360. package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
  361. package/skills/cloudflare/references/workflows/README.md +77 -0
  362. package/skills/cloudflare/references/workflows/api.md +218 -0
  363. package/skills/cloudflare/references/workflows/configuration.md +152 -0
  364. package/skills/cloudflare/references/workflows/gotchas.md +90 -0
  365. package/skills/cloudflare/references/workflows/patterns.md +175 -0
  366. package/skills/cloudflare/references/wrangler/README.md +135 -0
  367. package/skills/cloudflare/references/wrangler/api.md +188 -0
  368. package/skills/cloudflare/references/wrangler/configuration.md +197 -0
  369. package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
  370. package/skills/cloudflare/references/wrangler/patterns.md +209 -0
  371. package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
  372. package/skills/cloudflare/references/zaraz/README.md +111 -0
  373. package/skills/cloudflare/references/zaraz/api.md +112 -0
  374. package/skills/cloudflare/references/zaraz/configuration.md +90 -0
  375. package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
  376. package/skills/cloudflare/references/zaraz/patterns.md +74 -0
  377. package/skills/cloudflare-email-service/SKILL.md +103 -0
  378. package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
  379. package/skills/cloudflare-email-service/references/deliverability.md +285 -0
  380. package/skills/cloudflare-email-service/references/rest-api.md +184 -0
  381. package/skills/cloudflare-email-service/references/routing.md +199 -0
  382. package/skills/cloudflare-email-service/references/sending.md +252 -0
  383. package/skills/cloudflare-one/SKILL.md +176 -0
  384. package/skills/cloudflare-one-migrations/SKILL.md +110 -0
  385. package/skills/durable-objects/SKILL.md +186 -0
  386. package/skills/durable-objects/references/rules.md +295 -0
  387. package/skills/durable-objects/references/testing.md +264 -0
  388. package/skills/durable-objects/references/workers.md +346 -0
  389. package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
  390. package/skills/sandbox-next/SKILL.md +91 -0
  391. package/skills/sandbox-next/references/api-quick-ref.md +94 -0
  392. package/skills/sandbox-next/references/examples.md +15 -0
  393. package/skills/sandbox-stable/SKILL.md +110 -0
  394. package/skills/turnstile-spin/README.md +51 -0
  395. package/skills/turnstile-spin/SKILL.md +330 -0
  396. package/skills/turnstile-spin/references/astro.md +199 -0
  397. package/skills/turnstile-spin/references/hugo.md +114 -0
  398. package/skills/turnstile-spin/references/nextjs-app.md +261 -0
  399. package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
  400. package/skills/turnstile-spin/references/sveltekit.md +191 -0
  401. package/skills/turnstile-spin/references/vanilla-html.md +157 -0
  402. package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
  403. package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
  404. package/skills/turnstile-spin/scripts/validate.sh +137 -0
  405. package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
  406. package/skills/turnstile-spin/tests/validation.md +62 -0
  407. package/skills/workers-best-practices/SKILL.md +127 -0
  408. package/skills/workers-best-practices/references/review.md +174 -0
  409. package/skills/workers-best-practices/references/rules.md +467 -0
  410. package/skills/wrangler/SKILL.md +922 -0
@@ -0,0 +1,167 @@
1
+ # Gotchas and Troubleshooting
2
+
3
+ Common pitfalls, limitations, and solutions for TCP Sockets in Cloudflare Workers.
4
+
5
+ ## Platform Limits
6
+
7
+ ### Connection Limits
8
+
9
+ | Limit | Value |
10
+ |-------|-------|
11
+ | Max concurrent sockets per request | 6 (hard limit) |
12
+ | Socket lifetime | Request duration |
13
+ | Connection timeout | Platform-dependent, no setting |
14
+
15
+ **Problem:** Exceeding 6 connections throws error
16
+
17
+ **Solution:** Process in batches of 6
18
+
19
+ ```typescript
20
+ for (let i = 0; i < hosts.length; i += 6) {
21
+ const batch = hosts.slice(i, i + 6).map(h => connect({ hostname: h, port: 443 }));
22
+ await Promise.all(batch.map(async s => { /* use */ await s.close(); }));
23
+ }
24
+ ```
25
+
26
+ ### Blocked Destinations
27
+
28
+ Cloudflare IPs (1.1.1.1), localhost (127.0.0.1), port 25 (SMTP), Worker's own URL blocked for security.
29
+
30
+ **Solution:** Use public IPs or Tunnel hostnames: `connect({ hostname: "db.internal.company.net", port: 5432 })`
31
+
32
+ ### Scope Requirements
33
+
34
+ **Problem:** Sockets created in global scope fail
35
+
36
+ **Cause:** Sockets tied to request lifecycle
37
+
38
+ **Solution:** Create inside handler: `export default { async fetch() { const socket = connect(...); } }`
39
+
40
+ ## Common Errors
41
+
42
+ ### Error: "proxy request failed"
43
+
44
+ **Causes:** Blocked destination (Cloudflare IP, localhost, port 25), DNS failure, network unreachable
45
+
46
+ **Solution:** Validate destinations, use Tunnel hostnames, catch errors with try/catch
47
+
48
+ ### Error: "TCP Loop detected"
49
+
50
+ **Cause:** Worker connecting to itself
51
+
52
+ **Solution:** Connect to external service, not Worker's own hostname
53
+
54
+ ### Error: "Port 25 prohibited"
55
+
56
+ **Cause:** SMTP port blocked
57
+
58
+ **Solution:** Use Email Workers API for email
59
+
60
+ ### Error: "socket is not open"
61
+
62
+ **Cause:** Read/write after close
63
+
64
+ **Solution:** Always use try/finally to ensure proper closure order
65
+
66
+ ### Error: Connection timeout
67
+
68
+ **Cause:** No built-in timeout
69
+
70
+ **Solution:** Use `Promise.race()`:
71
+
72
+ ```typescript
73
+ const socket = connect(addr, opts);
74
+ const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 5000));
75
+ await Promise.race([socket.opened, timeout]);
76
+ ```
77
+
78
+ ## TLS/SSL Issues
79
+
80
+ ### StartTLS Timing
81
+
82
+ **Problem:** Calling `startTls()` too early
83
+
84
+ **Solution:** Send protocol-specific STARTTLS command, wait for server OK, then call `socket.startTls()`
85
+
86
+ ### Certificate Validation
87
+
88
+ **Problem:** Self-signed certs fail
89
+
90
+ **Solution:** Use proper certs or Tunnel (handles TLS termination)
91
+
92
+ ## Performance Issues
93
+
94
+ ### Not Using Connection Pooling
95
+
96
+ **Problem:** New connection overhead per request
97
+
98
+ **Solution:** Use [Hyperdrive](../hyperdrive/) for databases (built-in pooling)
99
+
100
+ ### Not Using Smart Placement
101
+
102
+ **Problem:** High latency to backend
103
+
104
+ **Solution:** Enable: `{ "placement": { "mode": "smart" } }` in wrangler.jsonc
105
+
106
+ ### Forgetting to Close Sockets
107
+
108
+ **Problem:** Resource leaks
109
+
110
+ **Solution:** Always use try/finally:
111
+
112
+ ```typescript
113
+ const socket = connect({ hostname: "api.internal", port: 443 });
114
+ try {
115
+ // Use socket
116
+ } finally {
117
+ await socket.close();
118
+ }
119
+ ```
120
+
121
+ ## Data Handling Issues
122
+
123
+ ### Assuming Single Read Gets All Data
124
+
125
+ **Problem:** Only reading once may miss chunked data
126
+
127
+ **Solution:** Loop `reader.read()` until `done === true` (see patterns.md)
128
+
129
+ ### Text Encoding Issues
130
+
131
+ **Problem:** Using wrong encoding
132
+
133
+ **Solution:** Specify encoding: `new TextDecoder('iso-8859-1').decode(data)`
134
+
135
+ ## Security Issues
136
+
137
+ ### SSRF Vulnerability
138
+
139
+ **Problem:** User-controlled destinations allow access to internal services
140
+
141
+ **Solution:** Validate against strict allowlist:
142
+
143
+ ```typescript
144
+ const ALLOWED = ['api1.internal.net', 'api2.internal.net'];
145
+ const host = new URL(req.url).searchParams.get('host');
146
+ if (!host || !ALLOWED.includes(host)) return new Response('Forbidden', { status: 403 });
147
+ ```
148
+
149
+ ## When to Use Alternatives
150
+
151
+ | Use Case | Alternative | Reason |
152
+ |----------|-------------|--------|
153
+ | PostgreSQL/MySQL | [Hyperdrive](../hyperdrive/) | Connection pooling, caching |
154
+ | HTTP/HTTPS | `fetch()` | Simpler, built-in |
155
+ | HTTP with SSRF protection | VPC Services (beta 2025+) | Declarative bindings |
156
+
157
+ ## Debugging Tips
158
+
159
+ 1. **Log connection details:** `const info = await socket.opened; console.log(info.remoteAddress);`
160
+ 2. **Test with public services first:** Use tcpbin.com:4242 echo server
161
+ 3. **Verify Tunnel:** `cloudflared tunnel info <name>` and `cloudflared tunnel route ip list`
162
+
163
+ ## Related
164
+
165
+ - [Hyperdrive](../hyperdrive/) - Database connections
166
+ - [Smart Placement](../smart-placement/) - Latency optimization
167
+ - [Tunnel Troubleshooting](../tunnel/gotchas.md)
@@ -0,0 +1,209 @@
1
+ # Common Patterns
2
+
3
+ Real-world patterns and examples for TCP Sockets in Cloudflare Workers.
4
+
5
+ ```typescript
6
+ import { connect } from 'cloudflare:sockets';
7
+ ```
8
+
9
+ ## Basic Patterns
10
+
11
+ ### Simple Request-Response
12
+
13
+ ```typescript
14
+ const socket = connect({ hostname: "echo.example.com", port: 7 }, { secureTransport: "on" });
15
+ try {
16
+ await socket.opened;
17
+ const writer = socket.writable.getWriter();
18
+ await writer.write(new TextEncoder().encode("Hello\n"));
19
+ await writer.close();
20
+
21
+ const reader = socket.readable.getReader();
22
+ const { value } = await reader.read();
23
+ return new Response(value);
24
+ } finally {
25
+ await socket.close();
26
+ }
27
+ ```
28
+
29
+ ### Reading All Data
30
+
31
+ ```typescript
32
+ async function readAll(socket: Socket): Promise<Uint8Array> {
33
+ const reader = socket.readable.getReader();
34
+ const chunks: Uint8Array[] = [];
35
+ while (true) {
36
+ const { done, value } = await reader.read();
37
+ if (done) break;
38
+ chunks.push(value);
39
+ }
40
+ const total = chunks.reduce((sum, c) => sum + c.length, 0);
41
+ const result = new Uint8Array(total);
42
+ let offset = 0;
43
+ for (const chunk of chunks) { result.set(chunk, offset); offset += chunk.length; }
44
+ return result;
45
+ }
46
+ ```
47
+
48
+ ### Streaming Response
49
+
50
+ ```typescript
51
+ // Stream socket data directly to HTTP response
52
+ const socket = connect({ hostname: "stream.internal", port: 9000 }, { secureTransport: "on" });
53
+ const writer = socket.writable.getWriter();
54
+ await writer.write(new TextEncoder().encode("STREAM\n"));
55
+ await writer.close();
56
+ return new Response(socket.readable);
57
+ ```
58
+
59
+ ## Protocol Examples
60
+
61
+ ### Redis RESP
62
+
63
+ ```typescript
64
+ // Send: *2\r\n$3\r\nGET\r\n$<keylen>\r\n<key>\r\n
65
+ // Recv: $<len>\r\n<data>\r\n or $-1\r\n for null
66
+ const socket = connect({ hostname: "redis.internal", port: 6379 });
67
+ const writer = socket.writable.getWriter();
68
+ await writer.write(new TextEncoder().encode(`*2\r\n$3\r\nGET\r\n$3\r\nkey\r\n`));
69
+ ```
70
+
71
+ ### PostgreSQL
72
+
73
+ **Use [Hyperdrive](../hyperdrive/) for production.** Raw Postgres protocol is complex (startup, auth, query messages).
74
+
75
+ ### MQTT
76
+
77
+ ```typescript
78
+ const socket = connect({ hostname: "mqtt.broker", port: 1883 });
79
+ const writer = socket.writable.getWriter();
80
+ // CONNECT: 0x10 <len> 0x00 0x04 "MQTT" 0x04 <flags> ...
81
+ // PUBLISH: 0x30 <len> <topic_len> <topic> <message>
82
+ ```
83
+
84
+ ## Error Handling Patterns
85
+
86
+ ### Retry with Backoff
87
+
88
+ ```typescript
89
+ async function connectWithRetry(addr: SocketAddress, opts: SocketOptions, maxRetries = 3): Promise<Socket> {
90
+ for (let i = 1; i <= maxRetries; i++) {
91
+ try {
92
+ const socket = connect(addr, opts);
93
+ await socket.opened;
94
+ return socket;
95
+ } catch (error) {
96
+ if (i === maxRetries) throw error;
97
+ await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i - 1))); // Exponential backoff
98
+ }
99
+ }
100
+ throw new Error('Unreachable');
101
+ }
102
+ ```
103
+
104
+ ### Timeout
105
+
106
+ ```typescript
107
+ async function connectWithTimeout(addr: SocketAddress, opts: SocketOptions, ms = 5000): Promise<Socket> {
108
+ const socket = connect(addr, opts);
109
+ const timeout = new Promise<never>((_, reject) => setTimeout(() => reject(new Error('Timeout')), ms));
110
+ await Promise.race([socket.opened, timeout]);
111
+ return socket;
112
+ }
113
+ ```
114
+
115
+ ### Fallback
116
+
117
+ ```typescript
118
+ async function connectWithFallback(primary: string, fallback: string, port: number): Promise<Socket> {
119
+ try {
120
+ const socket = connect({ hostname: primary, port }, { secureTransport: "on" });
121
+ await socket.opened;
122
+ return socket;
123
+ } catch {
124
+ return connect({ hostname: fallback, port }, { secureTransport: "on" });
125
+ }
126
+ }
127
+ ```
128
+
129
+ ## Security Patterns
130
+
131
+ ### Destination Allowlist (Prevent SSRF)
132
+
133
+ ```typescript
134
+ const ALLOWED_HOSTS = ['db.internal.company.net', 'api.internal.company.net', /^10\.0\.1\.\d+$/];
135
+
136
+ function isAllowed(hostname: string): boolean {
137
+ return ALLOWED_HOSTS.some(p => p instanceof RegExp ? p.test(hostname) : p === hostname);
138
+ }
139
+
140
+ export default {
141
+ async fetch(req: Request): Promise<Response> {
142
+ const target = new URL(req.url).searchParams.get('host');
143
+ if (!target || !isAllowed(target)) return new Response('Forbidden', { status: 403 });
144
+ const socket = connect({ hostname: target, port: 443 });
145
+ // Use socket...
146
+ }
147
+ };
148
+ ```
149
+
150
+ ### Connection Pooling
151
+
152
+ ```typescript
153
+ class SocketPool {
154
+ private pool = new Map<string, Socket[]>();
155
+
156
+ async acquire(hostname: string, port: number): Promise<Socket> {
157
+ const key = `${hostname}:${port}`;
158
+ const sockets = this.pool.get(key) || [];
159
+ if (sockets.length > 0) return sockets.pop()!;
160
+ const socket = connect({ hostname, port }, { secureTransport: "on" });
161
+ await socket.opened;
162
+ return socket;
163
+ }
164
+
165
+ release(hostname: string, port: number, socket: Socket): void {
166
+ const key = `${hostname}:${port}`;
167
+ const sockets = this.pool.get(key) || [];
168
+ if (sockets.length < 3) { sockets.push(socket); this.pool.set(key, sockets); }
169
+ else socket.close();
170
+ }
171
+ }
172
+ ```
173
+
174
+ ## Multi-Protocol Gateway
175
+
176
+ ```typescript
177
+ interface Protocol { name: string; defaultPort: number; test(host: string, port: number): Promise<string>; }
178
+
179
+ const PROTOCOLS: Record<string, Protocol> = {
180
+ redis: {
181
+ name: 'redis',
182
+ defaultPort: 6379,
183
+ async test(host, port) {
184
+ const socket = connect({ hostname: host, port });
185
+ try {
186
+ const writer = socket.writable.getWriter();
187
+ await writer.write(new TextEncoder().encode('*1\r\n$4\r\nPING\r\n'));
188
+ writer.releaseLock();
189
+ const reader = socket.readable.getReader();
190
+ const { value } = await reader.read();
191
+ return new TextDecoder().decode(value || new Uint8Array());
192
+ } finally { await socket.close(); }
193
+ }
194
+ }
195
+ };
196
+
197
+ export default {
198
+ async fetch(req: Request): Promise<Response> {
199
+ const url = new URL(req.url);
200
+ const proto = url.pathname.slice(1); // /redis
201
+ const host = url.searchParams.get('host');
202
+ if (!host || !PROTOCOLS[proto]) return new Response('Invalid', { status: 400 });
203
+ const result = await PROTOCOLS[proto].test(host, parseInt(url.searchParams.get('port') || '') || PROTOCOLS[proto].defaultPort);
204
+ return new Response(result);
205
+ }
206
+ };
207
+ ```
208
+
209
+
@@ -0,0 +1,77 @@
1
+ # Cloudflare Workflows
2
+
3
+ Durable multi-step applications with automatic retries, state persistence, and long-running execution.
4
+
5
+ ## What It Does
6
+
7
+ - Chain steps with automatic retry logic
8
+ - Persist state between steps (minutes → weeks)
9
+ - Handle failures without losing progress
10
+ - Wait for external events/approvals
11
+ - Sleep without consuming resources
12
+
13
+ **Available:** Free & Paid Workers plans
14
+
15
+ ## Core Concepts
16
+
17
+ **Workflow**: Class extending `WorkflowEntrypoint` with `run` method
18
+ **Instance**: Single execution with unique ID & independent state
19
+ **Steps**: Independently retriable units via `step.do()` - API calls, DB queries, AI invocations
20
+ **State**: Persisted from step returns; step name = cache key
21
+
22
+ ## Quick Start
23
+
24
+ ```typescript
25
+ import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';
26
+
27
+ type Env = { MY_WORKFLOW: Workflow; DB: D1Database };
28
+ type Params = { userId: string };
29
+
30
+ export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
31
+ async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
32
+ const user = await step.do('fetch user', async () => {
33
+ return await this.env.DB.prepare('SELECT * FROM users WHERE id = ?')
34
+ .bind(event.payload.userId).first();
35
+ });
36
+
37
+ await step.sleep('wait 7 days', '7 days');
38
+
39
+ await step.do('send reminder', async () => {
40
+ await sendEmail(user.email, 'Reminder!');
41
+ });
42
+ }
43
+ }
44
+ ```
45
+
46
+ ## Key Features
47
+
48
+ - **Durability**: Failed steps don't re-run successful ones
49
+ - **Retries**: Configurable backoff (constant/linear/exponential)
50
+ - **Events**: `waitForEvent()` for webhooks/approvals (configurable timeout)
51
+ - **Sleep**: `sleep()` / `sleepUntil()` for scheduling
52
+ - **Parallel**: `Promise.all()` for concurrent steps
53
+ - **Idempotency**: Check-then-execute patterns
54
+
55
+ ## Retrieval
56
+
57
+ These reference files cover API shapes, code patterns, and debugging — things that are stable. For **limits, pricing, and other values that change**, always fetch the latest from the official docs:
58
+
59
+ - **Limits:** https://developers.cloudflare.com/workflows/reference/limits/
60
+ - **Pricing:** https://developers.cloudflare.com/workflows/reference/pricing/
61
+ - **Workers API:** https://developers.cloudflare.com/workflows/build/workers-api/
62
+
63
+ ## Reading Order
64
+
65
+ **Getting Started:** configuration.md → api.md → patterns.md
66
+ **Troubleshooting:** gotchas.md
67
+
68
+ ## In This Reference
69
+ - [configuration.md](./configuration.md) - wrangler.jsonc setup, step config, bindings
70
+ - [api.md](./api.md) - Step APIs, instance management, sleep/parameters
71
+ - [patterns.md](./patterns.md) - Common workflows, testing, orchestration
72
+ - [gotchas.md](./gotchas.md) - Timeouts, limits, debugging strategies
73
+
74
+ ## See Also
75
+ - [durable-objects](../durable-objects/) - Alternative stateful approach
76
+ - [queues](../queues/) - Message-driven workflows
77
+ - [workers](../workers/) - Entry point for workflow instances
@@ -0,0 +1,218 @@
1
+ # Workflow APIs
2
+
3
+ ## Step APIs
4
+
5
+ ```typescript
6
+ // step.do()
7
+ const result = await step.do('step name', async () => { /* logic */ });
8
+ const result = await step.do('step name', { retries, timeout }, async () => {});
9
+
10
+ // step.sleep()
11
+ await step.sleep('description', '1 hour');
12
+ await step.sleep('description', 5000); // ms
13
+
14
+ // step.sleepUntil()
15
+ await step.sleepUntil('description', Date.parse('2024-12-31'));
16
+
17
+ // step.waitForEvent()
18
+ const data = await step.waitForEvent<PayloadType>('wait', {type: 'webhook-type', timeout: '24h'});
19
+ try { const event = await step.waitForEvent('wait', { type: 'approval', timeout: '1h' }); } catch (e) { /* Timeout */ }
20
+ ```
21
+
22
+ ## WorkflowStepContext
23
+
24
+ The `WorkflowStepContext` is passed as the first argument to the `step.do()` callback. It provides runtime information about the current step execution.
25
+
26
+ ```typescript
27
+ type WorkflowStepContext = {
28
+ step: {
29
+ name: string; // Step name as passed to step.do()
30
+ count: number; // How many times step.do() called with this name in current run (1-indexed)
31
+ };
32
+ attempt: number; // Current attempt number (1-indexed): 1 = first try, 2 = first retry, etc.
33
+ config: WorkflowStepConfig; // Resolved config for this step, including runtime defaults
34
+ };
35
+ ```
36
+
37
+ **Use cases:**
38
+ ```typescript
39
+ // Adjust behavior based on retry attempt
40
+ await step.do('call api', { retries: { limit: 3, delay: '5 seconds', backoff: 'exponential' } }, async (ctx) => {
41
+ if (ctx.attempt > 1) console.log(`Retry attempt ${ctx.attempt} for step "${ctx.step.name}"`);
42
+ const res = await fetch('https://api.example.com/data');
43
+ if (!res.ok) throw new Error(`API failed (attempt ${ctx.attempt})`);
44
+ return res.json();
45
+ });
46
+
47
+ ```
48
+
49
+ ## Instance Management
50
+
51
+ ```typescript
52
+ // Create single
53
+ const instance = await env.MY_WORKFLOW.create({id: crypto.randomUUID(), params: { userId: 'user123' }}); // id optional, auto-generated if omitted; throws if ID already exists within retention period
54
+
55
+ // Create with custom retention (check docs for default per plan)
56
+ const instance = await env.MY_WORKFLOW.create({
57
+ id: crypto.randomUUID(),
58
+ params: { userId: 'user123' },
59
+ retention: '30 days' // Override default retention period
60
+ });
61
+
62
+ // Batch (max 100, idempotent: skips existing IDs)
63
+ const instances = await env.MY_WORKFLOW.createBatch([{id: 'user1', params: {name: 'John'}}, {id: 'user2', params: {name: 'Jane'}}]);
64
+
65
+ // Get & Status
66
+ const instance = await env.MY_WORKFLOW.get('instance-id');
67
+ const status = await instance.status(); // {status: 'queued' | 'running' | 'paused' | 'errored' | 'terminated' | 'complete' | 'waiting' | 'waitingForPause' | 'unknown', error?, output?}
68
+
69
+ // Control
70
+ await instance.pause(); await instance.resume(); await instance.terminate(); await instance.restart();
71
+
72
+ // Send Events
73
+ await instance.sendEvent({type: 'approval', payload: { approved: true }}); // Must match waitForEvent type
74
+ ```
75
+
76
+ ## Triggering Workflows
77
+
78
+ ```typescript
79
+ // From Worker
80
+ export default { async fetch(req, env) { const instance = await env.MY_WORKFLOW.create({id: crypto.randomUUID(), params: { userId: 'user123' }}); return Response.json({ id: instance.id }); }};
81
+
82
+ // From Queue
83
+ export default { async queue(batch, env) { for (const msg of batch.messages) { await env.MY_WORKFLOW.create({id: `job-${msg.id}`, params: msg.body}); } }};
84
+
85
+ // From Cron
86
+ export default { async scheduled(event, env) { await env.CLEANUP_WORKFLOW.create({id: `cleanup-${Date.now()}`, params: { timestamp: event.scheduledTime }}); }};
87
+
88
+ // From Another Workflow (non-blocking)
89
+ export class ParentWorkflow extends WorkflowEntrypoint<Env, Params> {
90
+ async run(event, step) {
91
+ const child = await step.do('start child', async () => await this.env.CHILD_WORKFLOW.create({id: `child-${event.instanceId}`, params: {}}));
92
+ }
93
+ }
94
+ ```
95
+
96
+ ## Error Handling
97
+
98
+ ```typescript
99
+ import { NonRetryableError } from 'cloudflare:workflows';
100
+
101
+ // NonRetryableError
102
+ await step.do('validate', async () => {
103
+ if (!event.payload.paymentMethod) throw new NonRetryableError('Payment method required');
104
+ const res = await fetch('https://api.example.com/charge', { method: 'POST' });
105
+ if (res.status === 401) throw new NonRetryableError('Invalid credentials'); // Don't retry
106
+ if (!res.ok) throw new Error('Retryable failure'); // Will retry
107
+ return res.json();
108
+ });
109
+
110
+ // Catching Errors
111
+ try { await step.do('risky op', async () => { throw new NonRetryableError('Failed'); }); } catch (e) { await step.do('cleanup', async () => {}); }
112
+
113
+ // Idempotency
114
+ await step.do('charge', async () => {
115
+ const sub = await fetch(`https://api/subscriptions/${id}`).then(r => r.json());
116
+ if (sub.charged) return sub; // Already done
117
+ return await fetch(`https://api/subscriptions/${id}`, {method: 'POST', body: JSON.stringify({ amount: 10.0 })}).then(r => r.json());
118
+ });
119
+ ```
120
+
121
+ ## Type Constraints
122
+
123
+ Params and step returns must be `Rpc.Serializable<T>`:
124
+
125
+ ```typescript
126
+ // ✅ Valid types
127
+ type ValidParams = {
128
+ userId: string;
129
+ count: number;
130
+ tags: string[];
131
+ metadata: Record<string, unknown>;
132
+ };
133
+
134
+ // ❌ Invalid types
135
+ type InvalidParams = {
136
+ callback: () => void; // Functions not serializable
137
+ symbol: symbol; // Symbols not serializable
138
+ circular: any; // Circular references not allowed
139
+ };
140
+
141
+ // Step returns follow same rules
142
+ const result = await step.do('fetch', async () => {
143
+ return { userId: '123', data: [1, 2, 3] }; // ✅ Plain object
144
+ });
145
+
146
+ // ✅ ReadableStream<Uint8Array> for large binary output (bypasses non-stream step result size limit)
147
+ const stream = await step.do('read from R2', async () => {
148
+ const obj = await this.env.BUCKET.get('large-file.csv');
149
+ return obj.body; // Return the ReadableStream directly
150
+ });
151
+ ```
152
+
153
+ ## Sleep & Scheduling
154
+
155
+ ```typescript
156
+ // Relative
157
+ await step.sleep('wait 1 hour', '1 hour');
158
+ await step.sleep('wait 30 days', '30 days');
159
+ await step.sleep('wait 5s', 5000); // ms
160
+
161
+ // Absolute
162
+ await step.sleepUntil('launch date', Date.parse('24 Oct 2024 13:00:00 UTC'));
163
+ await step.sleepUntil('deadline', new Date('2024-12-31T23:59:59Z'));
164
+ ```
165
+
166
+ Units: second, minute, hour, day, week, month, year.
167
+ Sleeping instances don't count toward concurrency.
168
+
169
+ ## Parameters
170
+
171
+ **Pass from Worker:**
172
+ ```typescript
173
+ const instance = await env.MY_WORKFLOW.create({
174
+ id: crypto.randomUUID(),
175
+ params: { userId: 'user123', email: 'user@example.com' }
176
+ });
177
+ ```
178
+
179
+ **Access in Workflow:**
180
+ ```typescript
181
+ async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
182
+ const userId = event.payload.userId;
183
+ const instanceId = event.instanceId;
184
+ const createdAt = event.timestamp;
185
+ }
186
+ ```
187
+
188
+ **CLI Trigger:**
189
+ ```bash
190
+ npx wrangler workflows trigger my-workflow '{"userId":"user123"}'
191
+ ```
192
+
193
+ ## Wrangler CLI
194
+
195
+ ```bash
196
+ npm create cloudflare@latest my-workflow -- --template "cloudflare/workflows-starter"
197
+ npx wrangler deploy
198
+ npx wrangler workflows list
199
+ npx wrangler workflows trigger my-workflow '{"userId":"user123"}'
200
+ npx wrangler workflows instances list my-workflow
201
+ npx wrangler workflows instances describe my-workflow instance-id
202
+ npx wrangler workflows instances pause/resume/terminate my-workflow instance-id
203
+ ```
204
+
205
+ ## REST API
206
+
207
+ ```bash
208
+ # Create
209
+ curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/workflows/{workflow_name}/instances" -H "Authorization: Bearer {token}" -d '{"id":"custom-id","params":{"userId":"user123"}}'
210
+
211
+ # Status
212
+ curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/workflows/{workflow_name}/instances/{instance_id}/status" -H "Authorization: Bearer {token}"
213
+
214
+ # Send Event
215
+ curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/workflows/{workflow_name}/instances/{instance_id}/events" -H "Authorization: Bearer {token}" -d '{"type":"approval","payload":{"approved":true}}'
216
+ ```
217
+
218
+ See: [configuration.md](./configuration.md), [patterns.md](./patterns.md)