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
package/README.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# pi-cloudflare
|
|
2
|
+
|
|
3
|
+
One install for Cloudflare-driven agent work: **skills + MCP tools + setup
|
|
4
|
+
helper** in a single pi package.
|
|
5
|
+
|
|
6
|
+
- **Skills** (12 vendored from the official
|
|
7
|
+
[cloudflare/skills](https://github.com/cloudflare/skills) repo: `cloudflare`,
|
|
8
|
+
`wrangler`, `workers-best-practices`, `durable-objects`, `agents-sdk`,
|
|
9
|
+
`cloudflare-email-service`, `cloudflare-one`, `cloudflare-one-migrations`,
|
|
10
|
+
`sandbox-stable`, `sandbox-next`, `sandbox-migrate-to-next`,
|
|
11
|
+
`turnstile-spin`). Refresh with `scripts/sync-skills.sh`
|
|
12
|
+
(kept as a script, not vendored twice).
|
|
13
|
+
- **MCP tools** — all five official Cloudflare MCP servers, proxied with
|
|
14
|
+
per-server prefixes (a server that is down or unauthorized is skipped with
|
|
15
|
+
a warning instead of failing the session):
|
|
16
|
+
|
|
17
|
+
| Tools | Server |
|
|
18
|
+
| --------------- | ----------------------------------------------- |
|
|
19
|
+
| `cf_api_*` | Cloudflare API (2,500+ endpoints) |
|
|
20
|
+
| `cf_docs_*` | Developer documentation (works without a token) |
|
|
21
|
+
| `cf_bindings_*` | Workers primitives guidance |
|
|
22
|
+
| `cf_builds_*` | Workers Builds insights |
|
|
23
|
+
| `cf_obs_*` | Workers logs/metrics/traces |
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pi install npm:pi-cloudflare # once published
|
|
29
|
+
pi install /path/to/pi-cloudflare # from source
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Tools and skills register on the **next** session start.
|
|
33
|
+
|
|
34
|
+
## Authenticate (one-time browser OAuth)
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pi-cloudflare-setup # authorize missing servers
|
|
38
|
+
pi-cloudflare-setup --only builds # re-auth specific servers
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Each Cloudflare MCP server is its own OAuth issuer, so approval happens
|
|
42
|
+
once per server (docs needs none): the command opens one tab per server,
|
|
43
|
+
you approve, and tokens (with refresh) are stored owner-only in
|
|
44
|
+
`~/.pi/cloudflare-tokens.json`. The extension refreshes them silently
|
|
45
|
+
before expiry, and setup skips servers that are still fresh. If a server
|
|
46
|
+
later rejects its token, rerun setup (with `--only` for just that one).
|
|
47
|
+
Nothing is ever logged or committed.
|
|
48
|
+
|
|
49
|
+
## Configure (optional)
|
|
50
|
+
|
|
51
|
+
In `~/.pi/agent/settings.json`:
|
|
52
|
+
|
|
53
|
+
```jsonc
|
|
54
|
+
{
|
|
55
|
+
"pi-cloudflare": {
|
|
56
|
+
"servers": { "builds": false }, // disable individual servers
|
|
57
|
+
"connectTimeoutMs": 30000,
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Development
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npm install
|
|
66
|
+
npm test # typecheck + unit tests (mocked, no network)
|
|
67
|
+
```
|
package/bin/setup.mjs
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* pi-cloudflare setup: one-time browser OAuth for every Cloudflare MCP
|
|
4
|
+
* server. Each server is its own OAuth issuer, so approval happens once per
|
|
5
|
+
* server (docs needs none). Tokens (with refresh) are stored owner-only in
|
|
6
|
+
* ~/.pi/cloudflare-tokens.json and refreshed automatically afterwards.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* pi-cloudflare-setup # authorize missing/expired servers
|
|
10
|
+
* pi-cloudflare-setup --only builds # re-auth specific servers
|
|
11
|
+
* pi-cloudflare-setup --only api,observability
|
|
12
|
+
*
|
|
13
|
+
* Nothing secret is ever logged or written anywhere else.
|
|
14
|
+
*/
|
|
15
|
+
import { connectAll } from '../dist/client.js'
|
|
16
|
+
import { CLOUDFLARE_SERVERS } from '../dist/servers.js'
|
|
17
|
+
import { runOAuthFlow } from '../dist/auth-flow.js'
|
|
18
|
+
import { partitionServers, readTokenFile, writeTokenFile } from '../dist/token-store.js'
|
|
19
|
+
|
|
20
|
+
const AUTHED_IDS = ['api', 'bindings', 'builds', 'observability']
|
|
21
|
+
|
|
22
|
+
function argValue(flag) {
|
|
23
|
+
const index = process.argv.indexOf(flag)
|
|
24
|
+
return index >= 0 && index + 1 < process.argv.length ? process.argv[index + 1] : undefined
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function parseOnly() {
|
|
28
|
+
const raw = argValue('--only')
|
|
29
|
+
if (!raw) return undefined
|
|
30
|
+
const ids = raw
|
|
31
|
+
.split(',')
|
|
32
|
+
.map((id) => id.trim())
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
const unknown = ids.filter((id) => !AUTHED_IDS.includes(id))
|
|
35
|
+
if (unknown.length > 0) {
|
|
36
|
+
console.log(`Unknown server(s): ${unknown.join(', ')}. Choose from: ${AUTHED_IDS.join(', ')}`)
|
|
37
|
+
process.exit(2)
|
|
38
|
+
}
|
|
39
|
+
return ids
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const only = parseOnly()
|
|
43
|
+
const wanted = only ?? AUTHED_IDS
|
|
44
|
+
const file = readTokenFile() ?? { version: 1, servers: {} }
|
|
45
|
+
const { fresh, needed } = partitionServers(wanted, file.servers)
|
|
46
|
+
|
|
47
|
+
if (fresh.length > 0) {
|
|
48
|
+
console.log(`Already authorized (skipping): ${fresh.join(', ')}\n`)
|
|
49
|
+
}
|
|
50
|
+
if (needed.length === 0) {
|
|
51
|
+
console.log('All requested servers already authorized. Verifying...\n')
|
|
52
|
+
} else {
|
|
53
|
+
console.log(
|
|
54
|
+
`Browser OAuth: ${needed.length} approval tab${needed.length === 1 ? '' : 's'} ` +
|
|
55
|
+
`(${needed.join(', ')}). Approve each; tokens stay on this machine.\n`
|
|
56
|
+
)
|
|
57
|
+
let index = 0
|
|
58
|
+
for (const id of needed) {
|
|
59
|
+
index += 1
|
|
60
|
+
const definition = CLOUDFLARE_SERVERS.find((server) => server.id === id)
|
|
61
|
+
console.log(`[${index}/${needed.length}] Approving ${id} (${definition.url})...`)
|
|
62
|
+
try {
|
|
63
|
+
const { tokens, clientId, tokenEndpoint } = await runOAuthFlow(definition)
|
|
64
|
+
file.servers[id] = { ...tokens, clientId, tokenEndpoint }
|
|
65
|
+
writeTokenFile(file.servers)
|
|
66
|
+
console.log(`[${index}/${needed.length}] ${id}: authorized and stored\n`)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.log(
|
|
69
|
+
`[${index}/${needed.length}] ${id}: FAILED (${error instanceof Error ? error.message : String(error)})\n`
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
console.log('Verifying all servers...\n')
|
|
76
|
+
const stored = readTokenFile()
|
|
77
|
+
let okCount = 0
|
|
78
|
+
const failed = []
|
|
79
|
+
for (const definition of CLOUDFLARE_SERVERS) {
|
|
80
|
+
const token = stored?.servers[definition.id]?.accessToken
|
|
81
|
+
const [connection] = await connectAll([definition], { apiToken: token, timeoutMs: 20000 })
|
|
82
|
+
if (!connection) {
|
|
83
|
+
console.log(`- ${definition.id}: unreachable`)
|
|
84
|
+
if (AUTHED_IDS.includes(definition.id)) failed.push(definition.id)
|
|
85
|
+
continue
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const tools = await connection.listTools()
|
|
89
|
+
console.log(`- ${definition.id}: OK (${tools.length} tools)`)
|
|
90
|
+
okCount += 1
|
|
91
|
+
} catch {
|
|
92
|
+
console.log(`- ${definition.id}: connected but tool discovery failed`)
|
|
93
|
+
if (AUTHED_IDS.includes(definition.id)) failed.push(definition.id)
|
|
94
|
+
} finally {
|
|
95
|
+
await connection.close()
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log(`\n${okCount}/5 servers working.`)
|
|
100
|
+
if (failed.length > 0) {
|
|
101
|
+
console.log(`Re-authenticate with: pi-cloudflare-setup --only ${failed.join(',')}`)
|
|
102
|
+
process.exit(1)
|
|
103
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type OAuthTokens } from './oauth.js';
|
|
2
|
+
import type { CloudflareServerDefinition } from './servers.js';
|
|
3
|
+
export interface OAuthFlowResult {
|
|
4
|
+
tokens: OAuthTokens;
|
|
5
|
+
clientId: string;
|
|
6
|
+
tokenEndpoint: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* One-time browser OAuth for a single MCP server: dynamic registration,
|
|
10
|
+
* PKCE, localhost callback, code exchange. Nothing secret is logged.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runOAuthFlow(definition: CloudflareServerDefinition, options?: {
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
}): Promise<OAuthFlowResult>;
|
|
15
|
+
//# sourceMappingURL=auth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-flow.d.ts","sourceRoot":"","sources":["../src/auth-flow.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAkDD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,0BAA0B,EACtC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,eAAe,CAAC,CA0C1B"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { buildAuthorizeUrl, discoverAuthServer, exchangeCode, generatePkcePair, generateState, registerClient, } from './oauth.js';
|
|
4
|
+
function waitForCallback(server, expectedState, timeoutMs) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const timer = setTimeout(() => {
|
|
7
|
+
server.close();
|
|
8
|
+
reject(new Error('Timed out waiting for browser approval (5 minutes)'));
|
|
9
|
+
}, timeoutMs);
|
|
10
|
+
server.on('request', (request, response) => {
|
|
11
|
+
const url = new URL(request.url ?? '/', 'http://127.0.0.1');
|
|
12
|
+
response.writeHead(200, { 'Content-Type': 'text/html' });
|
|
13
|
+
response.end('<html><body><h1>Signed in.</h1><p>Return to your terminal; this window can be closed.</p></body></html>');
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
server.close();
|
|
16
|
+
if (url.pathname !== '/callback') {
|
|
17
|
+
reject(new Error(`Unexpected callback path: ${url.pathname}`));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (url.searchParams.get('state') !== expectedState) {
|
|
21
|
+
reject(new Error('State mismatch: possible cross-site request, aborting'));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const error = url.searchParams.get('error');
|
|
25
|
+
if (error) {
|
|
26
|
+
reject(new Error(`Authorization failed: ${error}`));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const code = url.searchParams.get('code');
|
|
30
|
+
if (!code) {
|
|
31
|
+
reject(new Error('Authorization response had no code'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
resolve(code);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function openBrowser(url) {
|
|
39
|
+
const opener = process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
40
|
+
const child = spawn(opener, [url], { detached: true, stdio: 'ignore' });
|
|
41
|
+
child.unref();
|
|
42
|
+
console.log(`Opened browser for approval. If nothing opened, visit:\n ${url}\n`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* One-time browser OAuth for a single MCP server: dynamic registration,
|
|
46
|
+
* PKCE, localhost callback, code exchange. Nothing secret is logged.
|
|
47
|
+
*/
|
|
48
|
+
export async function runOAuthFlow(definition, options = {}) {
|
|
49
|
+
const metadata = await discoverAuthServer(definition.url);
|
|
50
|
+
if (!metadata.registrationEndpoint) {
|
|
51
|
+
throw new Error(`${definition.id}: server does not support dynamic client registration`);
|
|
52
|
+
}
|
|
53
|
+
const server = createServer();
|
|
54
|
+
await new Promise((resolve, reject) => {
|
|
55
|
+
server.once('error', reject);
|
|
56
|
+
server.listen(0, '127.0.0.1', () => resolve());
|
|
57
|
+
});
|
|
58
|
+
const address = server.address();
|
|
59
|
+
if (!address || typeof address === 'string') {
|
|
60
|
+
server.close();
|
|
61
|
+
throw new Error('Could not bind localhost callback');
|
|
62
|
+
}
|
|
63
|
+
const redirectUri = `http://127.0.0.1:${address.port}/callback`;
|
|
64
|
+
try {
|
|
65
|
+
const { clientId } = await registerClient(metadata.registrationEndpoint, redirectUri);
|
|
66
|
+
const { verifier, challenge } = generatePkcePair();
|
|
67
|
+
const state = generateState();
|
|
68
|
+
openBrowser(buildAuthorizeUrl({
|
|
69
|
+
authorizationEndpoint: metadata.authorizationEndpoint,
|
|
70
|
+
clientId,
|
|
71
|
+
redirectUri,
|
|
72
|
+
state,
|
|
73
|
+
challenge,
|
|
74
|
+
resource: definition.url,
|
|
75
|
+
}));
|
|
76
|
+
const code = await waitForCallback(server, state, options.timeoutMs ?? 5 * 60_000);
|
|
77
|
+
const tokens = await exchangeCode({
|
|
78
|
+
tokenEndpoint: metadata.tokenEndpoint,
|
|
79
|
+
clientId,
|
|
80
|
+
code,
|
|
81
|
+
redirectUri,
|
|
82
|
+
verifier,
|
|
83
|
+
});
|
|
84
|
+
return { tokens, clientId, tokenEndpoint: metadata.tokenEndpoint };
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
server.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=auth-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-flow.js","sourceRoot":"","sources":["../src/auth-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { CloudflareServerDefinition } from './servers.js';
|
|
3
|
+
export interface ServerConnection {
|
|
4
|
+
definition: CloudflareServerDefinition;
|
|
5
|
+
listTools: () => Promise<Tool[]>;
|
|
6
|
+
callTool: (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function connectServer(definition: CloudflareServerDefinition, options: {
|
|
10
|
+
apiToken?: string | undefined;
|
|
11
|
+
timeoutMs: number;
|
|
12
|
+
}): Promise<ServerConnection>;
|
|
13
|
+
/** Connect every enabled server independently; failures isolate per server. */
|
|
14
|
+
export declare function connectAll(definitions: readonly CloudflareServerDefinition[], options: {
|
|
15
|
+
apiToken?: string | undefined;
|
|
16
|
+
timeoutMs: number;
|
|
17
|
+
}, onError?: (id: string, error: unknown) => void): Promise<ServerConnection[]>;
|
|
18
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAA;AAE9D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,0BAA0B,CAAA;IACtC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3E,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAUD,wBAAsB,aAAa,CACjC,UAAU,EAAE,0BAA0B,EACtC,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,gBAAgB,CAAC,CA0B3B;AAED,+EAA+E;AAC/E,wBAAsB,UAAU,CAC9B,WAAW,EAAE,SAAS,0BAA0B,EAAE,EAClD,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC7D,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAC7C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAY7B"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
function withTimeout(promise, ms, label) {
|
|
4
|
+
let timer;
|
|
5
|
+
const timeout = new Promise((_, reject) => {
|
|
6
|
+
timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
7
|
+
});
|
|
8
|
+
return Promise.race([promise.finally(() => clearTimeout(timer)), timeout]);
|
|
9
|
+
}
|
|
10
|
+
export async function connectServer(definition, options) {
|
|
11
|
+
const headers = {};
|
|
12
|
+
if (options.apiToken)
|
|
13
|
+
headers['Authorization'] = `Bearer ${options.apiToken}`;
|
|
14
|
+
const transport = new StreamableHTTPClientTransport(new URL(definition.url), {
|
|
15
|
+
requestInit: { headers },
|
|
16
|
+
});
|
|
17
|
+
const client = new Client({ name: 'pi-cloudflare', version: '0.1.0' }, { capabilities: {} });
|
|
18
|
+
const timeoutMs = options.timeoutMs;
|
|
19
|
+
await withTimeout(client.connect(transport), timeoutMs, `connect ${definition.id}`);
|
|
20
|
+
return {
|
|
21
|
+
definition,
|
|
22
|
+
listTools: async () => {
|
|
23
|
+
const result = await withTimeout(client.listTools(), timeoutMs, `listTools ${definition.id}`);
|
|
24
|
+
return result.tools;
|
|
25
|
+
},
|
|
26
|
+
callTool: async (name, args) => {
|
|
27
|
+
return withTimeout(client.callTool({ name, arguments: args }), timeoutMs, `callTool ${definition.id}.${name}`);
|
|
28
|
+
},
|
|
29
|
+
close: async () => {
|
|
30
|
+
await client.close().catch(() => undefined);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Connect every enabled server independently; failures isolate per server. */
|
|
35
|
+
export async function connectAll(definitions, options, onError) {
|
|
36
|
+
const settled = await Promise.all(definitions.map(async (definition) => {
|
|
37
|
+
try {
|
|
38
|
+
return await connectServer(definition, options);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
onError?.(definition.id, error);
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}));
|
|
45
|
+
return settled.filter((connection) => Boolean(connection));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CloudflareServerId } from './servers.js';
|
|
2
|
+
export interface PiCloudflareConfig {
|
|
3
|
+
/** Per-server enablement. Omitted servers default to enabled. */
|
|
4
|
+
servers?: Partial<Record<CloudflareServerId, boolean>>;
|
|
5
|
+
/** Connection timeout per server in milliseconds. */
|
|
6
|
+
connectTimeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolvedPiCloudflareConfig {
|
|
9
|
+
enabledServerIds: CloudflareServerId[];
|
|
10
|
+
connectTimeoutMs: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveConfig(config: PiCloudflareConfig | undefined): ResolvedPiCloudflareConfig;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGtD,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAA;IACtD,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,kBAAkB,EAAE,CAAA;IACtC,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,0BAA0B,CAQhG"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CLOUDFLARE_SERVERS } from './servers.js';
|
|
2
|
+
const DEFAULT_CONNECT_TIMEOUT_MS = 30_000;
|
|
3
|
+
export function resolveConfig(config) {
|
|
4
|
+
const enabledServerIds = CLOUDFLARE_SERVERS.map((server) => server.id).filter((id) => config?.servers?.[id] !== false);
|
|
5
|
+
return {
|
|
6
|
+
enabledServerIds,
|
|
7
|
+
connectTimeoutMs: config?.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAcjD,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAEzC,MAAM,UAAU,aAAa,CAAC,MAAsC;IAClE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAC3E,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,CACxC,CAAA;IACD,OAAO;QACL,gBAAgB;QAChB,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,0BAA0B;KACzE,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface PiToolDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
label?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
parameters?: unknown;
|
|
6
|
+
execute: (toolCallId: string, params: Record<string, unknown>, signal?: AbortSignal) => Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
interface PiHost {
|
|
9
|
+
registerTool: (definition: PiToolDefinition) => void;
|
|
10
|
+
on: (event: 'session_start' | 'session_shutdown', handler: (...args: never[]) => unknown) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* pi-coding-agent extension entry point.
|
|
14
|
+
*
|
|
15
|
+
* Credentials come only from per-server browser OAuth (pi-cloudflare-setup
|
|
16
|
+
* --oauth), stored owner-only in ~/.pi/cloudflare-tokens.json. The docs
|
|
17
|
+
* server needs no credential. On session_start every enabled server is
|
|
18
|
+
* connected independently and its tools registered with a `cf_<server>_`
|
|
19
|
+
* prefix; unreachable servers are skipped with a re-auth hint instead of
|
|
20
|
+
* failing the session. On session_shutdown all connections close.
|
|
21
|
+
*/
|
|
22
|
+
export default function piCloudflareExtension(pi: PiHost): void;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,OAAO,CAAC,CAAA;CACtB;AAED,UAAU,MAAM;IACd,YAAY,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACpD,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,kBAAkB,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,KAAK,IAAI,CAAA;CAClG;AAgDD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAwD9D"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { connectServer } from './client.js';
|
|
5
|
+
import { refreshAccessToken } from './oauth.js';
|
|
6
|
+
import { resolveConfig } from './config.js';
|
|
7
|
+
import { buildAllRegistrations } from './proxy.js';
|
|
8
|
+
import { CLOUDFLARE_SERVERS } from './servers.js';
|
|
9
|
+
import { isExpired, readTokenFile, writeTokenFile } from './token-store.js';
|
|
10
|
+
function loadUserConfig() {
|
|
11
|
+
try {
|
|
12
|
+
const raw = readFileSync(join(homedir(), '.pi', 'agent', 'settings.json'), 'utf8');
|
|
13
|
+
const parsed = JSON.parse(raw);
|
|
14
|
+
return parsed['pi-cloudflare'];
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function warn(message) {
|
|
21
|
+
console.warn(`[pi-cloudflare] ${message}`);
|
|
22
|
+
}
|
|
23
|
+
/** Refresh an OAuth token that is expired (or nearly so), persisting the result. */
|
|
24
|
+
async function ensureFreshToken(entry) {
|
|
25
|
+
const stored = entry.stored;
|
|
26
|
+
if (!stored)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (!isExpired(stored) || !stored.refreshToken)
|
|
29
|
+
return stored.accessToken;
|
|
30
|
+
const fresh = await refreshAccessToken({
|
|
31
|
+
tokenEndpoint: stored.tokenEndpoint,
|
|
32
|
+
clientId: stored.clientId,
|
|
33
|
+
refreshToken: stored.refreshToken,
|
|
34
|
+
});
|
|
35
|
+
entry.stored = { ...stored, ...fresh };
|
|
36
|
+
const file = readTokenFile() ?? { version: 1, servers: {} };
|
|
37
|
+
file.servers[entry.definition.id] = entry.stored;
|
|
38
|
+
writeTokenFile(file.servers);
|
|
39
|
+
await entry.connection?.close().catch(() => undefined);
|
|
40
|
+
entry.connection = await connectServer(entry.definition, {
|
|
41
|
+
apiToken: entry.stored.accessToken,
|
|
42
|
+
timeoutMs: 30_000,
|
|
43
|
+
});
|
|
44
|
+
return entry.stored.accessToken;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* pi-coding-agent extension entry point.
|
|
48
|
+
*
|
|
49
|
+
* Credentials come only from per-server browser OAuth (pi-cloudflare-setup
|
|
50
|
+
* --oauth), stored owner-only in ~/.pi/cloudflare-tokens.json. The docs
|
|
51
|
+
* server needs no credential. On session_start every enabled server is
|
|
52
|
+
* connected independently and its tools registered with a `cf_<server>_`
|
|
53
|
+
* prefix; unreachable servers are skipped with a re-auth hint instead of
|
|
54
|
+
* failing the session. On session_shutdown all connections close.
|
|
55
|
+
*/
|
|
56
|
+
export default function piCloudflareExtension(pi) {
|
|
57
|
+
let entries = [];
|
|
58
|
+
pi.on('session_start', async () => {
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
await entry.connection?.close().catch(() => undefined);
|
|
61
|
+
}
|
|
62
|
+
entries = [];
|
|
63
|
+
const config = resolveConfig(loadUserConfig());
|
|
64
|
+
const file = readTokenFile();
|
|
65
|
+
const definitions = CLOUDFLARE_SERVERS.filter((server) => config.enabledServerIds.includes(server.id));
|
|
66
|
+
for (const definition of definitions) {
|
|
67
|
+
const entry = { definition };
|
|
68
|
+
try {
|
|
69
|
+
entry.stored = file?.servers[definition.id];
|
|
70
|
+
await ensureFreshToken(entry);
|
|
71
|
+
entry.connection = await connectServer(definition, {
|
|
72
|
+
apiToken: entry.stored?.accessToken,
|
|
73
|
+
timeoutMs: config.connectTimeoutMs,
|
|
74
|
+
});
|
|
75
|
+
const tools = await entry.connection.listTools();
|
|
76
|
+
const registrations = buildAllRegistrations([
|
|
77
|
+
{
|
|
78
|
+
prefix: definition.prefix,
|
|
79
|
+
tools,
|
|
80
|
+
callTool: async (name, params) => {
|
|
81
|
+
if (!entry.connection)
|
|
82
|
+
throw new Error(`${definition.id}: not connected`);
|
|
83
|
+
return entry.connection.callTool(name, params);
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
for (const registration of registrations) {
|
|
88
|
+
pi.registerTool({
|
|
89
|
+
...registration,
|
|
90
|
+
execute: async (toolCallId, params, signal) => {
|
|
91
|
+
await ensureFreshToken(entry);
|
|
92
|
+
return registration.execute(toolCallId, params, signal);
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
entries.push(entry);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
warn(`${definition.id}: unavailable (${error instanceof Error ? error.message : String(error)}). Re-run pi-cloudflare-setup --oauth to re-authenticate.`);
|
|
100
|
+
await entry.connection?.close().catch(() => undefined);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
pi.on('session_shutdown', async () => {
|
|
105
|
+
await Promise.all(entries.map((entry) => entry.connection?.close().catch(() => undefined)));
|
|
106
|
+
entries = [];
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAyB,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,aAAa,EAA2B,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAyB,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAmC,MAAM,cAAc,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAA2B,MAAM,kBAAkB,CAAA;AA6BpG,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAA;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAA;QAChD,OAAO,MAAM,CAAC,eAAe,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO,CAAC,IAAI,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED,oFAAoF;AACpF,KAAK,UAAU,gBAAgB,CAAC,KAAkB;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC,WAAW,CAAA;IACzE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC;QACrC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAA;IACF,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,CAAA;IACtC,MAAM,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IACpE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;IAChD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IACtD,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE;QACvD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;QAClC,SAAS,EAAE,MAAM;KAClB,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAA;AACjC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,EAAU;IACtD,IAAI,OAAO,GAAkB,EAAE,CAAA;IAE/B,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,GAAG,EAAE,CAAA;QACZ,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,aAAa,EAAE,CAAA;QAC5B,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAC5C,CAAA;QACD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,KAAK,GAAgB,EAAE,UAAU,EAAE,CAAA;YACzC,IAAI,CAAC;gBACH,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC3C,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAA;gBAC7B,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;oBACjD,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW;oBACnC,SAAS,EAAE,MAAM,CAAC,gBAAgB;iBACnC,CAAC,CAAA;gBACF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAA;gBAChD,MAAM,aAAa,GAAuB,qBAAqB,CAAC;oBAC9D;wBACE,MAAM,EAAE,UAAU,CAAC,MAAM;wBACzB,KAAK;wBACL,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;4BAC/B,IAAI,CAAC,KAAK,CAAC,UAAU;gCAAE,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,iBAAiB,CAAC,CAAA;4BACzE,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;wBAChD,CAAC;qBACF;iBACF,CAAC,CAAA;gBACF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;oBACzC,EAAE,CAAC,YAAY,CAAC;wBACd,GAAG,YAAY;wBACf,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;4BAC5C,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAA;4BAC7B,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;wBACzD,CAAC;qBACF,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CACF,GAAG,UAAU,CAAC,EAAE,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CACpJ,CAAA;gBACD,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC3F,OAAO,GAAG,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface OAuthServerMetadata {
|
|
2
|
+
issuer: string;
|
|
3
|
+
authorizationEndpoint: string;
|
|
4
|
+
tokenEndpoint: string;
|
|
5
|
+
registrationEndpoint?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RegisteredClient {
|
|
8
|
+
clientId: string;
|
|
9
|
+
tokenEndpoint: string;
|
|
10
|
+
}
|
|
11
|
+
export interface OAuthTokens {
|
|
12
|
+
accessToken: string;
|
|
13
|
+
refreshToken?: string;
|
|
14
|
+
expiresAt: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function pkceChallengeFor(verifier: string): string;
|
|
17
|
+
export declare function generatePkcePair(): {
|
|
18
|
+
verifier: string;
|
|
19
|
+
challenge: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function generateState(): string;
|
|
22
|
+
export declare function discoverAuthServer(mcpUrl: string): Promise<OAuthServerMetadata>;
|
|
23
|
+
export declare function registerClient(registrationEndpoint: string, redirectUri: string): Promise<RegisteredClient>;
|
|
24
|
+
export declare function buildAuthorizeUrl(options: {
|
|
25
|
+
authorizationEndpoint: string;
|
|
26
|
+
clientId: string;
|
|
27
|
+
redirectUri: string;
|
|
28
|
+
state: string;
|
|
29
|
+
challenge: string;
|
|
30
|
+
resource: string;
|
|
31
|
+
}): string;
|
|
32
|
+
export declare function exchangeCode(options: {
|
|
33
|
+
tokenEndpoint: string;
|
|
34
|
+
clientId: string;
|
|
35
|
+
code: string;
|
|
36
|
+
redirectUri: string;
|
|
37
|
+
verifier: string;
|
|
38
|
+
}): Promise<OAuthTokens>;
|
|
39
|
+
export declare function refreshAccessToken(options: {
|
|
40
|
+
tokenEndpoint: string;
|
|
41
|
+
clientId: string;
|
|
42
|
+
refreshToken: string;
|
|
43
|
+
}): Promise<OAuthTokens>;
|
|
44
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,qBAAqB,EAAE,MAAM,CAAA;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAUD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,gBAAgB,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAG1E;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAUD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmCrF;AAED,wBAAsB,cAAc,CAClC,oBAAoB,EAAE,MAAM,EAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAiB3B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,GAAG,MAAM,CAWT;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBvB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmBvB"}
|