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.
- package/LICENSE +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# RealtimeKit Patterns
|
|
2
|
+
|
|
3
|
+
## UI Kit (Minimal Code)
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
// React
|
|
7
|
+
import { RtkMeeting } from '@cloudflare/realtimekit-react-ui';
|
|
8
|
+
<RtkMeeting authToken="<token>" onLeave={() => console.log('Left')} />
|
|
9
|
+
|
|
10
|
+
// Angular
|
|
11
|
+
@Component({ template: `<rtk-meeting [authToken]="authToken" (rtkLeave)="onLeave($event)"></rtk-meeting>` })
|
|
12
|
+
export class AppComponent { authToken = '<token>'; onLeave(event: unknown) {} }
|
|
13
|
+
|
|
14
|
+
// HTML/Web Components
|
|
15
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/@cloudflare/realtimekit-ui/dist/realtimekit-ui/realtimekit-ui.esm.js"></script>
|
|
16
|
+
<rtk-meeting id="meeting"></rtk-meeting>
|
|
17
|
+
<script>document.getElementById('meeting').authToken = '<token>';</script>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## UI Components
|
|
21
|
+
|
|
22
|
+
RealtimeKit provides 133+ pre-built Stencil.js Web Components with framework wrappers:
|
|
23
|
+
|
|
24
|
+
### Layout Components
|
|
25
|
+
- `<RtkMeeting>` - Full meeting UI (all-in-one)
|
|
26
|
+
- `<RtkHeader>`, `<RtkStage>`, `<RtkControlbar>` - Layout sections
|
|
27
|
+
- `<RtkSidebar>` - Chat/participants sidebar
|
|
28
|
+
- `<RtkGrid>` - Adaptive video grid
|
|
29
|
+
|
|
30
|
+
### Control Components
|
|
31
|
+
- `<RtkMicToggle>`, `<RtkCameraToggle>` - Media controls
|
|
32
|
+
- `<RtkScreenShareToggle>` - Screen sharing
|
|
33
|
+
- `<RtkLeaveButton>` - Leave meeting
|
|
34
|
+
- `<RtkSettingsModal>` - Device settings
|
|
35
|
+
|
|
36
|
+
### Grid Variants
|
|
37
|
+
- `<RtkSpotlightGrid>` - Active speaker focus
|
|
38
|
+
- `<RtkAudioGrid>` - Audio-only mode
|
|
39
|
+
- `<RtkPaginatedGrid>` - Paginated layout
|
|
40
|
+
|
|
41
|
+
**See full catalog**: https://docs.realtime.cloudflare.com/ui-kit
|
|
42
|
+
|
|
43
|
+
## Core SDK Patterns
|
|
44
|
+
|
|
45
|
+
### Basic Setup
|
|
46
|
+
```typescript
|
|
47
|
+
import RealtimeKitClient from '@cloudflare/realtimekit';
|
|
48
|
+
|
|
49
|
+
const meeting = new RealtimeKitClient({ authToken, video: true, audio: true });
|
|
50
|
+
meeting.self.on('roomJoined', () => console.log('Joined:', meeting.meta.meetingTitle));
|
|
51
|
+
meeting.participants.joined.on('participantJoined', (p) => console.log(`${p.name} joined`));
|
|
52
|
+
await meeting.join();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Video Grid & Device Selection
|
|
56
|
+
```typescript
|
|
57
|
+
// Video grid
|
|
58
|
+
function VideoGrid({ meeting }) {
|
|
59
|
+
const [participants, setParticipants] = useState([]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
const update = () => setParticipants(meeting.participants.joined.toArray());
|
|
62
|
+
meeting.participants.joined.on('participantJoined', update);
|
|
63
|
+
meeting.participants.joined.on('participantLeft', update);
|
|
64
|
+
update();
|
|
65
|
+
return () => { meeting.participants.joined.off('participantJoined', update); meeting.participants.joined.off('participantLeft', update); };
|
|
66
|
+
}, [meeting]);
|
|
67
|
+
return <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))' }}>
|
|
68
|
+
{participants.map(p => <VideoTile key={p.id} participant={p} />)}
|
|
69
|
+
</div>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function VideoTile({ participant }) {
|
|
73
|
+
const videoRef = useRef<HTMLVideoElement>(null);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (videoRef.current && participant.videoTrack) videoRef.current.srcObject = new MediaStream([participant.videoTrack]);
|
|
76
|
+
}, [participant.videoTrack]);
|
|
77
|
+
return <div><video ref={videoRef} autoPlay playsInline muted /><div>{participant.name}</div></div>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Device selection
|
|
81
|
+
const devices = await meeting.self.getAllDevices();
|
|
82
|
+
const switchCamera = (deviceId: string) => {
|
|
83
|
+
const device = devices.find(d => d.deviceId === deviceId);
|
|
84
|
+
if (device) await meeting.self.setDevice(device);
|
|
85
|
+
};
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## React Hooks (Official)
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { useRealtimeKitClient, useRealtimeKitSelector } from '@cloudflare/realtimekit-react-ui';
|
|
92
|
+
|
|
93
|
+
function MyComponent() {
|
|
94
|
+
const [meeting, initMeeting] = useRealtimeKitClient();
|
|
95
|
+
const audioEnabled = useRealtimeKitSelector(m => m.self.audioEnabled);
|
|
96
|
+
const participantCount = useRealtimeKitSelector(m => m.participants.joined.size());
|
|
97
|
+
|
|
98
|
+
useEffect(() => { initMeeting({ authToken: '<token>' }); }, []);
|
|
99
|
+
|
|
100
|
+
return <div>
|
|
101
|
+
<button onClick={() => meeting?.self.enableAudio()}>{audioEnabled ? 'Mute' : 'Unmute'}</button>
|
|
102
|
+
<span>{participantCount} participants</span>
|
|
103
|
+
</div>;
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Benefits:** Automatic re-renders, memoized selectors, type-safe
|
|
108
|
+
|
|
109
|
+
## Waitlist Handling
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// Monitor waitlist
|
|
113
|
+
meeting.participants.waitlisted.on('participantJoined', (participant) => {
|
|
114
|
+
console.log(`${participant.name} is waiting`);
|
|
115
|
+
// Show admin UI to approve/reject
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Approve from waitlist (backend only)
|
|
119
|
+
await fetch(
|
|
120
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/realtime/kit/${appId}/meetings/${meetingId}/active-session/waitlist/approve`,
|
|
121
|
+
{
|
|
122
|
+
method: 'POST',
|
|
123
|
+
headers: { 'Authorization': `Bearer ${apiToken}` },
|
|
124
|
+
body: JSON.stringify({ user_ids: [participant.userId] })
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// Client receives automatic transition when approved
|
|
129
|
+
meeting.self.on('roomJoined', () => console.log('Approved and joined'));
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Audio-Only Mode
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const meeting = new RealtimeKitClient({
|
|
136
|
+
authToken: '<token>',
|
|
137
|
+
video: false, // Disable video
|
|
138
|
+
audio: true,
|
|
139
|
+
mediaConfiguration: {
|
|
140
|
+
audio: {
|
|
141
|
+
echoCancellation: true,
|
|
142
|
+
noiseSuppression: true,
|
|
143
|
+
autoGainControl: true
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Use audio grid component
|
|
149
|
+
import { RtkAudioGrid } from '@cloudflare/realtimekit-react-ui';
|
|
150
|
+
<RtkAudioGrid meeting={meeting} />
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Addon System
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// List available addons
|
|
157
|
+
meeting.plugins.all.forEach(plugin => {
|
|
158
|
+
console.log(plugin.id, plugin.name, plugin.active);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Activate collaborative app
|
|
162
|
+
await meeting.plugins.activate('whiteboard-addon-id');
|
|
163
|
+
|
|
164
|
+
// Listen for activations
|
|
165
|
+
meeting.plugins.on('pluginActivated', ({ plugin }) => {
|
|
166
|
+
console.log(`${plugin.name} activated`);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Deactivate
|
|
170
|
+
await meeting.plugins.deactivate();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Backend Integration
|
|
174
|
+
|
|
175
|
+
### Token Generation (Workers)
|
|
176
|
+
```typescript
|
|
177
|
+
export interface Env { CLOUDFLARE_API_TOKEN: string; CLOUDFLARE_ACCOUNT_ID: string; REALTIMEKIT_APP_ID: string; }
|
|
178
|
+
|
|
179
|
+
export default {
|
|
180
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
181
|
+
const url = new URL(request.url);
|
|
182
|
+
|
|
183
|
+
if (url.pathname === '/api/join-meeting') {
|
|
184
|
+
const { meetingId, userName, presetName } = await request.json();
|
|
185
|
+
const response = await fetch(
|
|
186
|
+
`https://api.cloudflare.com/client/v4/accounts/${env.CLOUDFLARE_ACCOUNT_ID}/realtime/kit/${env.REALTIMEKIT_APP_ID}/meetings/${meetingId}/participants`,
|
|
187
|
+
{
|
|
188
|
+
method: 'POST',
|
|
189
|
+
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${env.CLOUDFLARE_API_TOKEN}` },
|
|
190
|
+
body: JSON.stringify({ name: userName, preset_name: presetName })
|
|
191
|
+
}
|
|
192
|
+
);
|
|
193
|
+
const data = await response.json();
|
|
194
|
+
return Response.json({ authToken: data.result.authToken });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return new Response('Not found', { status: 404 });
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Best Practices
|
|
203
|
+
|
|
204
|
+
### Security
|
|
205
|
+
1. **Never expose API tokens client-side** - Generate participant tokens server-side only
|
|
206
|
+
2. **Don't reuse participant tokens** - Generate fresh token per session, use refresh endpoint if expired
|
|
207
|
+
3. **Use custom participant IDs** - Map to your user system for cross-session tracking
|
|
208
|
+
|
|
209
|
+
### Performance
|
|
210
|
+
1. **Event-driven updates** - Listen to events, don't poll. Use `toArray()` only when needed
|
|
211
|
+
2. **Media quality constraints** - Set appropriate resolution/bitrate limits based on network conditions
|
|
212
|
+
3. **Device management** - Enable `autoSwitchAudioDevice` for better UX, handle device list updates
|
|
213
|
+
|
|
214
|
+
### Architecture
|
|
215
|
+
1. **Separate Apps for environments** - staging vs production to prevent data mixing
|
|
216
|
+
2. **Preset strategy** - Create presets at App level, reuse across meetings
|
|
217
|
+
3. **Token management** - Backend generates tokens, frontend receives via authenticated endpoint
|
|
218
|
+
|
|
219
|
+
## In This Reference
|
|
220
|
+
- [README.md](README.md) - Overview, core concepts, quick start
|
|
221
|
+
- [configuration.md](configuration.md) - SDK config, presets, wrangler setup
|
|
222
|
+
- [api.md](api.md) - Client SDK APIs, REST endpoints
|
|
223
|
+
- [gotchas.md](gotchas.md) - Common issues, troubleshooting, limits
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Cloudflare Sandbox SDK
|
|
2
|
+
|
|
3
|
+
Secure isolated code execution in containers on Cloudflare's edge. Run untrusted code, manage files, expose services, integrate with AI agents.
|
|
4
|
+
|
|
5
|
+
**Use cases**: AI code execution, interactive dev environments, data analysis, CI/CD, code interpreters, multi-tenant execution.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
- Each sandbox = Durable Object + Container
|
|
10
|
+
- Persistent across requests (same ID = same sandbox)
|
|
11
|
+
- Isolated filesystem/processes/network
|
|
12
|
+
- Configurable sleep/wake for cost optimization
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { getSandbox, proxyToSandbox, type Sandbox } from '@cloudflare/sandbox';
|
|
18
|
+
export { Sandbox } from '@cloudflare/sandbox';
|
|
19
|
+
|
|
20
|
+
type Env = { Sandbox: DurableObjectNamespace<Sandbox>; };
|
|
21
|
+
|
|
22
|
+
export default {
|
|
23
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
24
|
+
// CRITICAL: proxyToSandbox MUST be called first for preview URLs
|
|
25
|
+
const proxyResponse = await proxyToSandbox(request, env);
|
|
26
|
+
if (proxyResponse) return proxyResponse;
|
|
27
|
+
|
|
28
|
+
const sandbox = getSandbox(env.Sandbox, 'my-sandbox');
|
|
29
|
+
const result = await sandbox.exec('python3 -c "print(2 + 2)"');
|
|
30
|
+
return Response.json({ output: result.stdout });
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**wrangler.jsonc**:
|
|
36
|
+
```jsonc
|
|
37
|
+
{
|
|
38
|
+
"name": "my-sandbox-worker",
|
|
39
|
+
"main": "src/index.ts",
|
|
40
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
41
|
+
|
|
42
|
+
"containers": [{
|
|
43
|
+
"class_name": "Sandbox",
|
|
44
|
+
"image": "./Dockerfile",
|
|
45
|
+
"instance_type": "lite", // lite | standard | heavy
|
|
46
|
+
"max_instances": 5
|
|
47
|
+
}],
|
|
48
|
+
|
|
49
|
+
"durable_objects": {
|
|
50
|
+
"bindings": [{ "class_name": "Sandbox", "name": "Sandbox" }]
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
"migrations": [{
|
|
54
|
+
"tag": "v1",
|
|
55
|
+
"new_sqlite_classes": ["Sandbox"]
|
|
56
|
+
}]
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Dockerfile**:
|
|
61
|
+
```dockerfile
|
|
62
|
+
FROM docker.io/cloudflare/sandbox:0.7.0
|
|
63
|
+
RUN pip3 install --no-cache-dir pandas numpy matplotlib
|
|
64
|
+
EXPOSE 8080 3000 # Required for wrangler dev
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Core APIs
|
|
68
|
+
|
|
69
|
+
- `getSandbox(namespace, id, options?)` → Get/create sandbox
|
|
70
|
+
- `sandbox.exec(command, options?)` → Execute command
|
|
71
|
+
- `sandbox.readFile(path)` / `writeFile(path, content)` → File ops
|
|
72
|
+
- `sandbox.startProcess(command, options)` → Background process
|
|
73
|
+
- `sandbox.exposePort(port, options)` → Get preview URL
|
|
74
|
+
- `sandbox.createSession(options)` → Isolated session
|
|
75
|
+
- `sandbox.wsConnect(request, port)` → WebSocket proxy
|
|
76
|
+
- `sandbox.destroy()` → Terminate container
|
|
77
|
+
- `sandbox.mountBucket(bucket, path, options)` → Mount S3 storage
|
|
78
|
+
|
|
79
|
+
## Critical Rules
|
|
80
|
+
|
|
81
|
+
- ALWAYS call `proxyToSandbox()` first
|
|
82
|
+
- Same ID = reuse sandbox
|
|
83
|
+
- Use `/workspace` for persistent files
|
|
84
|
+
- `normalizeId: true` for preview URLs
|
|
85
|
+
- Retry on `CONTAINER_NOT_READY`
|
|
86
|
+
|
|
87
|
+
## In This Reference
|
|
88
|
+
- [configuration.md](./configuration.md) - Config, CLI, environment setup
|
|
89
|
+
- [api.md](./api.md) - Programmatic API, testing patterns
|
|
90
|
+
- [patterns.md](./patterns.md) - Common workflows, CI/CD integration
|
|
91
|
+
- [gotchas.md](./gotchas.md) - Issues, limits, best practices
|
|
92
|
+
|
|
93
|
+
## See Also
|
|
94
|
+
- [durable-objects](../durable-objects/) - Sandbox runs on DO infrastructure
|
|
95
|
+
- [containers](../containers/) - Container runtime fundamentals
|
|
96
|
+
- [workers](../workers/) - Entry point for sandbox requests
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Command Execution
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Basic
|
|
7
|
+
const result = await sandbox.exec('python3 script.py');
|
|
8
|
+
// Returns: { stdout, stderr, exitCode, success, duration }
|
|
9
|
+
|
|
10
|
+
// With options
|
|
11
|
+
await sandbox.exec('python3 test.py', {
|
|
12
|
+
cwd: '/workspace/project',
|
|
13
|
+
env: { API_KEY: 'secret' },
|
|
14
|
+
stream: true,
|
|
15
|
+
onOutput: (stream, data) => console.log(data)
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## File Operations
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// Read/Write
|
|
23
|
+
const { content } = await sandbox.readFile('/workspace/data.txt');
|
|
24
|
+
await sandbox.writeFile('/workspace/file.txt', 'content'); // Auto-creates dirs
|
|
25
|
+
|
|
26
|
+
// List/Delete
|
|
27
|
+
const files = await sandbox.listFiles('/workspace');
|
|
28
|
+
await sandbox.deleteFile('/workspace/temp.txt');
|
|
29
|
+
await sandbox.deleteFile('/workspace/dir', { recursive: true });
|
|
30
|
+
|
|
31
|
+
// Utils
|
|
32
|
+
await sandbox.mkdir('/workspace/dir', { recursive: true });
|
|
33
|
+
await sandbox.pathExists('/workspace/file.txt');
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Background Processes
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// Start
|
|
40
|
+
const process = await sandbox.startProcess('python3 -m http.server 8080', {
|
|
41
|
+
processId: 'web-server',
|
|
42
|
+
cwd: '/workspace/public',
|
|
43
|
+
env: { PORT: '8080' }
|
|
44
|
+
});
|
|
45
|
+
// Returns: { id, pid, command }
|
|
46
|
+
|
|
47
|
+
// Wait for readiness
|
|
48
|
+
await process.waitForPort(8080); // Wait for port to listen
|
|
49
|
+
await process.waitForLog(/Server running/); // Wait for log pattern
|
|
50
|
+
await process.waitForExit(); // Wait for completion
|
|
51
|
+
|
|
52
|
+
// Management
|
|
53
|
+
const processes = await sandbox.listProcesses();
|
|
54
|
+
const info = await sandbox.getProcess('web-server');
|
|
55
|
+
await sandbox.stopProcess('web-server');
|
|
56
|
+
const logs = await sandbox.getProcessLogs('web-server');
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Port Exposure
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// Expose port
|
|
63
|
+
const { url } = await sandbox.exposePort(8080, {
|
|
64
|
+
name: 'web-app',
|
|
65
|
+
hostname: request.hostname
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Management
|
|
69
|
+
await sandbox.isPortExposed(8080);
|
|
70
|
+
await sandbox.getExposedPorts(request.hostname);
|
|
71
|
+
await sandbox.unexposePort(8080);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Sessions (Isolated Contexts)
|
|
75
|
+
|
|
76
|
+
Each session maintains own shell state, env vars, cwd, process namespace.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// Create with context
|
|
80
|
+
const session = await sandbox.createSession({
|
|
81
|
+
id: 'user-123',
|
|
82
|
+
cwd: '/workspace/user123',
|
|
83
|
+
env: { USER_ID: '123' }
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Use (full sandbox API)
|
|
87
|
+
await session.exec('echo $USER_ID');
|
|
88
|
+
await session.writeFile('config.txt', 'data');
|
|
89
|
+
|
|
90
|
+
// Manage
|
|
91
|
+
await sandbox.getSession('user-123');
|
|
92
|
+
await sandbox.deleteSession('user-123');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Code Interpreter
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Create context with variables
|
|
99
|
+
const ctx = await sandbox.createCodeContext({
|
|
100
|
+
language: 'python',
|
|
101
|
+
variables: {
|
|
102
|
+
data: [1, 2, 3, 4, 5],
|
|
103
|
+
config: { verbose: true }
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Execute code with rich outputs
|
|
108
|
+
const result = await sandbox.runCode(`
|
|
109
|
+
import matplotlib.pyplot as plt
|
|
110
|
+
plt.plot(data, [x**2 for x in data])
|
|
111
|
+
plt.savefig('plot.png')
|
|
112
|
+
print(f"Processed {len(data)} points")
|
|
113
|
+
`, { context: ctx });
|
|
114
|
+
// Returns: ExecutionResult { code, logs, results: RichOutput[], error, executionCount }
|
|
115
|
+
|
|
116
|
+
// Context persists variables across runs
|
|
117
|
+
const result2 = await sandbox.runCode('print(data[0])', { context: ctx }); // Still has 'data'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## WebSocket Connections
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// Proxy WebSocket to sandbox service
|
|
124
|
+
export default {
|
|
125
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
126
|
+
const proxyResponse = await proxyToSandbox(request, env);
|
|
127
|
+
if (proxyResponse) return proxyResponse;
|
|
128
|
+
|
|
129
|
+
if (request.headers.get('Upgrade')?.toLowerCase() === 'websocket') {
|
|
130
|
+
const sandbox = getSandbox(env.Sandbox, 'realtime');
|
|
131
|
+
return await sandbox.wsConnect(request, 8080);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return new Response('Not a WebSocket request', { status: 400 });
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Bucket Mounting (S3 Storage)
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// Mount R2 bucket (production only, not wrangler dev)
|
|
143
|
+
await sandbox.mountBucket(env.DATA_BUCKET, '/data', {
|
|
144
|
+
readOnly: false
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Access files in mounted bucket
|
|
148
|
+
await sandbox.exec('ls /data');
|
|
149
|
+
await sandbox.writeFile('/data/output.txt', 'result');
|
|
150
|
+
|
|
151
|
+
// Unmount
|
|
152
|
+
await sandbox.unmountBucket('/data');
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Note**: Bucket mounting only works in production. Mounted buckets are sandbox-scoped (visible to all sessions in that sandbox).
|
|
156
|
+
|
|
157
|
+
## Lifecycle Management
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// Terminate container immediately
|
|
161
|
+
await sandbox.destroy();
|
|
162
|
+
|
|
163
|
+
// REQUIRED when using keepAlive: true
|
|
164
|
+
const sandbox = getSandbox(env.Sandbox, 'temp', { keepAlive: true });
|
|
165
|
+
try {
|
|
166
|
+
await sandbox.writeFile('/tmp/code.py', code);
|
|
167
|
+
const result = await sandbox.exec('python /tmp/code.py');
|
|
168
|
+
return result.stdout;
|
|
169
|
+
} finally {
|
|
170
|
+
await sandbox.destroy(); // Free resources
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Deletes: files, processes, sessions, network connections, exposed ports.
|
|
175
|
+
|
|
176
|
+
## Error Handling
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// Command errors
|
|
180
|
+
const result = await sandbox.exec('python3 invalid.py');
|
|
181
|
+
if (!result.success) {
|
|
182
|
+
console.error('Exit code:', result.exitCode);
|
|
183
|
+
console.error('Stderr:', result.stderr);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// SDK errors
|
|
187
|
+
try {
|
|
188
|
+
await sandbox.readFile('/nonexistent');
|
|
189
|
+
} catch (error) {
|
|
190
|
+
if (error.code === 'FILE_NOT_FOUND') { /* ... */ }
|
|
191
|
+
else if (error.code === 'CONTAINER_NOT_READY') { /* retry */ }
|
|
192
|
+
else if (error.code === 'TIMEOUT') { /* ... */ }
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Retry pattern (see gotchas.md for full implementation)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## getSandbox Options
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const sandbox = getSandbox(env.Sandbox, 'sandbox-id', {
|
|
7
|
+
normalizeId: true, // lowercase ID (required for preview URLs)
|
|
8
|
+
sleepAfter: '10m', // sleep after inactivity: '5m', '1h', '2d' (default: '10m')
|
|
9
|
+
keepAlive: false, // false = auto-timeout, true = never sleep
|
|
10
|
+
|
|
11
|
+
containerTimeouts: {
|
|
12
|
+
instanceGetTimeoutMS: 30000, // 30s for provisioning (default: 30000)
|
|
13
|
+
portReadyTimeoutMS: 90000 // 90s for container startup (default: 90000)
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Sleep Config**:
|
|
19
|
+
- `sleepAfter`: Duration string (e.g., '5m', '10m', '1h') - default: '10m'
|
|
20
|
+
- `keepAlive: false`: Auto-sleep (default, cost-optimized)
|
|
21
|
+
- `keepAlive: true`: Never sleep (higher cost, requires explicit `destroy()`)
|
|
22
|
+
- Sleeping sandboxes wake automatically (cold start)
|
|
23
|
+
|
|
24
|
+
## Instance Types
|
|
25
|
+
|
|
26
|
+
wrangler.jsonc `instance_type`:
|
|
27
|
+
- `lite`: 256MB RAM, 0.5 vCPU (default)
|
|
28
|
+
- `standard`: 512MB RAM, 1 vCPU
|
|
29
|
+
- `heavy`: 1GB RAM, 2 vCPU
|
|
30
|
+
|
|
31
|
+
## Dockerfile Patterns
|
|
32
|
+
|
|
33
|
+
**Basic**:
|
|
34
|
+
```dockerfile
|
|
35
|
+
FROM docker.io/cloudflare/sandbox:0.7.0
|
|
36
|
+
RUN pip3 install --no-cache-dir pandas numpy
|
|
37
|
+
EXPOSE 8080 # Required for wrangler dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Scientific**:
|
|
41
|
+
```dockerfile
|
|
42
|
+
FROM docker.io/cloudflare/sandbox:0.7.0
|
|
43
|
+
RUN pip3 install --no-cache-dir \
|
|
44
|
+
jupyter-server ipykernel matplotlib \
|
|
45
|
+
pandas seaborn plotly scipy scikit-learn
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Node.js**:
|
|
49
|
+
```dockerfile
|
|
50
|
+
FROM docker.io/cloudflare/sandbox:0.7.0
|
|
51
|
+
RUN npm install -g typescript ts-node
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**CRITICAL**: `EXPOSE` required for `wrangler dev` port access. Production auto-exposes all ports.
|
|
55
|
+
|
|
56
|
+
## CLI Commands
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Dev
|
|
60
|
+
wrangler dev # Start local dev server
|
|
61
|
+
wrangler deploy # Deploy to production
|
|
62
|
+
wrangler tail # Monitor logs
|
|
63
|
+
wrangler containers list # Check container status
|
|
64
|
+
wrangler secret put KEY # Set secret
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Environment & Secrets
|
|
68
|
+
|
|
69
|
+
**wrangler.jsonc**:
|
|
70
|
+
```jsonc
|
|
71
|
+
{
|
|
72
|
+
"vars": {
|
|
73
|
+
"ENVIRONMENT": "production",
|
|
74
|
+
"API_URL": "https://api.example.com"
|
|
75
|
+
},
|
|
76
|
+
"r2_buckets": [{
|
|
77
|
+
"binding": "DATA_BUCKET",
|
|
78
|
+
"bucket_name": "my-data-bucket"
|
|
79
|
+
}]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Usage**:
|
|
84
|
+
```typescript
|
|
85
|
+
const token = env.GITHUB_TOKEN; // From wrangler secret
|
|
86
|
+
await sandbox.exec('git clone ...', {
|
|
87
|
+
env: { GIT_TOKEN: token }
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Preview URL Setup
|
|
92
|
+
|
|
93
|
+
**Prerequisites**:
|
|
94
|
+
- Custom domain with wildcard DNS: `*.yourdomain.com → worker.yourdomain.com`
|
|
95
|
+
- `.workers.dev` domains NOT supported
|
|
96
|
+
- `normalizeId: true` in getSandbox
|
|
97
|
+
- `proxyToSandbox()` called first in fetch handler
|
|
98
|
+
|
|
99
|
+
## Cron Triggers (Pre-warming)
|
|
100
|
+
|
|
101
|
+
```jsonc
|
|
102
|
+
{
|
|
103
|
+
"triggers": {
|
|
104
|
+
"crons": ["*/5 * * * *"] // Every 5 minutes
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
export default {
|
|
111
|
+
async scheduled(event: ScheduledEvent, env: Env) {
|
|
112
|
+
const sandbox = getSandbox(env.Sandbox, 'main');
|
|
113
|
+
await sandbox.exec('echo "keepalive"'); // Wake sandbox
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Logging Configuration
|
|
119
|
+
|
|
120
|
+
**wrangler.jsonc**:
|
|
121
|
+
```jsonc
|
|
122
|
+
{
|
|
123
|
+
"vars": {
|
|
124
|
+
"SANDBOX_LOG_LEVEL": "debug", // debug | info | warn | error (default: info)
|
|
125
|
+
"SANDBOX_LOG_FORMAT": "pretty" // json | pretty (default: json)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Dev**: `debug` + `pretty`. **Production**: `info`/`warn` + `json`.
|
|
131
|
+
|
|
132
|
+
## Timeout Environment Overrides
|
|
133
|
+
|
|
134
|
+
Override default timeouts via environment variables:
|
|
135
|
+
|
|
136
|
+
```jsonc
|
|
137
|
+
{
|
|
138
|
+
"vars": {
|
|
139
|
+
"SANDBOX_INSTANCE_TIMEOUT_MS": "60000", // Override instanceGetTimeoutMS
|
|
140
|
+
"SANDBOX_PORT_TIMEOUT_MS": "120000" // Override portReadyTimeoutMS
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
```
|