@aigne/afs-cloudflare 1.11.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/cache.cjs +37 -0
  5. package/dist/cache.mjs +37 -0
  6. package/dist/cache.mjs.map +1 -0
  7. package/dist/client.cjs +53 -0
  8. package/dist/client.mjs +53 -0
  9. package/dist/client.mjs.map +1 -0
  10. package/dist/cloudflare-afs.cjs +2724 -0
  11. package/dist/cloudflare-afs.d.cts +387 -0
  12. package/dist/cloudflare-afs.d.cts.map +1 -0
  13. package/dist/cloudflare-afs.d.mts +387 -0
  14. package/dist/cloudflare-afs.d.mts.map +1 -0
  15. package/dist/cloudflare-afs.mjs +2725 -0
  16. package/dist/cloudflare-afs.mjs.map +1 -0
  17. package/dist/errors.cjs +85 -0
  18. package/dist/errors.d.cts +26 -0
  19. package/dist/errors.d.cts.map +1 -0
  20. package/dist/errors.d.mts +26 -0
  21. package/dist/errors.d.mts.map +1 -0
  22. package/dist/errors.mjs +82 -0
  23. package/dist/errors.mjs.map +1 -0
  24. package/dist/index.cjs +22 -0
  25. package/dist/index.d.cts +5 -0
  26. package/dist/index.d.mts +5 -0
  27. package/dist/index.mjs +6 -0
  28. package/dist/platform-ref.cjs +20 -0
  29. package/dist/platform-ref.d.cts +11 -0
  30. package/dist/platform-ref.d.cts.map +1 -0
  31. package/dist/platform-ref.d.mts +11 -0
  32. package/dist/platform-ref.d.mts.map +1 -0
  33. package/dist/platform-ref.mjs +17 -0
  34. package/dist/platform-ref.mjs.map +1 -0
  35. package/dist/types.cjs +52 -0
  36. package/dist/types.d.cts +63 -0
  37. package/dist/types.d.cts.map +1 -0
  38. package/dist/types.d.mts +63 -0
  39. package/dist/types.d.mts.map +1 -0
  40. package/dist/types.mjs +46 -0
  41. package/dist/types.mjs.map +1 -0
  42. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-afs.mjs","names":["versions","deployment"],"sources":["../src/cloudflare-afs.ts"],"sourcesContent":["import {\n Actions,\n type AFSAccessMode,\n AFSBaseProvider,\n type AFSDeleteResult,\n type AFSEntry,\n type AFSExecResult,\n type AFSExplainResult,\n type AFSListResult,\n type AFSModuleLoadParams,\n AFSNotFoundError,\n AFSReadonlyError,\n type AFSSearchOptions,\n type AFSSearchResult,\n type AFSStatResult,\n type AFSWriteEntryPayload,\n type AFSWriteResult,\n type CapabilitiesManifest,\n Delete,\n Explain,\n List,\n type ListHandlerResult,\n Meta,\n Read,\n type RouteContext,\n Search,\n Stat,\n Write,\n} from \"@aigne/afs\";\nimport { zodParse } from \"@aigne/afs/utils/zod\";\nimport { minimatch } from \"minimatch\";\nimport { joinURL } from \"ufo\";\nimport { CloudflareCache } from \"./cache.js\";\nimport { type CloudflareClient, createCloudflareClient } from \"./client.js\";\nimport { confirmationRequired, mapCloudflareError } from \"./errors.js\";\nimport {\n generateKVPlatformRef,\n generatePagesPlatformRef,\n generateWorkerPlatformRef,\n} from \"./platform-ref.js\";\nimport {\n type AFSCloudflareConfig,\n AFSCloudflareConfigSchema,\n KINDS,\n type NormalizedConfig,\n normalizeConfig,\n} from \"./types.js\";\n\n/** Minimal interface for AFS operations needed by directory upload helpers. */\ninterface AFSReader {\n list(path: string, options?: { recursive?: boolean }): Promise<{ data: AFSEntry[] }>;\n read(path: string): Promise<{ data?: AFSEntry }>;\n}\n\nfunction camelize(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = key.replace(/_([a-z])/g, (_, letter: string) => letter.toUpperCase());\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[camelKey] = camelize(value as Record<string, unknown>);\n } else {\n result[camelKey] = value;\n }\n }\n return result;\n}\n\nexport class AFSCloudflare extends AFSBaseProvider {\n override readonly name: string;\n override readonly description?: string;\n override readonly accessMode: AFSAccessMode;\n\n private config: NormalizedConfig;\n private cfClient: CloudflareClient;\n private cache: CloudflareCache;\n private destroyed = false;\n\n constructor(config: AFSCloudflareConfig) {\n super();\n const validated = AFSCloudflareConfigSchema.parse(config);\n this.config = normalizeConfig(validated);\n this.name = this.config.name;\n this.description = this.config.description;\n this.accessMode = this.config.accessMode;\n this.cfClient = createCloudflareClient(this.config);\n this.cache = new CloudflareCache(this.config.cacheTtl, this.config.cacheDisabled);\n }\n\n static schema() {\n return AFSCloudflareConfigSchema;\n }\n\n static async load({ basePath, config }: AFSModuleLoadParams = {}): Promise<AFSCloudflare> {\n const camelized = camelize((config ?? {}) as Record<string, unknown>);\n const options = zodParse(AFSCloudflareConfigSchema, camelized, { prefix: basePath });\n return new AFSCloudflare(options);\n }\n\n // Allow injecting a mock client for testing\n setClient(client: unknown): void {\n this.cfClient.setClient(client as any);\n }\n\n private get client(): any {\n return this.cfClient.getClient();\n }\n\n private async accountId(): Promise<string> {\n return this.cfClient.getAccountId();\n }\n\n private ensureNotDestroyed(): void {\n if (this.destroyed) throw new Error(\"Provider has been destroyed\");\n }\n\n private requireReadwrite(path: string): void {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSReadonlyError(`Read-only mode: Cannot perform write operation at ${path}`);\n }\n }\n\n // ========== Helper: Resolve KV namespace title to ID ==========\n\n private async resolveKVNamespaceId(title: string): Promise<string> {\n const cacheKey = `kv:title:${title}`;\n const cached = this.cache.get<string>(cacheKey);\n if (cached) return cached;\n\n const accountId = await this.accountId();\n const namespaces = this.client.kv.namespaces.list({ account_id: accountId });\n for await (const ns of namespaces) {\n if ((ns as any).title === title) {\n const id = (ns as any).id as string;\n this.cache.set(cacheKey, id);\n return id;\n }\n }\n throw new AFSNotFoundError(`KV namespace not found: ${title}`);\n }\n\n // ========== Helper: Collect async iterable ==========\n\n private async collect<T>(iter: AsyncIterable<T>): Promise<T[]> {\n const items: T[] = [];\n for await (const item of iter) {\n items.push(item);\n }\n return items;\n }\n\n // ========== Helper: Validate AFS path ==========\n\n private validateAfsPath(path: string): void {\n if (!path.startsWith(\"/\") && !path.startsWith(\"$afs\")) {\n throw new Error(`Invalid path: \"${path}\". Must be an AFS path (starting with / or $afs)`);\n }\n if (/^\\/[a-zA-Z]:\\//.test(path) || path.includes(\"..\")) {\n throw new Error(\n `Invalid path: \"${path}\". System filesystem paths are not allowed. Use an AFS mount path.`,\n );\n }\n }\n\n // ========== Helper: Get AFS from exec context ==========\n\n private getAfsFromContext(ctx: RouteContext): AFSReader {\n const afs = (ctx.options as Record<string, any>)?.context?.afs as AFSReader | undefined;\n if (!afs) {\n throw new Error(\n \"AFS context not available. Directory operations require the AFS instance in exec context.\",\n );\n }\n return afs;\n }\n\n // ========== Helper: Read directory files from AFS ==========\n\n private async readDirectoryFiles(afs: AFSReader, basePath: string): Promise<Map<string, string>> {\n const files = new Map<string, string>();\n const { data: entries } = await afs.list(basePath, { recursive: true });\n for (const entry of entries) {\n if (entry.meta?.kind === \"directory\" || entry.meta?.childrenCount !== undefined) continue;\n try {\n const { data } = await afs.read(entry.path);\n if (data?.content !== undefined && data?.content !== null) {\n const relPath = entry.path.slice(basePath.length).replace(/^\\//, \"\");\n files.set(\n relPath,\n typeof data.content === \"string\" ? data.content : JSON.stringify(data.content),\n );\n }\n } catch {\n // Skip files that can't be read\n }\n }\n if (files.size === 0) {\n throw new Error(`No files found in directory: ${basePath}`);\n }\n return files;\n }\n\n // ========== Helper: Detect main module ==========\n\n private detectMainModule(files: Map<string, string>): string {\n const candidates = [\n \"index.js\",\n \"index.mjs\",\n \"index.ts\",\n \"worker.js\",\n \"worker.mjs\",\n \"src/index.js\",\n \"src/index.ts\",\n ];\n for (const candidate of candidates) {\n if (files.has(candidate)) return candidate;\n }\n for (const name of files.keys()) {\n if (name.endsWith(\".js\") || name.endsWith(\".mjs\") || name.endsWith(\".ts\")) return name;\n }\n throw new Error(\"No JavaScript/TypeScript main module found in directory\");\n }\n\n // ========== Helper: Content type for file ==========\n\n private getContentType(filename: string): string {\n if (filename.endsWith(\".html\") || filename.endsWith(\".htm\")) return \"text/html\";\n if (filename.endsWith(\".css\")) return \"text/css\";\n if (filename.endsWith(\".js\") || filename.endsWith(\".mjs\"))\n return \"application/javascript+module\";\n if (filename.endsWith(\".ts\")) return \"application/typescript\";\n if (filename.endsWith(\".json\")) return \"application/json\";\n if (filename.endsWith(\".svg\")) return \"image/svg+xml\";\n if (filename.endsWith(\".png\")) return \"image/png\";\n if (filename.endsWith(\".jpg\") || filename.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (filename.endsWith(\".gif\")) return \"image/gif\";\n if (filename.endsWith(\".ico\")) return \"image/x-icon\";\n if (filename.endsWith(\".woff2\")) return \"font/woff2\";\n if (filename.endsWith(\".woff\")) return \"font/woff\";\n if (filename.endsWith(\".wasm\")) return \"application/wasm\";\n if (filename.endsWith(\".xml\")) return \"application/xml\";\n if (filename.endsWith(\".txt\")) return \"text/plain\";\n return \"application/octet-stream\";\n }\n\n // ========== ROOT ==========\n\n @List(\"/\")\n async listRoot(_ctx: RouteContext): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n const [workers, kvNamespaces, pagesProjects, zones] = await Promise.all([\n this.collect(this.client.workers.scripts.list({ account_id: accountId })),\n this.collect(this.client.kv.namespaces.list({ account_id: accountId })),\n this.collect(this.client.pages.projects.list({ account_id: accountId })),\n this.collect(this.client.zones.list()),\n ]);\n const children: AFSEntry[] = [\n {\n id: \"WORLD.md\",\n path: \"/WORLD.md\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"text/markdown\" },\n },\n {\n id: \"workers\",\n path: \"/workers\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: workers.length },\n },\n {\n id: \"kv\",\n path: \"/kv\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: kvNamespaces.length },\n },\n {\n id: \"pages\",\n path: \"/pages\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: pagesProjects.length },\n },\n {\n id: \"by-zone\",\n path: \"/by-zone\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: zones.length },\n },\n ];\n return { data: children };\n }\n\n @Read(\"/.meta/.capabilities\")\n async readCapabilities(_ctx: RouteContext): Promise<AFSEntry> {\n const manifest: CapabilitiesManifest = {\n schemaVersion: 1,\n provider: this.name,\n description: this.description ?? \"Cloudflare provider\",\n tools: [],\n actions: [],\n operations: this.getOperationsDeclaration(),\n };\n return {\n id: \"/.meta/.capabilities\",\n path: \"/.meta/.capabilities\",\n content: manifest,\n meta: { kind: \"afs:capabilities\" },\n };\n }\n\n @Read(\"/\")\n async readRoot(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"/\",\n path: \"/\",\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: 5 },\n };\n }\n\n @Read(\"/WORLD.md\")\n async readWorldMd(_ctx: RouteContext): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const cacheKey = \"world-md\";\n const cached = this.cache.get<string>(cacheKey);\n if (cached) {\n return {\n id: \"WORLD.md\",\n path: \"/WORLD.md\",\n content: cached,\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"text/markdown\" },\n };\n }\n\n const [workers, kvNamespaces, pagesProjects, zones] = await Promise.all([\n this.collect(this.client.workers.scripts.list({ account_id: accountId })),\n this.collect(this.client.kv.namespaces.list({ account_id: accountId })),\n this.collect(this.client.pages.projects.list({ account_id: accountId })),\n this.collect(this.client.zones.list()),\n ]);\n\n const content = `# Cloudflare Account Overview\n\n**Account ID**: ${accountId}\n\n## Resources\n\n| Resource | Count |\n|----------|-------|\n| Workers | ${workers.length} |\n| KV Namespaces | ${kvNamespaces.length} |\n| Pages Projects | ${pagesProjects.length} |\n| Zones | ${zones.length} |\n\n## Workers\n${workers.map((w: any) => `- ${w.id}`).join(\"\\n\")}\n\n## KV Namespaces\n${kvNamespaces.map((ns: any) => `- ${ns.title}`).join(\"\\n\")}\n\n## Pages Projects\n${pagesProjects.map((p: any) => `- ${p.name}`).join(\"\\n\")}\n\n## Zones\n${zones.map((z: any) => `- ${z.name}`).join(\"\\n\")}\n`;\n this.cache.set(cacheKey, content);\n return {\n id: \"WORLD.md\",\n path: \"/WORLD.md\",\n content,\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"text/markdown\" },\n };\n }\n\n @Meta(\"/\")\n async metaRoot(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"\",\n path: \"/.meta\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: 5 },\n };\n }\n\n @Stat(\"/\")\n @Stat(\"/WORLD.md\")\n async statRoot(ctx: RouteContext): Promise<AFSStatResult> {\n if (ctx.path === \"/WORLD.md\" || ctx.path === \"/WORLD.md/.stat\") {\n return {\n data: {\n id: \"WORLD.md\",\n path: \"/WORLD.md\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"text/markdown\" },\n },\n };\n }\n return {\n data: {\n id: \"/\",\n path: \"/\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: 5 },\n },\n };\n }\n\n @Explain(\"/\")\n async explainRoot(_ctx: RouteContext): Promise<AFSExplainResult> {\n const accountId = await this.accountId();\n return {\n format: \"markdown\",\n content: `# Cloudflare Provider\n\nThis provider gives file-system-like access to Cloudflare Developer Platform resources.\n\n**Account ID**: ${accountId}\n\n## Available Paths\n\n- \\`/workers\\` — Cloudflare Workers (edge functions)\n- \\`/kv\\` — KV Namespaces (key-value storage)\n- \\`/pages\\` — Pages Projects (static site hosting)\n- \\`/by-zone\\` — Resources grouped by DNS zone\n- \\`/WORLD.md\\` — Account overview and resource statistics\n`,\n };\n }\n\n // ========== File Nodes: List returns empty ==========\n\n @List(\"/WORLD.md\")\n @List(\"/workers/:name/script.js\")\n @List(\"/workers/:name/settings.json\")\n @List(\"/workers/:name/bindings/:binding\")\n @List(\"/workers/:name/routes/:route+\")\n @List(\"/workers/:name/cron-triggers/:cron+\")\n @List(\"/kv/:title/metadata.json\")\n @List(\"/kv/:title/keys/:key+\")\n @List(\"/pages/:project/metadata.json\")\n @List(\"/pages/:project/deployments/:id\")\n @List(\"/pages/:project/domains/:domain\")\n @List(\"/by-zone/:zone/workers/:name\")\n @List(\"/by-zone/:zone/pages/:project\")\n async listFileNode(_ctx: RouteContext): Promise<ListHandlerResult> {\n return { data: [] };\n }\n\n // ========== Catch-all Meta for paths without specific meta handlers ==========\n\n @Meta(\"/WORLD.md\")\n async metaWorldMd(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"WORLD.md\",\n path: \"/WORLD.md/.meta\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"text/markdown\" },\n };\n }\n\n @Meta(\"/workers/:name/script.js\")\n async metaWorkerScript(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n return {\n id: \"script.js\",\n path: joinURL(\"/workers\", ctx.params.name, \"script.js\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/javascript\" },\n };\n }\n\n @Meta(\"/workers/:name/settings.json\")\n async metaWorkerSettings(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n return {\n id: \"settings.json\",\n path: joinURL(\"/workers\", ctx.params.name, \"settings.json\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n };\n }\n\n @Meta(\"/workers/:name/bindings\")\n async metaWorkerBindings(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n return {\n id: \"bindings\",\n path: joinURL(\"/workers\", ctx.params.name, \"bindings\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/workers/:name/bindings/:binding\")\n async metaWorkerBinding(ctx: RouteContext<{ name: string; binding: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.binding,\n path: joinURL(\"/workers\", ctx.params.name, \"bindings\", ctx.params.binding, \".meta\"),\n meta: { kind: KINDS.BINDING, kinds: [KINDS.BINDING, KINDS.NODE] },\n };\n }\n\n @Meta(\"/workers/:name/routes\")\n async metaWorkerRoutes(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n return {\n id: \"routes\",\n path: joinURL(\"/workers\", ctx.params.name, \"routes\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/workers/:name/routes/:route+\")\n async metaWorkerRoute(ctx: RouteContext<{ name: string; route: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.route,\n path: joinURL(\"/workers\", ctx.params.name, \"routes\", ctx.params.route, \".meta\"),\n meta: { kind: KINDS.ROUTE, kinds: [KINDS.ROUTE, KINDS.NODE] },\n };\n }\n\n @Meta(\"/workers/:name/cron-triggers\")\n async metaWorkerCronTriggers(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n return {\n id: \"cron-triggers\",\n path: joinURL(\"/workers\", ctx.params.name, \"cron-triggers\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/workers/:name/cron-triggers/:cron+\")\n async metaWorkerCronTrigger(\n ctx: RouteContext<{ name: string; cron: string }>,\n ): Promise<AFSEntry> {\n return {\n id: ctx.params.cron,\n path: joinURL(\"/workers\", ctx.params.name, \"cron-triggers\", ctx.params.cron, \".meta\"),\n meta: { kind: KINDS.CRON_TRIGGER, kinds: [KINDS.CRON_TRIGGER, KINDS.NODE] },\n };\n }\n\n @Meta(\"/kv/:title/metadata.json\")\n async metaKVMetadataFile(ctx: RouteContext<{ title: string }>): Promise<AFSEntry> {\n return {\n id: \"metadata.json\",\n path: joinURL(\"/kv\", ctx.params.title, \"metadata.json\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n };\n }\n\n @Meta(\"/kv/:title/keys\")\n async metaKVKeys(ctx: RouteContext<{ title: string }>): Promise<AFSEntry> {\n return {\n id: \"keys\",\n path: joinURL(\"/kv\", ctx.params.title, \"keys\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/kv/:title/keys/:key+\")\n async metaKVKey(ctx: RouteContext<{ title: string; key: string }>): Promise<AFSEntry> {\n const decodedKey = decodeURIComponent(ctx.params.key);\n return {\n id: decodedKey,\n path: joinURL(\"/kv\", ctx.params.title, \"keys\", ctx.params.key, \".meta\"),\n meta: { kind: KINDS.KV_KEY, kinds: [KINDS.KV_KEY, KINDS.NODE] },\n };\n }\n\n @Meta(\"/pages/:project/metadata.json\")\n async metaPagesMetadataFile(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n return {\n id: \"metadata.json\",\n path: joinURL(\"/pages\", ctx.params.project, \"metadata.json\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n };\n }\n\n @Meta(\"/pages/:project/deployments\")\n async metaPagesDeployments(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n return {\n id: \"deployments\",\n path: joinURL(\"/pages\", ctx.params.project, \"deployments\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/pages/:project/deployments/:id\")\n async metaPagesDeployment(ctx: RouteContext<{ project: string; id: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.id,\n path: joinURL(\"/pages\", ctx.params.project, \"deployments\", ctx.params.id, \".meta\"),\n meta: { kind: KINDS.DEPLOYMENT, kinds: [KINDS.DEPLOYMENT, KINDS.NODE] },\n };\n }\n\n @Meta(\"/pages/:project/domains\")\n async metaPagesDomains(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n return {\n id: \"domains\",\n path: joinURL(\"/pages\", ctx.params.project, \"domains\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/pages/:project/domains/:domain\")\n async metaPagesDomain(ctx: RouteContext<{ project: string; domain: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.domain,\n path: joinURL(\"/pages\", ctx.params.project, \"domains\", ctx.params.domain, \".meta\"),\n meta: { kind: KINDS.DOMAIN, kinds: [KINDS.DOMAIN, KINDS.NODE] },\n };\n }\n\n @Meta(\"/by-zone/:zone\")\n async metaByZoneDir(ctx: RouteContext<{ zone: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.zone,\n path: joinURL(\"/by-zone\", ctx.params.zone, \".meta\"),\n meta: { kind: KINDS.ZONE, kinds: [KINDS.ZONE, KINDS.NODE], childrenCount: 2 },\n };\n }\n\n @Meta(\"/by-zone/:zone/workers\")\n async metaByZoneWorkers(ctx: RouteContext<{ zone: string }>): Promise<AFSEntry> {\n return {\n id: \"workers\",\n path: joinURL(\"/by-zone\", ctx.params.zone, \"workers\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/by-zone/:zone/workers/:name\")\n async metaByZoneWorker(ctx: RouteContext<{ zone: string; name: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.name,\n path: joinURL(\"/by-zone\", ctx.params.zone, \"workers\", ctx.params.name, \".meta\"),\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE] },\n };\n }\n\n @Meta(\"/by-zone/:zone/pages\")\n async metaByZonePages(ctx: RouteContext<{ zone: string }>): Promise<AFSEntry> {\n return {\n id: \"pages\",\n path: joinURL(\"/by-zone\", ctx.params.zone, \"pages\", \".meta\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/by-zone/:zone/pages/:project\")\n async metaByZoneProject(ctx: RouteContext<{ zone: string; project: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.project,\n path: joinURL(\"/by-zone\", ctx.params.zone, \"pages\", ctx.params.project, \".meta\"),\n meta: { kind: KINDS.PAGES_PROJECT, kinds: [KINDS.PAGES_PROJECT, KINDS.NODE] },\n };\n }\n\n // ========== Global Actions ==========\n\n @Actions(\"\")\n async listGlobalActions(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: [\n {\n id: \"refresh\",\n path: \"/.actions/refresh\",\n summary: \"Refresh all cached data\",\n meta: { kind: KINDS.EXECUTABLE, kinds: [KINDS.EXECUTABLE, KINDS.NODE] },\n },\n ],\n };\n }\n\n @Actions.Exec(\"\", \"refresh\")\n async execRefresh(_ctx: RouteContext, _args: Record<string, unknown>): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.cache.clear();\n return { success: true, data: { message: \"Cache cleared\" } };\n }\n\n // ========== WORKERS: List ==========\n\n @List(\"/workers\")\n async listWorkers(_ctx: RouteContext): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const cacheKey = \"list:workers\";\n const cached = this.cache.get<AFSEntry[]>(cacheKey);\n if (cached) return { data: cached };\n\n const workers = await this.collect(this.client.workers.scripts.list({ account_id: accountId }));\n const entries: AFSEntry[] = workers.map((w: any) => ({\n id: w.id,\n path: joinURL(\"/workers\", w.id),\n summary: w.id,\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE], childrenCount: 5 },\n }));\n\n this.cache.set(cacheKey, entries);\n return { data: entries };\n }\n\n @List(\"/workers/:name\")\n async listWorkerDir(ctx: RouteContext<{ name: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n const basePath = joinURL(\"/workers\", name);\n\n const settings = (await this.client.workers.scripts.settings.get(name, {\n account_id: accountId,\n })) as any;\n const bindings = settings?.result?.bindings || [];\n const schedules = (await this.client.workers.scripts.schedules.get(name, {\n account_id: accountId,\n })) as any;\n const triggers = schedules?.schedules || [];\n const zones = await this.collect(this.client.zones.list());\n let routeCount = 0;\n for (const zone of zones) {\n const routes = await this.collect(\n this.client.workers.routes.list({ zone_id: (zone as any).id }),\n );\n routeCount += routes.filter((r: any) => r.script === name).length;\n }\n\n const children: AFSEntry[] = [\n {\n id: \"script.js\",\n path: joinURL(basePath, \"script.js\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/javascript\" },\n },\n {\n id: \"settings.json\",\n path: joinURL(basePath, \"settings.json\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n },\n {\n id: \"bindings\",\n path: joinURL(basePath, \"bindings\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: bindings.length },\n },\n {\n id: \"routes\",\n path: joinURL(basePath, \"routes\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: routeCount },\n },\n {\n id: \"cron-triggers\",\n path: joinURL(basePath, \"cron-triggers\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: triggers.length },\n },\n ];\n return { data: children };\n }\n\n @List(\"/workers/:name/bindings\")\n async listWorkerBindings(ctx: RouteContext<{ name: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n const settings = (await this.client.workers.scripts.settings.get(name, {\n account_id: accountId,\n })) as any;\n const bindings = settings?.result?.bindings || [];\n const entries: AFSEntry[] = bindings.map((b: any) => ({\n id: b.name,\n path: joinURL(\"/workers\", name, \"bindings\", b.name),\n content: JSON.stringify(b, null, 2),\n meta: { kind: KINDS.BINDING, kinds: [KINDS.BINDING, KINDS.NODE], bindingType: b.type },\n }));\n return { data: entries };\n }\n\n @List(\"/workers/:name/routes\")\n async listWorkerRoutes(ctx: RouteContext<{ name: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n\n // Get all zones and find routes for this worker\n const zones = await this.collect(this.client.zones.list());\n const entries: AFSEntry[] = [];\n\n for (const zone of zones) {\n const routes = await this.collect(\n this.client.workers.routes.list({ zone_id: (zone as any).id }),\n );\n for (const route of routes) {\n if ((route as any).script === name) {\n const pattern = (route as any).pattern;\n entries.push({\n id: pattern,\n path: joinURL(\"/workers\", name, \"routes\", pattern),\n content: JSON.stringify(route, null, 2),\n meta: {\n kind: KINDS.ROUTE,\n kinds: [KINDS.ROUTE, KINDS.NODE],\n zoneName: (zone as any).name,\n },\n });\n }\n }\n }\n return { data: entries };\n }\n\n @List(\"/workers/:name/cron-triggers\")\n async listWorkerCronTriggers(ctx: RouteContext<{ name: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n const schedules = (await this.client.workers.scripts.schedules.get(name, {\n account_id: accountId,\n })) as any;\n const triggers = schedules?.schedules || [];\n const entries: AFSEntry[] = triggers.map((t: any) => ({\n id: t.cron,\n path: joinURL(\"/workers\", name, \"cron-triggers\", t.cron),\n content: JSON.stringify(t, null, 2),\n meta: { kind: KINDS.CRON_TRIGGER, kinds: [KINDS.CRON_TRIGGER, KINDS.NODE] },\n }));\n return { data: entries };\n }\n\n // ========== WORKERS: Read ==========\n\n @Read(\"/workers\")\n async readWorkers(_ctx: RouteContext): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n const workers = await this.collect(this.client.workers.scripts.list({ account_id: accountId }));\n return {\n id: \"workers\",\n path: \"/workers\",\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: workers.length },\n };\n }\n\n @Read(\"/workers/:name\")\n async readWorkerDir(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.name,\n path: joinURL(\"/workers\", ctx.params.name),\n content: \"\",\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE], childrenCount: 5 },\n };\n }\n\n @Read(\"/workers/:name/bindings\")\n async readWorkerBindingsDir(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n const settings = (await this.client.workers.scripts.settings.get(name, {\n account_id: accountId,\n })) as any;\n const bindings = settings?.result?.bindings || [];\n return {\n id: \"bindings\",\n path: joinURL(\"/workers\", name, \"bindings\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: bindings.length },\n };\n }\n\n @Read(\"/workers/:name/routes\")\n async readWorkerRoutesDir(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const zones = await this.collect(this.client.zones.list());\n let routeCount = 0;\n for (const zone of zones) {\n const routes = await this.collect(\n this.client.workers.routes.list({ zone_id: (zone as any).id }),\n );\n routeCount += routes.filter((r: any) => r.script === name).length;\n }\n return {\n id: \"routes\",\n path: joinURL(\"/workers\", name, \"routes\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: routeCount },\n };\n }\n\n @Read(\"/workers/:name/cron-triggers\")\n async readWorkerCronTriggersDir(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n const schedules = (await this.client.workers.scripts.schedules.get(name, {\n account_id: accountId,\n })) as any;\n const triggers = schedules?.schedules || [];\n return {\n id: \"cron-triggers\",\n path: joinURL(\"/workers\", name, \"cron-triggers\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: triggers.length },\n };\n }\n\n @Read(\"/workers/:name/script.js\")\n async readWorkerScript(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n const response = (await this.client.workers.scripts.content.get(name, {\n account_id: accountId,\n })) as any;\n const content =\n response instanceof Response\n ? await response.text()\n : typeof response === \"string\"\n ? response\n : \"\";\n return {\n id: \"script.js\",\n path: joinURL(\"/workers\", name, \"script.js\"),\n content,\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/javascript\" },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Read(\"/workers/:name/settings.json\")\n async readWorkerSettings(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n const settings = (await this.client.workers.scripts.settings.get(name, {\n account_id: accountId,\n })) as any;\n const content = JSON.stringify(settings?.result || {}, null, 2);\n return {\n id: \"settings.json\",\n path: joinURL(\"/workers\", name, \"settings.json\"),\n content,\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Read(\"/workers/:name/bindings/:binding\")\n async readWorkerBinding(ctx: RouteContext<{ name: string; binding: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name, binding } = ctx.params;\n const accountId = await this.accountId();\n\n const settings = (await this.client.workers.scripts.settings.get(name, {\n account_id: accountId,\n })) as any;\n const bindings = settings?.result?.bindings || [];\n const found = bindings.find((b: any) => b.name === binding);\n if (!found) throw new AFSNotFoundError(`Binding not found: ${binding}`);\n\n return {\n id: binding,\n path: joinURL(\"/workers\", name, \"bindings\", binding),\n content: JSON.stringify(found, null, 2),\n meta: { kind: KINDS.BINDING, kinds: [KINDS.BINDING, KINDS.NODE], bindingType: found.type },\n };\n }\n\n @Read(\"/workers/:name/routes/:route+\")\n async readWorkerRoute(ctx: RouteContext<{ name: string; route: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name, route } = ctx.params;\n const decodedRoute = route;\n\n // Find this route in zones\n const zones = await this.collect(this.client.zones.list());\n for (const zone of zones) {\n const routes = await this.collect(\n this.client.workers.routes.list({ zone_id: (zone as any).id }),\n );\n for (const r of routes) {\n if ((r as any).script === name && (r as any).pattern === decodedRoute) {\n return {\n id: decodedRoute,\n path: joinURL(\"/workers\", name, \"routes\", route),\n content: JSON.stringify(r, null, 2),\n meta: {\n kind: KINDS.ROUTE,\n kinds: [KINDS.ROUTE, KINDS.NODE],\n zoneName: (zone as any).name,\n },\n };\n }\n }\n }\n throw new AFSNotFoundError(`Route not found: ${decodedRoute}`);\n }\n\n @Read(\"/workers/:name/cron-triggers/:cron+\")\n async readWorkerCronTrigger(\n ctx: RouteContext<{ name: string; cron: string }>,\n ): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name, cron } = ctx.params;\n const decodedCron = cron;\n const accountId = await this.accountId();\n\n const schedules = (await this.client.workers.scripts.schedules.get(name, {\n account_id: accountId,\n })) as any;\n const triggers = schedules?.schedules || [];\n const found = triggers.find((t: any) => t.cron === decodedCron);\n if (!found) throw new AFSNotFoundError(`Cron trigger not found: ${decodedCron}`);\n\n return {\n id: decodedCron,\n path: joinURL(\"/workers\", name, \"cron-triggers\", cron),\n content: JSON.stringify(found, null, 2),\n meta: { kind: KINDS.CRON_TRIGGER, kinds: [KINDS.CRON_TRIGGER, KINDS.NODE] },\n };\n }\n\n // ========== WORKERS: Meta & Stat ==========\n\n @Meta(\"/workers\")\n async metaWorkers(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"workers\",\n path: \"/workers/.meta\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Meta(\"/workers/:name\")\n async metaWorker(ctx: RouteContext<{ name: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n const worker = (await this.client.workers.scripts.get(name, { account_id: accountId })) as any;\n if (!worker) throw new AFSNotFoundError(`Worker not found: ${name}`);\n\n const settings = (await this.client.workers.scripts.settings.get(name, {\n account_id: accountId,\n })) as any;\n const bindings = settings?.result?.bindings || [];\n const schedules = (await this.client.workers.scripts.schedules.get(name, {\n account_id: accountId,\n })) as any;\n const cronTriggers = schedules?.schedules || [];\n\n // Count routes\n const zones = await this.collect(this.client.zones.list());\n let routeCount = 0;\n for (const zone of zones) {\n const routes = await this.collect(\n this.client.workers.routes.list({ zone_id: (zone as any).id }),\n );\n routeCount += routes.filter((r: any) => r.script === name).length;\n }\n\n return {\n id: name,\n path: joinURL(\"/workers\", name, \".meta\"),\n meta: {\n kind: KINDS.WORKER,\n kinds: [KINDS.WORKER, KINDS.NODE],\n childrenCount: 5,\n scriptName: name,\n createdOn: worker.created_on,\n modifiedOn: worker.modified_on,\n compatibilityDate: settings?.result?.compatibility_date,\n usageModel: settings?.result?.usage_model,\n routeCount,\n bindingCount: bindings.length,\n cronTriggerCount: cronTriggers.length,\n platformRef: generateWorkerPlatformRef(accountId, name),\n },\n };\n }\n\n @Stat(\"/workers\")\n @Stat(\"/workers/:name\")\n @Stat(\"/workers/:name/script.js\")\n @Stat(\"/workers/:name/settings.json\")\n @Stat(\"/workers/:name/bindings\")\n @Stat(\"/workers/:name/bindings/:binding\")\n @Stat(\"/workers/:name/routes\")\n @Stat(\"/workers/:name/routes/:route+\")\n @Stat(\"/workers/:name/cron-triggers\")\n @Stat(\"/workers/:name/cron-triggers/:cron+\")\n async statWorkers(\n ctx: RouteContext<{ name?: string; binding?: string; route?: string; cron?: string }>,\n ): Promise<AFSStatResult> {\n const parts = ctx.path\n .replace(/\\/.stat$/, \"\")\n .split(\"/\")\n .filter(Boolean);\n const id = parts[parts.length - 1] || \"workers\";\n return {\n data: {\n id,\n path: ctx.path.replace(/\\/.stat$/, \"\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n },\n };\n }\n\n @Explain(\"/workers\")\n async explainWorkers(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: `# Workers\n\nCloudflare Workers are serverless edge functions. Each worker contains:\n- \\`script.js\\` — The worker source code\n- \\`settings.json\\` — Configuration (compatibility_date, usage_model)\n- \\`bindings/\\` — Resource bindings (KV, R2, D1, etc.)\n- \\`routes/\\` — URL patterns that trigger this worker\n- \\`cron-triggers/\\` — Scheduled execution patterns\n`,\n };\n }\n\n @Explain(\"/workers/:name\")\n async explainWorker(ctx: RouteContext<{ name: string }>): Promise<AFSExplainResult> {\n this.ensureNotDestroyed();\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n const worker = (await this.client.workers.scripts.get(name, { account_id: accountId })) as any;\n if (!worker) throw new AFSNotFoundError(`Worker not found: ${name}`);\n\n return {\n format: \"markdown\",\n content: `# Worker: ${name}\n\n**Created**: ${worker.created_on}\n**Modified**: ${worker.modified_on}\n\n## Structure\n- \\`script.js\\` — Source code (read/write)\n- \\`settings.json\\` — Configuration\n- \\`bindings/\\` — Resource bindings\n- \\`routes/\\` — URL route patterns\n- \\`cron-triggers/\\` — Scheduled triggers\n\n## Actions\n- \\`deploy\\` — Deploy latest version to production\n- \\`rollback\\` — Rollback to previous version\n- \\`delete\\` — Delete this worker (requires confirm: true)\n`,\n };\n }\n\n // ========== WORKERS: Write ==========\n\n @Write(\"/workers/:name/script.js\")\n async writeWorkerScript(\n ctx: RouteContext<{ name: string }>,\n payload: AFSWriteEntryPayload,\n ): Promise<AFSWriteResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { name } = ctx.params;\n const accountId = await this.accountId();\n const content = typeof payload.content === \"string\" ? payload.content : \"\";\n\n try {\n // Upload actual script content via content.update (multipart)\n const scriptFile = new File([content], \"script.js\", {\n type: \"application/javascript+module\",\n });\n const result = await this.client.workers.scripts.update(name, {\n account_id: accountId,\n metadata: { main_module: \"script.js\" },\n files: { \"script.js\": scriptFile },\n } as any);\n this.cache.invalidate(\"list:workers\");\n this.cache.invalidate(`worker:${name}`);\n return {\n data: {\n id: \"script.js\",\n path: joinURL(\"/workers\", name, \"script.js\"),\n content,\n meta: {\n kind: KINDS.NODE,\n kinds: [KINDS.NODE],\n contentType: \"application/javascript\",\n etag: result?.etag,\n },\n },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Write(\"/workers/:name/settings.json\")\n async writeWorkerSettings(\n ctx: RouteContext<{ name: string }>,\n payload: AFSWriteEntryPayload,\n ): Promise<AFSWriteResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n const settings =\n typeof payload.content === \"string\" ? JSON.parse(payload.content) : payload.content || {};\n\n const applied: Record<string, unknown> = {};\n\n // Currently only workers_dev is supported\n if (\"workers_dev\" in settings) {\n await (this.client.workers.scripts as any).subdomain.create(name, {\n account_id: accountId,\n enabled: !!settings.workers_dev,\n });\n applied.workers_dev = !!settings.workers_dev;\n }\n\n this.cache.invalidate(`worker:${name}`);\n return {\n data: {\n id: \"settings.json\",\n path: joinURL(\"/workers\", name, \"settings.json\"),\n content: JSON.stringify(applied, null, 2),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n // ========== WORKERS: Actions ==========\n\n @Actions(\"/workers\")\n async listRootWorkerActions(_ctx: RouteContext): Promise<AFSListResult> {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSNotFoundError(\"Actions not available in readonly mode\");\n }\n return {\n data: [\n {\n id: \"create\",\n path: \"/workers/.actions/create\",\n summary: \"Create and deploy a new worker\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n required: [\"name\"],\n properties: {\n name: { type: \"string\", description: \"Worker name\" },\n script: {\n type: \"string\",\n description: \"Inline script content (for single-file workers)\",\n },\n directory: {\n type: \"string\",\n description:\n \"AFS directory path containing worker files (must be an AFS mount path)\",\n },\n mainModule: {\n type: \"string\",\n description: \"Main module filename (auto-detected if not provided)\",\n },\n bindings: {\n type: \"array\",\n description:\n 'KV/R2/etc bindings, e.g. [{\"type\":\"kv_namespace\",\"name\":\"KV\",\"namespace_id\":\"...\"}]',\n items: { type: \"object\" },\n },\n compatibilityDate: {\n type: \"string\",\n description: \"Compatibility date (default: today)\",\n },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/workers\", \"create\")\n async execWorkerCreate(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const accountId = await this.accountId();\n\n const name = args.name as string | undefined;\n const script = args.script as string | undefined;\n const directory = args.directory as string | undefined;\n const mainModuleArg = args.mainModule as string | undefined;\n const rawBindings = args.bindings;\n let bindings: Array<Record<string, unknown>> | undefined;\n if (typeof rawBindings === \"string\") {\n try {\n bindings = JSON.parse(rawBindings);\n } catch {\n return {\n success: false,\n error: { code: \"VALIDATION_ERROR\", message: \"bindings must be valid JSON array\" },\n };\n }\n } else {\n bindings = rawBindings as Array<Record<string, unknown>> | undefined;\n }\n const compatibilityDate =\n (args.compatibilityDate as string) || new Date().toISOString().split(\"T\")[0]!;\n\n if (!name) {\n return {\n success: false,\n error: { code: \"VALIDATION_ERROR\", message: \"name is required\" },\n };\n }\n if (!script && !directory) {\n return {\n success: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Either script (inline content) or directory (AFS path) is required\",\n },\n };\n }\n\n try {\n const hasBindings = bindings && bindings.length > 0;\n let fileCount = 1;\n\n if (script) {\n // Single-file worker\n const scriptFile = new File([script], \"index.js\", {\n type: \"application/javascript+module\",\n });\n // Override Content-Type to null so Bun's fetch auto-sets multipart/form-data\n // (SDK defaults to 'application/javascript' which breaks multipart in Bun runtime)\n await this.client.workers.scripts.update(name, {\n account_id: accountId,\n metadata: {\n main_module: \"index.js\",\n ...(hasBindings ? { bindings } : {}),\n compatibility_date: compatibilityDate,\n },\n files: { \"index.js\": scriptFile },\n } as any);\n } else if (directory) {\n // Multi-file worker: read from AFS directory\n this.validateAfsPath(directory);\n const afs = this.getAfsFromContext(ctx);\n const files = await this.readDirectoryFiles(afs, directory);\n const mainModule = mainModuleArg || this.detectMainModule(files);\n fileCount = files.size;\n\n const fileUploads: Record<string, File> = {};\n for (const [filename, content] of files) {\n fileUploads[filename] = new File([content], filename, {\n type: this.getContentType(filename),\n });\n }\n await this.client.workers.scripts.update(name, {\n account_id: accountId,\n metadata: {\n main_module: mainModule,\n ...(hasBindings ? { bindings } : {}),\n compatibility_date: compatibilityDate,\n },\n files: fileUploads,\n } as any);\n }\n\n // Enable workers.dev subdomain by default\n try {\n await (this.client.workers.scripts as any).subdomain.create(name, {\n account_id: accountId,\n enabled: true,\n });\n } catch {\n // workers.dev subdomain may already be enabled or not available\n }\n\n this.cache.invalidate(\"list:workers\");\n this.cache.invalidate(`worker:${name}`);\n\n return {\n success: true,\n data: {\n name,\n type: script ? \"single-file\" : \"directory\",\n fileCount,\n },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions(\"/workers/:name\")\n async listWorkerActions(ctx: RouteContext<{ name: string }>): Promise<AFSListResult> {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSNotFoundError(\"Actions not available in readonly mode\");\n }\n const basePath = joinURL(\"/workers\", ctx.params.name, \".actions\");\n return {\n data: [\n {\n id: \"deploy\",\n path: joinURL(basePath, \"deploy\"),\n summary: \"Deploy version to production\",\n meta: { kind: KINDS.EXECUTABLE, kinds: [KINDS.EXECUTABLE, KINDS.NODE] },\n },\n {\n id: \"rollback\",\n path: joinURL(basePath, \"rollback\"),\n summary: \"Rollback to previous version\",\n meta: { kind: KINDS.EXECUTABLE, kinds: [KINDS.EXECUTABLE, KINDS.NODE] },\n },\n {\n id: \"delete\",\n path: joinURL(basePath, \"delete\"),\n summary: \"Delete worker (requires confirm: true)\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n required: [\"confirm\"],\n properties: {\n confirm: { type: \"boolean\", description: \"Must be true to confirm deletion\" },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/workers/:name\", \"deploy\")\n async execWorkerDeploy(\n ctx: RouteContext<{ name: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n // If directory is provided, upload new files first\n const directory = args.directory as string | undefined;\n if (directory) {\n this.validateAfsPath(directory);\n const afs = this.getAfsFromContext(ctx);\n const files = await this.readDirectoryFiles(afs, directory);\n const mainModule = (args.mainModule as string) || this.detectMainModule(files);\n\n const fileUploads: Record<string, File> = {};\n for (const [filename, content] of files) {\n fileUploads[filename] = new File([content], filename, {\n type: this.getContentType(filename),\n });\n }\n await this.client.workers.scripts.update(name, {\n account_id: accountId,\n metadata: { main_module: mainModule },\n files: fileUploads,\n } as any);\n }\n\n let versionId = args.versionId as string | undefined;\n if (!versionId) {\n // Get latest version\n const versions = await this.collect(\n this.client.workers.scripts.versions.list(name, { account_id: accountId }),\n );\n if (versions.length > 0) {\n versionId = (versions[0] as any).id;\n }\n }\n\n const versions = versionId ? [{ version_id: versionId, percentage: 100 }] : [];\n const deployment = await this.client.workers.scripts.deployments.create(name, {\n account_id: accountId,\n strategy: \"percentage\",\n versions,\n });\n\n this.cache.invalidate(\"list:workers\");\n this.cache.invalidate(`worker:${name}`);\n\n return { success: true, data: { deploymentId: deployment?.id, versionId } };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions.Exec(\"/workers/:name\", \"rollback\")\n async execWorkerRollback(\n ctx: RouteContext<{ name: string }>,\n _args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n // Get versions and deploy the second one (previous)\n const versions = await this.collect(\n this.client.workers.scripts.versions.list(name, { account_id: accountId }),\n );\n if (versions.length < 2) {\n return {\n success: false,\n error: { code: \"NO_PREVIOUS_VERSION\", message: \"No previous version to rollback to\" },\n };\n }\n\n const previousVersionId = (versions[1] as any).id;\n const deployment = await this.client.workers.scripts.deployments.create(name, {\n account_id: accountId,\n strategy: \"percentage\",\n versions: [{ version_id: previousVersionId, percentage: 100 }],\n });\n\n this.cache.invalidate(\"list:workers\");\n this.cache.invalidate(`worker:${name}`);\n\n return {\n success: true,\n data: { deploymentId: deployment?.id, versionId: previousVersionId },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions.Exec(\"/workers/:name\", \"delete\")\n async execWorkerDelete(\n ctx: RouteContext<{ name: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n\n if (args.confirm !== true) {\n throw confirmationRequired(\"delete\", ctx.path);\n }\n\n const { name } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n await this.client.workers.scripts.delete(name, { account_id: accountId });\n this.cache.invalidate(\"list:workers\");\n this.cache.invalidate(`worker:${name}`);\n return { success: true, data: { deleted: name } };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n // ========== WORKERS: Search ==========\n\n @Search(\"/workers\")\n async searchWorkers(\n _ctx: RouteContext,\n query: string,\n options?: AFSSearchOptions,\n ): Promise<AFSSearchResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const workers = await this.collect(this.client.workers.scripts.list({ account_id: accountId }));\n const matched = workers.filter((w: any) => minimatch(w.id, query));\n const limit = options?.limit ?? 100;\n\n const data: AFSEntry[] = matched.slice(0, limit).map((w: any) => ({\n id: w.id,\n path: joinURL(\"/workers\", w.id),\n summary: w.id,\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE] },\n }));\n\n return { data };\n }\n\n // ========== KV: List ==========\n\n @List(\"/kv\")\n async listKV(_ctx: RouteContext): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const cacheKey = \"list:kv\";\n const cached = this.cache.get<AFSEntry[]>(cacheKey);\n if (cached) return { data: cached };\n\n const namespaces = await this.collect(\n this.client.kv.namespaces.list({ account_id: accountId }),\n );\n const entries: AFSEntry[] = namespaces.map((ns: any) => ({\n id: ns.title,\n path: joinURL(\"/kv\", ns.title),\n summary: ns.title,\n meta: { kind: KINDS.KV_NAMESPACE, kinds: [KINDS.KV_NAMESPACE, KINDS.NODE], childrenCount: 2 },\n }));\n\n this.cache.set(cacheKey, entries);\n return { data: entries };\n }\n\n @List(\"/kv/:title\")\n async listKVNamespaceDir(ctx: RouteContext<{ title: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { title } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n const basePath = joinURL(\"/kv\", title);\n\n const keys = await this.collect(\n this.client.kv.namespaces.keys.list(namespaceId, { account_id: accountId }),\n );\n const children: AFSEntry[] = [\n {\n id: \"metadata.json\",\n path: joinURL(basePath, \"metadata.json\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n },\n {\n id: \"keys\",\n path: joinURL(basePath, \"keys\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: keys.length },\n },\n ];\n return { data: children };\n }\n\n @List(\"/kv/:title/keys\")\n async listKVKeys(ctx: RouteContext<{ title: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { title } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n\n const keys = await this.collect(\n this.client.kv.namespaces.keys.list(namespaceId, { account_id: accountId }),\n );\n const entries: AFSEntry[] = keys.map((k: any) => ({\n id: k.name,\n path: joinURL(\"/kv\", title, \"keys\", k.name),\n meta: { kind: KINDS.KV_KEY, kinds: [KINDS.KV_KEY, KINDS.NODE] },\n }));\n return { data: entries };\n }\n\n // ========== KV: Read ==========\n\n @Read(\"/kv\")\n async readKV(_ctx: RouteContext): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n const namespaces = await this.collect(\n this.client.kv.namespaces.list({ account_id: accountId }),\n );\n return {\n id: \"kv\",\n path: \"/kv\",\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: namespaces.length },\n };\n }\n\n @Read(\"/kv/:title\")\n async readKVNamespaceDir(ctx: RouteContext<{ title: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.title,\n path: joinURL(\"/kv\", ctx.params.title),\n content: \"\",\n meta: { kind: KINDS.KV_NAMESPACE, kinds: [KINDS.KV_NAMESPACE, KINDS.NODE], childrenCount: 2 },\n };\n }\n\n @Read(\"/kv/:title/metadata.json\")\n async readKVMetadata(ctx: RouteContext<{ title: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { title } = ctx.params;\n const namespaceId = await this.resolveKVNamespaceId(title);\n\n const content = JSON.stringify({ id: namespaceId, title }, null, 2);\n return {\n id: \"metadata.json\",\n path: joinURL(\"/kv\", title, \"metadata.json\"),\n content,\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n };\n }\n\n @Read(\"/kv/:title/keys\")\n async readKVKeysDir(ctx: RouteContext<{ title: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { title } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n const keys = await this.collect(\n this.client.kv.namespaces.keys.list(namespaceId, { account_id: accountId }),\n );\n return {\n id: \"keys\",\n path: joinURL(\"/kv\", title, \"keys\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: keys.length },\n };\n }\n\n @Read(\"/kv/:title/keys/:key+\")\n async readKVKey(ctx: RouteContext<{ title: string; key: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { title, key } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n const decodedKey = key;\n\n try {\n const response = (await this.client.kv.namespaces.values.get(namespaceId, decodedKey, {\n account_id: accountId,\n })) as any;\n if (!response) throw new AFSNotFoundError(`KV key not found: ${decodedKey}`);\n const content =\n response instanceof Response\n ? await response.text()\n : typeof response === \"string\"\n ? response\n : String(response);\n return {\n id: decodedKey,\n path: joinURL(\"/kv\", title, \"keys\", key),\n content,\n meta: { kind: KINDS.KV_KEY, kinds: [KINDS.KV_KEY, KINDS.NODE] },\n };\n } catch (error) {\n if (error instanceof AFSNotFoundError) throw error;\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n // ========== KV: Meta & Stat ==========\n\n @Meta(\"/kv\")\n async metaKV(_ctx: RouteContext): Promise<AFSEntry> {\n return { id: \"kv\", path: \"/kv/.meta\", meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] } };\n }\n\n @Meta(\"/kv/:title\")\n async metaKVNamespace(ctx: RouteContext<{ title: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { title } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n\n return {\n id: title,\n path: joinURL(\"/kv\", title, \".meta\"),\n meta: {\n kind: KINDS.KV_NAMESPACE,\n kinds: [KINDS.KV_NAMESPACE, KINDS.NODE],\n childrenCount: 2,\n namespaceId,\n title,\n platformRef: generateKVPlatformRef(accountId, namespaceId),\n },\n };\n }\n\n @Stat(\"/kv\")\n @Stat(\"/kv/:title\")\n @Stat(\"/kv/:title/metadata.json\")\n @Stat(\"/kv/:title/keys\")\n @Stat(\"/kv/:title/keys/:key+\")\n async statKV(ctx: RouteContext<{ title?: string; key?: string }>): Promise<AFSStatResult> {\n const parts = ctx.path\n .replace(/\\/.stat$/, \"\")\n .split(\"/\")\n .filter(Boolean);\n const id = parts[parts.length - 1] || \"kv\";\n return {\n data: {\n id,\n path: ctx.path.replace(/\\/.stat$/, \"\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n },\n };\n }\n\n @Explain(\"/kv\")\n async explainKV(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: `# KV Namespaces\n\nCloudflare KV is a global, low-latency key-value data store. Each namespace contains:\n- \\`metadata.json\\` — Namespace configuration\n- \\`keys/\\` — Key-value pairs (read/write/delete)\n`,\n };\n }\n\n @Explain(\"/kv/:title\")\n async explainKVNamespace(ctx: RouteContext<{ title: string }>): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: `# KV Namespace: ${ctx.params.title}\n\n## Structure\n- \\`metadata.json\\` — Namespace metadata\n- \\`keys/\\` — All key-value pairs\n\n## Actions\n- \\`delete\\` — Delete this namespace (requires confirm: true)\n`,\n };\n }\n\n // ========== KV: Write & Delete ==========\n\n @Write(\"/kv/:title/keys/:key+\")\n async writeKVKey(\n ctx: RouteContext<{ title: string; key: string }>,\n payload: AFSWriteEntryPayload,\n ): Promise<AFSWriteResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { title, key } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n const decodedKey = key;\n\n const content =\n typeof payload.content === \"string\" ? payload.content : JSON.stringify(payload.content);\n\n try {\n await this.client.kv.namespaces.values.update(namespaceId, decodedKey, {\n account_id: accountId,\n value: content,\n });\n this.cache.invalidate(`list:kv:${title}`);\n return {\n data: {\n id: decodedKey,\n path: joinURL(\"/kv\", title, \"keys\", key),\n content,\n meta: { kind: KINDS.KV_KEY, kinds: [KINDS.KV_KEY, KINDS.NODE] },\n },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Delete(\"/kv/:title/keys/:key+\")\n async deleteKVKey(ctx: RouteContext<{ title: string; key: string }>): Promise<AFSDeleteResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { title, key } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n const decodedKey = key;\n\n try {\n await this.client.kv.namespaces.values.delete(namespaceId, decodedKey, {\n account_id: accountId,\n });\n this.cache.invalidate(`list:kv:${title}`);\n return { message: `Key '${decodedKey}' deleted` };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n // ========== KV: Actions ==========\n\n @Actions(\"/kv\")\n async listRootKVActions(_ctx: RouteContext): Promise<AFSListResult> {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSNotFoundError(\"Actions not available in readonly mode\");\n }\n return {\n data: [\n {\n id: \"create\",\n path: \"/kv/.actions/create\",\n summary: \"Create a new KV namespace\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n required: [\"title\"],\n properties: {\n title: { type: \"string\", description: \"Namespace title\" },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/kv\", \"create\")\n async execKVCreate(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const accountId = await this.accountId();\n const title = args.title as string | undefined;\n\n if (!title) {\n return {\n success: false,\n error: { code: \"VALIDATION_ERROR\", message: \"title is required\" },\n };\n }\n\n try {\n const namespace = (await this.client.kv.namespaces.create({\n account_id: accountId,\n title,\n })) as any;\n this.cache.invalidate(\"list:kv\");\n return {\n success: true,\n data: { id: namespace.id, title: namespace.title },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions(\"/kv/:title\")\n async listKVActions(ctx: RouteContext<{ title: string }>): Promise<AFSListResult> {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSNotFoundError(\"Actions not available in readonly mode\");\n }\n const basePath = joinURL(\"/kv\", ctx.params.title, \".actions\");\n return {\n data: [\n {\n id: \"delete\",\n path: joinURL(basePath, \"delete\"),\n summary: \"Delete namespace (requires confirm: true)\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n required: [\"confirm\"],\n properties: {\n confirm: { type: \"boolean\", description: \"Must be true to confirm deletion\" },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/kv/:title\", \"delete\")\n async execKVDelete(\n ctx: RouteContext<{ title: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n\n if (args.confirm !== true) {\n throw confirmationRequired(\"delete\", ctx.path);\n }\n\n const { title } = ctx.params;\n const accountId = await this.accountId();\n const namespaceId = await this.resolveKVNamespaceId(title);\n\n try {\n await this.client.kv.namespaces.delete(namespaceId, { account_id: accountId });\n this.cache.invalidate(\"list:kv\");\n this.cache.invalidate(`kv:title:${title}`);\n return { success: true, data: { deleted: title } };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n // ========== KV: Search ==========\n\n @Search(\"/kv\")\n async searchKV(\n _ctx: RouteContext,\n query: string,\n options?: AFSSearchOptions,\n ): Promise<AFSSearchResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const namespaces = await this.collect(\n this.client.kv.namespaces.list({ account_id: accountId }),\n );\n const matched = namespaces.filter((ns: any) => minimatch(ns.title, query));\n const limit = options?.limit ?? 100;\n\n const data: AFSEntry[] = matched.slice(0, limit).map((ns: any) => ({\n id: ns.title,\n path: joinURL(\"/kv\", ns.title),\n summary: ns.title,\n meta: { kind: KINDS.KV_NAMESPACE, kinds: [KINDS.KV_NAMESPACE, KINDS.NODE] },\n }));\n\n return { data };\n }\n\n // ========== PAGES: List ==========\n\n @List(\"/pages\")\n async listPages(_ctx: RouteContext): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const cacheKey = \"list:pages\";\n const cached = this.cache.get<AFSEntry[]>(cacheKey);\n if (cached) return { data: cached };\n\n const projects = await this.collect(this.client.pages.projects.list({ account_id: accountId }));\n const entries: AFSEntry[] = projects.map((p: any) => ({\n id: p.name,\n path: joinURL(\"/pages\", p.name),\n summary: p.name,\n meta: {\n kind: KINDS.PAGES_PROJECT,\n kinds: [KINDS.PAGES_PROJECT, KINDS.NODE],\n childrenCount: 3,\n },\n }));\n\n this.cache.set(cacheKey, entries);\n return { data: entries };\n }\n\n @List(\"/pages/:project\")\n async listPagesProjectDir(ctx: RouteContext<{ project: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n const basePath = joinURL(\"/pages\", project);\n\n const [deployments, domains] = await Promise.all([\n this.collect(this.client.pages.projects.deployments.list(project, { account_id: accountId })),\n this.collect(this.client.pages.projects.domains.list(project, { account_id: accountId })),\n ]);\n\n const children: AFSEntry[] = [\n {\n id: \"metadata.json\",\n path: joinURL(basePath, \"metadata.json\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n },\n {\n id: \"deployments\",\n path: joinURL(basePath, \"deployments\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: deployments.length },\n },\n {\n id: \"domains\",\n path: joinURL(basePath, \"domains\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: domains.length },\n },\n ];\n return { data: children };\n }\n\n @List(\"/pages/:project/deployments\")\n async listPagesDeployments(ctx: RouteContext<{ project: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n const deployments = await this.collect(\n this.client.pages.projects.deployments.list(project, { account_id: accountId }),\n );\n const entries: AFSEntry[] = deployments.map((d: any) => ({\n id: d.id,\n path: joinURL(\"/pages\", project, \"deployments\", d.id),\n summary: `${d.environment} - ${d.created_on}`,\n meta: { kind: KINDS.DEPLOYMENT, kinds: [KINDS.DEPLOYMENT, KINDS.NODE] },\n }));\n return { data: entries };\n }\n\n @List(\"/pages/:project/domains\")\n async listPagesDomains(ctx: RouteContext<{ project: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n const domains = await this.collect(\n this.client.pages.projects.domains.list(project, { account_id: accountId }),\n );\n const entries: AFSEntry[] = domains.map((d: any) => ({\n id: d.name,\n path: joinURL(\"/pages\", project, \"domains\", d.name),\n content: JSON.stringify(d, null, 2),\n meta: { kind: KINDS.DOMAIN, kinds: [KINDS.DOMAIN, KINDS.NODE] },\n }));\n return { data: entries };\n }\n\n // ========== PAGES: Read ==========\n\n @Read(\"/pages\")\n async readPages(_ctx: RouteContext): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n const projects = await this.collect(this.client.pages.projects.list({ account_id: accountId }));\n return {\n id: \"pages\",\n path: \"/pages\",\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: projects.length },\n };\n }\n\n @Read(\"/pages/:project\")\n async readPagesProjectDir(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.project,\n path: joinURL(\"/pages\", ctx.params.project),\n content: \"\",\n meta: {\n kind: KINDS.PAGES_PROJECT,\n kinds: [KINDS.PAGES_PROJECT, KINDS.NODE],\n childrenCount: 3,\n },\n };\n }\n\n @Read(\"/pages/:project/metadata.json\")\n async readPagesMetadata(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n const projectData = (await this.client.pages.projects.get(project, {\n account_id: accountId,\n })) as any;\n if (!projectData) throw new AFSNotFoundError(`Pages project not found: ${project}`);\n\n const content = JSON.stringify(projectData, null, 2);\n return {\n id: \"metadata.json\",\n path: joinURL(\"/pages\", project, \"metadata.json\"),\n content,\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], contentType: \"application/json\" },\n };\n }\n\n @Read(\"/pages/:project/deployments\")\n async readPagesDeploymentsDir(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n const deployments = await this.collect(\n this.client.pages.projects.deployments.list(project, { account_id: accountId }),\n );\n return {\n id: \"deployments\",\n path: joinURL(\"/pages\", project, \"deployments\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: deployments.length },\n };\n }\n\n @Read(\"/pages/:project/deployments/:id\")\n async readPagesDeployment(ctx: RouteContext<{ project: string; id: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { project, id } = ctx.params;\n const accountId = await this.accountId();\n\n const deployment = (await this.client.pages.projects.deployments.get(project, id, {\n account_id: accountId,\n })) as any;\n if (!deployment) throw new AFSNotFoundError(`Deployment not found: ${id}`);\n\n return {\n id,\n path: joinURL(\"/pages\", project, \"deployments\", id),\n content: JSON.stringify(deployment, null, 2),\n meta: { kind: KINDS.DEPLOYMENT, kinds: [KINDS.DEPLOYMENT, KINDS.NODE] },\n };\n }\n\n @Read(\"/pages/:project/domains\")\n async readPagesDomainsDir(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n const domains = await this.collect(\n this.client.pages.projects.domains.list(project, { account_id: accountId }),\n );\n return {\n id: \"domains\",\n path: joinURL(\"/pages\", project, \"domains\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: domains.length },\n };\n }\n\n @Read(\"/pages/:project/domains/:domain\")\n async readPagesDomain(ctx: RouteContext<{ project: string; domain: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { project, domain } = ctx.params;\n const accountId = await this.accountId();\n\n const domains = await this.collect(\n this.client.pages.projects.domains.list(project, { account_id: accountId }),\n );\n const found = domains.find((d: any) => d.name === domain);\n if (!found) throw new AFSNotFoundError(`Domain not found: ${domain}`);\n\n return {\n id: domain,\n path: joinURL(\"/pages\", project, \"domains\", domain),\n content: JSON.stringify(found, null, 2),\n meta: { kind: KINDS.DOMAIN, kinds: [KINDS.DOMAIN, KINDS.NODE] },\n };\n }\n\n // ========== PAGES: Meta & Stat ==========\n\n @Meta(\"/pages\")\n async metaPages(_ctx: RouteContext): Promise<AFSEntry> {\n return { id: \"pages\", path: \"/pages/.meta\", meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] } };\n }\n\n @Meta(\"/pages/:project\")\n async metaPagesProject(ctx: RouteContext<{ project: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n const projectData = (await this.client.pages.projects.get(project, {\n account_id: accountId,\n })) as any;\n if (!projectData) throw new AFSNotFoundError(`Pages project not found: ${project}`);\n\n const domains = await this.collect(\n this.client.pages.projects.domains.list(project, { account_id: accountId }),\n );\n\n return {\n id: project,\n path: joinURL(\"/pages\", project, \".meta\"),\n meta: {\n kind: KINDS.PAGES_PROJECT,\n kinds: [KINDS.PAGES_PROJECT, KINDS.NODE],\n childrenCount: 3,\n projectName: project,\n subdomain: projectData.subdomain,\n productionBranch: projectData.production_branch,\n latestDeployment: projectData.latest_deployment\n ? {\n id: projectData.latest_deployment.id,\n url: projectData.latest_deployment.url,\n environment: projectData.latest_deployment.environment,\n createdOn: projectData.latest_deployment.created_on,\n }\n : undefined,\n domainCount: domains.length,\n platformRef: generatePagesPlatformRef(accountId, project),\n },\n };\n }\n\n @Stat(\"/pages\")\n @Stat(\"/pages/:project\")\n @Stat(\"/pages/:project/metadata.json\")\n @Stat(\"/pages/:project/deployments\")\n @Stat(\"/pages/:project/deployments/:id\")\n @Stat(\"/pages/:project/domains\")\n @Stat(\"/pages/:project/domains/:domain\")\n async statPages(\n ctx: RouteContext<{ project?: string; id?: string; domain?: string }>,\n ): Promise<AFSStatResult> {\n const parts = ctx.path\n .replace(/\\/.stat$/, \"\")\n .split(\"/\")\n .filter(Boolean);\n const id = parts[parts.length - 1] || \"pages\";\n return {\n data: {\n id,\n path: ctx.path.replace(/\\/.stat$/, \"\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n },\n };\n }\n\n @Explain(\"/pages\")\n async explainPages(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: `# Pages Projects\n\nCloudflare Pages provides static site hosting with CI/CD. Each project contains:\n- \\`metadata.json\\` — Project configuration\n- \\`deployments/\\` — Deployment history\n- \\`domains/\\` — Custom domains\n`,\n };\n }\n\n @Explain(\"/pages/:project\")\n async explainPagesProject(ctx: RouteContext<{ project: string }>): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: `# Pages Project: ${ctx.params.project}\n\n## Structure\n- \\`metadata.json\\` — Project metadata\n- \\`deployments/\\` — Deployment history\n- \\`domains/\\` — Custom domain mappings\n\n## Actions\n- \\`deploy\\` — Deploy new version\n- \\`rollback\\` — Rollback to a specific deployment\n- \\`delete\\` — Delete project (requires confirm: true)\n`,\n };\n }\n\n // ========== PAGES: Actions ==========\n\n @Actions(\"/pages\")\n async listRootPagesActions(_ctx: RouteContext): Promise<AFSListResult> {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSNotFoundError(\"Actions not available in readonly mode\");\n }\n return {\n data: [\n {\n id: \"create\",\n path: \"/pages/.actions/create\",\n summary: \"Create a new Pages project and deploy files\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n required: [\"name\", \"directory\"],\n properties: {\n name: { type: \"string\", description: \"Project name\" },\n directory: {\n type: \"string\",\n description: \"AFS directory path containing static files to deploy\",\n },\n productionBranch: {\n type: \"string\",\n description: 'Production branch name (default: \"main\")',\n },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/pages\", \"create\")\n async execPagesCreate(ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const accountId = await this.accountId();\n\n const name = args.name as string | undefined;\n const directory = args.directory as string | undefined;\n const productionBranch = (args.productionBranch as string) || \"main\";\n\n if (!name) {\n return {\n success: false,\n error: { code: \"VALIDATION_ERROR\", message: \"name is required\" },\n };\n }\n if (!directory) {\n return {\n success: false,\n error: { code: \"VALIDATION_ERROR\", message: \"directory (AFS path) is required\" },\n };\n }\n\n this.validateAfsPath(directory);\n const afs = this.getAfsFromContext(ctx);\n\n try {\n // 1. Create the Pages project\n await this.client.pages.projects.create({\n account_id: accountId,\n name,\n production_branch: productionBranch,\n });\n\n // 2. Upload files via Direct Upload API\n const deployment = await this.uploadPagesFiles(name, afs, directory);\n\n this.cache.invalidate(\"list:pages\");\n\n return {\n success: true,\n data: { name, deploymentId: deployment.id, url: deployment.url },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n /**\n * Upload files to a Pages project via the Direct Upload API.\n *\n * Follows the same multi-step flow as wrangler:\n * 1. Read files from AFS directory\n * 2. Hash each file with BLAKE3 (base64Content + extension, truncated to 32 hex chars)\n * 3. Get upload JWT token\n * 4. Check which files are missing (deduplication)\n * 5. Upload missing files as JSON with base64 content\n * 6. Upsert all hashes\n * 7. Create deployment with manifest\n */\n private async uploadPagesFiles(\n projectName: string,\n afs: AFSReader,\n directory: string,\n ): Promise<{ id: string; url: string }> {\n const accountId = await this.accountId();\n const apiToken = this.config.apiToken || process.env.CLOUDFLARE_API_TOKEN;\n if (!apiToken) {\n throw new Error(\n \"API token is required for Pages Direct Upload. Set apiToken in config or CLOUDFLARE_API_TOKEN env var.\",\n );\n }\n const baseUrl = \"https://api.cloudflare.com/client/v4\";\n\n // 1. Read all files from AFS directory\n const files = await this.readDirectoryFiles(afs, directory);\n\n // Separate _worker.js from static files (Pages Functions)\n let workerScript: string | undefined;\n const staticFiles = new Map<string, string>();\n for (const [filePath, content] of files) {\n if (filePath === \"_worker.js\") {\n workerScript = content;\n } else {\n staticFiles.set(filePath, content);\n }\n }\n\n // 2. Hash each static file (BLAKE3) and prepare upload entries\n const { hash: blake3hash } = await import(\"blake3-wasm\");\n\n const manifest: Record<string, string> = {};\n const uploadEntries: Array<{\n key: string;\n value: string;\n metadata: { contentType: string };\n base64: boolean;\n }> = [];\n\n for (const [filePath, content] of staticFiles) {\n const buffer = Buffer.from(content, \"utf-8\");\n const base64Content = buffer.toString(\"base64\");\n const extension = filePath.includes(\".\") ? filePath.split(\".\").pop()! : \"\";\n\n // BLAKE3 hash of (base64Content + extension), truncated to 32 hex chars\n const hash = blake3hash(base64Content + extension)\n .toString(\"hex\")\n .slice(0, 32);\n\n manifest[`/${filePath}`] = hash;\n uploadEntries.push({\n key: hash,\n value: base64Content,\n metadata: { contentType: this.getContentType(filePath) },\n base64: true,\n });\n }\n\n // 3. Get upload JWT token\n const tokenRes = await fetch(\n `${baseUrl}/accounts/${accountId}/pages/projects/${projectName}/upload-token`,\n { headers: { Authorization: `Bearer ${apiToken}` } },\n );\n if (!tokenRes.ok) {\n throw new Error(`Failed to get upload token: ${tokenRes.status} ${await tokenRes.text()}`);\n }\n const jwt = ((await tokenRes.json()) as any).result?.jwt;\n if (!jwt) {\n throw new Error(\"Failed to get upload JWT from Cloudflare\");\n }\n\n // 4. Check which files are missing (deduplication)\n const allHashes = uploadEntries.map((e) => e.key);\n const checkRes = await fetch(`${baseUrl}/pages/assets/check-missing`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${jwt}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ hashes: allHashes }),\n });\n if (!checkRes.ok) {\n throw new Error(\n `Failed to check missing assets: ${checkRes.status} ${await checkRes.text()}`,\n );\n }\n const missingHashes = new Set<string>(((await checkRes.json()) as any).result || []);\n\n // 5. Upload missing files as JSON with base64 content\n const toUpload = uploadEntries.filter((e) => missingHashes.has(e.key));\n if (toUpload.length > 0) {\n const uploadRes = await fetch(`${baseUrl}/pages/assets/upload`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${jwt}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(toUpload),\n });\n if (!uploadRes.ok) {\n throw new Error(`Failed to upload files: ${uploadRes.status} ${await uploadRes.text()}`);\n }\n }\n\n // 6. Upsert all hashes (register for future deduplication)\n const upsertRes = await fetch(`${baseUrl}/pages/assets/upsert-hashes`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${jwt}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ hashes: allHashes }),\n });\n if (!upsertRes.ok) {\n throw new Error(`Failed to upsert hashes: ${upsertRes.status} ${await upsertRes.text()}`);\n }\n\n // 7. Create deployment with manifest (and _worker.js if present)\n const formData = new FormData();\n formData.append(\"manifest\", JSON.stringify(manifest));\n if (workerScript) {\n formData.append(\n \"_worker.js\",\n new Blob([workerScript], { type: \"application/javascript+module\" }),\n \"_worker.js\",\n );\n }\n\n const deployRes = await fetch(\n `${baseUrl}/accounts/${accountId}/pages/projects/${projectName}/deployments`,\n {\n method: \"POST\",\n headers: { Authorization: `Bearer ${apiToken}` },\n body: formData,\n },\n );\n if (!deployRes.ok) {\n throw new Error(`Failed to create deployment: ${deployRes.status} ${await deployRes.text()}`);\n }\n\n const { result } = (await deployRes.json()) as any;\n return {\n id: result?.id || \"unknown\",\n url: result?.url || `https://${projectName}.pages.dev`,\n };\n }\n\n @Actions(\"/pages/:project\")\n async listPagesActions(ctx: RouteContext<{ project: string }>): Promise<AFSListResult> {\n if (this.config.accessMode !== \"readwrite\") {\n throw new AFSNotFoundError(\"Actions not available in readonly mode\");\n }\n const basePath = joinURL(\"/pages\", ctx.params.project, \".actions\");\n return {\n data: [\n {\n id: \"deploy\",\n path: joinURL(basePath, \"deploy\"),\n summary: \"Deploy new version\",\n meta: { kind: KINDS.EXECUTABLE, kinds: [KINDS.EXECUTABLE, KINDS.NODE] },\n },\n {\n id: \"rollback\",\n path: joinURL(basePath, \"rollback\"),\n summary: \"Rollback to specific deployment\",\n meta: { kind: KINDS.EXECUTABLE, kinds: [KINDS.EXECUTABLE, KINDS.NODE] },\n },\n {\n id: \"delete\",\n path: joinURL(basePath, \"delete\"),\n summary: \"Delete project (requires confirm: true)\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n required: [\"confirm\"],\n properties: {\n confirm: { type: \"boolean\", description: \"Must be true to confirm deletion\" },\n },\n },\n },\n },\n {\n id: \"configure-bindings\",\n path: joinURL(basePath, \"configure-bindings\"),\n summary: \"Configure Pages Functions bindings (KV, D1, R2, etc.)\",\n meta: {\n kind: KINDS.EXECUTABLE,\n kinds: [KINDS.EXECUTABLE, KINDS.NODE],\n inputSchema: {\n type: \"object\",\n properties: {\n environment: {\n type: \"string\",\n description: \"Environment to configure (default: production)\",\n },\n kv_namespaces: {\n type: \"object\",\n description: 'KV namespace bindings, e.g. {\"KV\":{\"namespace_id\":\"...\"}}',\n },\n d1_databases: {\n type: \"object\",\n description: 'D1 database bindings, e.g. {\"DB\":{\"id\":\"...\"}}',\n },\n r2_buckets: {\n type: \"object\",\n description: 'R2 bucket bindings, e.g. {\"BUCKET\":{\"name\":\"...\"}}',\n },\n compatibility_date: {\n type: \"string\",\n description: \"Compatibility date for Pages Functions\",\n },\n },\n },\n },\n },\n ],\n };\n }\n\n @Actions.Exec(\"/pages/:project\", \"deploy\")\n async execPagesDeploy(\n ctx: RouteContext<{ project: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n const directory = args.directory as string | undefined;\n\n if (directory) {\n // Upload new files from AFS directory via Direct Upload\n this.validateAfsPath(directory);\n const afs = this.getAfsFromContext(ctx);\n const deployment = await this.uploadPagesFiles(project, afs, directory);\n this.cache.invalidate(\"list:pages\");\n return {\n success: true,\n data: { deploymentId: deployment.id, url: deployment.url },\n };\n }\n\n // No directory: trigger deployment from production branch\n const deployment = (await this.client.pages.projects.deployments.create(project, {\n account_id: accountId,\n })) as any;\n this.cache.invalidate(\"list:pages\");\n return { success: true, data: { deploymentId: deployment?.id, url: deployment?.url } };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions.Exec(\"/pages/:project\", \"rollback\")\n async execPagesRollback(\n ctx: RouteContext<{ project: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { project } = ctx.params;\n const accountId = await this.accountId();\n const deploymentId = args.deploymentId as string;\n\n try {\n // Re-deploy the specified deployment\n const deployment = (await this.client.pages.projects.deployments.create(project, {\n account_id: accountId,\n })) as any;\n this.cache.invalidate(\"list:pages\");\n return { success: true, data: { deploymentId: deployment?.id, rolledBackTo: deploymentId } };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions.Exec(\"/pages/:project\", \"delete\")\n async execPagesDelete(\n ctx: RouteContext<{ project: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n\n if (args.confirm !== true) {\n throw confirmationRequired(\"delete\", ctx.path);\n }\n\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n try {\n await this.client.pages.projects.delete(project, { account_id: accountId });\n this.cache.invalidate(\"list:pages\");\n return { success: true, data: { deleted: project } };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n @Actions.Exec(\"/pages/:project\", \"configure-bindings\")\n async execPagesConfigureBindings(\n ctx: RouteContext<{ project: string }>,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n const { project } = ctx.params;\n const accountId = await this.accountId();\n\n const environment = (args.environment as string) || \"production\";\n const envConfig: Record<string, unknown> = {};\n if (args.kv_namespaces) envConfig.kv_namespaces = args.kv_namespaces;\n if (args.d1_databases) envConfig.d1_databases = args.d1_databases;\n if (args.r2_buckets) envConfig.r2_buckets = args.r2_buckets;\n if (args.compatibility_date) envConfig.compatibility_date = args.compatibility_date;\n\n try {\n await (this.client.pages.projects as any).edit(project, {\n account_id: accountId,\n deployment_configs: {\n [environment]: envConfig,\n },\n });\n this.cache.invalidate(\"list:pages\");\n return {\n success: true,\n data: { project, environment, bindings: Object.keys(envConfig) },\n };\n } catch (error) {\n throw mapCloudflareError(error, ctx.path);\n }\n }\n\n // ========== PAGES: Search ==========\n\n @Search(\"/pages\")\n async searchPages(\n _ctx: RouteContext,\n query: string,\n options?: AFSSearchOptions,\n ): Promise<AFSSearchResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n\n const projects = await this.collect(this.client.pages.projects.list({ account_id: accountId }));\n const matched = projects.filter((p: any) => minimatch(p.name, query));\n const limit = options?.limit ?? 100;\n\n const data: AFSEntry[] = matched.slice(0, limit).map((p: any) => ({\n id: p.name,\n path: joinURL(\"/pages\", p.name),\n summary: p.name,\n meta: { kind: KINDS.PAGES_PROJECT, kinds: [KINDS.PAGES_PROJECT, KINDS.NODE] },\n }));\n\n return { data };\n }\n\n // ========== BY-ZONE: List ==========\n\n @List(\"/by-zone\")\n async listByZone(_ctx: RouteContext): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n\n const cacheKey = \"list:by-zone\";\n const cached = this.cache.get<AFSEntry[]>(cacheKey);\n if (cached) return { data: cached };\n\n const zones = await this.collect(this.client.zones.list());\n const entries: AFSEntry[] = zones.map((z: any) => ({\n id: z.name,\n path: joinURL(\"/by-zone\", z.name),\n summary: z.name,\n meta: { kind: KINDS.ZONE, kinds: [KINDS.ZONE, KINDS.NODE], childrenCount: 2 },\n }));\n\n this.cache.set(cacheKey, entries);\n return { data: entries };\n }\n\n @List(\"/by-zone/:zone\")\n async listByZoneDir(ctx: RouteContext<{ zone: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { zone } = ctx.params;\n const accountId = await this.accountId();\n const basePath = joinURL(\"/by-zone\", zone);\n\n // Compute worker count for this zone\n const zones = await this.collect(this.client.zones.list());\n const zoneData = zones.find((z: any) => z.name === zone) as any;\n let workerCount = 0;\n if (zoneData) {\n const routes = await this.collect(this.client.workers.routes.list({ zone_id: zoneData.id }));\n workerCount = [...new Set(routes.map((r: any) => r.script).filter(Boolean))].length;\n }\n\n // Compute pages count for this zone\n const projects = await this.collect(this.client.pages.projects.list({ account_id: accountId }));\n let pagesCount = 0;\n for (const project of projects) {\n const domains = await this.collect(\n this.client.pages.projects.domains.list((project as any).name, { account_id: accountId }),\n );\n if (domains.some((d: any) => d.name.endsWith(zone))) pagesCount++;\n }\n\n return {\n data: [\n {\n id: \"workers\",\n path: joinURL(basePath, \"workers\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: workerCount },\n },\n {\n id: \"pages\",\n path: joinURL(basePath, \"pages\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: pagesCount },\n },\n ],\n };\n }\n\n @List(\"/by-zone/:zone/workers\")\n async listByZoneWorkers(ctx: RouteContext<{ zone: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { zone } = ctx.params;\n\n // Find zone ID\n const zones = await this.collect(this.client.zones.list());\n const zoneData = zones.find((z: any) => z.name === zone) as any;\n if (!zoneData) throw new AFSNotFoundError(`Zone not found: ${zone}`);\n\n // Get routes for this zone\n const routes = await this.collect(this.client.workers.routes.list({ zone_id: zoneData.id }));\n const workerNames = [...new Set(routes.map((r: any) => r.script).filter(Boolean))];\n\n const entries: AFSEntry[] = workerNames.map((name: string) => ({\n id: name,\n path: joinURL(\"/by-zone\", zone, \"workers\", name),\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE] },\n }));\n return { data: entries };\n }\n\n @List(\"/by-zone/:zone/pages\")\n async listByZonePages(ctx: RouteContext<{ zone: string }>): Promise<ListHandlerResult> {\n this.ensureNotDestroyed();\n const { zone } = ctx.params;\n const accountId = await this.accountId();\n\n // Pages are associated with zones through custom domains\n const projects = await this.collect(this.client.pages.projects.list({ account_id: accountId }));\n const matchingProjects: AFSEntry[] = [];\n\n for (const project of projects) {\n const domains = await this.collect(\n this.client.pages.projects.domains.list((project as any).name, { account_id: accountId }),\n );\n const hasZoneDomain = domains.some((d: any) => d.name.endsWith(zone));\n if (hasZoneDomain) {\n matchingProjects.push({\n id: (project as any).name,\n path: joinURL(\"/by-zone\", zone, \"pages\", (project as any).name),\n meta: { kind: KINDS.PAGES_PROJECT, kinds: [KINDS.PAGES_PROJECT, KINDS.NODE] },\n });\n }\n }\n return { data: matchingProjects };\n }\n\n // ========== BY-ZONE: Read ==========\n\n @Read(\"/by-zone\")\n async readByZone(_ctx: RouteContext): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const zones = await this.collect(this.client.zones.list());\n return {\n id: \"by-zone\",\n path: \"/by-zone\",\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: zones.length },\n };\n }\n\n @Read(\"/by-zone/:zone\")\n async readByZoneDir(ctx: RouteContext<{ zone: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.zone,\n path: joinURL(\"/by-zone\", ctx.params.zone),\n content: \"\",\n meta: { kind: KINDS.ZONE, kinds: [KINDS.ZONE, KINDS.NODE], childrenCount: 2 },\n };\n }\n\n @Read(\"/by-zone/:zone/workers\")\n async readByZoneWorkersDir(ctx: RouteContext<{ zone: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { zone } = ctx.params;\n const zones = await this.collect(this.client.zones.list());\n const zoneData = zones.find((z: any) => z.name === zone) as any;\n if (!zoneData) throw new AFSNotFoundError(`Zone not found: ${zone}`);\n const routes = await this.collect(this.client.workers.routes.list({ zone_id: zoneData.id }));\n const workerNames = [...new Set(routes.map((r: any) => r.script).filter(Boolean))];\n return {\n id: \"workers\",\n path: joinURL(\"/by-zone\", zone, \"workers\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: workerNames.length },\n };\n }\n\n @Read(\"/by-zone/:zone/workers/:name\")\n async readByZoneWorker(ctx: RouteContext<{ zone: string; name: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.name,\n path: joinURL(\"/by-zone\", ctx.params.zone, \"workers\", ctx.params.name),\n content: \"\",\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE] },\n };\n }\n\n @Read(\"/by-zone/:zone/pages\")\n async readByZonePagesDir(ctx: RouteContext<{ zone: string }>): Promise<AFSEntry> {\n this.ensureNotDestroyed();\n const { zone } = ctx.params;\n const accountId = await this.accountId();\n const projects = await this.collect(this.client.pages.projects.list({ account_id: accountId }));\n let matchCount = 0;\n for (const project of projects) {\n const domains = await this.collect(\n this.client.pages.projects.domains.list((project as any).name, { account_id: accountId }),\n );\n if (domains.some((d: any) => d.name.endsWith(zone))) matchCount++;\n }\n return {\n id: \"pages\",\n path: joinURL(\"/by-zone\", zone, \"pages\"),\n content: \"\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE], childrenCount: matchCount },\n };\n }\n\n @Read(\"/by-zone/:zone/pages/:project\")\n async readByZoneProject(ctx: RouteContext<{ zone: string; project: string }>): Promise<AFSEntry> {\n return {\n id: ctx.params.project,\n path: joinURL(\"/by-zone\", ctx.params.zone, \"pages\", ctx.params.project),\n content: \"\",\n meta: { kind: KINDS.PAGES_PROJECT, kinds: [KINDS.PAGES_PROJECT, KINDS.NODE] },\n };\n }\n\n // ========== BY-ZONE: Meta & Stat ==========\n\n @Meta(\"/by-zone\")\n async metaByZone(_ctx: RouteContext): Promise<AFSEntry> {\n return {\n id: \"by-zone\",\n path: \"/by-zone/.meta\",\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n };\n }\n\n @Stat(\"/by-zone\")\n @Stat(\"/by-zone/:zone\")\n @Stat(\"/by-zone/:zone/workers\")\n @Stat(\"/by-zone/:zone/workers/:name\")\n @Stat(\"/by-zone/:zone/pages\")\n @Stat(\"/by-zone/:zone/pages/:project\")\n async statByZone(\n ctx: RouteContext<{ zone?: string; name?: string; project?: string }>,\n ): Promise<AFSStatResult> {\n const parts = ctx.path\n .replace(/\\/.stat$/, \"\")\n .split(\"/\")\n .filter(Boolean);\n const id = parts[parts.length - 1] || \"by-zone\";\n return {\n data: {\n id,\n path: ctx.path.replace(/\\/.stat$/, \"\"),\n meta: { kind: KINDS.NODE, kinds: [KINDS.NODE] },\n },\n };\n }\n\n @Explain(\"/by-zone\")\n async explainByZone(_ctx: RouteContext): Promise<AFSExplainResult> {\n return {\n format: \"markdown\",\n content: `# By Zone\n\nResources grouped by DNS zone. Workers are associated through route bindings, Pages through custom domains.\n`,\n };\n }\n\n // ========== Global Search ==========\n\n @Search(\"/\")\n async searchRoot(\n _ctx: RouteContext,\n query: string,\n options?: AFSSearchOptions,\n ): Promise<AFSSearchResult> {\n this.ensureNotDestroyed();\n const accountId = await this.accountId();\n const limit = options?.limit ?? 100;\n const results: AFSEntry[] = [];\n\n // Search across all resource types\n const [workers, kvNamespaces, pagesProjects] = await Promise.all([\n this.collect(this.client.workers.scripts.list({ account_id: accountId })),\n this.collect(this.client.kv.namespaces.list({ account_id: accountId })),\n this.collect(this.client.pages.projects.list({ account_id: accountId })),\n ]);\n\n for (const w of workers) {\n if (minimatch((w as any).id, query) && results.length < limit) {\n results.push({\n id: (w as any).id,\n path: joinURL(\"/workers\", (w as any).id),\n summary: (w as any).id,\n meta: { kind: KINDS.WORKER, kinds: [KINDS.WORKER, KINDS.NODE] },\n });\n }\n }\n for (const ns of kvNamespaces) {\n if (minimatch((ns as any).title, query) && results.length < limit) {\n results.push({\n id: (ns as any).title,\n path: joinURL(\"/kv\", (ns as any).title),\n summary: (ns as any).title,\n meta: { kind: KINDS.KV_NAMESPACE, kinds: [KINDS.KV_NAMESPACE, KINDS.NODE] },\n });\n }\n }\n for (const p of pagesProjects) {\n if (minimatch((p as any).name, query) && results.length < limit) {\n results.push({\n id: (p as any).name,\n path: joinURL(\"/pages\", (p as any).name),\n summary: (p as any).name,\n meta: { kind: KINDS.PAGES_PROJECT, kinds: [KINDS.PAGES_PROJECT, KINDS.NODE] },\n });\n }\n }\n\n return { data: results };\n }\n\n // ========== Catch-all Delete ==========\n\n @Delete(\"/:path+\")\n async deleteCatchAll(ctx: RouteContext<{ path: string }>): Promise<AFSDeleteResult> {\n this.ensureNotDestroyed();\n this.requireReadwrite(ctx.path);\n throw new AFSNotFoundError(`Cannot delete: ${ctx.path}`);\n }\n\n // ========== Lifecycle ==========\n\n async destroy(): Promise<void> {\n if (this.destroyed) return;\n this.destroyed = true;\n await this.cfClient.destroy();\n this.cache.clear();\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n description: this.description,\n accessMode: this.accessMode,\n accountId: this.config.accountId,\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+
2
+ //#region src/errors.ts
3
+ const AFS_ERROR_CODES = {
4
+ ENTRY_NOT_FOUND: "ENTRY_NOT_FOUND",
5
+ INVALID_PATH: "INVALID_PATH",
6
+ PERMISSION_DENIED: "PERMISSION_DENIED",
7
+ READONLY_ERROR: "READONLY_ERROR",
8
+ RATE_LIMITED: "RATE_LIMITED",
9
+ INTERNAL_ERROR: "INTERNAL_ERROR",
10
+ CONFIRMATION_REQUIRED: "CONFIRMATION_REQUIRED",
11
+ OPERATION_FAILED: "OPERATION_FAILED",
12
+ AUTH_ERROR: "AUTH_ERROR"
13
+ };
14
+ const CF_ERROR_MAP = {
15
+ 1e4: AFS_ERROR_CODES.AUTH_ERROR,
16
+ 10001: AFS_ERROR_CODES.PERMISSION_DENIED,
17
+ 10007: AFS_ERROR_CODES.ENTRY_NOT_FOUND,
18
+ 10014: AFS_ERROR_CODES.RATE_LIMITED,
19
+ 10021: AFS_ERROR_CODES.OPERATION_FAILED
20
+ };
21
+ var AFSError = class AFSError extends Error {
22
+ code;
23
+ cause;
24
+ path;
25
+ constructor(code, message, options) {
26
+ super(message);
27
+ this.name = "AFSError";
28
+ this.code = code;
29
+ this.cause = options?.cause;
30
+ this.path = options?.path;
31
+ if (Error.captureStackTrace) Error.captureStackTrace(this, AFSError);
32
+ }
33
+ toJSON() {
34
+ return {
35
+ name: this.name,
36
+ code: this.code,
37
+ message: this.message,
38
+ path: this.path
39
+ };
40
+ }
41
+ };
42
+ const SENSITIVE_PATTERNS = [/[A-Za-z0-9_-]{40,}/g, /[0-9a-f]{32}/gi];
43
+ function maskSensitiveData(message) {
44
+ let masked = message;
45
+ for (const pattern of SENSITIVE_PATTERNS) masked = masked.replace(pattern, (match) => {
46
+ if (match.length <= 4) return "***";
47
+ return `${match.substring(0, 4)}***`;
48
+ });
49
+ return masked;
50
+ }
51
+ function mapCloudflareError(error, path) {
52
+ if (!(error instanceof Error)) return new AFSError(AFS_ERROR_CODES.INTERNAL_ERROR, "Unknown error occurred", { path });
53
+ const errorCode = error.error?.code;
54
+ const afsCode = errorCode && CF_ERROR_MAP[errorCode] || AFS_ERROR_CODES.INTERNAL_ERROR;
55
+ const maskedMessage = maskSensitiveData(error.message || "Unknown error");
56
+ let friendlyMessage;
57
+ switch (afsCode) {
58
+ case AFS_ERROR_CODES.ENTRY_NOT_FOUND:
59
+ friendlyMessage = path ? `Resource not found: ${path}` : "The requested resource was not found";
60
+ break;
61
+ case AFS_ERROR_CODES.AUTH_ERROR:
62
+ friendlyMessage = "Authentication failed. Check your Cloudflare API token.";
63
+ break;
64
+ case AFS_ERROR_CODES.PERMISSION_DENIED:
65
+ friendlyMessage = "Permission denied. Check your API token permissions.";
66
+ break;
67
+ case AFS_ERROR_CODES.RATE_LIMITED:
68
+ friendlyMessage = "Rate limit exceeded (1200 req/5min). Please retry after a short delay.";
69
+ break;
70
+ default: friendlyMessage = `Cloudflare operation failed: ${maskedMessage}`;
71
+ }
72
+ return new AFSError(afsCode, friendlyMessage, {
73
+ cause: error,
74
+ path
75
+ });
76
+ }
77
+ function confirmationRequired(action, path) {
78
+ return new AFSError(AFS_ERROR_CODES.CONFIRMATION_REQUIRED, `Action '${action}' requires explicit confirmation. Set { confirm: true } in input.`, { path });
79
+ }
80
+
81
+ //#endregion
82
+ exports.AFSError = AFSError;
83
+ exports.AFS_ERROR_CODES = AFS_ERROR_CODES;
84
+ exports.confirmationRequired = confirmationRequired;
85
+ exports.mapCloudflareError = mapCloudflareError;
@@ -0,0 +1,26 @@
1
+ //#region src/errors.d.ts
2
+ declare const AFS_ERROR_CODES: {
3
+ readonly ENTRY_NOT_FOUND: "ENTRY_NOT_FOUND";
4
+ readonly INVALID_PATH: "INVALID_PATH";
5
+ readonly PERMISSION_DENIED: "PERMISSION_DENIED";
6
+ readonly READONLY_ERROR: "READONLY_ERROR";
7
+ readonly RATE_LIMITED: "RATE_LIMITED";
8
+ readonly INTERNAL_ERROR: "INTERNAL_ERROR";
9
+ readonly CONFIRMATION_REQUIRED: "CONFIRMATION_REQUIRED";
10
+ readonly OPERATION_FAILED: "OPERATION_FAILED";
11
+ readonly AUTH_ERROR: "AUTH_ERROR";
12
+ };
13
+ type AFSErrorCode = (typeof AFS_ERROR_CODES)[keyof typeof AFS_ERROR_CODES];
14
+ declare class AFSError extends Error {
15
+ readonly code: AFSErrorCode;
16
+ readonly cause?: Error;
17
+ readonly path?: string;
18
+ constructor(code: AFSErrorCode, message: string, options?: {
19
+ cause?: Error;
20
+ path?: string;
21
+ });
22
+ toJSON(): Record<string, unknown>;
23
+ }
24
+ //#endregion
25
+ export { AFSError, AFS_ERROR_CODES };
26
+ //# sourceMappingURL=errors.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.cts","names":[],"sources":["../src/errors.ts"],"mappings":";cACa,eAAA;EAAA;;;;;;;;;;KAYD,YAAA,WAAuB,eAAA,eAA8B,eAAA;AAAA,cAYpD,QAAA,SAAiB,KAAA;EAAA,SACnB,IAAA,EAAM,YAAA;EAAA,SACN,KAAA,GAAQ,KAAA;EAAA,SACR,IAAA;cAEG,IAAA,EAAM,YAAA,EAAc,OAAA,UAAiB,OAAA;IAAY,KAAA,GAAQ,KAAA;IAAO,IAAA;EAAA;EAY5E,MAAA,CAAA,GAAU,MAAA;AAAA"}
@@ -0,0 +1,26 @@
1
+ //#region src/errors.d.ts
2
+ declare const AFS_ERROR_CODES: {
3
+ readonly ENTRY_NOT_FOUND: "ENTRY_NOT_FOUND";
4
+ readonly INVALID_PATH: "INVALID_PATH";
5
+ readonly PERMISSION_DENIED: "PERMISSION_DENIED";
6
+ readonly READONLY_ERROR: "READONLY_ERROR";
7
+ readonly RATE_LIMITED: "RATE_LIMITED";
8
+ readonly INTERNAL_ERROR: "INTERNAL_ERROR";
9
+ readonly CONFIRMATION_REQUIRED: "CONFIRMATION_REQUIRED";
10
+ readonly OPERATION_FAILED: "OPERATION_FAILED";
11
+ readonly AUTH_ERROR: "AUTH_ERROR";
12
+ };
13
+ type AFSErrorCode = (typeof AFS_ERROR_CODES)[keyof typeof AFS_ERROR_CODES];
14
+ declare class AFSError extends Error {
15
+ readonly code: AFSErrorCode;
16
+ readonly cause?: Error;
17
+ readonly path?: string;
18
+ constructor(code: AFSErrorCode, message: string, options?: {
19
+ cause?: Error;
20
+ path?: string;
21
+ });
22
+ toJSON(): Record<string, unknown>;
23
+ }
24
+ //#endregion
25
+ export { AFSError, AFS_ERROR_CODES };
26
+ //# sourceMappingURL=errors.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.mts","names":[],"sources":["../src/errors.ts"],"mappings":";cACa,eAAA;EAAA;;;;;;;;;;KAYD,YAAA,WAAuB,eAAA,eAA8B,eAAA;AAAA,cAYpD,QAAA,SAAiB,KAAA;EAAA,SACnB,IAAA,EAAM,YAAA;EAAA,SACN,KAAA,GAAQ,KAAA;EAAA,SACR,IAAA;cAEG,IAAA,EAAM,YAAA,EAAc,OAAA,UAAiB,OAAA;IAAY,KAAA,GAAQ,KAAA;IAAO,IAAA;EAAA;EAY5E,MAAA,CAAA,GAAU,MAAA;AAAA"}