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,171 @@
|
|
|
1
|
+
# Testing Strategy Reference
|
|
2
|
+
|
|
3
|
+
4-layer testing model with structural invariants for MCP servers.
|
|
4
|
+
|
|
5
|
+
> Read this reference when setting up tests or reviewing test coverage for an MCP server.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 4-Layer Testing Model
|
|
10
|
+
|
|
11
|
+
MCP servers require four complementary testing layers plus structural invariant tests.
|
|
12
|
+
|
|
13
|
+
| Layer | Tool | Scope | Transport | Speed |
|
|
14
|
+
| -------------------------- | -------------- | ----------------------------------------------------------- | ------------- | -------- |
|
|
15
|
+
| **1. Unit Tests** | Vitest | Handler logic, schemas, validation, error paths | None (mocked) | Fast |
|
|
16
|
+
| **1b. Invariant Tests** | Vitest | Structural enforcement (annotations, output schemas) | None | Fast |
|
|
17
|
+
| **1c. Benchmarks** | Vitest bench | Handler dispatch, schema parsing, logger sanitization | None | Fast |
|
|
18
|
+
| **2. E2E Tests** | Playwright | Live server process, HTTP lifecycle, security headers | HTTP (dual) | Medium |
|
|
19
|
+
| **3. Integration Scripts** | Node.js `.mjs` | Protocol compliance, scheduler, transport-specific features | stdio + HTTP | Variable |
|
|
20
|
+
| **4. Agent-Driven Tests** | MCP tool calls | Functional verification of all tools, resources, prompts | stdio (live) | Slow |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Layer 1: Unit Tests (Vitest)
|
|
25
|
+
|
|
26
|
+
Core handler logic, input validation, error formatting, database adapters. Mock external dependencies. Target ≥90% line coverage.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
tests/
|
|
30
|
+
├── handlers/ # Tool handler logic
|
|
31
|
+
├── database/ # Adapter + query tests
|
|
32
|
+
├── server/ # Resource + prompt tests
|
|
33
|
+
├── auth/ # OAuth module (8 files)
|
|
34
|
+
├── security/ # Input sanitization
|
|
35
|
+
├── filtering/ # Tool filter expressions
|
|
36
|
+
├── codemode/ # Sandbox execution
|
|
37
|
+
└── e2e/ # Playwright (Layer 2)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Layer 1b: Invariant Tests (Vitest)
|
|
43
|
+
|
|
44
|
+
Structural enforcement tests that verify every tool meets minimum standards. Run as part of the unit test suite.
|
|
45
|
+
|
|
46
|
+
| Test File | Enforces |
|
|
47
|
+
| ----------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
48
|
+
| `tool-annotations.test.ts` | Every tool has `annotations` with explicit `readOnlyHint`, per-group checks, title validation |
|
|
49
|
+
| `tool-output-schemas.test.ts` | Every tool has `outputSchema`, error response acceptance, centralized schema wiring, no orphan schemas |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Layer 2: E2E Tests (Playwright)
|
|
54
|
+
|
|
55
|
+
Spawn real `dist/cli.js` process + MCP SDK client. Test the system as a black box.
|
|
56
|
+
|
|
57
|
+
**Canonical spec inventory (~50 spec files, ~300+ tests):**
|
|
58
|
+
|
|
59
|
+
| Category | Spec Files | Coverage |
|
|
60
|
+
| --------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
|
|
61
|
+
| **Zod Sweeps** | `zod-sweep.spec.ts`, `zod-sweep-native.spec.ts` | Every tool called with `{}` — must return structured error, never raw `-32602` |
|
|
62
|
+
| **Numeric Coercion** | `numeric-coercion.spec.ts`, `numeric-coercion-native.spec.ts` | String-typed numeric param coercion |
|
|
63
|
+
| **Boundary** | `boundary.spec.ts` | Empty tables, NULLs, idempotency, edge cases |
|
|
64
|
+
| **Aliases** | `aliases.spec.ts` | Backward-compatible parameter aliases |
|
|
65
|
+
| **Payloads** | `payloads-{group}.spec.ts` | Per-group payload correctness (one spec per tool group) |
|
|
66
|
+
| **Errors** | `errors.spec.ts`, `errors-extended.spec.ts`, `errors-native.spec.ts` | Error path coverage |
|
|
67
|
+
| **Code Mode** | `codemode.spec.ts`, `codemode-groups.spec.ts` | Sandbox lifecycle + all groups |
|
|
68
|
+
| **Help Resources** | `help-resources.spec.ts` | Root + per-group help resources listed, readable, non-empty |
|
|
69
|
+
| **Resources/Prompts** | `resources.spec.ts`, `prompts.spec.ts` | MCP resource/prompt verification |
|
|
70
|
+
| **Auth** | `auth.spec.ts`, `oauth-discovery.spec.ts` | OAuth 2.1 and RFC 9728 metadata |
|
|
71
|
+
| **Security** | `security.spec.ts` | Security header assertions, HSTS |
|
|
72
|
+
| **Rate Limiting** | `rate-limiting.spec.ts` | 429 burst, Retry-After header, health exemption |
|
|
73
|
+
| **Sessions** | `sessions.spec.ts`, `session-advanced.spec.ts` | Session management |
|
|
74
|
+
| **Transport** | `streaming.spec.ts`, `streamable-http.spec.ts`, `protocols.spec.ts` | Transport protocol tests |
|
|
75
|
+
|
|
76
|
+
**Testing cadence per group:** invariant (vitest) → zod sweep (E2E) → payload correctness (E2E) → error paths (E2E).
|
|
77
|
+
|
|
78
|
+
**Dual transport parity:** Run the same assertion suite against both stateful and stateless HTTP modes.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Layer 3: Integration Scripts (Node.js `.mjs`)
|
|
83
|
+
|
|
84
|
+
For features that require **separate server processes** — can't be tested via vitest mocks or MCP tool calls. Zero external dependencies (just Node.js `child_process` + `fetch`).
|
|
85
|
+
|
|
86
|
+
**Standard scripts:**
|
|
87
|
+
|
|
88
|
+
| Script | Purpose | Transport |
|
|
89
|
+
| ----------------------------- | ------------------------------------------------------------------------------------------ | --------- |
|
|
90
|
+
| `test-help-resources.mjs` | Verify slim instructions + help resource filtering by group | stdio |
|
|
91
|
+
| `test-tool-annotations.mjs` | Parse `tools/list` response, verify `openWorldHint` counts and 0 missing | stdio |
|
|
92
|
+
| `test-scheduler.mjs` | Init HTTP session, read `memory://health`, wait for jobs, verify `runCount` + `lastResult` | HTTP |
|
|
93
|
+
| `test-instruction-levels.mjs` | Instruction level generation (`essential`, `standard`, `full`) — verify token budgets | stdio |
|
|
94
|
+
|
|
95
|
+
**Script conventions:**
|
|
96
|
+
|
|
97
|
+
- Node.js ESM (`.mjs`), no dependencies — run with `node test-server/script.mjs`
|
|
98
|
+
- Exit code 0 = pass, 1 = fail
|
|
99
|
+
- Handle SSE response parsing for HTTP transport (`text/event-stream` → JSON-RPC)
|
|
100
|
+
- Support env vars for configuration (e.g., `MCP_URL`, `WAIT_SECONDS`)
|
|
101
|
+
- Always `npm run build` before running
|
|
102
|
+
|
|
103
|
+
**Dual transport testing:** The scheduler activates in both HTTP stateful and stateless modes. Integration scripts should verify behavior in both when applicable:
|
|
104
|
+
|
|
105
|
+
| Mode | CLI Flags | Sessions | Scheduler |
|
|
106
|
+
| -------------- | ------------------------------ | ------------------------ | --------- |
|
|
107
|
+
| stdio | `--transport stdio` (default) | N/A | ❌ |
|
|
108
|
+
| HTTP stateful | `--transport http` | `mcp-session-id` header | ✅ |
|
|
109
|
+
| HTTP stateless | `--transport http --stateless` | No sessions (serverless) | ✅ |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Layer 4: Agent-Driven Tests (MCP Tool Calls)
|
|
114
|
+
|
|
115
|
+
Exhaustive functional testing of all tools, resources, and prompts via direct MCP calls from an AI agent. Organized in phased test plans.
|
|
116
|
+
|
|
117
|
+
**Orchestration pattern (`test-server/` directory):**
|
|
118
|
+
|
|
119
|
+
| File | Purpose |
|
|
120
|
+
| -------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
121
|
+
| `README.md` | Agent-optimized orchestration doc — file inventory, conventions, script reference, troubleshooting |
|
|
122
|
+
| `code-map.md` | Comprehensive architecture reference (directory layout, module responsibilities, cross-references) |
|
|
123
|
+
| `tool-reference.md` | Tool inventory taxonomy (all tools by group with scope, annotations, schema status) |
|
|
124
|
+
| `prompt-template.md` | Extracted testing prompt boilerplate for consistent formatting across all test prompts |
|
|
125
|
+
| `test-tool-groups/*.md` | ~20 self-contained prompts at sub-group granularity (e.g., `test-core.md`, `test-json-get.md`) |
|
|
126
|
+
| `test-codemode/*.md` | ~12 prompts for Code Mode groups + sandbox security + WASM degradation |
|
|
127
|
+
| `test-advanced/*.md` | ~10 stress test prompts per tool group (Pattern P401: Agent-First Stress Testing) |
|
|
128
|
+
| `test-resources.md` | Dedicated resource verification (all data + help resources) |
|
|
129
|
+
| `test-prompts.md` | Dedicated prompt verification |
|
|
130
|
+
| `test-agent-experience.md` | ~20 open-ended scenarios validating help resource sufficiency |
|
|
131
|
+
| `*.mjs` | Integration scripts (Layer 3) |
|
|
132
|
+
|
|
133
|
+
**Test count taxonomy:** Document tool counts using the formal taxonomy: Group tools (per-group subtotal) / Built-in tools (server_info, server_health, list_adapters) / Audit tools (when audit enabled) / Inventory tools (when applicable) / MCP total (sum visible to clients via `tools/list`).
|
|
134
|
+
|
|
135
|
+
**Test plan conventions:**
|
|
136
|
+
|
|
137
|
+
- Phases numbered 0-N, each with a table of `| Test | Command | Expected |`
|
|
138
|
+
- Error-path tests marked with 🔴 prefix
|
|
139
|
+
- Reporting: ❌ Fail, ⚠️ Issue, ✅ inline only (omit from summary)
|
|
140
|
+
- Mermaid-producing resources must specify `text/plain` MIME in expected results
|
|
141
|
+
- Script-based phases (help resources, scheduler) reference scripts, not inline commands
|
|
142
|
+
|
|
143
|
+
**Standardized Prompt Format:** Use `prompt-template.md` boilerplate for all test prompts. This ensures consistent structure (Setup, Prerequisites, Test Matrix, Reporting Format) across 40+ test files. Generate or update prompts programmatically when adding new tool groups.
|
|
144
|
+
|
|
145
|
+
**OAuth Tests:** 8 test files in `src/auth/tests/`. See [`oauth-reference.md`](../oauth-reference.md) §Testing Patterns for file list and mocking strategies.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Code Quality & Supply Chain
|
|
150
|
+
|
|
151
|
+
- No duplicated code, consistent error handling, full type coverage, <600 line modules
|
|
152
|
+
- **SHA-pinned CI Actions:** Pin all GitHub Actions by SHA digest (not version tag) to prevent supply chain injection
|
|
153
|
+
- **Version SSoT:** Create `src/version.ts` that reads `version` from `package.json` at runtime (via `createRequire`). **Both adapters** (if dual-backend) `import { VERSION }` — never hardcode version strings. On a bump, only `package.json` needs updating
|
|
154
|
+
- **Lockfile integrity:** Verify lockfile SHA-256 checksum + `git diff --exit-code` before `npm ci` in CI pipelines. Prevents supply chain attacks via lockfile manipulation
|
|
155
|
+
- **Dockerfile patch drift:** Weekly CI workflow to detect stale transitive dependency patches (e.g., `package.json` overrides) against upstream versions. Alert when patches diverge from upstream releases
|
|
156
|
+
- Regular dependency scanning and artifact integrity
|
|
157
|
+
|
|
158
|
+
**Compact JSON Serialization:** Use `JSON.stringify(result)` (no pretty-print) for tool responses — ~15-20% payload reduction on large results. Retain `JSON.stringify(result, null, 2)` only for error responses where human readability matters.
|
|
159
|
+
|
|
160
|
+
**WASM/Native Backend Parity:** For servers with dual backends (e.g., WASM + Native), maintain a parity checklist:
|
|
161
|
+
|
|
162
|
+
- Features registered but always failing in one backend (e.g., FTS5 on WASM) must return structured "Feature Not Available" errors, not raw crashes
|
|
163
|
+
- Test each backend independently — Code Mode can mask registration-only failures
|
|
164
|
+
- Document backend-specific capabilities in help resources
|
|
165
|
+
|
|
166
|
+
**WASM Degradation Testing:** For dual-backend servers, add dedicated degradation test suites:
|
|
167
|
+
|
|
168
|
+
- Verify WASM-unsupported features return structured `{ success: false, code: 'FEATURE_NOT_AVAILABLE' }` errors
|
|
169
|
+
- Test Code Mode gracefully degrades (e.g., `codemode-wasm-degradation.md` prompt)
|
|
170
|
+
- Confirm tool count differences between backends match expected parity (`test-tool-annotations.mjs` validates this)
|
|
171
|
+
- Document expected tool counts per backend in `test-server/README.md`
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# MCP Server Integration
|
|
2
|
+
|
|
3
|
+
Fetch `docs/mcp-client.md` and `docs/mcp-servers.md` from `https://github.com/cloudflare/agents/tree/main/docs` for complete documentation.
|
|
4
|
+
|
|
5
|
+
Agents include a multi-server MCP client for connecting to external MCP servers.
|
|
6
|
+
|
|
7
|
+
## Add an MCP Server
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { Agent, callable } from 'agents'
|
|
11
|
+
|
|
12
|
+
export class MyAgent extends Agent<Env, State> {
|
|
13
|
+
@callable()
|
|
14
|
+
async addServer(name: string, url: string) {
|
|
15
|
+
// Options-based API (recommended)
|
|
16
|
+
const result = await this.addMcpServer(name, url, {
|
|
17
|
+
callbackHost: 'https://my-worker.workers.dev',
|
|
18
|
+
transport: { headers: { Authorization: 'Bearer ...' } },
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
if (result.state === 'authenticating') {
|
|
22
|
+
// OAuth required - redirect user to result.authUrl
|
|
23
|
+
return { needsAuth: true, authUrl: result.authUrl }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return { ready: true, id: result.id }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Use MCP Tools
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
async onChatMessage() {
|
|
35
|
+
// Get AI-compatible tools from all connected MCP servers
|
|
36
|
+
const mcpTools = this.mcp.getAITools();
|
|
37
|
+
|
|
38
|
+
const allTools = {
|
|
39
|
+
...localTools,
|
|
40
|
+
...mcpTools
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const result = streamText({
|
|
44
|
+
model: openai("gpt-4o"),
|
|
45
|
+
messages: await convertToModelMessages(this.messages),
|
|
46
|
+
tools: allTools
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return result.toUIMessageStreamResponse();
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## List MCP Resources
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// List all registered servers
|
|
57
|
+
const servers = this.mcp.listServers()
|
|
58
|
+
|
|
59
|
+
// List tools from all servers
|
|
60
|
+
const tools = this.mcp.listTools()
|
|
61
|
+
|
|
62
|
+
// List resources
|
|
63
|
+
const resources = this.mcp.listResources()
|
|
64
|
+
|
|
65
|
+
// List prompts
|
|
66
|
+
const prompts = this.mcp.listPrompts()
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Remove Server
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
await this.removeMcpServer(serverId)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Building an MCP Server
|
|
76
|
+
|
|
77
|
+
Use `McpAgent` from the SDK to create an MCP server.
|
|
78
|
+
|
|
79
|
+
**Install dependencies:**
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm install @modelcontextprotocol/sdk zod
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Wrangler config:**
|
|
86
|
+
|
|
87
|
+
```jsonc
|
|
88
|
+
{
|
|
89
|
+
"durable_objects": {
|
|
90
|
+
"bindings": [{ "name": "MyMCP", "class_name": "MyMCP" }],
|
|
91
|
+
},
|
|
92
|
+
"migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyMCP"] }],
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Server implementation:**
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
100
|
+
import { McpAgent } from 'agents/mcp'
|
|
101
|
+
import { z } from 'zod'
|
|
102
|
+
|
|
103
|
+
type State = { counter: number }
|
|
104
|
+
|
|
105
|
+
export class MyMCP extends McpAgent<Env, State, {}> {
|
|
106
|
+
server = new McpServer({
|
|
107
|
+
name: 'MyMCPServer',
|
|
108
|
+
version: '1.0.0',
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
initialState = { counter: 0 }
|
|
112
|
+
|
|
113
|
+
async init() {
|
|
114
|
+
// Register a resource
|
|
115
|
+
this.server.resource('counter', 'mcp://resource/counter', (uri) => ({
|
|
116
|
+
contents: [{ text: String(this.state.counter), uri: uri.href }],
|
|
117
|
+
}))
|
|
118
|
+
|
|
119
|
+
// Register a tool
|
|
120
|
+
this.server.registerTool(
|
|
121
|
+
'increment',
|
|
122
|
+
{
|
|
123
|
+
description: 'Increment the counter',
|
|
124
|
+
inputSchema: { amount: z.number().default(1) },
|
|
125
|
+
},
|
|
126
|
+
async ({ amount }) => {
|
|
127
|
+
this.setState({ counter: this.state.counter + amount })
|
|
128
|
+
return {
|
|
129
|
+
content: [{ text: `Counter: ${this.state.counter}`, type: 'text' }],
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Serve MCP Server
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
export default {
|
|
141
|
+
fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
142
|
+
const url = new URL(request.url)
|
|
143
|
+
|
|
144
|
+
// SSE transport (legacy)
|
|
145
|
+
if (url.pathname.startsWith('/sse')) {
|
|
146
|
+
return MyMCP.serveSSE('/sse', { binding: 'MyMCP' }).fetch(request, env, ctx)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Streamable HTTP transport (recommended)
|
|
150
|
+
if (url.pathname.startsWith('/mcp')) {
|
|
151
|
+
return MyMCP.serve('/mcp', { binding: 'MyMCP' }).fetch(request, env, ctx)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return new Response('Not found', { status: 404 })
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
```
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# State & Scheduling
|
|
2
|
+
|
|
3
|
+
Fetch `docs/state.md` and `docs/scheduling.md` from `https://github.com/cloudflare/agents/tree/main/docs` for complete documentation.
|
|
4
|
+
|
|
5
|
+
## State Management
|
|
6
|
+
|
|
7
|
+
State persists to SQLite and broadcasts to connected clients automatically.
|
|
8
|
+
|
|
9
|
+
### Define Typed State
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
type State = {
|
|
13
|
+
count: number
|
|
14
|
+
items: string[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class MyAgent extends Agent<Env, State> {
|
|
18
|
+
initialState: State = { count: 0, items: [] }
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Read and Update
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// Read (lazy-loaded from SQLite)
|
|
26
|
+
const count = this.state.count
|
|
27
|
+
|
|
28
|
+
// Write (sync, persists, broadcasts)
|
|
29
|
+
this.setState({ count: this.state.count + 1 })
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Validation Hook
|
|
33
|
+
|
|
34
|
+
`validateStateChange()` runs synchronously before state persists. Throw to reject the update.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
validateStateChange(nextState: State, source: Connection | "server") {
|
|
38
|
+
if (nextState.count < 0) {
|
|
39
|
+
throw new Error("Count cannot be negative");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Execution Order
|
|
45
|
+
|
|
46
|
+
1. `validateStateChange(nextState, source)` - sync, gating
|
|
47
|
+
2. State persisted to SQLite
|
|
48
|
+
3. State broadcast to connected clients
|
|
49
|
+
4. `onStateUpdate(nextState, source)` - async via `ctx.waitUntil`, non-gating
|
|
50
|
+
|
|
51
|
+
### Client-Side Sync (React)
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { useAgent } from 'agents/react'
|
|
55
|
+
|
|
56
|
+
function App() {
|
|
57
|
+
const [state, setLocalState] = useState<State>({ count: 0 })
|
|
58
|
+
|
|
59
|
+
const agent = useAgent<State>({
|
|
60
|
+
agent: 'MyAgent',
|
|
61
|
+
name: 'instance-1',
|
|
62
|
+
onStateUpdate: (newState) => setLocalState(newState),
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<button onClick={() => agent.setState({ count: state.count + 1 })}>Count: {state.count}</button>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## SQL API
|
|
72
|
+
|
|
73
|
+
Direct SQLite access for custom queries:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// Create table
|
|
77
|
+
this.sql`
|
|
78
|
+
CREATE TABLE IF NOT EXISTS items (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
name TEXT,
|
|
81
|
+
created_at INTEGER DEFAULT (unixepoch())
|
|
82
|
+
)
|
|
83
|
+
`
|
|
84
|
+
|
|
85
|
+
// Insert
|
|
86
|
+
this.sql`INSERT INTO items (id, name) VALUES (${id}, ${name})`
|
|
87
|
+
|
|
88
|
+
// Query with types
|
|
89
|
+
const items = this.sql<{ id: string; name: string }>`
|
|
90
|
+
SELECT * FROM items WHERE name LIKE ${`%${search}%`}
|
|
91
|
+
`
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Scheduling
|
|
95
|
+
|
|
96
|
+
### Schedule Types
|
|
97
|
+
|
|
98
|
+
| Mode | Syntax | Use Case |
|
|
99
|
+
| -------- | ----------------------------------- | -------------------------- |
|
|
100
|
+
| Delay | `this.schedule(60, ...)` | Run in 60 seconds |
|
|
101
|
+
| Date | `this.schedule(new Date(...), ...)` | Run at specific time |
|
|
102
|
+
| Cron | `this.schedule("0 8 * * *", ...)` | Recurring schedule |
|
|
103
|
+
| Interval | `this.scheduleEvery(30, ...)` | Fixed interval (every 30s) |
|
|
104
|
+
|
|
105
|
+
### Examples
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Delay (seconds)
|
|
109
|
+
await this.schedule(60, 'checkStatus', { id: 'abc123' })
|
|
110
|
+
|
|
111
|
+
// Specific date
|
|
112
|
+
await this.schedule(new Date('2025-12-25T00:00:00Z'), 'sendGreeting', { to: 'user' })
|
|
113
|
+
|
|
114
|
+
// Cron (recurring)
|
|
115
|
+
await this.schedule('0 9 * * 1-5', 'weekdayReport', {})
|
|
116
|
+
|
|
117
|
+
// Fixed interval (every 30 seconds, overlap prevention built-in)
|
|
118
|
+
await this.scheduleEvery(30, 'pollUpdates')
|
|
119
|
+
await this.scheduleEvery(300, 'syncData', { source: 'api' })
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Handler
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
async sendGreeting(payload: { to: string }, schedule: Schedule) {
|
|
126
|
+
console.log(`Sending greeting to ${payload.to}`);
|
|
127
|
+
// Cron schedules auto-reschedule; one-time schedules are deleted
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Manage Schedules
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const schedules = this.getSchedules()
|
|
135
|
+
const crons = this.getSchedules({ type: 'cron' })
|
|
136
|
+
await this.cancelSchedule(schedule.id)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Lifecycle Callbacks
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
export class MyAgent extends Agent<Env, State> {
|
|
143
|
+
async onStart() {
|
|
144
|
+
// Agent started or woke from hibernation
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
onConnect(conn: Connection, ctx: ConnectionContext) {
|
|
148
|
+
// WebSocket connected
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
onMessage(conn: Connection, message: WSMessage) {
|
|
152
|
+
// WebSocket message (non-RPC)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
onStateUpdate(state: State, source: Connection | 'server') {
|
|
156
|
+
// State changed (async, non-blocking)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
onError(error: unknown) {
|
|
160
|
+
// Error handler
|
|
161
|
+
throw error // Re-throw to propagate
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Streaming Chat with AIChatAgent
|
|
2
|
+
|
|
3
|
+
Fetch `docs/resumable-streaming.md` and `docs/client-sdk.md` from `https://github.com/cloudflare/agents/tree/main/docs` for complete documentation.
|
|
4
|
+
|
|
5
|
+
`AIChatAgent` provides streaming chat with automatic message persistence and resumable streams.
|
|
6
|
+
|
|
7
|
+
## Basic Chat Agent
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { AIChatAgent } from '@cloudflare/ai-chat'
|
|
11
|
+
import { streamText, convertToModelMessages } from 'ai'
|
|
12
|
+
import { openai } from '@ai-sdk/openai'
|
|
13
|
+
|
|
14
|
+
export class Chat extends AIChatAgent<Env> {
|
|
15
|
+
async onChatMessage(onFinish) {
|
|
16
|
+
const result = streamText({
|
|
17
|
+
model: openai('gpt-4o'),
|
|
18
|
+
messages: await convertToModelMessages(this.messages),
|
|
19
|
+
onFinish,
|
|
20
|
+
})
|
|
21
|
+
return result.toUIMessageStreamResponse()
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## With Custom System Prompt
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
export class Chat extends AIChatAgent<Env> {
|
|
30
|
+
async onChatMessage(onFinish) {
|
|
31
|
+
const result = streamText({
|
|
32
|
+
model: openai('gpt-4o'),
|
|
33
|
+
system: 'You are a helpful assistant specializing in...',
|
|
34
|
+
messages: await convertToModelMessages(this.messages),
|
|
35
|
+
onFinish,
|
|
36
|
+
})
|
|
37
|
+
return result.toUIMessageStreamResponse()
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## With Tools
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import { tool } from 'ai'
|
|
46
|
+
import { z } from 'zod'
|
|
47
|
+
|
|
48
|
+
const tools = {
|
|
49
|
+
getWeather: tool({
|
|
50
|
+
description: 'Get weather for a location',
|
|
51
|
+
parameters: z.object({ location: z.string() }),
|
|
52
|
+
execute: async ({ location }) => `Weather in ${location}: 72°F, sunny`,
|
|
53
|
+
}),
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class Chat extends AIChatAgent<Env> {
|
|
57
|
+
async onChatMessage(onFinish) {
|
|
58
|
+
const result = streamText({
|
|
59
|
+
model: openai('gpt-4o'),
|
|
60
|
+
messages: await convertToModelMessages(this.messages),
|
|
61
|
+
tools,
|
|
62
|
+
onFinish,
|
|
63
|
+
})
|
|
64
|
+
return result.toUIMessageStreamResponse()
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Custom UI Message Stream
|
|
70
|
+
|
|
71
|
+
For more control, use `createUIMessageStream`:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { createUIMessageStream, createUIMessageStreamResponse } from 'ai'
|
|
75
|
+
|
|
76
|
+
export class Chat extends AIChatAgent<Env> {
|
|
77
|
+
async onChatMessage(onFinish) {
|
|
78
|
+
const stream = createUIMessageStream({
|
|
79
|
+
execute: async ({ writer }) => {
|
|
80
|
+
const result = streamText({
|
|
81
|
+
model: openai('gpt-4o'),
|
|
82
|
+
messages: await convertToModelMessages(this.messages),
|
|
83
|
+
onFinish,
|
|
84
|
+
})
|
|
85
|
+
writer.merge(result.toUIMessageStream())
|
|
86
|
+
},
|
|
87
|
+
})
|
|
88
|
+
return createUIMessageStreamResponse({ stream })
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Resumable Streaming
|
|
94
|
+
|
|
95
|
+
Streams automatically resume if client disconnects and reconnects:
|
|
96
|
+
|
|
97
|
+
1. Chunks buffered to SQLite during streaming
|
|
98
|
+
2. On reconnect, buffered chunks sent immediately
|
|
99
|
+
3. Live streaming continues from where it left off
|
|
100
|
+
|
|
101
|
+
**Enabled by default.** To disable:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
const { messages } = useAgentChat({ agent, resume: false })
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## React Client
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import { useAgent } from 'agents/react'
|
|
111
|
+
import { useAgentChat } from '@cloudflare/ai-chat/react'
|
|
112
|
+
|
|
113
|
+
function ChatUI() {
|
|
114
|
+
const agent = useAgent({
|
|
115
|
+
agent: 'Chat',
|
|
116
|
+
name: 'my-chat-session',
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
const { messages, input, handleInputChange, handleSubmit, status } = useAgentChat({ agent })
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<div>
|
|
123
|
+
{messages.map((m) => (
|
|
124
|
+
<div key={m.id}>
|
|
125
|
+
<strong>{m.role}:</strong> {m.content}
|
|
126
|
+
</div>
|
|
127
|
+
))}
|
|
128
|
+
|
|
129
|
+
<form onSubmit={handleSubmit}>
|
|
130
|
+
<input value={input} onChange={handleInputChange} disabled={status === 'streaming'} />
|
|
131
|
+
<button type="submit">Send</button>
|
|
132
|
+
</form>
|
|
133
|
+
</div>
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Streaming RPC Methods
|
|
139
|
+
|
|
140
|
+
For non-chat streaming, use `@callable({ streaming: true })`:
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import { Agent, callable, StreamingResponse } from 'agents'
|
|
144
|
+
|
|
145
|
+
export class MyAgent extends Agent<Env> {
|
|
146
|
+
@callable({ streaming: true })
|
|
147
|
+
async streamData(stream: StreamingResponse, query: string) {
|
|
148
|
+
for (let i = 0; i < 10; i++) {
|
|
149
|
+
stream.send(`Result ${i}: ${query}`)
|
|
150
|
+
await sleep(100)
|
|
151
|
+
}
|
|
152
|
+
stream.close()
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Client receives streamed messages via WebSocket RPC.
|
|
158
|
+
|
|
159
|
+
## Status Values
|
|
160
|
+
|
|
161
|
+
`useAgentChat` status:
|
|
162
|
+
|
|
163
|
+
| Status | Meaning |
|
|
164
|
+
| ----------- | --------------------- |
|
|
165
|
+
| `ready` | Idle, ready for input |
|
|
166
|
+
| `streaming` | Response streaming |
|
|
167
|
+
| `submitted` | Request sent, waiting |
|
|
168
|
+
| `error` | Error occurred |
|