memory-journal-mcp 7.7.0 → 8.0.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/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +7 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -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 +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -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 +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -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 +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -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 +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -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 +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -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 +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Cloudflare Tail Workers
|
|
2
|
+
|
|
3
|
+
Specialized Workers that consume execution events from producer Workers for logging, debugging, analytics, and observability.
|
|
4
|
+
|
|
5
|
+
## When to Use This Reference
|
|
6
|
+
|
|
7
|
+
- Implementing observability/logging for Cloudflare Workers
|
|
8
|
+
- Processing Worker execution events, logs, exceptions
|
|
9
|
+
- Building custom analytics or error tracking
|
|
10
|
+
- Configuring real-time event streaming
|
|
11
|
+
- Working with tail handlers or tail consumers
|
|
12
|
+
|
|
13
|
+
## Core Concepts
|
|
14
|
+
|
|
15
|
+
### What Are Tail Workers?
|
|
16
|
+
|
|
17
|
+
Tail Workers automatically process events from producer Workers (the Workers being monitored). They receive:
|
|
18
|
+
|
|
19
|
+
- HTTP request/response info
|
|
20
|
+
- Console logs (`console.log/error/warn/debug`)
|
|
21
|
+
- Uncaught exceptions
|
|
22
|
+
- Execution outcomes (`ok`, `exception`, `exceededCpu`, etc.)
|
|
23
|
+
- Diagnostic channel events
|
|
24
|
+
|
|
25
|
+
**Key characteristics:**
|
|
26
|
+
|
|
27
|
+
- Invoked AFTER producer finishes executing
|
|
28
|
+
- Capture entire request lifecycle including Service Bindings and Dynamic Dispatch sub-requests
|
|
29
|
+
- Billed by CPU time, not request count
|
|
30
|
+
- Available on Workers Paid and Enterprise tiers
|
|
31
|
+
|
|
32
|
+
### Alternative: OpenTelemetry Export
|
|
33
|
+
|
|
34
|
+
**Before using Tail Workers, consider OpenTelemetry:**
|
|
35
|
+
|
|
36
|
+
For batch exports to observability tools (Sentry, Grafana, Honeycomb):
|
|
37
|
+
|
|
38
|
+
- OTEL export sends logs/traces in batches (more efficient)
|
|
39
|
+
- Built-in integrations with popular platforms
|
|
40
|
+
- Lower overhead than Tail Workers
|
|
41
|
+
- **Use Tail Workers only for custom real-time processing**
|
|
42
|
+
|
|
43
|
+
## Decision Tree
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
Need observability for Workers?
|
|
47
|
+
├─ Batch export to known tools (Sentry/Grafana/Honeycomb)?
|
|
48
|
+
│ └─ Use OpenTelemetry export (not Tail Workers)
|
|
49
|
+
├─ Custom real-time processing needed?
|
|
50
|
+
│ ├─ Aggregated metrics?
|
|
51
|
+
│ │ └─ Use Tail Worker + Analytics Engine
|
|
52
|
+
│ ├─ Error tracking?
|
|
53
|
+
│ │ └─ Use Tail Worker + external service
|
|
54
|
+
│ ├─ Custom logging/debugging?
|
|
55
|
+
│ │ └─ Use Tail Worker + KV/HTTP endpoint
|
|
56
|
+
│ └─ Complex event processing?
|
|
57
|
+
│ └─ Use Tail Worker + Durable Objects
|
|
58
|
+
└─ Quick debugging?
|
|
59
|
+
└─ Use `wrangler tail` (different from Tail Workers)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Reading Order
|
|
63
|
+
|
|
64
|
+
1. **[configuration.md](configuration.md)** - Set up Tail Workers
|
|
65
|
+
2. **[api.md](api.md)** - Handler signature, types, redaction
|
|
66
|
+
3. **[patterns.md](patterns.md)** - Common use cases and integrations
|
|
67
|
+
4. **[gotchas.md](gotchas.md)** - Pitfalls and debugging tips
|
|
68
|
+
|
|
69
|
+
## Quick Example
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
export default {
|
|
73
|
+
async tail(events, env, ctx) {
|
|
74
|
+
// Process events from producer Worker
|
|
75
|
+
ctx.waitUntil(
|
|
76
|
+
fetch(env.LOG_ENDPOINT, {
|
|
77
|
+
method: 'POST',
|
|
78
|
+
headers: { 'Content-Type': 'application/json' },
|
|
79
|
+
body: JSON.stringify(events),
|
|
80
|
+
})
|
|
81
|
+
)
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Related Skills
|
|
87
|
+
|
|
88
|
+
- **observability** - General Workers observability patterns, OTEL export
|
|
89
|
+
- **analytics-engine** - Aggregated metrics storage for tail event data
|
|
90
|
+
- **durable-objects** - Stateful event processing, batching tail events
|
|
91
|
+
- **logpush** - Alternative for batch log export (non-real-time)
|
|
92
|
+
- **workers-for-platforms** - Dynamic dispatch with tail consumers
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Tail Workers API Reference
|
|
2
|
+
|
|
3
|
+
## Handler Signature
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async tail(events: TraceItem[], env: Env, ctx: ExecutionContext): Promise<void> {
|
|
8
|
+
// Process events
|
|
9
|
+
},
|
|
10
|
+
} satisfies ExportedHandler<Env>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Parameters:**
|
|
14
|
+
|
|
15
|
+
- `events`: Array of `TraceItem` objects (one per producer invocation)
|
|
16
|
+
- `env`: Bindings (KV, D1, R2, env vars, etc.)
|
|
17
|
+
- `ctx`: Context with `waitUntil()` for async work
|
|
18
|
+
|
|
19
|
+
**CRITICAL:** Tail handlers don't return values. Use `ctx.waitUntil()` for async operations.
|
|
20
|
+
|
|
21
|
+
## TraceItem Type
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
interface TraceItem {
|
|
25
|
+
scriptName: string // Producer Worker name
|
|
26
|
+
eventTimestamp: number // Epoch milliseconds
|
|
27
|
+
outcome:
|
|
28
|
+
| 'ok'
|
|
29
|
+
| 'exception'
|
|
30
|
+
| 'exceededCpu'
|
|
31
|
+
| 'exceededMemory'
|
|
32
|
+
| 'canceled'
|
|
33
|
+
| 'scriptNotFound'
|
|
34
|
+
| 'responseStreamDisconnected'
|
|
35
|
+
| 'unknown'
|
|
36
|
+
|
|
37
|
+
event?: {
|
|
38
|
+
request?: {
|
|
39
|
+
url: string // Redacted by default
|
|
40
|
+
method: string
|
|
41
|
+
headers: Record<string, string> // Sensitive headers redacted
|
|
42
|
+
cf?: IncomingRequestCfProperties
|
|
43
|
+
getUnredacted(): TraceRequest // Bypass redaction (use carefully)
|
|
44
|
+
}
|
|
45
|
+
response?: {
|
|
46
|
+
status: number
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
logs: Array<{
|
|
51
|
+
timestamp: number // Epoch milliseconds
|
|
52
|
+
level: 'debug' | 'info' | 'log' | 'warn' | 'error'
|
|
53
|
+
message: unknown[] // Args passed to console function
|
|
54
|
+
}>
|
|
55
|
+
|
|
56
|
+
exceptions: Array<{
|
|
57
|
+
timestamp: number // Epoch milliseconds
|
|
58
|
+
name: string // Error type (Error, TypeError, etc.)
|
|
59
|
+
message: string // Error description
|
|
60
|
+
}>
|
|
61
|
+
|
|
62
|
+
diagnosticsChannelEvents: Array<{
|
|
63
|
+
channel: string
|
|
64
|
+
message: unknown
|
|
65
|
+
timestamp: number // Epoch milliseconds
|
|
66
|
+
}>
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Note:** Official SDK uses `TraceItem`, not `TailItem`. Use `@cloudflare/workers-types` for accurate types.
|
|
71
|
+
|
|
72
|
+
## Timestamp Handling
|
|
73
|
+
|
|
74
|
+
All timestamps are **epoch milliseconds**, not seconds:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// ✅ CORRECT - use directly with Date
|
|
78
|
+
const date = new Date(event.eventTimestamp)
|
|
79
|
+
|
|
80
|
+
// ❌ WRONG - don't multiply by 1000
|
|
81
|
+
const date = new Date(event.eventTimestamp * 1000)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Automatic Redaction
|
|
85
|
+
|
|
86
|
+
By default, sensitive data is redacted from `TraceRequest`:
|
|
87
|
+
|
|
88
|
+
### Header Redaction
|
|
89
|
+
|
|
90
|
+
Headers containing these substrings (case-insensitive):
|
|
91
|
+
|
|
92
|
+
- `auth`, `key`, `secret`, `token`, `jwt`
|
|
93
|
+
- `cookie`, `set-cookie`
|
|
94
|
+
|
|
95
|
+
Redacted values show as `"REDACTED"`.
|
|
96
|
+
|
|
97
|
+
### URL Redaction
|
|
98
|
+
|
|
99
|
+
- **Hex IDs:** 32+ hex digits → `"REDACTED"`
|
|
100
|
+
- **Base-64 IDs:** 21+ chars with 2+ upper, 2+ lower, 2+ digits → `"REDACTED"`
|
|
101
|
+
|
|
102
|
+
## Bypassing Redaction
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
export default {
|
|
106
|
+
async tail(events, env, ctx) {
|
|
107
|
+
for (const event of events) {
|
|
108
|
+
// ⚠️ Use with extreme caution
|
|
109
|
+
const unredacted = event.event?.request?.getUnredacted()
|
|
110
|
+
// unredacted.url and unredacted.headers contain raw values
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Best practices:**
|
|
117
|
+
|
|
118
|
+
- Only call `getUnredacted()` when absolutely necessary
|
|
119
|
+
- Never log unredacted sensitive data
|
|
120
|
+
- Implement additional filtering before external transmission
|
|
121
|
+
- Use environment variables for API keys, never hardcode
|
|
122
|
+
|
|
123
|
+
## Type-Safe Handler
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
interface Env {
|
|
127
|
+
LOGS_KV: KVNamespace
|
|
128
|
+
ANALYTICS: AnalyticsEngineDataset
|
|
129
|
+
LOG_ENDPOINT: string
|
|
130
|
+
API_TOKEN: string
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export default {
|
|
134
|
+
async tail(events: TraceItem[], env: Env, ctx: ExecutionContext): Promise<void> {
|
|
135
|
+
const payload = events.map((event) => ({
|
|
136
|
+
script: event.scriptName,
|
|
137
|
+
timestamp: event.eventTimestamp,
|
|
138
|
+
outcome: event.outcome,
|
|
139
|
+
url: event.event?.request?.url,
|
|
140
|
+
status: event.event?.response?.status,
|
|
141
|
+
}))
|
|
142
|
+
|
|
143
|
+
ctx.waitUntil(
|
|
144
|
+
fetch(env.LOG_ENDPOINT, {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
headers: { 'Content-Type': 'application/json' },
|
|
147
|
+
body: JSON.stringify(payload),
|
|
148
|
+
})
|
|
149
|
+
)
|
|
150
|
+
},
|
|
151
|
+
} satisfies ExportedHandler<Env>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Outcome vs HTTP Status
|
|
155
|
+
|
|
156
|
+
**IMPORTANT:** `outcome` is script execution status, NOT HTTP status.
|
|
157
|
+
|
|
158
|
+
- Worker returns 500 → `outcome='ok'` if script completed successfully
|
|
159
|
+
- Uncaught exception → `outcome='exception'` regardless of HTTP status
|
|
160
|
+
- CPU limit exceeded → `outcome='exceededCpu'`
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// ✅ Check outcome for script execution status
|
|
164
|
+
if (event.outcome === 'exception') {
|
|
165
|
+
// Script threw uncaught exception
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ✅ Check HTTP status separately
|
|
169
|
+
if (event.event?.response?.status === 500) {
|
|
170
|
+
// HTTP 500 returned (script may have handled error)
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Serialization Considerations
|
|
175
|
+
|
|
176
|
+
`log.message` is `unknown[]` and may contain non-serializable objects:
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// ❌ May fail with circular references or BigInt
|
|
180
|
+
JSON.stringify(events)
|
|
181
|
+
|
|
182
|
+
// ✅ Safe serialization
|
|
183
|
+
const safePayload = events.map((event) => ({
|
|
184
|
+
...event,
|
|
185
|
+
logs: event.logs.map((log) => ({
|
|
186
|
+
...log,
|
|
187
|
+
message: log.message.map((m) => {
|
|
188
|
+
try {
|
|
189
|
+
return JSON.parse(JSON.stringify(m))
|
|
190
|
+
} catch {
|
|
191
|
+
return String(m)
|
|
192
|
+
}
|
|
193
|
+
}),
|
|
194
|
+
})),
|
|
195
|
+
}))
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Common serialization issues:**
|
|
199
|
+
|
|
200
|
+
- Circular references in logged objects
|
|
201
|
+
- `BigInt` values (not JSON-serializable)
|
|
202
|
+
- Functions or symbols in console.log arguments
|
|
203
|
+
- Large objects exceeding body size limits
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Tail Workers Configuration
|
|
2
|
+
|
|
3
|
+
## Setup Steps
|
|
4
|
+
|
|
5
|
+
### 1. Create Tail Worker
|
|
6
|
+
|
|
7
|
+
Create a Worker with a `tail()` handler:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
export default {
|
|
11
|
+
async tail(events, env, ctx) {
|
|
12
|
+
// Process events from producer Worker
|
|
13
|
+
ctx.waitUntil(
|
|
14
|
+
fetch(env.LOG_ENDPOINT, {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
body: JSON.stringify(events),
|
|
17
|
+
})
|
|
18
|
+
)
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. Configure Producer Worker
|
|
24
|
+
|
|
25
|
+
In producer's `wrangler.jsonc`:
|
|
26
|
+
|
|
27
|
+
```jsonc
|
|
28
|
+
{
|
|
29
|
+
"name": "my-producer-worker",
|
|
30
|
+
"tail_consumers": [
|
|
31
|
+
{
|
|
32
|
+
"service": "my-tail-worker",
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 3. Deploy Both Workers
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Deploy Tail Worker first
|
|
42
|
+
cd tail-worker
|
|
43
|
+
wrangler deploy
|
|
44
|
+
|
|
45
|
+
# Then deploy producer Worker
|
|
46
|
+
cd ../producer-worker
|
|
47
|
+
wrangler deploy
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Wrangler Configuration
|
|
51
|
+
|
|
52
|
+
### Single Tail Consumer
|
|
53
|
+
|
|
54
|
+
```jsonc
|
|
55
|
+
{
|
|
56
|
+
"name": "producer-worker",
|
|
57
|
+
"tail_consumers": [
|
|
58
|
+
{
|
|
59
|
+
"service": "logging-tail-worker",
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Multiple Tail Consumers
|
|
66
|
+
|
|
67
|
+
```jsonc
|
|
68
|
+
{
|
|
69
|
+
"name": "producer-worker",
|
|
70
|
+
"tail_consumers": [
|
|
71
|
+
{
|
|
72
|
+
"service": "logging-tail-worker",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"service": "metrics-tail-worker",
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Note:** Each consumer receives ALL events independently.
|
|
82
|
+
|
|
83
|
+
### Remove Tail Consumer
|
|
84
|
+
|
|
85
|
+
```jsonc
|
|
86
|
+
{
|
|
87
|
+
"tail_consumers": [],
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Then redeploy producer Worker.
|
|
92
|
+
|
|
93
|
+
## Environment Variables
|
|
94
|
+
|
|
95
|
+
Tail Workers use same binding syntax as regular Workers:
|
|
96
|
+
|
|
97
|
+
```jsonc
|
|
98
|
+
{
|
|
99
|
+
"name": "my-tail-worker",
|
|
100
|
+
"vars": {
|
|
101
|
+
"LOG_ENDPOINT": "https://logs.example.com/ingest",
|
|
102
|
+
},
|
|
103
|
+
"kv_namespaces": [
|
|
104
|
+
{
|
|
105
|
+
"binding": "LOGS_KV",
|
|
106
|
+
"id": "abc123...",
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Testing & Development
|
|
113
|
+
|
|
114
|
+
### Local Testing
|
|
115
|
+
|
|
116
|
+
**Tail Workers cannot be fully tested with `wrangler dev`.** Deploy to staging environment for testing.
|
|
117
|
+
|
|
118
|
+
### Testing Strategy
|
|
119
|
+
|
|
120
|
+
1. Deploy producer Worker to staging
|
|
121
|
+
2. Deploy Tail Worker to staging
|
|
122
|
+
3. Configure `tail_consumers` in producer
|
|
123
|
+
4. Trigger producer Worker requests
|
|
124
|
+
5. Verify Tail Worker receives events (check destination logs/storage)
|
|
125
|
+
|
|
126
|
+
### Wrangler Tail Command
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Stream logs to terminal (NOT Tail Workers)
|
|
130
|
+
wrangler tail my-producer-worker
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**This is different from Tail Workers:**
|
|
134
|
+
|
|
135
|
+
- `wrangler tail` streams logs to your terminal
|
|
136
|
+
- Tail Workers are Workers that process events programmatically
|
|
137
|
+
|
|
138
|
+
## Deployment Checklist
|
|
139
|
+
|
|
140
|
+
- [ ] Tail Worker has `tail()` handler
|
|
141
|
+
- [ ] Tail Worker deployed before producer
|
|
142
|
+
- [ ] Producer's `wrangler.jsonc` has correct `tail_consumers`
|
|
143
|
+
- [ ] Environment variables configured
|
|
144
|
+
- [ ] Tested with staging environment
|
|
145
|
+
- [ ] Monitoring configured for Tail Worker itself
|
|
146
|
+
|
|
147
|
+
## Limits
|
|
148
|
+
|
|
149
|
+
| Limit | Value | Notes |
|
|
150
|
+
| ------------------------------- | ------------------------------- | -------------------------------------------- |
|
|
151
|
+
| Max tail consumers per producer | 10 | Each receives all events independently |
|
|
152
|
+
| Events batch size | Up to 100 events per invocation | Larger batches split across invocations |
|
|
153
|
+
| Tail Worker CPU time | Same as regular Workers | 10ms (free), 30ms (paid), 50ms (paid bundle) |
|
|
154
|
+
| Pricing tier | Workers Paid or Enterprise | Not available on free plan |
|
|
155
|
+
| Request body size | 100 MB max | When sending to external endpoints |
|
|
156
|
+
| Event retention | None | Events not retried if tail handler fails |
|
|
157
|
+
|
|
158
|
+
## Workers for Platforms
|
|
159
|
+
|
|
160
|
+
For dynamic dispatch Workers, both dispatch and user Worker events sent to tail consumer:
|
|
161
|
+
|
|
162
|
+
```jsonc
|
|
163
|
+
{
|
|
164
|
+
"name": "dispatch-worker",
|
|
165
|
+
"tail_consumers": [
|
|
166
|
+
{
|
|
167
|
+
"service": "platform-tail-worker",
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Tail Worker receives TWO `TraceItem` elements per request:
|
|
174
|
+
|
|
175
|
+
1. Dynamic dispatch Worker event
|
|
176
|
+
2. User Worker event
|
|
177
|
+
|
|
178
|
+
See [patterns.md](patterns.md) for handling.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Tail Workers Gotchas & Debugging
|
|
2
|
+
|
|
3
|
+
## Critical Pitfalls
|
|
4
|
+
|
|
5
|
+
### 1. Not Using `ctx.waitUntil()`
|
|
6
|
+
|
|
7
|
+
**Problem:** Async work doesn't complete or tail Worker times out
|
|
8
|
+
**Cause:** Handlers exit immediately; awaiting blocks processing
|
|
9
|
+
**Solution:**
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// ❌ WRONG - fire and forget
|
|
13
|
+
export default {
|
|
14
|
+
async tail(events) {
|
|
15
|
+
fetch(endpoint, { body: JSON.stringify(events) })
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ❌ WRONG - blocking await
|
|
20
|
+
export default {
|
|
21
|
+
async tail(events, env, ctx) {
|
|
22
|
+
await fetch(endpoint, { body: JSON.stringify(events) })
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ✅ CORRECT
|
|
27
|
+
export default {
|
|
28
|
+
async tail(events, env, ctx) {
|
|
29
|
+
ctx.waitUntil(
|
|
30
|
+
(async () => {
|
|
31
|
+
await fetch(endpoint, { body: JSON.stringify(events) })
|
|
32
|
+
await processMore()
|
|
33
|
+
})()
|
|
34
|
+
)
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Missing `tail()` Handler
|
|
40
|
+
|
|
41
|
+
**Problem:** Producer deployment fails
|
|
42
|
+
**Cause:** Worker in `tail_consumers` doesn't export `tail()` handler
|
|
43
|
+
**Solution:** Ensure `export default { async tail(events, env, ctx) { ... } }`
|
|
44
|
+
|
|
45
|
+
### 3. Outcome vs HTTP Status
|
|
46
|
+
|
|
47
|
+
**Problem:** Filtering by wrong status
|
|
48
|
+
**Cause:** `outcome` is script execution status, not HTTP status
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// ❌ WRONG
|
|
52
|
+
if (event.outcome === 500) {
|
|
53
|
+
/* never matches */
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ✅ CORRECT
|
|
57
|
+
if (event.outcome === 'exception') {
|
|
58
|
+
/* script threw */
|
|
59
|
+
}
|
|
60
|
+
if (event.event?.response?.status === 500) {
|
|
61
|
+
/* HTTP 500 */
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 4. Timestamp Units
|
|
66
|
+
|
|
67
|
+
**Problem:** Dates off by 1000x
|
|
68
|
+
**Cause:** Timestamps are epoch milliseconds, not seconds
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// ❌ WRONG: const date = new Date(event.eventTimestamp * 1000);
|
|
72
|
+
// ✅ CORRECT: const date = new Date(event.eventTimestamp);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 5. Type Name Mismatch
|
|
76
|
+
|
|
77
|
+
**Problem:** Using `TailItem` type
|
|
78
|
+
**Cause:** Old docs used `TailItem`, SDK uses `TraceItem`
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import type { TraceItem } from '@cloudflare/workers-types'
|
|
82
|
+
export default {
|
|
83
|
+
async tail(events: TraceItem[], env, ctx) {
|
|
84
|
+
/* ... */
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 6. Excessive Logging Volume
|
|
90
|
+
|
|
91
|
+
**Problem:** Unexpected high costs
|
|
92
|
+
**Cause:** Invoked on EVERY producer request
|
|
93
|
+
**Solution:** Sample events
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
export default {
|
|
97
|
+
async tail(events, env, ctx) {
|
|
98
|
+
if (Math.random() > 0.1) return // 10% sample
|
|
99
|
+
ctx.waitUntil(sendToEndpoint(events))
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 7. Serialization Issues
|
|
105
|
+
|
|
106
|
+
**Problem:** `JSON.stringify()` fails
|
|
107
|
+
**Cause:** `log.message` is `unknown[]` with non-serializable values
|
|
108
|
+
**Solution:**
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const safePayload = events.map((e) => ({
|
|
112
|
+
...e,
|
|
113
|
+
logs: e.logs.map((log) => ({
|
|
114
|
+
...log,
|
|
115
|
+
message: log.message.map((m) => {
|
|
116
|
+
try {
|
|
117
|
+
return JSON.parse(JSON.stringify(m))
|
|
118
|
+
} catch {
|
|
119
|
+
return String(m)
|
|
120
|
+
}
|
|
121
|
+
}),
|
|
122
|
+
})),
|
|
123
|
+
}))
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 8. Missing Error Handling
|
|
127
|
+
|
|
128
|
+
**Problem:** Tail Worker silently fails
|
|
129
|
+
**Cause:** No try/catch
|
|
130
|
+
**Solution:**
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
ctx.waitUntil(
|
|
134
|
+
(async () => {
|
|
135
|
+
try {
|
|
136
|
+
await fetch(env.ENDPOINT, { body: JSON.stringify(events) })
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.error('Tail error:', error)
|
|
139
|
+
await env.FALLBACK_KV.put(`failed:${Date.now()}`, JSON.stringify(events))
|
|
140
|
+
}
|
|
141
|
+
})()
|
|
142
|
+
)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 9. Deployment Order
|
|
146
|
+
|
|
147
|
+
**Problem:** Producer deployment fails
|
|
148
|
+
**Cause:** Tail consumer not deployed yet
|
|
149
|
+
**Solution:** Deploy tail consumer FIRST
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
cd tail-worker && wrangler deploy
|
|
153
|
+
cd ../producer && wrangler deploy
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 10. No Event Retry
|
|
157
|
+
|
|
158
|
+
**Problem:** Events lost when handler fails
|
|
159
|
+
**Cause:** Failed invocations NOT retried
|
|
160
|
+
**Solution:** Implement fallback storage (see #8)
|
|
161
|
+
|
|
162
|
+
## Debugging
|
|
163
|
+
|
|
164
|
+
**View logs:** `wrangler tail my-tail-worker`
|
|
165
|
+
|
|
166
|
+
**Incremental testing:**
|
|
167
|
+
|
|
168
|
+
1. Verify receipt: `console.log('Events:', events.length)`
|
|
169
|
+
2. Inspect structure: `console.log(JSON.stringify(events[0], null, 2))`
|
|
170
|
+
3. Add external call with `ctx.waitUntil()`
|
|
171
|
+
|
|
172
|
+
**Monitor dashboard:** Check invocation count (matches producer?), error rate, CPU time
|
|
173
|
+
|
|
174
|
+
## Testing
|
|
175
|
+
|
|
176
|
+
Add test endpoint to producer:
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
export default {
|
|
180
|
+
async fetch(request) {
|
|
181
|
+
if (request.url.includes('/test')) {
|
|
182
|
+
console.log('Test log')
|
|
183
|
+
throw new Error('Test error')
|
|
184
|
+
}
|
|
185
|
+
return new Response('OK')
|
|
186
|
+
},
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Trigger: `curl https://producer.example.workers.dev/test`
|
|
191
|
+
|
|
192
|
+
## Common Errors
|
|
193
|
+
|
|
194
|
+
| Error | Cause | Solution |
|
|
195
|
+
| ----------------------------- | ---------------- | ------------------------ |
|
|
196
|
+
| "Tail consumer not found" | Not deployed | Deploy tail Worker first |
|
|
197
|
+
| "No tail handler" | Missing `tail()` | Add to default export |
|
|
198
|
+
| "waitUntil is not a function" | Missing `ctx` | Add `ctx` parameter |
|
|
199
|
+
| Timeout | Blocking await | Use `ctx.waitUntil()` |
|
|
200
|
+
|
|
201
|
+
## Performance Notes
|
|
202
|
+
|
|
203
|
+
- Max 100 events per invocation
|
|
204
|
+
- Each consumer receives all events independently
|
|
205
|
+
- CPU limits same as regular Workers
|
|
206
|
+
- For high volume, use Durable Objects batching
|