@dragonmastery/tamer 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +2 -1
  2. package/dist/{StateManager-DTqtLLVX.mjs → StateManager-JLBtz9V-.mjs} +2 -2
  3. package/dist/{StateManager-DTqtLLVX.mjs.map → StateManager-JLBtz9V-.mjs.map} +1 -1
  4. package/dist/{apply-B0b_jjGv.mjs → apply-CWU3HY0P.mjs} +13 -13
  5. package/dist/{apply-B0b_jjGv.mjs.map → apply-CWU3HY0P.mjs.map} +1 -1
  6. package/dist/{applyTarget-BetDYdeS.mjs → applyTarget-D15T_q7G.mjs} +3 -3
  7. package/dist/{applyTarget-BetDYdeS.mjs.map → applyTarget-D15T_q7G.mjs.map} +1 -1
  8. package/dist/{bootstrap-CBzPilB1.mjs → bootstrap-BicPW44a.mjs} +3 -3
  9. package/dist/{bootstrap-CBzPilB1.mjs.map → bootstrap-BicPW44a.mjs.map} +1 -1
  10. package/dist/{cloudflareSnapshot-B4FOaNr0.mjs → cloudflareSnapshot-GBUHeg2m.mjs} +7 -7
  11. package/dist/{cloudflareSnapshot-B4FOaNr0.mjs.map → cloudflareSnapshot-GBUHeg2m.mjs.map} +1 -1
  12. package/dist/{deploy-gHEQxhmx.mjs → deploy-DAEjDjOm.mjs} +8 -8
  13. package/dist/{deploy-gHEQxhmx.mjs.map → deploy-DAEjDjOm.mjs.map} +1 -1
  14. package/dist/{destroy-B21f3wgq.mjs → destroy-DtgPD_bD.mjs} +11 -11
  15. package/dist/{destroy-B21f3wgq.mjs.map → destroy-DtgPD_bD.mjs.map} +1 -1
  16. package/dist/{destroy-tenant-BW2nasnK.mjs → destroy-tenant-B-VLKfc6.mjs} +3 -3
  17. package/dist/{destroy-tenant-BW2nasnK.mjs.map → destroy-tenant-B-VLKfc6.mjs.map} +1 -1
  18. package/dist/{dev-Dt26nzMJ.mjs → dev-BYItpt9U.mjs} +8 -8
  19. package/dist/{dev-Dt26nzMJ.mjs.map → dev-BYItpt9U.mjs.map} +1 -1
  20. package/dist/{dns-records.sync-Bpzz9H0s.mjs → dns-records.sync-CfI1mqXv.mjs} +2 -2
  21. package/dist/{dns-records.sync-Bpzz9H0s.mjs.map → dns-records.sync-CfI1mqXv.mjs.map} +1 -1
  22. package/dist/drift-DRnwTyZD.mjs +10 -0
  23. package/dist/{drift-D8ZrSgTn.mjs → drift-DncpkI2R.mjs} +8 -8
  24. package/dist/{drift-D8ZrSgTn.mjs.map → drift-DncpkI2R.mjs.map} +1 -1
  25. package/dist/{events-BSwGdkGj.mjs → events-B6oCdvSt.mjs} +3 -3
  26. package/dist/{events-BSwGdkGj.mjs.map → events-B6oCdvSt.mjs.map} +1 -1
  27. package/dist/{fetchStackImports-B4ZJahOt.mjs → fetchStackImports-ClUYZy_U.mjs} +294 -101
  28. package/dist/fetchStackImports-ClUYZy_U.mjs.map +1 -0
  29. package/dist/{generator-CIMbcPzv.mjs → generator-h_VG0Q5f.mjs} +6 -5
  30. package/dist/generator-h_VG0Q5f.mjs.map +1 -0
  31. package/dist/{import-BrduwA9Z.mjs → import-D8zaVvwK.mjs} +6 -4
  32. package/dist/import-D8zaVvwK.mjs.map +1 -0
  33. package/dist/index.d.mts +154 -4
  34. package/dist/index.d.mts.map +1 -1
  35. package/dist/index.mjs +1 -1
  36. package/dist/{loader-DP7yXqT6.mjs → loader-DnT9iqz9.mjs} +17 -4
  37. package/dist/loader-DnT9iqz9.mjs.map +1 -0
  38. package/dist/{logpush-job-xS7270FZ.mjs → logpush-job-DsRkOORJ.mjs} +2 -2
  39. package/dist/{logpush-job-xS7270FZ.mjs.map → logpush-job-DsRkOORJ.mjs.map} +1 -1
  40. package/dist/{migrate-CahG6BYV.mjs → migrate-Bwl0w6XN.mjs} +5 -5
  41. package/dist/{migrate-CahG6BYV.mjs.map → migrate-Bwl0w6XN.mjs.map} +1 -1
  42. package/dist/{normalize-Bx0bpFop.mjs → normalize-DVSTRZhO.mjs} +18 -1
  43. package/dist/normalize-DVSTRZhO.mjs.map +1 -0
  44. package/dist/{plan-DWvsvy1U.mjs → plan-BNIAD--f.mjs} +11 -11
  45. package/dist/{plan-DWvsvy1U.mjs.map → plan-BNIAD--f.mjs.map} +1 -1
  46. package/dist/{provision-tenant-WTKo93Y0.mjs → provision-tenant-BcZocyyn.mjs} +4 -4
  47. package/dist/{provision-tenant-WTKo93Y0.mjs.map → provision-tenant-BcZocyyn.mjs.map} +1 -1
  48. package/dist/{stackOutputs-W9mnnJuj.mjs → stackOutputs-D33EmyfT.mjs} +3 -3
  49. package/dist/{stackOutputs-W9mnnJuj.mjs.map → stackOutputs-D33EmyfT.mjs.map} +1 -1
  50. package/dist/{status-DLwREPjb.mjs → status-BAPpi2Zt.mjs} +7 -7
  51. package/dist/{status-DLwREPjb.mjs.map → status-BAPpi2Zt.mjs.map} +1 -1
  52. package/dist/{sync-f2K2blwm.mjs → sync-BdJ43vO7.mjs} +8 -8
  53. package/dist/{sync-f2K2blwm.mjs.map → sync-BdJ43vO7.mjs.map} +1 -1
  54. package/dist/tamer.mjs +32 -18
  55. package/dist/tamer.mjs.map +1 -1
  56. package/dist/{types-CqxqYnrT.mjs → types-CN1BOr0U.mjs} +5 -5
  57. package/dist/{types-CqxqYnrT.mjs.map → types-CN1BOr0U.mjs.map} +1 -1
  58. package/dist/{verifyPlanFile-c16z1AMH.mjs → verifyPlanFile-BQ7GCDC2.mjs} +2 -2
  59. package/dist/{verifyPlanFile-c16z1AMH.mjs.map → verifyPlanFile-BQ7GCDC2.mjs.map} +1 -1
  60. package/dist/{wfp-delete-DysvX1u7.mjs → wfp-delete-BG9WBd7F.mjs} +2 -2
  61. package/dist/{wfp-delete-DysvX1u7.mjs.map → wfp-delete-BG9WBd7F.mjs.map} +1 -1
  62. package/dist/{wfp-put-jaVd_LjO.mjs → wfp-put-DjErqxFa.mjs} +2 -2
  63. package/dist/{wfp-put-jaVd_LjO.mjs.map → wfp-put-DjErqxFa.mjs.map} +1 -1
  64. package/dist/{worker-route-Be2IvOdr.mjs → worker-route-DY1onr-h.mjs} +3 -3
  65. package/dist/{worker-route-Be2IvOdr.mjs.map → worker-route-DY1onr-h.mjs.map} +1 -1
  66. package/dist/{workers-aGILs77X.mjs → workers-DNKsZOq4.mjs} +3 -3
  67. package/dist/{workers-aGILs77X.mjs.map → workers-DNKsZOq4.mjs.map} +1 -1
  68. package/package.json +1 -1
  69. package/dist/drift-D5qzCTft.mjs +0 -10
  70. package/dist/fetchStackImports-B4ZJahOt.mjs.map +0 -1
  71. package/dist/generator-CIMbcPzv.mjs.map +0 -1
  72. package/dist/import-BrduwA9Z.mjs.map +0 -1
  73. package/dist/loader-DP7yXqT6.mjs.map +0 -1
  74. package/dist/normalize-Bx0bpFop.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchStackImports-ClUYZy_U.mjs","names":["tenant: TenantMeta","conventions?: NamingConventions","out: Route[]","fieldPath: string","out: Record<string, string>","target: WorkerConfig | undefined","next: WorkerConfig","mergedRoutes: Route[]","wranglerRoutes: Route[] | undefined","override","todayIso","derivedName","uuid","shardDate","drift: ResourceDrift","bindings: WranglerD1Database[]","results: D1StatusResult[]","d1Module: ResourceModule<D1ResourceConfig, CFD1>","entry: D1StateEntry","errors: string[]","drift: ResourceDrift","bindings: WranglerR2Bucket[]","results: R2StatusResult[]","r2Module: ResourceModule<R2ResourceConfig, CFR2>","entry: R2StateEntry","drift: ResourceDrift","bindings: WranglerKVNamespace[]","results: KVStatusResult[]","kvModule: ResourceModule<KVResourceConfig, CFKv>","entry: KVStateEntry","STATE_KEY_PREFIX","stateKey","drift: ResourceDrift","producers: Array<{ binding: string; queue: string }>","out: QueuesStatusResult[]","queuesModule: ResourceModule<QueueResourceConfig, CFQueue>","out: NonNullable<\n import(\"../../generated/wrangler-types.js\").WranglerConfig[\"queues\"]\n >","entry: QueueStateEntry","items: PlanItem[]","computeChanges","formatVal","changes: PlanFieldChange[]","STATE_KEY_PREFIX","stateKey","origin","drift: ResourceDrift","out: GeneratedHyperdriveBinding[]","out: HyperdriveStatusResult[]","hyperdriveModule: ResourceModule<\n HyperdriveResourceConfig,\n CFHyperdrive\n>","entry: HyperdriveStateEntry","STATE_KEY_PREFIX","stateKey","drift: ResourceDrift","out: GeneratedVectorizeBinding[]","out: VectorizeStatusResult[]","items: PlanItem[]","changes: PlanFieldChange[]","vectorizeModule: ResourceModule<\n VectorizeResourceConfig,\n CFVectorize\n>","entry: VectorizeStateEntry","items: PlanItem[]","formatVal","changes: PlanFieldChange[]","STATE_KEY_PREFIX","stateKey","drift: ResourceDrift","out: AIGatewayStatusResult[]","aiGatewayModule: ResourceModule<\n AIGatewayResourceConfig,\n CFAIGateway\n>","entry: AIGatewayStateEntry","STATE_KEY_PREFIX","stateKey","drift: ResourceDrift","out: GeneratedPipelineBinding[]","out: PipelineStatusResult[]","items: PlanItem[]","changes: PlanFieldChange[]","pipelinesModule: ResourceModule<\n PipelineResourceConfig,\n CFPipeline\n>","entry: PipelineStateEntry","items: PlanItem[]","changes: PlanFieldChange[]","STATE_KEY_PREFIX","stateKey","entry: WorkflowStateEntry","entry: WorkflowStateEntry","drift: ResourceDrift","out: GeneratedWorkflowBinding[]","binding: GeneratedWorkflowBinding","out: WorkflowStatusResult[]","workflowsModule: ResourceModule<\n WorkflowResourceConfig,\n CFWorkflow\n>","entry: WorkflowStateEntry","allStores:\n | Awaited<ReturnType<typeof api.secretsStoreListAll>>\n | null","cfId: string","entry: SecretsStoreStateEntry","entry: SecretsStoreStateEntry","drift: ResourceDrift","out: SecretsStoreStatusResult[]","secretsStoreModule: ResourceModule<\n SecretsStoreResourceConfig,\n CFSecretsStore\n>","entry: SecretsStoreStateEntry","resourceModules: ReadonlyArray<ResourceModule>","moduleByKind: Map<ResourceKind, ResourceModule>","refs: DiscoveredImportRef[]","m: RegExpExecArray | null","out: Record<string, Record<string, string>>","flat: Record<string, string>"],"sources":["../src/core/naming/NamingEngine.ts","../src/core/config/namingFromConfig.ts","../src/core/routes/routes.resolve.ts","../src/core/wrangler/wranglerOutFile.ts","../src/core/references/references.ts","../src/core/config/resolver.ts","../src/core/naming/resolveCloudflareName.ts","../src/features/d1/d1.ownership.ts","../src/features/d1/d1.naming.ts","../src/features/d1/d1.apply.ts","../src/features/d1/d1.sync.ts","../src/features/d1/d1.drift.ts","../src/core/config/resourcesFromConfig.ts","../src/features/d1/d1.destroy.ts","../src/features/d1/d1.generate.ts","../src/features/d1/d1.status.ts","../src/core/registry/pickResources.ts","../src/core/registry/findResourceForImport.ts","../src/features/d1/d1.module.ts","../src/features/r2/r2.naming.ts","../src/features/r2/r2.apply.ts","../src/features/r2/r2.sync.ts","../src/features/r2/r2.drift.ts","../src/features/r2/r2.destroy.ts","../src/features/r2/r2.generate.ts","../src/features/r2/r2.status.ts","../src/features/r2/r2.module.ts","../src/features/kv/kv.naming.ts","../src/features/kv/kv.apply.ts","../src/features/kv/kv.sync.ts","../src/features/kv/kv.drift.ts","../src/features/kv/kv.destroy.ts","../src/features/kv/kv.generate.ts","../src/features/kv/kv.status.ts","../src/features/kv/kv.module.ts","../src/features/queues/queues.naming.ts","../src/features/queues/queues.apply.ts","../src/features/queues/queues.sync.ts","../src/features/queues/queues.drift.ts","../src/features/queues/queues.destroy.ts","../src/features/queues/queues.generate.ts","../src/features/queues/queues.status.ts","../src/features/queues/queues.module.ts","../src/features/hyperdrive/hyperdrive.secrets.ts","../src/features/hyperdrive/hyperdrive.naming.ts","../src/features/hyperdrive/hyperdrive.diff.ts","../src/features/hyperdrive/hyperdrive.apply.ts","../src/features/hyperdrive/hyperdrive.sync.ts","../src/features/hyperdrive/hyperdrive.drift.ts","../src/features/hyperdrive/hyperdrive.destroy.ts","../src/features/hyperdrive/hyperdrive.generate.ts","../src/features/hyperdrive/hyperdrive.status.ts","../src/features/hyperdrive/hyperdrive.module.ts","../src/features/vectorize/vectorize.naming.ts","../src/features/vectorize/vectorize.apply.ts","../src/features/vectorize/vectorize.sync.ts","../src/features/vectorize/vectorize.drift.ts","../src/features/vectorize/vectorize.destroy.ts","../src/features/vectorize/vectorize.generate.ts","../src/features/vectorize/vectorize.status.ts","../src/features/vectorize/vectorize.diff.ts","../src/features/vectorize/vectorize.module.ts","../src/features/ai-gateway/ai-gateway.types.ts","../src/features/ai-gateway/ai-gateway.naming.ts","../src/features/ai-gateway/ai-gateway.diff.ts","../src/features/ai-gateway/ai-gateway.apply.ts","../src/features/ai-gateway/ai-gateway.sync.ts","../src/features/ai-gateway/ai-gateway.drift.ts","../src/features/ai-gateway/ai-gateway.destroy.ts","../src/features/ai-gateway/ai-gateway.status.ts","../src/features/ai-gateway/ai-gateway.module.ts","../src/features/pipelines/pipelines.naming.ts","../src/features/pipelines/pipelines.apply.ts","../src/features/pipelines/pipelines.sync.ts","../src/features/pipelines/pipelines.drift.ts","../src/features/pipelines/pipelines.destroy.ts","../src/features/pipelines/pipelines.generate.ts","../src/features/pipelines/pipelines.status.ts","../src/features/pipelines/pipelines.diff.ts","../src/features/pipelines/pipelines.module.ts","../src/features/workflows/workflows.naming.ts","../src/features/workflows/workflows.diff.ts","../src/features/workflows/workflows.apply.ts","../src/features/workflows/workflows.sync.ts","../src/features/workflows/workflows.drift.ts","../src/features/workflows/workflows.destroy.ts","../src/features/workflows/workflows.generate.ts","../src/features/workflows/workflows.status.ts","../src/features/workflows/workflows.module.ts","../src/features/secrets-store/secrets-store.naming.ts","../src/features/secrets-store/secrets-store.apply.ts","../src/features/secrets-store/secrets-store.sync.ts","../src/features/secrets-store/secrets-store.drift.ts","../src/features/secrets-store/secrets-store.destroy.ts","../src/features/secrets-store/secrets-store.status.ts","../src/features/secrets-store/secrets-store.module.ts","../src/core/registry/registry.ts","../src/core/imports/fetchStackImports.ts"],"sourcesContent":["import type { NamingConventions, TenantMeta } from \"../../types.js\";\n\nfunction reLiteral(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport class NamingEngine {\n constructor(\n private tenant: TenantMeta,\n private conventions?: NamingConventions\n ) {}\n\n /** Tenant id for per-resource {@link CloudflareNameFn} overrides. */\n get tenantId(): string {\n return this.tenant.id;\n }\n\n d1SingleName(logicalName: string, env: string): string {\n if (this.conventions?.d1Single) {\n return this.conventions.d1Single(logicalName, this.tenant.id, env);\n }\n return `db_${logicalName}_t_${this.tenant.id}_${env}`;\n }\n\n d1ShardName(\n logicalName: string,\n shardDate: string,\n env: string\n ): string {\n if (this.conventions?.d1Shard) {\n return this.conventions.d1Shard(\n logicalName,\n shardDate,\n this.tenant.id,\n env\n );\n }\n const dateNoDashes = shardDate.replace(/-/g, \"\");\n if (logicalName === \"default\" || logicalName === \"\") {\n return `db_${dateNoDashes}_t_${this.tenant.id}_${env}`;\n }\n return `db_${logicalName}_${dateNoDashes}_t_${this.tenant.id}_${env}`;\n }\n\n d1SingleBindingKey(logicalName: string): string {\n return `DB_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n d1ShardBindingKey(logicalName: string, shardDate: string): string {\n const dateNoDashes = shardDate.replace(/-/g, \"\");\n return `DB_${logicalName.toUpperCase().replace(/-/g, \"_\")}_${dateNoDashes}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n r2BucketName(logicalName: string, env: string): string {\n if (this.conventions?.r2Bucket) {\n const dateNoDashes = new Date().toISOString().slice(0, 10).replace(/-/g, \"\");\n return this.conventions.r2Bucket(\n logicalName,\n dateNoDashes,\n this.tenant.id,\n env,\n );\n }\n return `r2-${logicalName}-t-${this.tenant.id}-${env}`;\n }\n\n /**\n * Wrangler `r2_buckets[].binding`: logical + tenant only (same idea as {@link kvBindingKey}).\n * Stable across envs; default {@link r2BucketName} is `r2-{logical}-t-{tenant}-{env}`.\n */\n r2BindingKey(logicalName: string): string {\n return `R2_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n kvNamespaceName(logicalName: string, env: string): string {\n return `kv_${logicalName}_t_${this.tenant.id}_${env}`;\n }\n\n kvBindingKey(logicalName: string): string {\n return `KV_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n queueName(logicalName: string, env: string): string {\n return `q-${logicalName}-t-${this.tenant.id}-${env}`;\n }\n\n queueBindingKey(logicalName: string): string {\n return `Q_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n hyperdriveName(logicalName: string, env: string): string {\n return `hd-${logicalName}-t-${this.tenant.id}-${env}`;\n }\n\n hyperdriveBindingKey(logicalName: string): string {\n return `HD_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n vectorizeName(logicalName: string, env: string): string {\n return `vec-${logicalName}-t-${this.tenant.id}-${env}`;\n }\n\n vectorizeBindingKey(logicalName: string): string {\n return `VEC_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n /**\n * AI Gateway slug (== Cloudflare gateway id). Per the Cloudflare API,\n * gateway ids are case-sensitive lowercase ascii with `-`/`_`. Format:\n * `aigw-{logical}-t-{tenantId}-{env}`.\n */\n aiGatewayId(logicalName: string, env: string): string {\n return `aigw-${logicalName}-t-${this.tenant.id}-${env}`.toLowerCase();\n }\n\n /**\n * Stable cross-reference binding key for AI Gateway. AI Gateway has no\n * Wrangler binding kind today, so this is only consumed by\n * `${tamer:ai_gateway:<logical>.binding}` interpolations.\n */\n aiGatewayBindingKey(logicalName: string): string {\n return `AI_GW_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n /**\n * Cloudflare-side pipeline name. Pipelines V1 names must be lowercase\n * alphanumerics + hyphens (no underscores), so we mirror the R2 scheme.\n * Pattern: `pipe-{logical}-t-{tenantId}-{env}`.\n */\n pipelineName(logicalName: string, env: string): string {\n return `pipe-${logicalName}-t-${this.tenant.id}-${env}`.toLowerCase();\n }\n\n /**\n * Wrangler binding key emitted in `pipelines[]`. Uppercased logical with\n * the tenant id appended so two tenants can share a worker namespace\n * without colliding bindings.\n */\n pipelineBindingKey(logicalName: string): string {\n return `PIPE_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n pipelineMatchPattern(\n logicalName: string,\n env: string,\n ): (name: string) => boolean {\n const exact = this.pipelineName(logicalName, env);\n return (name: string) => name === exact;\n }\n\n /**\n * Cloudflare-side workflow name. Workflow names accept lowercase\n * alphanumerics + hyphens; we mirror the pipelines/AI-Gateway hyphen\n * scheme. Pattern: `wf-{logical}-t-{tenantId}-{env}`.\n */\n workflowName(logicalName: string, env: string): string {\n if (this.conventions?.workflow) {\n return this.conventions.workflow(logicalName, this.tenant.id, env);\n }\n return `wf-${logicalName}-t-${this.tenant.id}-${env}`.toLowerCase();\n }\n\n /**\n * Wrangler binding key emitted in `workflows[]`. Uppercased logical with\n * the tenant id appended so two tenants sharing a script can't collide.\n */\n workflowBindingKey(logicalName: string): string {\n return `WF_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n workflowMatchPattern(\n logicalName: string,\n env: string,\n ): (name: string) => boolean {\n const exact = this.workflowName(logicalName, env);\n return (name: string) => name === exact;\n }\n\n /**\n * Cloudflare Secrets Store name. Account-scoped — the API allows free-form\n * names (the dashboard examples use both `service_x_keys` and dashed\n * variants), so we mirror our hyphen convention for consistency with\n * pipelines / workflows / AI Gateway. Pattern:\n * `sec-{logical}-t-{tenantId}-{env}`.\n */\n secretsStoreName(logicalName: string, env: string): string {\n return `sec-${logicalName}-t-${this.tenant.id}-${env}`.toLowerCase();\n }\n\n /**\n * Stable cross-reference key for the store. Secrets Store has no Wrangler\n * binding kind directly — `secrets_store_secrets[]` references the\n * resolved `store_id`, not the store name — so this only powers\n * `${tamer:secret_store:<n>.binding}` interpolations.\n */\n secretsStoreBindingKey(logicalName: string): string {\n return `SEC_${logicalName.toUpperCase().replace(/-/g, \"_\")}_T_${this.tenant.id.toUpperCase()}`;\n }\n\n secretsStoreMatchPattern(\n logicalName: string,\n env: string,\n ): (name: string) => boolean {\n const exact = this.secretsStoreName(logicalName, env);\n return (name: string) => name === exact;\n }\n\n workerName(workerKey: string, env: string | \"local\"): string {\n if (this.conventions?.workerName) {\n return this.conventions.workerName(\n this.tenant.slug,\n workerKey,\n env,\n this.tenant.id\n );\n }\n if (env === \"local\") {\n return `${this.tenant.slug}-${workerKey}-${this.tenant.id}`;\n }\n return `${this.tenant.slug}-${workerKey}-${env}-${this.tenant.id}`;\n }\n\n /** Whether stack {@link NamingConventions.d1Shard} is configured. */\n hasD1ShardConvention(): boolean {\n return Boolean(this.conventions?.d1Shard);\n }\n\n d1MatchPattern(logicalName: string, env: string): (name: string) => boolean {\n if (this.conventions?.d1Shard) {\n return (name: string) => {\n const shardDate = this.extractD1ShardDate(name);\n if (!shardDate) return false;\n return this.d1ShardName(logicalName, shardDate, env) === name;\n };\n }\n const suffix = `_t_${this.tenant.id}_${env}`;\n if (logicalName === \"default\" || logicalName === \"\") {\n return (name: string) =>\n /^db_\\d{8}_t_/.test(name) && name.endsWith(suffix);\n }\n const prefix = `db_${logicalName}_`;\n return (name: string) =>\n name.startsWith(prefix) && name.endsWith(suffix);\n }\n\n /**\n * Default: exact {@link r2BucketName}, or legacy dated buckets\n * `r2-{logical}-{YYYYMMDD}-t-{tenant}-{env}` from older Tamer versions.\n * Custom {@link NamingConventions.r2Bucket}: exact name only (uses today's date\n * when calling the hook, same as apply).\n */\n r2MatchPattern(logicalName: string, env: string): (name: string) => boolean {\n if (this.conventions?.r2Bucket) {\n const expected = this.r2BucketName(logicalName, env);\n return (name: string) => name === expected;\n }\n const exactNew = `r2-${logicalName}-t-${this.tenant.id}-${env}`;\n const legacyDated = new RegExp(\n `^r2-${reLiteral(logicalName)}-\\\\d{8}-t-${reLiteral(this.tenant.id)}-${reLiteral(env)}$`,\n );\n return (name: string) => name === exactNew || legacyDated.test(name);\n }\n\n extractD1ShardDate(name: string): string | null {\n const compact = name.match(/_(\\d{8})_t_/);\n if (compact) {\n const d = compact[1];\n return `${d.slice(0, 4)}-${d.slice(4, 6)}-${d.slice(6, 8)}`;\n }\n const underscored = name.match(/_(\\d{4})_(\\d{2})_(\\d{2})_t_/);\n if (underscored) {\n return `${underscored[1]}-${underscored[2]}-${underscored[3]}`;\n }\n return null;\n }\n\n extractR2Date(name: string): string | null {\n const match = name.match(/r2-\\w+-(\\d{8})-t-/);\n if (match) {\n const d = match[1];\n return `${d.slice(0, 4)}-${d.slice(4, 6)}-${d.slice(6, 8)}`;\n }\n return null;\n }\n}\n","import type { CfiConfig } from \"../../types.js\";\nimport { NamingEngine } from \"../naming/NamingEngine.js\";\n\nexport function namingFromConfig(config: CfiConfig): NamingEngine {\n const conventions =\n \"naming\" in config && config.naming ? config.naming : undefined;\n return new NamingEngine(config.tenant, conventions);\n}\n","import type { RouteResourceConfig } from \"../../types.js\";\nimport type {\n Route,\n ZoneNameRoute,\n CustomDomainRoute,\n} from \"../../generated/wrangler-types.js\";\n\nconst DEFAULT_PROD_ENVS = [\"prod\", \"production\"];\nconst DEFAULT_SKIP_ENVS = [\"local\"];\n\n/**\n * Per `docs/handoff.md` §6:\n * - prod / production → bare apex (`todo.com`)\n * - any other env (including ephemeral `pr-*`) → `{env}.{apex}`\n * - `local` (or anything in `skipEnvs`) → no route\n *\n * The resource-name `-{env}` suffix on workers/D1/R2/KV is decoupled from\n * URLs; this function only computes the URL.\n */\nexport function effectiveHostForEnv(\n route: RouteResourceConfig,\n env: string,\n): string | undefined {\n const skipEnvs = route.skipEnvs ?? DEFAULT_SKIP_ENVS;\n if (skipEnvs.includes(env)) return undefined;\n const prodEnvs = route.prodEnvs ?? DEFAULT_PROD_ENVS;\n if (prodEnvs.includes(env)) return route.host;\n return `${env}.${route.host}`;\n}\n\n/**\n * Expand one Tamer route into a wrangler `Route` (or `undefined` if the env\n * should not receive the route at all).\n */\nexport function expandRouteForEnv(\n route: RouteResourceConfig,\n env: string,\n): Route | undefined {\n const host = effectiveHostForEnv(route, env);\n if (!host) return undefined;\n const zone = route.zone ?? route.host;\n\n if (route.customDomain) {\n const cd: CustomDomainRoute = { pattern: host, custom_domain: true };\n return cd;\n }\n\n const path = route.path ?? \"/*\";\n const expanded: ZoneNameRoute = {\n pattern: `${host}${path}`,\n zone_name: zone,\n };\n return expanded;\n}\n\n/**\n * Expand `tamerRoutes` for the given env, dropping any that resolve to\n * `undefined` (`local`, `skipEnvs`).\n *\n * Note: ephemeral envs (matching `tenant.ephemeralEnvPattern`) follow the\n * same `{env}.{apex}` prefix rule as any non-prod env — e.g. an env named\n * `pr-1234` resolves to `pr-1234.todo.com`. Callers that want a different\n * URL scheme for ephemeral envs should special-case before calling.\n */\nexport function effectiveRoutesForEnv(\n tamerRoutes: RouteResourceConfig[] | undefined,\n env: string,\n): Route[] {\n if (!tamerRoutes || tamerRoutes.length === 0) return [];\n const out: Route[] = [];\n for (const r of tamerRoutes) {\n const expanded = expandRouteForEnv(r, env);\n if (expanded) out.push(expanded);\n }\n return out;\n}\n\n/**\n * Zone-name routes are attached via the Cloudflare Workers Routes HTTP API\n * (`/zones/{id}/workers/routes`), not via `wrangler.json`, so deploys stay\n * consistent with `tamer drift` / destroy.\n */\nexport function isApiManagedZoneRoute(r: Route): r is ZoneNameRoute {\n return (\n typeof r === \"object\" &&\n r !== null &&\n \"zone_name\" in r &&\n typeof (r as ZoneNameRoute).zone_name === \"string\" &&\n \"pattern\" in r &&\n typeof (r as ZoneNameRoute).pattern === \"string\" &&\n !(\n \"custom_domain\" in r &&\n (r as { custom_domain?: boolean }).custom_domain === true\n )\n );\n}\n\n/** Custom-domain `tamerRoutes` stay in wrangler until a dedicated API path exists. */\nexport function isWranglerOnlyTamerRoute(r: Route): r is CustomDomainRoute {\n return (\n typeof r === \"object\" &&\n r !== null &&\n \"custom_domain\" in r &&\n (r as CustomDomainRoute).custom_domain === true\n );\n}\n","/** Reject path segments in generated Wrangler config filename. */\nexport function assertSafeWranglerOutFile(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) {\n throw new Error(\"wranglerOutFile cannot be empty\");\n }\n if (\n trimmed.includes(\"/\") ||\n trimmed.includes(\"\\\\\") ||\n trimmed.startsWith(\"..\")\n ) {\n throw new Error(\n `Invalid wranglerOutFile \"${name}\": use a basename only (e.g. wrangler.json)`,\n );\n }\n return trimmed;\n}\n\n/** Extra CLI args so Wrangler uses a non-default config file. */\nexport function wranglerConfigCliArgs(outFile: string): string[] {\n if (outFile === \"wrangler.json\") return [];\n return [\"--config\", outFile];\n}\n","/**\n * Cross-resource reference resolver — Tamer's `!Ref` / `!GetAtt` analogue.\n *\n * Syntax: `${tamer:<kind>:<logicalName>.<field>}` (whole-string OR\n * interpolated). Recognized in worker `vars`, `tamerRoutes[].host` and\n * `tamerRoutes[].zone`, `r2_buckets[].bucket_name`, `services[].service`,\n * `dispatch_namespaces[].namespace`, and external `resources.d1[].databaseName`.\n * Resolved at wrangler-config-generation time against the in-memory state snapshot,\n * so all referenced resources must already\n * have been created (typically by an earlier loop within `tamer apply`).\n *\n * Examples:\n * \"${tamer:r2:assets.name}\" → derived bucket name\n * \"${tamer:queue:events.id}\" → queue id (uuid)\n * \"${tamer:d1:settings.binding}\" → wrangler binding key\n * \"queue=${tamer:queue:events.name};dim=128\" → interpolated mid-string\n * \"${tamer:worker:api.name}\" → deployed worker name\n * \"${tamer:dispatch_namespace:workspace.name}\" → namespace name\n * \"${tamer:logpush_pipelines:workers-trace.r2_data_catalog_table_name}\" → R2 SQL table name (normalized)\n * \"${tamer:logpush_pipelines:workers-trace.r2_data_catalog_table_name_pipelines}\" → Pipelines-reported name before normalize\n * \"${tamer:config:stack.account_id}\" → `config.account_id` or CLI `accountId` (same as wrangler account)\n *\n * Throws `TamerReferenceError` with the originating field path on any\n * unresolved reference; `tamer apply` / `deploy` surface this as a clear\n * \"run apply first\" or \"typo in logicalName\" message.\n */\n\nimport type { NamingEngine } from \"../naming/NamingEngine.js\";\nimport type { StateManager } from \"../state/StateManager.js\";\nimport type {\n CfiConfig,\n LogpushPipelinesStateEntry,\n StateEntry,\n WorkerConfig,\n} from \"../../types.js\";\nimport { getDispatchNamespaces } from \"../../types.js\";\nimport { resolveDeployedWorkerName } from \"../config/resolver.js\";\n\nexport class TamerReferenceError extends Error {\n constructor(message: string, public readonly fieldPath: string) {\n super(`${message} (at ${fieldPath})`);\n this.name = \"TamerReferenceError\";\n }\n}\n\n// Field token is broad enough to cover both built-in resource fields\n// (`name`, `id`, `binding` — all lower-case) and `${tamer:import:<stack>.<output>}`\n// where the output name is a CloudFormation-style identifier\n// (`^[a-zA-Z][a-zA-Z0-9_-]*$`). Each `lookupReference` branch enforces the\n// allowed field set for its kind, so widening here is purely a parsing concern.\nconst REF_RE = /\\$\\{tamer:([a-z0-9_]+):([a-zA-Z0-9_-]+)\\.([a-zA-Z0-9_-]+)\\}/g;\nconst FULL_REF_RE = /^\\$\\{tamer:([a-z0-9_]+):([a-zA-Z0-9_-]+)\\.([a-zA-Z0-9_-]+)\\}$/;\n\nexport interface ReferenceContext {\n config: CfiConfig;\n env: string;\n state: StateManager;\n naming: NamingEngine;\n /**\n * When `true`, unresolved references are left in place instead of throwing.\n * Used by read-only commands (`plan`, `drift`, `status`) so they don't fail\n * on a config that has not yet been `apply`ed.\n */\n tolerant?: boolean;\n /**\n * Stack outputs imported from sibling stacks living in the same\n * `tamer-state-{env}` D1, keyed by source stack name → output name →\n * resolved literal. Populated by `fetchStackImports` at command start so\n * cross-stack references resolve without re-reading D1 mid-resolution.\n * Empty/undefined when no `${tamer:import:…}` references appear in config.\n */\n imports?: Record<string, Record<string, string>>;\n /**\n * Effective account id for the current tamer command (`config.account_id` ??\n * `CLOUDFLARE_ACCOUNT_ID` from the caller). Fills\n * `${tamer:config:stack.account_id}` when the config file omits\n * top-level `account_id` but the CLI has already resolved the id.\n */\n accountId?: string;\n}\n\n/**\n * Scan a string for any `${tamer:...}` references. Returns true when at\n * least one reference is present (used for cheap pre-checks).\n */\nexport function stringHasReference(s: string): boolean {\n REF_RE.lastIndex = 0;\n return REF_RE.test(s);\n}\n\n/**\n * Resolve every `${tamer:...}` reference in `value`. Replacement preserves\n * surrounding text for partial-string interpolation. `fieldPath` is included\n * in any thrown {@link TamerReferenceError} for actionable diagnostics.\n */\nexport function resolveReferencesInString(\n value: string,\n ctx: ReferenceContext,\n fieldPath: string,\n): string {\n if (!stringHasReference(value)) return value;\n\n return value.replace(REF_RE, (match, kind, logicalName, field) => {\n try {\n return lookupReference(\n kind as string,\n logicalName as string,\n field as string,\n ctx,\n fieldPath,\n );\n } catch (err) {\n if (ctx.tolerant && err instanceof TamerReferenceError) {\n return match;\n }\n throw err;\n }\n });\n}\n\n/**\n * Walk a `vars` record (or any flat string→string map) replacing references\n * in every value. Returns a new object; the input is not mutated.\n */\nexport function resolveReferencesInVars(\n vars: Record<string, string> | undefined,\n ctx: ReferenceContext,\n fieldPathPrefix: string,\n): Record<string, string> | undefined {\n if (!vars) return vars;\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(vars)) {\n if (typeof value !== \"string\") {\n out[key] = value;\n continue;\n }\n out[key] = resolveReferencesInString(\n value,\n ctx,\n `${fieldPathPrefix}.${key}`,\n );\n }\n return out;\n}\n\nfunction lookupReference(\n kind: string,\n logicalName: string,\n field: string,\n ctx: ReferenceContext,\n fieldPath: string,\n): string {\n switch (kind) {\n case \"d1\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"d1_database\" && entry.logicalName === logicalName,\n );\n case \"r2\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"r2_bucket\" && entry.logicalName === logicalName,\n );\n case \"kv\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"kv_namespace\" && entry.logicalName === logicalName,\n );\n case \"queue\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"queue\" && entry.logicalName === logicalName,\n );\n case \"hyperdrive\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"hyperdrive\" && entry.logicalName === logicalName,\n );\n case \"vectorize\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"vectorize\" && entry.logicalName === logicalName,\n );\n case \"ai_gateway\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"ai_gateway\" && entry.logicalName === logicalName,\n );\n case \"pipeline\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"pipeline\" && entry.logicalName === logicalName,\n );\n case \"workflow\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) => entry.type === \"workflow\" && entry.logicalName === logicalName,\n );\n case \"secret_store\":\n return lookupResource(\n ctx,\n kind,\n logicalName,\n field,\n fieldPath,\n (entry) =>\n entry.type === \"secrets_store\" && entry.logicalName === logicalName,\n );\n case \"dispatch_namespace\":\n return lookupDispatchNamespace(ctx, logicalName, field, fieldPath);\n case \"worker\":\n return lookupWorker(ctx, logicalName, field, fieldPath);\n case \"import\":\n return lookupImport(ctx, logicalName, field, fieldPath);\n case \"logpush_pipelines\":\n return lookupLogpushPipelines(ctx, logicalName, field, fieldPath);\n case \"config\":\n return lookupConfigField(ctx, logicalName, field, fieldPath);\n default:\n throw new TamerReferenceError(\n `Unknown reference kind \"${kind}\" — expected one of d1 | r2 | kv | queue | hyperdrive | vectorize | ai_gateway | pipeline | workflow | secret_store | dispatch_namespace | worker | import | logpush_pipelines | config`,\n fieldPath,\n );\n }\n}\n\nfunction lookupConfigField(\n ctx: ReferenceContext,\n _logicalName: string,\n field: string,\n fieldPath: string,\n): string {\n if (field === \"account_id\") {\n const id = (ctx.accountId ?? ctx.config.account_id ?? \"\").trim();\n if (!id) {\n throw new TamerReferenceError(\n `Reference \\${tamer:config:stack.account_id} needs the stack Cloudflare account id — set top-level account_id in tamer/project.config.ts or pass CLOUDFLARE_ACCOUNT_ID when running tamer.`,\n fieldPath,\n );\n }\n return id;\n }\n throw new TamerReferenceError(\n `Unknown field \"${field}\" on config reference — expected account_id`,\n fieldPath,\n );\n}\n\nfunction getLogpushPipelinesEntry(\n ctx: ReferenceContext,\n logicalName: string,\n fieldPath: string,\n): LogpushPipelinesStateEntry {\n const all = ctx.state.getAll();\n const entry = Object.values(all).find(\n (e): e is LogpushPipelinesStateEntry =>\n e.type === \"logpush_pipelines\" && e.logicalName === logicalName,\n );\n if (!entry) {\n throw new TamerReferenceError(\n `Reference \\${tamer:logpush_pipelines:${logicalName}.…} cannot be resolved — ` +\n `no pipelines graph in state for logpush job \"${logicalName}\". Run a full \\`tamer apply\\` (including the Logpush / pipelinesAuto step) for env \"${ctx.env}\" first.`,\n fieldPath,\n );\n }\n return entry;\n}\n\n/**\n * Exposes fields from the `logpush_pipelines:*` D1 state row (after\n * `ensurePipelinesLogpushProvision` has run) for `outputs` and `vars`, e.g.\n * `${tamer:logpush_pipelines:workers-trace.r2_data_catalog_table_name}`.\n */\nfunction lookupLogpushPipelines(\n ctx: ReferenceContext,\n logicalName: string,\n field: string,\n fieldPath: string,\n): string {\n const entry = getLogpushPipelinesEntry(ctx, logicalName, fieldPath);\n switch (field) {\n case \"r2_data_catalog_table_name\":\n case \"iceberg_table\": {\n const v = entry.r2DataCatalogTableName?.trim();\n if (!v) {\n throw new TamerReferenceError(\n `logpush_pipelines state for \"${logicalName}\" has no r2DataCatalogTableName (sink not yet created, or pre-upgrade state). ` +\n `Re-run a full \\`tamer apply\\` for env \"${ctx.env}\" after pipelinesAuto provisions the sink, or set table manually in consuming stack.`,\n fieldPath,\n );\n }\n return v;\n }\n case \"r2_data_catalog_table_name_pipelines\":\n case \"iceberg_table_pipelines\": {\n const v = entry.r2DataCatalogTableNamePipelines?.trim();\n if (v) return v;\n const fallback = entry.r2DataCatalogTableName?.trim();\n if (!fallback) {\n throw new TamerReferenceError(\n `logpush_pipelines state for \"${logicalName}\" has no table name (sink not yet created). ` +\n `Re-run \\`tamer apply\\` for env \"${ctx.env}\".`,\n fieldPath,\n );\n }\n return fallback;\n }\n case \"r2_data_catalog_namespace\":\n case \"iceberg_namespace\": {\n const v = (entry.r2DataCatalogNamespace ?? \"default\").trim();\n return v || \"default\";\n }\n case \"name\":\n return entry.pipelineName;\n case \"id\":\n return entry.pipelineId;\n default:\n throw new TamerReferenceError(\n `Unknown field \"${field}\" on logpush_pipelines reference — ` +\n `expected r2_data_catalog_table_name | r2_data_catalog_table_name_pipelines | r2_data_catalog_namespace | name | id | iceberg_table | iceberg_table_pipelines | iceberg_namespace`,\n fieldPath,\n );\n }\n}\n\n/**\n * Resolve a `${tamer:import:<stack>.<output>}` against pre-fetched sibling\n * stack outputs. The pre-fetch (`fetchStackImports`) loads every imported\n * stack's `cfi_state:{stack}` row before resolution begins; this lookup is\n * pure map access. Throws if the stack isn't in `ctx.imports` (config\n * never declared it / pre-fetch wasn't wired in for this command) or if\n * the named output hasn't been published yet (sibling stack hasn't run\n * `apply` since the output was declared, or has been destroyed).\n */\nfunction lookupImport(\n ctx: ReferenceContext,\n stackName: string,\n outputName: string,\n fieldPath: string,\n): string {\n const imports = ctx.imports;\n if (!imports || !(stackName in imports)) {\n throw new TamerReferenceError(\n `Reference \\${tamer:import:${stackName}.${outputName}} cannot be resolved — ` +\n `no imported stack \"${stackName}\" available. Ensure stack \"${stackName}\" ` +\n `exists in env \"${ctx.env}\" (run 'tamer apply' there first) and that the ` +\n `current command pre-fetches sibling stacks.`,\n fieldPath,\n );\n }\n const stackOutputs = imports[stackName]!;\n if (!(outputName in stackOutputs)) {\n const available = Object.keys(stackOutputs).sort();\n const hint = available.length > 0\n ? ` Available outputs on stack \"${stackName}\": ${available.join(\", \")}.`\n : ` Stack \"${stackName}\" has no published outputs — run 'tamer apply' there with an \\`outputs:\\` block.`;\n throw new TamerReferenceError(\n `Reference \\${tamer:import:${stackName}.${outputName}} cannot be resolved — ` +\n `output \"${outputName}\" not found on imported stack \"${stackName}\".${hint}`,\n fieldPath,\n );\n }\n return stackOutputs[outputName]!;\n}\n\nfunction lookupResource(\n ctx: ReferenceContext,\n kind: string,\n logicalName: string,\n field: string,\n fieldPath: string,\n predicate: (entry: StateEntry) => boolean,\n): string {\n const all = ctx.state.getAll();\n const entry = Object.values(all).find(predicate);\n if (!entry) {\n throw new TamerReferenceError(\n `Reference \\${tamer:${kind}:${logicalName}.${field}} cannot be resolved — no ${kind} resource named \"${logicalName}\" in state. Run 'tamer apply --env ${ctx.env}' first.`,\n fieldPath,\n );\n }\n\n switch (field) {\n case \"name\":\n return resourceName(entry);\n case \"id\":\n return resourceId(entry, kind, logicalName, fieldPath);\n case \"binding\":\n return resourceBinding(entry);\n default:\n throw new TamerReferenceError(\n `Unknown field \"${field}\" on ${kind} reference — expected name | id | binding`,\n fieldPath,\n );\n }\n}\n\nfunction resourceName(entry: StateEntry): string {\n switch (entry.type) {\n case \"d1_database\":\n case \"kv_namespace\":\n case \"queue\":\n case \"hyperdrive\":\n case \"vectorize\":\n case \"ai_gateway\":\n case \"pipeline\":\n case \"workflow\":\n case \"secrets_store\":\n case \"dispatch_namespace\":\n case \"r2_bucket\":\n return entry.derivedName;\n case \"dns_record\":\n return entry.name;\n case \"logpush_job\":\n return entry.derivedName;\n case \"logpush_pipelines\":\n return entry.pipelineName;\n case \"worker_route\":\n return entry.pattern;\n }\n}\n\nfunction resourceId(\n entry: StateEntry,\n kind: string,\n logicalName: string,\n fieldPath: string,\n): string {\n switch (entry.type) {\n case \"d1_database\":\n case \"kv_namespace\":\n case \"queue\":\n case \"hyperdrive\":\n case \"vectorize\":\n case \"ai_gateway\":\n case \"pipeline\":\n case \"workflow\":\n case \"secrets_store\":\n return entry.cfId;\n case \"r2_bucket\":\n throw new TamerReferenceError(\n `R2 bucket \"${logicalName}\" has no .id (R2 buckets are addressed by name); use \\${tamer:${kind}:${logicalName}.name}`,\n fieldPath,\n );\n case \"dispatch_namespace\":\n return entry.derivedName;\n case \"dns_record\":\n return entry.recordId;\n case \"logpush_job\":\n return String(entry.cfJobId);\n case \"logpush_pipelines\":\n return entry.pipelineId;\n case \"worker_route\":\n return entry.routeId;\n }\n}\n\nfunction resourceBinding(entry: StateEntry): string {\n switch (entry.type) {\n case \"d1_database\":\n case \"r2_bucket\":\n case \"kv_namespace\":\n case \"queue\":\n case \"hyperdrive\":\n case \"vectorize\":\n case \"ai_gateway\":\n case \"pipeline\":\n case \"workflow\":\n case \"secrets_store\":\n return entry.bindingKey;\n case \"dispatch_namespace\":\n return entry.derivedName;\n case \"dns_record\":\n throw new Error(\n \"internal: dns_record has no .binding — use .name or .id in config references\",\n );\n case \"logpush_job\":\n throw new Error(\n \"internal: logpush_job has no .binding — use .name or .id in config references\",\n );\n case \"logpush_pipelines\":\n throw new Error(\n \"internal: logpush_pipelines has no .binding — use .name or .id in config references\",\n );\n case \"worker_route\":\n return entry.routeId;\n }\n}\n\nfunction lookupDispatchNamespace(\n ctx: ReferenceContext,\n logicalName: string,\n field: string,\n fieldPath: string,\n): string {\n const declared = getDispatchNamespaces(ctx.config).find(\n (d) => d.logicalName === logicalName,\n );\n if (!declared) {\n throw new TamerReferenceError(\n `Reference \\${tamer:dispatch_namespace:${logicalName}.${field}} cannot be resolved — no dispatchNamespaces entry named \"${logicalName}\" in the Tamer project config`,\n fieldPath,\n );\n }\n if (field !== \"name\" && field !== \"id\") {\n throw new TamerReferenceError(\n `Unknown field \"${field}\" on dispatch_namespace reference — expected name | id`,\n fieldPath,\n );\n }\n const all = ctx.state.getAll();\n const stateEntry = Object.values(all).find(\n (e) => e.type === \"dispatch_namespace\" && e.logicalName === logicalName,\n );\n if (!stateEntry || stateEntry.type !== \"dispatch_namespace\") {\n throw new TamerReferenceError(\n `Reference \\${tamer:dispatch_namespace:${logicalName}.${field}} unresolved — no state entry. Run 'tamer apply --env ${ctx.env}' first.`,\n fieldPath,\n );\n }\n return stateEntry.derivedName;\n}\n\nfunction lookupWorker(\n ctx: ReferenceContext,\n workerKey: string,\n field: string,\n fieldPath: string,\n): string {\n let target: WorkerConfig | undefined;\n if (ctx.config.workers && ctx.config.workers[workerKey]) {\n target = ctx.config.workers[workerKey];\n } else if (ctx.config.worker && workerKey === \"default\") {\n target = ctx.config.worker;\n }\n if (!target) {\n throw new TamerReferenceError(\n `Reference \\${tamer:worker:${workerKey}.${field}} cannot be resolved — no worker key \"${workerKey}\" in the Tamer project config`,\n fieldPath,\n );\n }\n if (field !== \"name\") {\n throw new TamerReferenceError(\n `Unknown field \"${field}\" on worker reference — only \"name\" is supported (the env-suffixed deployed script name)`,\n fieldPath,\n );\n }\n return resolveDeployedWorkerName(\n ctx.config,\n workerKey,\n target,\n ctx.env,\n ctx.naming,\n );\n}\n\n/**\n * True iff `value` is a single full-string reference (e.g. `\"${tamer:r2:x.name}\"`).\n * Surface for callers that want to short-circuit type coercion.\n */\nexport function isFullReference(value: string): boolean {\n FULL_REF_RE.lastIndex = 0;\n return FULL_REF_RE.test(value);\n}\n","import { resolve } from \"path\";\nimport {\n materializeTamerResolvable,\n materializeVars,\n} from \"../../dx/normalize.js\";\nimport type {\n CfiConfig,\n TenantMeta,\n TamerResolvableString,\n WorkerConfig,\n WorkerResources,\n} from \"../../types.js\";\nimport { getDispatchNamespaces } from \"../../types.js\";\nimport {\n effectiveDispatchNamespaceName,\n isEphemeralEnv,\n} from \"../../features/dispatch-namespace/dispatch-namespace.resolve.js\";\nimport type { Route, WranglerConfig } from \"../../generated/wrangler-types.js\";\nimport { NamingEngine } from \"../naming/NamingEngine.js\";\nimport {\n effectiveRoutesForEnv,\n isApiManagedZoneRoute,\n isWranglerOnlyTamerRoute,\n} from \"../routes/routes.resolve.js\";\nimport type { StateManager } from \"../state/StateManager.js\";\nimport { assertSafeWranglerOutFile } from \"../wrangler/wranglerOutFile.js\";\nimport {\n resolveReferencesInString,\n resolveReferencesInVars,\n} from \"../references/references.js\";\nimport type { RouteResourceConfig } from \"../../types.js\";\n\n/** Wrangler script name after env suffix rules (matches `tamer deploy`). */\nexport function resolveDeployedWorkerName(\n _config: CfiConfig,\n workerKey: string,\n workerConfig: WorkerConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const m = workerConfig as WorkerConfig & { scriptName?: string };\n const sn = m.scriptName?.trim();\n if (sn) {\n if (env === \"local\") return sn;\n return `${sn}-${env}`;\n }\n return naming.workerName(workerKey, env);\n}\n\n/**\n * Map from base service-binding target name (`scriptName` for envs other than\n * `local`, or the local-deployed name) → env-suffixed deployed name for every\n * worker in `config`. Used to auto-rewrite intra-stack `services[].service`\n * fields so fixtures don't have to repeat env overrides for every env.\n */\nexport function buildIntraStackScriptNameMap(\n config: CfiConfig,\n env: string,\n naming: NamingEngine,\n): Map<string, string> {\n const map = new Map<string, string>();\n if (config.workers) {\n for (const [key, wc] of Object.entries(config.workers)) {\n const m = wc as WorkerConfig & { scriptName?: string };\n const sn = m.scriptName?.trim();\n const baseName = sn ?? naming.workerName(key, \"local\");\n const deployed = resolveDeployedWorkerName(config, key, wc, env, naming);\n map.set(baseName, deployed);\n }\n }\n if (config.worker) {\n const w = config.worker;\n const m = w as WorkerConfig & { scriptName?: string };\n const sn = m.scriptName?.trim();\n const baseName = sn ?? naming.workerName(\"default\", \"local\");\n const deployed = resolveDeployedWorkerName(\n config,\n \"default\",\n w,\n env,\n naming,\n );\n map.set(baseName, deployed);\n }\n return map;\n}\n\n/** Returns a worker config copy whose `services[].service` is rewritten to env-suffixed deployed names. */\nexport function rewriteIntraStackServiceTargets(\n workerConfig: WorkerConfig,\n baseToDeployed: Map<string, string>,\n): WorkerConfig {\n const services = (\n workerConfig as WorkerConfig & {\n services?: Array<{ binding: string; service: string; environment?: string }>;\n }\n ).services;\n if (!services || services.length === 0) return workerConfig;\n let rewroteAny = false;\n const rewritten = services.map((s) => {\n const target = baseToDeployed.get(s.service);\n if (!target || target === s.service) return s;\n rewroteAny = true;\n return { ...s, service: target };\n });\n if (!rewroteAny) return workerConfig;\n return { ...workerConfig, services: rewritten };\n}\n\nexport interface ResolvedWorkerConfig {\n workerKey: string;\n workerName: string;\n workerDir: string;\n env: string;\n /** Basename of generated Wrangler JSON (default `wrangler.json`). */\n wranglerOutFile: string;\n /** Passed to `wrangler deploy --dispatch-namespace` when set. */\n dispatchNamespace?: string;\n wranglerConfig: WranglerConfig;\n resources: WorkerResources;\n /**\n * Zone routes from `tamerRoutes` managed via Workers Routes API after\n * `wrangler deploy` — not embedded in {@link wranglerConfig.routes}.\n */\n apiManagedRoutes: import(\"../../generated/wrangler-types.js\").ZoneNameRoute[];\n}\n\nfunction mergeVars(\n base: Record<string, TamerResolvableString> = {},\n override: Record<string, TamerResolvableString> = {},\n): Record<string, TamerResolvableString> {\n return { ...base, ...override };\n}\n\n/** Same env merge as `resolveWorkerConfig` (for deploy topo-sort service edges). */\nexport function mergedWorkerConfigForEnv(\n workerConfig: WorkerConfig,\n env: string,\n tenant: TenantMeta,\n): WorkerConfig {\n let merged = { ...workerConfig } as WorkerConfig & {\n vars?: Record<string, string>;\n };\n\n if (env === \"local\" && workerConfig.local) {\n merged = {\n ...merged,\n ...workerConfig.local,\n vars: mergeVars(workerConfig.vars, workerConfig.local.vars),\n } as WorkerConfig & { vars?: Record<string, string> };\n } else if (workerConfig.env?.[env]) {\n const envOverride = workerConfig.env[env];\n merged = {\n ...merged,\n ...envOverride,\n vars: mergeVars(workerConfig.vars, envOverride.vars),\n } as WorkerConfig & { vars?: Record<string, string> };\n }\n\n const mv = (merged as WorkerConfig & { vars?: Record<string, string> }).vars;\n if (mv && Object.prototype.hasOwnProperty.call(mv, \"BRANCH_SUFFIX\")) {\n merged = {\n ...merged,\n vars: {\n ...mv,\n BRANCH_SUFFIX: isEphemeralEnv(env, tenant) ? env : \"\",\n },\n } as WorkerConfig & { vars?: Record<string, string> };\n }\n\n return merged;\n}\n\n/**\n * Align `dispatch_namespaces[].namespace` and `vars.WFP_NAMESPACE` with\n * {@link effectiveDispatchNamespaceName} for envs that have no explicit\n * `worker.env[env]` block (e.g. `pr-*` shared namespace).\n */\nexport function applyDispatchNamespaceEnvOverrides(\n config: CfiConfig,\n merged: WorkerConfig,\n env: string,\n): WorkerConfig {\n const dns = getDispatchNamespaces(config);\n if (dns.length === 0) return merged;\n const resolved = effectiveDispatchNamespaceName(dns[0], env, config.tenant);\n const m = merged as WorkerConfig & {\n dispatch_namespaces?: Array<{ binding: string; namespace: string }>;\n vars?: Record<string, string>;\n };\n let next: WorkerConfig = merged;\n if (m.dispatch_namespaces?.length) {\n next = {\n ...next,\n dispatch_namespaces: m.dispatch_namespaces.map((d) => ({\n ...d,\n namespace: resolved,\n })),\n } as WorkerConfig;\n }\n if (\n m.vars &&\n typeof m.vars.WFP_NAMESPACE === \"string\" &&\n m.vars.WFP_NAMESPACE === dns[0].namespace\n ) {\n const v = (next as WorkerConfig & { vars?: Record<string, string> }).vars;\n next = {\n ...(next as object),\n vars: { ...v!, WFP_NAMESPACE: resolved },\n } as WorkerConfig;\n }\n return next;\n}\n\n/**\n * Walk the merged worker config and replace `${tamer:<kind>:<logical>.<field>}`\n * references in `vars` and `tamerRoutes[].host` / `.zone` against the current\n * state snapshot. Also resolves `r2_buckets[].bucket_name`,\n * **`services[].service`**, **`dispatch_namespaces[].namespace`**, and\n * `resources.d1[].databaseName` when `ownership` is `external`. Throws\n * `TamerReferenceError` (with field path) if any\n * reference is unresolved — bubbles up to the caller as a fatal.\n */\nexport function resolveCrossResourceReferences(\n merged: WorkerConfig,\n ctx: {\n config: CfiConfig;\n env: string;\n state: StateManager;\n naming: NamingEngine;\n workerKey: string;\n tolerant?: boolean;\n /**\n * Pre-fetched sibling stack outputs (`fetchStackImports` result) so\n * `${tamer:import:<stack>.<output>}` references in worker `vars` /\n * `tamerRoutes` resolve without mid-resolution D1 reads.\n */\n imports?: Record<string, Record<string, string>>;\n /** Same as wrangler `account_id` (drives `${tamer:config:stack.account_id}`). */\n accountId: string;\n },\n): WorkerConfig {\n const refCtx = {\n config: ctx.config,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n tolerant: ctx.tolerant,\n imports: ctx.imports,\n accountId: ctx.accountId,\n };\n const m = merged as WorkerConfig & { vars?: Record<string, string> };\n let next: WorkerConfig = merged;\n if (m.vars) {\n const resolvedVars = resolveReferencesInVars(\n materializeVars(m.vars)!,\n refCtx,\n `worker[${ctx.workerKey}].vars`,\n );\n if (resolvedVars && resolvedVars !== m.vars) {\n next = { ...next, vars: resolvedVars } as WorkerConfig;\n }\n }\n const tamerRoutes = (\n next as WorkerConfig & { tamerRoutes?: RouteResourceConfig[] }\n ).tamerRoutes;\n if (tamerRoutes && tamerRoutes.length > 0) {\n let mutated = false;\n const resolvedRoutes = tamerRoutes.map((r, idx) => {\n const fieldBase = `worker[${ctx.workerKey}].tamerRoutes[${idx}]`;\n const host = resolveReferencesInString(\n r.host,\n refCtx,\n `${fieldBase}.host`,\n );\n const zone = r.zone\n ? resolveReferencesInString(r.zone, refCtx, `${fieldBase}.zone`)\n : r.zone;\n if (host !== r.host || zone !== r.zone) mutated = true;\n return { ...r, host, ...(zone !== undefined ? { zone } : {}) };\n });\n if (mutated) {\n next = { ...next, tamerRoutes: resolvedRoutes } as WorkerConfig;\n }\n }\n\n const r2Buckets = (\n next as WorkerConfig & {\n r2_buckets?: Array<{ binding: string; bucket_name: string }>;\n }\n ).r2_buckets;\n if (r2Buckets && r2Buckets.length > 0) {\n let mutated = false;\n const resolvedBuckets = r2Buckets.map((b, idx) => {\n const raw = b.bucket_name;\n if (raw === undefined) return b;\n const fieldBase = `worker[${ctx.workerKey}].r2_buckets[${idx}].bucket_name`;\n const bucket_name = resolveReferencesInString(\n materializeTamerResolvable(raw),\n refCtx,\n fieldBase,\n );\n if (bucket_name !== raw) mutated = true;\n return { ...b, bucket_name };\n });\n if (mutated) {\n next = { ...next, r2_buckets: resolvedBuckets } as WorkerConfig;\n }\n }\n\n const svc = (\n next as WorkerConfig & {\n services?: Array<{ binding: string; service: string; environment?: string }>;\n }\n ).services;\n if (svc && svc.length > 0) {\n let mutated = false;\n const resolvedSvc = svc.map((s, idx) => {\n const raw = s.service;\n const fieldBase = `worker[${ctx.workerKey}].services[${idx}].service`;\n const service = resolveReferencesInString(\n materializeTamerResolvable(raw),\n refCtx,\n fieldBase,\n );\n if (service !== raw) mutated = true;\n return { ...s, service };\n });\n if (mutated) {\n next = { ...next, services: resolvedSvc } as WorkerConfig;\n }\n }\n\n const dispatchNsMerged = (\n next as WorkerConfig & {\n dispatch_namespaces?: Array<{ binding: string; namespace: string }>;\n }\n ).dispatch_namespaces;\n if (dispatchNsMerged && dispatchNsMerged.length > 0) {\n let mutated = false;\n const resolvedDn = dispatchNsMerged.map((d, idx) => {\n const raw = d.namespace;\n const fieldBase = `worker[${ctx.workerKey}].dispatch_namespaces[${idx}].namespace`;\n const namespace = resolveReferencesInString(\n materializeTamerResolvable(raw),\n refCtx,\n fieldBase,\n );\n if (namespace !== raw) mutated = true;\n return { ...d, namespace };\n });\n if (mutated) {\n next = { ...next, dispatch_namespaces: resolvedDn } as WorkerConfig;\n }\n }\n\n const resBlock = (\n next as WorkerConfig & { resources?: WorkerResources }\n ).resources;\n if (resBlock?.d1 && resBlock.d1.length > 0) {\n let mutated = false;\n const d1Resolved = resBlock.d1.map((d1c, idx) => {\n if (d1c.ownership !== \"external\" || !d1c.databaseName) return d1c;\n const fieldBase = `worker[${ctx.workerKey}].resources.d1[${idx}].databaseName`;\n const databaseName = resolveReferencesInString(\n materializeTamerResolvable(d1c.databaseName),\n refCtx,\n fieldBase,\n );\n if (databaseName !== d1c.databaseName) mutated = true;\n return { ...d1c, databaseName };\n });\n if (mutated) {\n next = {\n ...next,\n resources: { ...resBlock, d1: d1Resolved },\n } as WorkerConfig;\n }\n }\n\n return next;\n}\n\nfunction stripTamerFields(config: Record<string, unknown>): Record<string, unknown> {\n const {\n path,\n config: configPath,\n resources,\n local,\n env,\n scriptName: _scriptName,\n wranglerOutFile: _out,\n dispatchNamespace: _dispatchNs,\n tamerRoutes: _tamerRoutes,\n tamerStaleRouteSweepZones: _tamerStaleRouteSweepZones,\n ...rest\n } = config;\n return rest;\n}\n\nexport interface ResolveWorkerConfigOptions {\n /**\n * `strict` (default): unresolved `${tamer:...}` references throw, surfacing\n * a clear \"run apply first\" message. `tolerant`: leaves unresolved\n * references in place — used by read-only callers (`plan`, `drift`,\n * `status`) so a not-yet-applied config doesn't crash them.\n */\n referencesMode?: \"strict\" | \"tolerant\";\n /**\n * Pre-fetched sibling stack outputs powering\n * `${tamer:import:<stack>.<output>}`. Caller is responsible for\n * scanning the config (`importedStackNames`) and loading them via\n * `fetchStackImports` before invoking this resolver.\n */\n imports?: Record<string, Record<string, string>>;\n}\n\n/**\n * Env merge + intra-stack `services` rewrite + sibling-stack resolution for\n * **`resources.d1[].databaseName` only** when `ownership: \"external\"`.\n *\n * Use before {@link ResourceModule.pickResources} during `apply` / `sync` /\n * `drift` so imported D1 names are known **without** resolving worker `vars`\n * (those references often need resources created earlier in the same `apply`).\n */\nexport function mergeWorkerConfigForResourcePick(\n config: CfiConfig,\n workerKey: string,\n workerConfig: WorkerConfig,\n env: string,\n accountId: string,\n naming: NamingEngine,\n state: StateManager,\n opts: ResolveWorkerConfigOptions = {},\n): WorkerConfig {\n let merged = mergedWorkerConfigForEnv(workerConfig, env, config.tenant);\n merged = applyDispatchNamespaceEnvOverrides(config, merged, env);\n const intraMap = buildIntraStackScriptNameMap(config, env, naming);\n merged = rewriteIntraStackServiceTargets(merged, intraMap);\n const refCtx = {\n config,\n env,\n state,\n naming,\n tolerant: opts.referencesMode === \"tolerant\",\n imports: opts.imports,\n accountId,\n };\n const resBlock = (merged as WorkerConfig & { resources?: WorkerResources })\n .resources;\n if (!resBlock?.d1?.length) return merged;\n\n const d1Resolved = resBlock.d1.map((d1c, idx) => {\n if (d1c.ownership !== \"external\" || !d1c.databaseName) return d1c;\n const fieldBase = `worker[${workerKey}].resources.d1[${idx}].databaseName`;\n const databaseName = resolveReferencesInString(\n materializeTamerResolvable(d1c.databaseName),\n refCtx,\n fieldBase,\n );\n return { ...d1c, databaseName };\n });\n return {\n ...merged,\n resources: { ...resBlock, d1: d1Resolved },\n } as WorkerConfig;\n}\n\n/**\n * Env-merged worker config with every `${tamer:…}` site resolved for wrangler\n * (`vars`, `tamerRoutes`, `r2_buckets[].bucket_name`, external D1 names).\n * Used by {@link resolveWorkerConfig} after resource state is up to date.\n */\nexport function mergeWorkerConfigWithResolvedRefs(\n config: CfiConfig,\n workerKey: string,\n workerConfig: WorkerConfig,\n env: string,\n accountId: string,\n naming: NamingEngine,\n state: StateManager,\n opts: ResolveWorkerConfigOptions = {},\n): WorkerConfig {\n let merged = mergedWorkerConfigForEnv(workerConfig, env, config.tenant);\n merged = applyDispatchNamespaceEnvOverrides(config, merged, env);\n const intraMap = buildIntraStackScriptNameMap(config, env, naming);\n merged = rewriteIntraStackServiceTargets(merged, intraMap);\n return resolveCrossResourceReferences(merged, {\n config,\n env,\n state,\n naming,\n workerKey,\n tolerant: opts.referencesMode === \"tolerant\",\n imports: opts.imports,\n accountId,\n });\n}\n\nexport async function resolveWorkerConfig(\n config: CfiConfig,\n workerKey: string,\n workerConfig: WorkerConfig,\n env: string,\n baseDir: string,\n accountId: string,\n naming: NamingEngine,\n state: StateManager,\n opts: ResolveWorkerConfigOptions = {},\n): Promise<ResolvedWorkerConfig> {\n const merged = mergeWorkerConfigWithResolvedRefs(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n opts,\n );\n\n const workerDir = workerConfig.path\n ? resolve(baseDir, workerConfig.path)\n : baseDir;\n\n const m = merged as WorkerConfig & {\n scriptName?: string;\n wranglerOutFile?: string;\n dispatchNamespace?: string;\n };\n const workerName = resolveDeployedWorkerName(\n config,\n workerKey,\n merged as WorkerConfig,\n env,\n naming,\n );\n\n const wranglerOutFile = assertSafeWranglerOutFile(\n m.wranglerOutFile?.trim() || \"wrangler.json\",\n );\n const dispatchNamespace = m.dispatchNamespace?.trim() || undefined;\n\n const stripped = stripTamerFields(merged as Record<string, unknown>);\n const tamerRoutes = (\n merged as WorkerConfig & { tamerRoutes?: import(\"../../types.js\").RouteResourceConfig[] }\n ).tamerRoutes;\n const expandedRoutes = effectiveRoutesForEnv(tamerRoutes, env);\n const apiManagedRoutes = expandedRoutes.filter(isApiManagedZoneRoute);\n const wranglerTamerRoutes = expandedRoutes.filter(isWranglerOnlyTamerRoute);\n const existingRoutes = (stripped.routes as Route[] | undefined) ?? [];\n const mergedRoutes: Route[] = [...existingRoutes, ...wranglerTamerRoutes];\n\n /** Non-local deploys emit `routes: []` when there are none — omitting `routes` can leave stale Wrangler-published custom domains attached from a prior config. */\n const wranglerRoutes: Route[] | undefined =\n mergedRoutes.length > 0 ? mergedRoutes : env === \"local\" ? undefined : [];\n\n const wranglerConfig: WranglerConfig = {\n ...stripped,\n ...(wranglerRoutes !== undefined ? { routes: wranglerRoutes } : {}),\n name: workerName,\n account_id: accountId,\n compatibility_date:\n (stripped.compatibility_date as string | undefined) ??\n config.compatibility_date,\n } as WranglerConfig;\n\n return {\n workerKey,\n workerName,\n workerDir,\n env,\n wranglerOutFile,\n dispatchNamespace,\n wranglerConfig,\n resources: (merged as WorkerConfig & { resources?: WorkerResources })\n .resources ??\n workerConfig.resources ??\n {},\n apiManagedRoutes,\n };\n}\n","import type {\n AIGatewayResourceConfig,\n CloudflareNameContext,\n CloudflareNameFn,\n D1ResourceConfig,\n HyperdriveResourceConfig,\n KVResourceConfig,\n PipelineResourceConfig,\n QueueResourceConfig,\n R2ResourceConfig,\n SecretsStoreResourceConfig,\n VectorizeResourceConfig,\n WorkflowResourceConfig,\n} from \"../../types.js\";\nimport type { NamingEngine } from \"./NamingEngine.js\";\n\nfunction resolveOverride(\n fn: CloudflareNameFn | undefined,\n tenantId: string,\n env: string,\n ctx?: CloudflareNameContext,\n): string | undefined {\n if (!fn) return undefined;\n return fn(tenantId, env, ctx);\n}\n\n/** Managed D1 Cloudflare database name (not external `databaseName`). */\nexport function resolveD1CloudflareName(\n config: D1ResourceConfig,\n env: string,\n naming: NamingEngine,\n shardDate?: string,\n): string {\n const tenantId = naming.tenantId;\n if (config.type === \"single\") {\n const override = resolveOverride(config.cloudflareName, tenantId, env);\n if (override !== undefined) return override;\n return naming.d1SingleName(config.logicalName, env);\n }\n if (!shardDate) {\n throw new Error(`Sharded D1 \"${config.logicalName}\" requires shardDate`);\n }\n const override = resolveOverride(config.cloudflareName, tenantId, env, {\n shardDate,\n });\n if (override !== undefined) return override;\n return naming.d1ShardName(config.logicalName, shardDate, env);\n}\n\nexport function resolveR2CloudflareName(\n config: R2ResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.r2BucketName(config.logicalName, env);\n}\n\nexport function resolveWorkflowCloudflareName(\n config: WorkflowResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.workflowName(config.logicalName, env);\n}\n\nexport function resolveKVCloudflareName(\n config: KVResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.kvNamespaceName(config.logicalName, env);\n}\n\nexport function resolveQueueCloudflareName(\n config: QueueResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.queueName(config.logicalName, env);\n}\n\nexport function resolveHyperdriveCloudflareName(\n config: HyperdriveResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.hyperdriveName(config.logicalName, env);\n}\n\nexport function resolveVectorizeCloudflareName(\n config: VectorizeResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.vectorizeName(config.logicalName, env);\n}\n\nexport function resolveAIGatewayCloudflareName(\n config: AIGatewayResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.aiGatewayId(config.logicalName, env);\n}\n\nexport function resolvePipelineCloudflareName(\n config: PipelineResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.pipelineName(config.logicalName, env);\n}\n\nexport function resolveSecretsStoreCloudflareName(\n config: SecretsStoreResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n const override = resolveOverride(\n config.cloudflareName,\n naming.tenantId,\n env,\n );\n if (override !== undefined) return override;\n return naming.secretsStoreName(config.logicalName, env);\n}\n","import type { D1ResourceConfig } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveD1CloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\n\nexport function d1IsExternal(config: D1ResourceConfig): boolean {\n return config.ownership === \"external\";\n}\n\n/**\n * Skip provision / migrate / Cloudflare delete for this binding.\n * `preserveOnDestroy` alone keeps legacy \"same derived name as owner\" behaviour.\n */\nexport function d1SkipsProvisionAndMigrate(config: D1ResourceConfig): boolean {\n return d1IsExternal(config) || config.preserveOnDestroy === true;\n}\n\n/** Cloudflare D1 database name for state keys, sync, and wrangler `database_name`. */\nexport function d1CloudflareDatabaseName(\n config: D1ResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n if (config.type !== \"single\") {\n throw new Error(\n `D1 \"${config.logicalName}\": expected type \"single\" for derived database name`,\n );\n }\n if (d1IsExternal(config)) {\n const n = config.databaseName;\n if (typeof n !== \"string\" || !n.trim()) {\n throw new Error(\n `D1 \"${config.logicalName}\" has ownership \"external\" but databaseName is empty — ` +\n `ensure imports are pre-fetched and config is merged with resolveWorkerConfig / mergeWorkerConfigWithResolvedRefs.`,\n );\n }\n return n.trim();\n }\n return resolveD1CloudflareName(config, env, naming);\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveD1CloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { D1ResourceConfig } from \"./d1.types.js\";\n\nexport function d1DeriveName(\n config: D1ResourceConfig,\n env: string,\n shardDate: string | undefined,\n naming: NamingEngine,\n): string {\n if (config.type === \"single\") {\n return resolveD1CloudflareName(config, env, naming);\n }\n if (!shardDate) {\n throw new Error(`Sharded D1 \"${config.logicalName}\" requires shardDate`);\n }\n return resolveD1CloudflareName(config, env, naming, shardDate);\n}\n\nexport function d1DeriveBindingKey(\n config: D1ResourceConfig,\n shardDate: string | undefined,\n naming: NamingEngine,\n): string {\n if (config.type === \"single\") {\n return naming.d1SingleBindingKey(config.logicalName);\n }\n if (!shardDate) {\n throw new Error(`Sharded D1 \"${config.logicalName}\" requires shardDate`);\n }\n return naming.d1ShardBindingKey(config.logicalName, shardDate);\n}\n\nexport function d1MatchPattern(\n config: D1ResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n if (config.type === \"single\") {\n const exactName = resolveD1CloudflareName(config, env, naming);\n return (name: string) => name === exactName;\n }\n if (config.cloudflareName || naming.hasD1ShardConvention()) {\n return (name: string) => {\n const shardDate = d1ExtractShardDate(name, naming);\n if (!shardDate) return false;\n try {\n return resolveD1CloudflareName(config, env, naming, shardDate) === name;\n } catch {\n return false;\n }\n };\n }\n return naming.d1MatchPattern(config.logicalName, env);\n}\n\nexport function d1ExtractShardDate(name: string, naming: NamingEngine): string | null {\n return naming.extractD1ShardDate(name);\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { D1ResourceConfig } from \"./d1.types.js\";\nimport {\n d1CloudflareDatabaseName,\n d1SkipsProvisionAndMigrate,\n} from \"./d1.ownership.js\";\nimport { d1DeriveName } from \"./d1.naming.js\";\n\nfunction todayNoDashes(): string {\n return new Date().toISOString().slice(0, 10).replace(/-/g, \"\");\n}\n\nfunction todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nexport async function d1Apply(\n resources: D1ResourceConfig[],\n tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n addShard?: string\n): Promise<void> {\n for (const config of resources) {\n if (config.type === \"single\") {\n const derivedName = d1CloudflareDatabaseName(config, env, naming);\n const existing = state.get(derivedName);\n if (existing) continue;\n\n if (d1SkipsProvisionAndMigrate(config)) {\n console.warn(\n `[apply] Skipping D1 create for \"${config.logicalName}\" (external / preserveOnDestroy). ` +\n `Run \\`tamer sync\\` after the owning stack has created ${derivedName}.`,\n );\n continue;\n }\n\n const { uuid } = await api.d1Create(derivedName);\n state.set(derivedName, {\n type: \"d1_database\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.d1SingleBindingKey(config.logicalName),\n cfId: uuid,\n migrationsDir: config.migrationsDir,\n preserveOnDestroy: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n continue;\n }\n\n if (addShard && addShard !== config.logicalName) continue;\n if (addShard && addShard === config.logicalName) {\n const shardDate = todayNoDashes();\n const derivedName = d1DeriveName(config, env, shardDate, naming);\n const existing = state.get(derivedName);\n if (existing) continue;\n\n const { uuid } = await api.d1Create(derivedName);\n state.set(derivedName, {\n type: \"d1_database\",\n logicalName: config.logicalName,\n shardDate: todayIso(),\n derivedName,\n bindingKey: naming.d1ShardBindingKey(config.logicalName, shardDate),\n cfId: uuid,\n migrationsDir: config.migrationsDir,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n continue;\n }\n\n const allResources = state.getAll();\n const existingShards = Object.values(allResources).filter(\n (e) => e.type === \"d1_database\" && \"logicalName\" in e && e.logicalName === config.logicalName\n );\n if (existingShards.length > 0) continue;\n\n const shardDate = todayNoDashes();\n const derivedName = d1DeriveName(config, env, shardDate, naming);\n const { uuid } = await api.d1Create(derivedName);\n state.set(derivedName, {\n type: \"d1_database\",\n logicalName: config.logicalName,\n shardDate: todayIso(),\n derivedName,\n bindingKey: naming.d1ShardBindingKey(config.logicalName, shardDate),\n cfId: uuid,\n migrationsDir: config.migrationsDir,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { D1ResourceConfig, D1StateEntry } from \"./d1.types.js\";\nimport { d1MatchPattern, d1ExtractShardDate } from \"./d1.naming.js\";\nimport {\n d1CloudflareDatabaseName,\n d1SkipsProvisionAndMigrate,\n} from \"./d1.ownership.js\";\n\ninterface CFD1Database {\n uuid: string;\n name: string;\n created_at: string;\n}\n\nexport function d1Sync(\n allD1: CFD1Database[],\n resources: D1ResourceConfig[],\n tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine\n): void {\n for (const config of resources) {\n const pattern = d1MatchPattern(config, env, naming);\n\n if (config.type === \"single\") {\n const derivedKey = d1CloudflareDatabaseName(config, env, naming);\n const match = allD1.find((db) => db.name === derivedKey);\n if (match) {\n state.set(match.name, {\n type: \"d1_database\",\n logicalName: config.logicalName,\n derivedName: match.name,\n bindingKey:\n config.binding?.trim() || naming.d1SingleBindingKey(config.logicalName),\n cfId: match.uuid,\n migrationsDir: config.migrationsDir,\n preserveOnDestroy: d1SkipsProvisionAndMigrate(config),\n createdAt: match.created_at,\n updatedAt: new Date().toISOString(),\n });\n }\n continue;\n }\n\n const shards = allD1.filter((db) => pattern(db.name));\n for (const shard of shards) {\n const shardDate = d1ExtractShardDate(shard.name, naming);\n if (!shardDate) continue;\n\n state.set(shard.name, {\n type: \"d1_database\",\n logicalName: config.logicalName,\n shardDate,\n derivedName: shard.name,\n bindingKey: naming.d1ShardBindingKey(config.logicalName, shardDate),\n cfId: shard.uuid,\n migrationsDir: config.migrationsDir,\n createdAt: shard.created_at,\n updatedAt: new Date().toISOString(),\n });\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { D1ResourceConfig, D1StateEntry } from \"./d1.types.js\";\nimport { d1MatchPattern, d1ExtractShardDate } from \"./d1.naming.js\";\nimport { d1CloudflareDatabaseName } from \"./d1.ownership.js\";\nimport type { ResourceDrift, DriftEntry } from \"../../core/drift/drift.types.js\";\n\ninterface CFD1Database {\n uuid: string;\n name: string;\n}\n\n/**\n * Diff D1 state against the Cloudflare list and the current config.\n *\n * - **single**: one expected derived name per resource.\n * - **sharded**: every CF database matching the pattern is \"expected\"; state\n * should contain an entry for each.\n */\nexport function d1Drift(\n allD1: CFD1Database[],\n resources: D1ResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"d1\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(allD1.map((db) => [db.name, db.uuid]));\n const allState = state.getAll();\n const d1State = Object.values(allState).filter(\n (e): e is D1StateEntry => e.type === \"d1_database\",\n );\n\n for (const config of resources) {\n if (config.type === \"single\") {\n const derivedName = d1CloudflareDatabaseName(config, env, naming);\n const cfId = cfByName.get(derivedName);\n const stateEntry = d1State.find(\n (e) => e.logicalName === config.logicalName && !e.shardDate,\n );\n\n if (stateEntry && !cfId) {\n drift.missingFromCloudflare.push(toEntry(stateEntry));\n } else if (cfId && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId,\n });\n } else if (!cfId && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n continue;\n }\n\n const pattern = d1MatchPattern(config, env, naming);\n const cfShards = allD1.filter((db) => pattern(db.name));\n const cfShardNames = new Set(cfShards.map((s) => s.name));\n const stateShards = d1State.filter(\n (e) => e.logicalName === config.logicalName && !!e.shardDate,\n );\n const stateShardNames = new Set(stateShards.map((s) => s.derivedName));\n\n for (const shard of stateShards) {\n if (!cfShardNames.has(shard.derivedName)) {\n drift.missingFromCloudflare.push(toEntry(shard));\n }\n }\n for (const shard of cfShards) {\n if (!stateShardNames.has(shard.name)) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName: shard.name,\n cfId: shard.uuid,\n detail: d1ExtractShardDate(shard.name, naming) ?? undefined,\n });\n }\n }\n if (cfShards.length === 0 && stateShards.length === 0) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName: `(no shards for ${config.logicalName})`,\n });\n }\n }\n\n return drift;\n}\n\nfunction toEntry(e: D1StateEntry): DriftEntry {\n return {\n logicalName: e.logicalName,\n derivedName: e.derivedName,\n cfId: e.cfId,\n detail: e.shardDate,\n };\n}\n","import type { CfiConfig } from \"../../types.js\";\nimport { getWorkers } from \"./loader.js\";\nimport {\n getResourceModule,\n type ResourceKind,\n} from \"../registry/registry.js\";\n\n/**\n * Logical resource names declared on workers in this config (for\n * stack-scoped destroy / drift). Iterates the resource registry — adding a\n * new kind doesn't require editing this file.\n */\nexport async function logicalNamesForResourceKind(\n config: CfiConfig,\n baseDir: string,\n kind: ResourceKind,\n): Promise<Set<string>> {\n const mod = getResourceModule(kind);\n if (!mod) return new Set();\n const workers = await getWorkers(config, baseDir);\n const set = new Set<string>();\n for (const [, wc] of workers) {\n for (const r of mod.pickResources(wc)) {\n const logical = (r as { logicalName?: string }).logicalName;\n if (logical) set.add(logical);\n }\n }\n return set;\n}\n","import type { CfiConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\nimport type { D1StateEntry } from \"./d1.types.js\";\n\nexport async function d1Destroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"d1\");\n const resources = state.getAll();\n const d1Entries = Object.values(resources).filter(\n (e): e is D1StateEntry => e.type === \"d1_database\",\n );\n\n for (const entry of d1Entries) {\n if (!owned.has(entry.logicalName)) continue;\n if (entry.preserveOnDestroy) {\n console.log(\n `Skipping D1 destroy for ${entry.derivedName} (preserveOnDestroy / cross-stack binding).`,\n );\n continue;\n }\n try {\n await api.d1Delete(entry.cfId);\n state.delete(entry.derivedName);\n } catch (err) {\n console.warn(`Failed to delete D1 ${entry.derivedName}:`, err);\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { D1ResourceConfig, D1StateEntry } from \"./d1.types.js\";\nimport {\n d1CloudflareDatabaseName,\n d1SkipsProvisionAndMigrate,\n} from \"./d1.ownership.js\";\nimport type { WranglerD1Database } from \"../../generated/wrangler-types.js\";\nimport type { StateEntry } from \"../../types.js\";\n\nexport interface D1StateLike {\n get(derivedName: string): StateEntry | undefined;\n getAll(): Record<string, StateEntry>;\n}\n\nexport function d1Generate(\n resources: D1ResourceConfig[],\n env: string,\n state: D1StateLike,\n naming: NamingEngine\n): WranglerD1Database[] {\n const bindings: WranglerD1Database[] = [];\n\n for (const config of resources) {\n if (config.type === \"single\") {\n const derivedName = d1CloudflareDatabaseName(config, env, naming);\n const entry = state.get(derivedName);\n if (!entry || entry.type !== \"d1_database\") {\n if (d1SkipsProvisionAndMigrate(config)) {\n throw new Error(\n `Cross-stack D1 \"${config.logicalName}\" (${derivedName}) not in state. ` +\n `Deploy the owning stack first, then re-run from this stack ` +\n `(apply now syncs automatically for env \"${env}\").`,\n );\n }\n throw new Error(\n `D1 \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`\n );\n }\n bindings.push({\n binding: entry.bindingKey,\n database_id: entry.cfId,\n database_name: derivedName,\n migrations_dir: config.migrationsDir,\n migrations_table: config.migrationsTable,\n });\n continue;\n }\n\n const allResources = state.getAll();\n const shards = Object.values(allResources).filter(\n (e): e is D1StateEntry =>\n e.type === \"d1_database\" && e.logicalName === config.logicalName\n );\n\n for (const shard of shards) {\n bindings.push({\n binding: shard.bindingKey,\n database_id: shard.cfId,\n database_name: shard.derivedName,\n migrations_dir: config.migrationsDir,\n migrations_table: config.migrationsTable,\n });\n }\n }\n\n return bindings;\n}\n","import type { ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { D1ResourceConfig, D1StateEntry } from \"./d1.types.js\";\nimport { d1CloudflareDatabaseName } from \"./d1.ownership.js\";\n\nexport interface D1StatusResult {\n binding: string;\n name: string;\n cfId: string;\n status: ResourceStatus;\n}\n\nexport function d1Status(\n resources: D1ResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine\n): D1StatusResult[] {\n const results: D1StatusResult[] = [];\n\n for (const config of resources) {\n if (config.type === \"single\") {\n const derivedName = d1CloudflareDatabaseName(config, env, naming);\n const entry = state.get(derivedName) as D1StateEntry | undefined;\n results.push({\n binding:\n config.binding?.trim() || naming.d1SingleBindingKey(config.logicalName),\n name: derivedName,\n cfId: entry?.cfId ?? \"\",\n status: entry ? \"ok\" : \"missing\",\n });\n continue;\n }\n\n const allResources = state.getAll();\n const shards = Object.values(allResources).filter(\n (e): e is D1StateEntry =>\n e.type === \"d1_database\" && e.logicalName === config.logicalName\n );\n\n for (const shard of shards) {\n results.push({\n binding: shard.bindingKey,\n name: shard.derivedName,\n cfId: shard.cfId,\n status: \"ok\",\n });\n }\n\n if (shards.length === 0) {\n results.push({\n binding: naming.d1ShardBindingKey(config.logicalName, \"00000000\"),\n name: `(no shards for ${config.logicalName})`,\n cfId: \"\",\n status: \"missing\",\n });\n }\n }\n\n return results;\n}\n","import type { WorkerConfig, WorkerResources } from \"../../types.js\";\n\n/**\n * Helper used by every {@link ResourceModule.pickResources} so module files\n * can accept either a full `WorkerConfig` (the common path from `apply`,\n * `sync`, `drift`, `status`) or a bare `WorkerResources` (the wrangler\n * generator passes `resolved.resources` directly). Returns `undefined`\n * when no resource map is present.\n */\nexport function resourcesFrom(\n source: WorkerConfig | WorkerResources | undefined,\n): WorkerResources | undefined {\n if (!source) return undefined;\n if (\"resources\" in source) {\n return (source as WorkerConfig).resources;\n }\n return source as WorkerResources;\n}\n","import type { CfiConfig, WorkerResources } from \"../../types.js\";\nimport { getWorkers } from \"../config/loader.js\";\n\n/**\n * Find the first declared resource config matching `logical` across all workers.\n * Used by `tamer import` to validate CF names against {@link cloudflareName} overrides.\n */\nexport async function findWorkerResourceByLogicalName<\n C extends { logicalName: string },\n>(\n config: CfiConfig,\n configKey: keyof WorkerResources,\n logical: string,\n baseDir?: string,\n): Promise<C | undefined> {\n const workers = await getWorkers(config, baseDir);\n for (const [, wc] of workers) {\n const list = wc.resources?.[configKey] as C[] | undefined;\n if (!list) continue;\n const hit = list.find((r) => r.logicalName === logical);\n if (hit) return hit;\n }\n return undefined;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { D1ResourceConfig } from \"./d1.types.js\";\nimport type {\n WorkerConfig,\n WorkerResources,\n D1StateEntry,\n} from \"../../types.js\";\nimport { d1Apply } from \"./d1.apply.js\";\nimport { d1Sync } from \"./d1.sync.js\";\nimport { d1Drift } from \"./d1.drift.js\";\nimport { d1Destroy } from \"./d1.destroy.js\";\nimport { d1Generate } from \"./d1.generate.js\";\nimport { d1Status } from \"./d1.status.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { d1DeriveName } from \"./d1.naming.js\";\n\ninterface CFD1 {\n uuid: string;\n name: string;\n created_at: string;\n}\n\nexport const d1Module: ResourceModule<D1ResourceConfig, CFD1> = {\n kind: \"d1\",\n label: \"D1\",\n configKey: \"d1\",\n stateEntryType: \"d1_database\",\n\n async fetchAll(api: CFApiClient): Promise<CFD1[]> {\n return api.d1ListAll();\n },\n\n async apply(ctx) {\n await d1Apply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n ctx.addShard,\n );\n },\n\n sync(ctx) {\n d1Sync(ctx.all, ctx.resources, ctx.tenant, ctx.env, ctx.state, ctx.naming);\n },\n\n drift(ctx) {\n return d1Drift(ctx.all, ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n async destroy(ctx) {\n await d1Destroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return d1Status(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n if (ctx.resources.length === 0) return {};\n const generated = d1Generate(ctx.resources, ctx.env, ctx.state, ctx.naming);\n const passthrough = ctx.passthrough?.d1_databases ?? [];\n return { d1_databases: [...passthrough, ...generated] };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): D1ResourceConfig[] {\n return resourcesFrom(source)?.d1 ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"d1_database\") return;\n try {\n await api.d1Delete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(`Rollback: failed to delete D1 ${entry.derivedName}:`, err);\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n if (!options.cfId) throw new Error(\"import d1: --cf-id <uuid> is required\");\n const resourceConfig = await findWorkerResourceByLogicalName<D1ResourceConfig>(\n config,\n \"d1\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import d1: no resources.d1 entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.d1ListAll();\n const hit = all.find((d) => d.uuid === options.cfId);\n if (!hit) {\n throw new Error(\n `import d1: D1 database with uuid \"${options.cfId}\" not found in account`,\n );\n }\n const derivedName = options.shardDate\n ? d1DeriveName(resourceConfig, env, options.shardDate, naming)\n : d1DeriveName(resourceConfig, env, undefined, naming);\n if (hit.name !== derivedName) {\n throw new Error(\n `import d1: cf name \"${hit.name}\" does not match derived \"${derivedName}\" — wrong --logical, missing --shard-date, or naming convention drift?`,\n );\n }\n const bindingKey = options.shardDate\n ? naming.d1ShardBindingKey(options.logical, options.shardDate)\n : naming.d1SingleBindingKey(options.logical);\n const existing = state.get(derivedName);\n if (\n existing &&\n existing.type === \"d1_database\" &&\n existing.cfId !== options.cfId\n ) {\n throw new Error(\n `import d1: state already tracks \"${derivedName}\" with a different cfId`,\n );\n }\n const entry: D1StateEntry = {\n type: \"d1_database\",\n logicalName: options.logical,\n shardDate: options.shardDate,\n derivedName,\n bindingKey,\n cfId: options.cfId,\n createdAt: existing?.type === \"d1_database\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(derivedName, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveR2CloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { R2ResourceConfig } from \"./r2.types.js\";\n\nexport function r2DeriveName(\n config: R2ResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveR2CloudflareName(config, env, naming);\n}\n\nexport function r2MatchPattern(\n config: R2ResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n if (config.cloudflareName) {\n const expected = resolveR2CloudflareName(config, env, naming);\n return (name: string) => name === expected;\n }\n return naming.r2MatchPattern(config.logicalName, env);\n}\n\nexport function r2ExtractDate(name: string, naming: NamingEngine): string | null {\n return naming.extractR2Date(name);\n}\n","import type { TenantMeta, R2StateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { R2ResourceConfig } from \"./r2.types.js\";\nimport { r2DeriveName } from \"./r2.naming.js\";\n\nfunction existingR2ForLogical(\n state: StateManager,\n logicalName: string,\n): R2StateEntry | undefined {\n for (const e of Object.values(state.getAll())) {\n if (e.type === \"r2_bucket\" && e.logicalName === logicalName) {\n return e;\n }\n }\n return undefined;\n}\n\nfunction todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\n// https://developers.cloudflare.com/r2/buckets/create-buckets/#bucket-level-operations\nfunction assertValidR2BucketName(name: string, logicalName: string): void {\n const errors: string[] = [];\n if (name.length < 3 || name.length > 63) {\n errors.push(`length must be 3-63 chars (got ${name.length})`);\n }\n if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(name)) {\n errors.push(\n \"must contain only lowercase letters, numbers, and hyphens, and start/end with a letter or number\",\n );\n }\n if (/--/.test(name)) {\n errors.push(\"must not contain consecutive hyphens\");\n }\n if (errors.length > 0) {\n throw new Error(\n `Invalid R2 bucket name \"${name}\" (derived for logical resource \"${logicalName}\"): ${errors.join(\"; \")}. ` +\n `Adjust your naming.r2Bucket hook (e.g., replace underscores with hyphens and lowercase the result).`,\n );\n }\n}\n\nexport async function r2Apply(\n resources: R2ResourceConfig[],\n tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = r2DeriveName(config, env, naming);\n const existing = state.get(derivedName);\n if (existing) {\n console.log(\n `R2: skip \"${derivedName}\" (already in state; logical \"${config.logicalName}\")`,\n );\n continue;\n }\n const prior = existingR2ForLogical(state, config.logicalName);\n if (prior) {\n console.log(\n `R2: skip \"${derivedName}\" (logical \"${config.logicalName}\" already in state as \"${prior.derivedName}\")`,\n );\n continue;\n }\n\n assertValidR2BucketName(derivedName, config.logicalName);\n await api.r2Create(derivedName);\n console.log(\n `R2: created \"${derivedName}\" (logical \"${config.logicalName}\")`,\n );\n state.set(derivedName, {\n type: \"r2_bucket\",\n logicalName: config.logicalName,\n createdDate: todayIso(),\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.r2BindingKey(config.logicalName),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { R2ResourceConfig } from \"./r2.types.js\";\nimport { r2ExtractDate, r2MatchPattern } from \"./r2.naming.js\";\n\ninterface CFR2Bucket {\n name: string;\n creation_date: string;\n}\n\nexport function r2Sync(\n allR2: CFR2Bucket[],\n resources: R2ResourceConfig[],\n tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine\n): void {\n for (const config of resources) {\n const pattern = r2MatchPattern(config, env, naming);\n const match = allR2.find((b) => pattern(b.name));\n if (match) {\n const createdDate = r2ExtractDate(match.name, naming) ?? match.creation_date.slice(0, 10);\n const prev = state.get(match.name);\n state.set(match.name, {\n type: \"r2_bucket\",\n logicalName: config.logicalName,\n createdDate,\n derivedName: match.name,\n bindingKey:\n config.binding?.trim() ||\n (prev?.type === \"r2_bucket\" && prev.bindingKey\n ? prev.bindingKey\n : naming.r2BindingKey(config.logicalName)),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { R2ResourceConfig, R2StateEntry } from \"./r2.types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { r2MatchPattern } from \"./r2.naming.js\";\n\ninterface CFR2Bucket {\n name: string;\n}\n\n/**\n * Diff R2 state against the Cloudflare list and the current config.\n *\n * R2 buckets carry a date stamp, so each declared resource matches at most one\n * bucket (the one whose name matches the logical-name pattern).\n */\nexport function r2Drift(\n allR2: CFR2Bucket[],\n resources: R2ResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"r2\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfNames = new Set(allR2.map((b) => b.name));\n const allState = state.getAll();\n const r2State = Object.values(allState).filter(\n (e): e is R2StateEntry => e.type === \"r2_bucket\",\n );\n\n for (const config of resources) {\n const pattern = r2MatchPattern(config, env, naming);\n const cfMatch = allR2.find((b) => pattern(b.name));\n const stateEntry = r2State.find(\n (e) => e.logicalName === config.logicalName,\n );\n\n if (stateEntry && !cfNames.has(stateEntry.derivedName)) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n });\n continue;\n }\n if (cfMatch && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName: cfMatch.name,\n });\n continue;\n }\n if (!cfMatch && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName: `(no bucket for ${config.logicalName})`,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\nimport type { R2StateEntry } from \"./r2.types.js\";\nimport {\n emptyR2BucketViaS3,\n r2S3CredentialsFromEnv,\n} from \"./r2S3EmptyBucket.js\";\n\nexport async function r2Destroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"r2\");\n const resources = state.getAll();\n const r2Entries = Object.values(resources).filter(\n (e): e is R2StateEntry => e.type === \"r2_bucket\",\n );\n const accountId = api.getAccountId();\n const s3creds = r2S3CredentialsFromEnv();\n\n for (const entry of r2Entries) {\n if (!owned.has(entry.logicalName)) continue;\n const name = entry.derivedName;\n if (s3creds) {\n try {\n console.log(\n `R2: emptying bucket \"${name}\" via S3 API (incomplete multipart uploads, then objects)…`,\n );\n const { uploadsAborted, objectsDeleted } = await emptyR2BucketViaS3(\n accountId,\n name,\n s3creds,\n );\n console.log(\n `R2: bucket \"${name}\" — aborted ${uploadsAborted} multipart upload(s), deleted ${objectsDeleted} object(s).`,\n );\n } catch (err) {\n console.warn(\n `R2: S3 empty failed for \"${name}\" (fix credentials or use the dashboard; still attempting API bucket delete):`,\n err instanceof Error ? err.message : err,\n );\n }\n } else {\n console.warn(\n `R2: skipping S3 empty for \"${name}\" (set R2_ACCESS_KEY_ID and R2_SECRET_ACCESS_KEY to remove all objects and incomplete multipart uploads before bucket delete). ` +\n `Create an R2 API token in the dashboard (R2 → Manage R2 API Tokens) with object read+write; those keys are not the same as CLOUDFLARE_API_TOKEN.`,\n );\n }\n try {\n await api.r2Delete(name);\n state.delete(name);\n } catch (err) {\n console.warn(`Failed to delete R2 ${name}:`, err);\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { R2ResourceConfig, R2StateEntry } from \"./r2.types.js\";\nimport type { WranglerR2Bucket } from \"../../generated/wrangler-types.js\";\nimport type { StateEntry } from \"../../types.js\";\n\nexport interface R2StateLike {\n get(derivedName: string): StateEntry | undefined;\n getAll(): Record<string, StateEntry>;\n}\n\nexport function r2Generate(\n resources: R2ResourceConfig[],\n env: string,\n state: R2StateLike,\n naming: NamingEngine\n): WranglerR2Bucket[] {\n const bindings: WranglerR2Bucket[] = [];\n\n for (const config of resources) {\n const allResources = state.getAll();\n const entry = Object.values(allResources).find(\n (e): e is R2StateEntry =>\n e.type === \"r2_bucket\" && e.logicalName === config.logicalName,\n );\n\n if (!entry) {\n throw new Error(\n `R2 \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`\n );\n }\n\n bindings.push({\n binding: entry.bindingKey,\n bucket_name: entry.derivedName,\n });\n }\n\n return bindings;\n}\n","import type { ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { R2ResourceConfig, R2StateEntry } from \"./r2.types.js\";\nimport { r2DeriveName } from \"./r2.naming.js\";\n\nexport interface R2StatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function r2Status(\n resources: R2ResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine\n): R2StatusResult[] {\n const results: R2StatusResult[] = [];\n\n for (const config of resources) {\n const allResources = state.getAll();\n const entry = Object.values(allResources).find(\n (e): e is R2StateEntry =>\n e.type === \"r2_bucket\" && e.logicalName === config.logicalName\n );\n\n results.push({\n binding: entry?.bindingKey ?? naming.r2BindingKey(config.logicalName),\n name: entry?.derivedName ?? r2DeriveName(config, env, naming),\n status: entry ? \"ok\" : \"missing\",\n });\n }\n\n return results;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { R2ResourceConfig } from \"./r2.types.js\";\nimport type {\n WorkerConfig,\n WorkerResources,\n R2StateEntry,\n} from \"../../types.js\";\nimport { r2Apply } from \"./r2.apply.js\";\nimport { r2Sync } from \"./r2.sync.js\";\nimport { r2Drift } from \"./r2.drift.js\";\nimport { r2Destroy } from \"./r2.destroy.js\";\nimport { r2Generate } from \"./r2.generate.js\";\nimport { r2Status } from \"./r2.status.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { r2MatchPattern } from \"./r2.naming.js\";\n\ninterface CFR2 {\n name: string;\n creation_date: string;\n}\n\nexport const r2Module: ResourceModule<R2ResourceConfig, CFR2> = {\n kind: \"r2\",\n label: \"R2\",\n configKey: \"r2\",\n stateEntryType: \"r2_bucket\",\n\n async fetchAll(api: CFApiClient): Promise<CFR2[]> {\n return api.r2ListAll();\n },\n\n async apply(ctx) {\n await r2Apply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n r2Sync(ctx.all, ctx.resources, ctx.tenant, ctx.env, ctx.state, ctx.naming);\n },\n\n drift(ctx) {\n return r2Drift(ctx.all, ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n async destroy(ctx) {\n await r2Destroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return r2Status(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n if (ctx.resources.length === 0) return {};\n return {\n r2_buckets: r2Generate(ctx.resources, ctx.env, ctx.state, ctx.naming),\n };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): R2ResourceConfig[] {\n return resourcesFrom(source)?.r2 ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"r2_bucket\") return;\n try {\n await api.r2Delete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(`Rollback: failed to delete R2 ${entry.derivedName}:`, err);\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n const bucketName = options.cfId;\n if (!bucketName) {\n throw new Error(\"import r2: --cf-id <bucket-name> is required\");\n }\n const resourceConfig = await findWorkerResourceByLogicalName<R2ResourceConfig>(\n config,\n \"r2\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import r2: no resources.r2 entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.r2ListAll();\n const hit = all.find((b) => b.name === bucketName);\n if (!hit) {\n throw new Error(`import r2: bucket \"${bucketName}\" not found in account`);\n }\n const pattern = r2MatchPattern(resourceConfig, env, naming);\n if (!pattern(hit.name)) {\n throw new Error(\n `import r2: bucket name \"${hit.name}\" does not match expected pattern for logical \"${options.logical}\" and env \"${env}\"`,\n );\n }\n const derivedName = hit.name;\n const createdDate =\n options.createdDate ??\n naming.extractR2Date(hit.name) ??\n hit.creation_date.slice(0, 10);\n const bindingKey = naming.r2BindingKey(options.logical);\n const existing = state.get(derivedName);\n const entry: R2StateEntry = {\n type: \"r2_bucket\",\n logicalName: options.logical,\n derivedName,\n bindingKey,\n createdDate,\n createdAt: existing?.type === \"r2_bucket\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(derivedName, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveKVCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { KVResourceConfig } from \"../../types.js\";\n\nexport function kvDeriveName(\n config: KVResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveKVCloudflareName(config, env, naming);\n}\n\nexport function kvMatchPattern(\n config: KVResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveKVCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { KVResourceConfig } from \"./kv.types.js\";\nimport { kvDeriveName } from \"./kv.naming.js\";\n\nexport async function kvApply(\n resources: KVResourceConfig[],\n tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine\n): Promise<void> {\n for (const config of resources) {\n const derivedName = kvDeriveName(config, env, naming);\n const existing = state.get(derivedName);\n if (existing) continue;\n\n const { id } = await api.kvCreate(derivedName);\n state.set(derivedName, {\n type: \"kv_namespace\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.kvBindingKey(config.logicalName),\n cfId: id,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { KVResourceConfig } from \"./kv.types.js\";\nimport { kvDeriveName } from \"./kv.naming.js\";\n\ninterface CFKVNamespace {\n id: string;\n title: string;\n}\n\nexport function kvSync(\n allKV: CFKVNamespace[],\n resources: KVResourceConfig[],\n tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine\n): void {\n for (const config of resources) {\n const derivedName = kvDeriveName(config, env, naming);\n const match = allKV.find((ns) => ns.title === derivedName);\n if (match) {\n state.set(derivedName, {\n type: \"kv_namespace\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.kvBindingKey(config.logicalName),\n cfId: match.id,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { KVResourceConfig } from \"./kv.types.js\";\nimport type { KVStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { kvDeriveName } from \"./kv.naming.js\";\n\ninterface CFKVNamespace {\n id: string;\n title: string;\n}\n\nexport function kvDrift(\n allKV: CFKVNamespace[],\n resources: KVResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"kv\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByTitle = new Map(allKV.map((ns) => [ns.title, ns.id]));\n const allState = state.getAll();\n const kvState = Object.values(allState).filter(\n (e): e is KVStateEntry => e.type === \"kv_namespace\",\n );\n\n for (const config of resources) {\n const derivedName = kvDeriveName(config, env, naming);\n const cfId = cfByTitle.get(derivedName);\n const stateEntry = kvState.find(\n (e) => e.logicalName === config.logicalName,\n );\n\n if (stateEntry && !cfId) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (cfId && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId,\n });\n } else if (!cfId && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, KVStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function kvDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"kv\");\n const resources = state.getAll();\n const kvEntries = Object.values(resources).filter(\n (e): e is KVStateEntry => e.type === \"kv_namespace\"\n );\n\n for (const entry of kvEntries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.kvDelete(entry.cfId);\n state.delete(entry.derivedName);\n } catch (err) {\n console.warn(`Failed to delete KV ${entry.derivedName}:`, err);\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { KVResourceConfig } from \"./kv.types.js\";\nimport type { KVStateEntry } from \"../../types.js\";\nimport type { WranglerKVNamespace } from \"../../generated/wrangler-types.js\";\nimport type { StateEntry } from \"../../types.js\";\nimport { kvDeriveName } from \"./kv.naming.js\";\n\nexport interface KVStateLike {\n get(derivedName: string): StateEntry | undefined;\n getAll(): Record<string, StateEntry>;\n}\n\nexport function kvGenerate(\n resources: KVResourceConfig[],\n env: string,\n state: KVStateLike,\n naming: NamingEngine\n): WranglerKVNamespace[] {\n const bindings: WranglerKVNamespace[] = [];\n\n for (const config of resources) {\n const derivedName = kvDeriveName(config, env, naming);\n const entry = state.get(derivedName);\n if (!entry || entry.type !== \"kv_namespace\") {\n throw new Error(\n `KV \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`\n );\n }\n\n bindings.push({\n binding: entry.bindingKey,\n id: entry.cfId,\n });\n }\n\n return bindings;\n}\n","import type { ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { KVResourceConfig } from \"./kv.types.js\";\nimport type { KVStateEntry } from \"../../types.js\";\nimport { kvDeriveName } from \"./kv.naming.js\";\n\nexport interface KVStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function kvStatus(\n resources: KVResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine\n): KVStatusResult[] {\n const results: KVStatusResult[] = [];\n\n for (const config of resources) {\n const derivedName = kvDeriveName(config, env, naming);\n const entry = state.get(derivedName) as KVStateEntry | undefined;\n\n results.push({\n binding: naming.kvBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n\n return results;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { KVResourceConfig } from \"./kv.types.js\";\nimport type {\n WorkerConfig,\n WorkerResources,\n KVStateEntry,\n} from \"../../types.js\";\nimport { kvApply } from \"./kv.apply.js\";\nimport { kvSync } from \"./kv.sync.js\";\nimport { kvDrift } from \"./kv.drift.js\";\nimport { kvDestroy } from \"./kv.destroy.js\";\nimport { kvGenerate } from \"./kv.generate.js\";\nimport { kvStatus } from \"./kv.status.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { kvDeriveName } from \"./kv.naming.js\";\n\ninterface CFKv {\n id: string;\n title: string;\n}\n\nexport const kvModule: ResourceModule<KVResourceConfig, CFKv> = {\n kind: \"kv\",\n label: \"KV\",\n configKey: \"kv\",\n stateEntryType: \"kv_namespace\",\n\n async fetchAll(api: CFApiClient): Promise<CFKv[]> {\n const all = await api.kvListAll();\n return all.map((k) => ({ id: k.id, title: k.title }));\n },\n\n async apply(ctx) {\n await kvApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n kvSync(ctx.all, ctx.resources, ctx.tenant, ctx.env, ctx.state, ctx.naming);\n },\n\n drift(ctx) {\n return kvDrift(ctx.all, ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n async destroy(ctx) {\n await kvDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return kvStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n if (ctx.resources.length === 0) return {};\n return {\n kv_namespaces: kvGenerate(ctx.resources, ctx.env, ctx.state, ctx.naming),\n };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): KVResourceConfig[] {\n return resourcesFrom(source)?.kv ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"kv_namespace\") return;\n try {\n await api.kvDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(`Rollback: failed to delete KV ${entry.derivedName}:`, err);\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n if (!options.cfId)\n throw new Error(\"import kv: --cf-id <namespace-id> is required\");\n const resourceConfig = await findWorkerResourceByLogicalName<KVResourceConfig>(\n config,\n \"kv\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import kv: no resources.kv entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.kvListAll();\n const hit = all.find((k) => k.id === options.cfId);\n if (!hit) {\n throw new Error(\n `import kv: KV namespace id \"${options.cfId}\" not found in account`,\n );\n }\n const derivedName = kvDeriveName(resourceConfig, env, naming);\n if (hit.title !== derivedName) {\n throw new Error(\n `import kv: cf title \"${hit.title}\" does not match derived \"${derivedName}\"`,\n );\n }\n const bindingKey = naming.kvBindingKey(options.logical);\n const existing = state.get(derivedName);\n const entry: KVStateEntry = {\n type: \"kv_namespace\",\n logicalName: options.logical,\n derivedName,\n bindingKey,\n cfId: options.cfId,\n createdAt: existing?.type === \"kv_namespace\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(derivedName, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveQueueCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { QueueResourceConfig } from \"../../types.js\";\n\nexport function queueDeriveName(\n config: QueueResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveQueueCloudflareName(config, env, naming);\n}\n\nexport function queueMatchPattern(\n config: QueueResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveQueueCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { QueueResourceConfig } from \"./queues.types.js\";\nimport { queueDeriveName } from \"./queues.naming.js\";\n\nconst STATE_KEY_PREFIX = \"queue:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\nexport async function queuesApply(\n resources: QueueResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = queueDeriveName(config, env, naming);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n if (existing) continue;\n\n const ts = new Date().toISOString();\n const { queue_id } = await api.queueCreate(derivedName);\n state.set(key, {\n type: \"queue\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.queueBindingKey(config.logicalName),\n cfId: queue_id,\n producerBinding: !config.consumerOnly,\n createdAt: ts,\n updatedAt: ts,\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { QueueResourceConfig } from \"./queues.types.js\";\nimport { queueDeriveName } from \"./queues.naming.js\";\n\ninterface CFQueue {\n queue_id: string;\n queue_name: string;\n}\n\nexport function queuesSync(\n allQueues: CFQueue[],\n resources: QueueResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = queueDeriveName(config, env, naming);\n const match = allQueues.find((q) => q.queue_name === derivedName);\n if (!match) continue;\n const key = `queue:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n state.set(key, {\n type: \"queue\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.queueBindingKey(config.logicalName),\n cfId: match.queue_id,\n producerBinding: !config.consumerOnly,\n createdAt: existing?.type === \"queue\" ? existing.createdAt : ts,\n updatedAt: ts,\n });\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { QueueResourceConfig } from \"./queues.types.js\";\nimport type { QueueStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { queueDeriveName } from \"./queues.naming.js\";\n\ninterface CFQueue {\n queue_id: string;\n queue_name: string;\n}\n\nexport function queuesDrift(\n allQueues: CFQueue[],\n resources: QueueResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"queue\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(allQueues.map((q) => [q.queue_name, q.queue_id]));\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is QueueStateEntry => e.type === \"queue\",\n );\n\n for (const config of resources) {\n const derivedName = queueDeriveName(config, env, naming);\n const cfId = cfByName.get(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !cfId) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (cfId && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId,\n });\n } else if (!cfId && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, QueueStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function queuesDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"queue\");\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, QueueStateEntry] => kv[1].type === \"queue\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.queueDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(`Failed to delete queue ${entry.derivedName}:`, err);\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { QueueResourceConfig } from \"./queues.types.js\";\nimport type { StateEntry } from \"../../types.js\";\nimport { queueDeriveName } from \"./queues.naming.js\";\n\nexport interface QueuesStateLike {\n get(key: string): StateEntry | undefined;\n getAll(): Record<string, StateEntry>;\n}\n\nexport interface GeneratedQueues {\n producers?: Array<{ binding: string; queue: string }>;\n}\n\n/**\n * Emit `queues.producers[]` for every declared queue (skips entries marked\n * `consumerOnly`). Consumers stay wrangler-side and can be set on the worker\n * config under `queues.consumers` (passed through unchanged).\n */\nexport function queuesGenerate(\n resources: QueueResourceConfig[],\n env: string,\n state: QueuesStateLike,\n naming: NamingEngine,\n): GeneratedQueues | undefined {\n const producers: Array<{ binding: string; queue: string }> = [];\n\n for (const config of resources) {\n if (config.consumerOnly) continue;\n const derivedName = queueDeriveName(config, env, naming);\n const entry = state.get(`queue:${derivedName}`);\n if (!entry || entry.type !== \"queue\") {\n throw new Error(\n `Queue \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`,\n );\n }\n producers.push({\n binding: entry.bindingKey,\n queue: entry.derivedName,\n });\n }\n\n if (producers.length === 0) return undefined;\n return { producers };\n}\n","import type { ResourceStatus, QueueStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { QueueResourceConfig } from \"./queues.types.js\";\nimport { queueDeriveName } from \"./queues.naming.js\";\n\nexport interface QueuesStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function queuesStatus(\n resources: QueueResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): QueuesStatusResult[] {\n const out: QueuesStatusResult[] = [];\n for (const config of resources) {\n const derivedName = queueDeriveName(config, env, naming);\n const entry = state.get(`queue:${derivedName}`) as\n | QueueStateEntry\n | undefined;\n out.push({\n binding:\n config.binding?.trim() || naming.queueBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { QueueResourceConfig } from \"./queues.types.js\";\nimport type {\n WorkerConfig,\n WorkerResources,\n QueueStateEntry,\n} from \"../../types.js\";\nimport { queuesApply } from \"./queues.apply.js\";\nimport { queuesSync } from \"./queues.sync.js\";\nimport { queuesDrift } from \"./queues.drift.js\";\nimport { queuesDestroy } from \"./queues.destroy.js\";\nimport { queuesGenerate } from \"./queues.generate.js\";\nimport { queuesStatus } from \"./queues.status.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { queueDeriveName } from \"./queues.naming.js\";\n\ninterface CFQueue {\n queue_id: string;\n queue_name: string;\n}\n\nexport const queuesModule: ResourceModule<QueueResourceConfig, CFQueue> = {\n kind: \"queue\",\n label: \"Queues\",\n configKey: \"queues\",\n stateEntryType: \"queue\",\n\n async fetchAll(api: CFApiClient): Promise<CFQueue[]> {\n const all = await api.queuesListAll();\n return all.map((q) => ({ queue_id: q.queue_id, queue_name: q.queue_name }));\n },\n\n async apply(ctx) {\n await queuesApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n queuesSync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return queuesDrift(ctx.all, ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n async destroy(ctx) {\n await queuesDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return queuesStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n const generated =\n ctx.resources.length > 0\n ? queuesGenerate(ctx.resources, ctx.env, ctx.state, ctx.naming)\n : undefined;\n const passthrough = ctx.passthrough?.queues;\n if (!generated && !passthrough) return {};\n const producers = [\n ...(passthrough?.producers ?? []),\n ...(generated?.producers ?? []),\n ];\n const consumers = passthrough?.consumers ?? [];\n if (producers.length === 0 && consumers.length === 0) return {};\n const out: NonNullable<\n import(\"../../generated/wrangler-types.js\").WranglerConfig[\"queues\"]\n > = {};\n if (producers.length > 0) out.producers = producers;\n if (consumers.length > 0) out.consumers = consumers;\n return { queues: out };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): QueueResourceConfig[] {\n return resourcesFrom(source)?.queues ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"queue\") return;\n try {\n await api.queueDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete queue ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n if (!options.cfId) {\n throw new Error(\"import queue: --cf-id <queue-id> is required\");\n }\n const resourceConfig =\n await findWorkerResourceByLogicalName<QueueResourceConfig>(\n config,\n \"queues\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import queue: no resources.queues entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.queuesListAll();\n const hit = all.find((q) => q.queue_id === options.cfId);\n if (!hit) {\n throw new Error(\n `import queue: queue id \"${options.cfId}\" not found in account`,\n );\n }\n const derivedName = queueDeriveName(resourceConfig, env, naming);\n if (hit.queue_name !== derivedName) {\n throw new Error(\n `import queue: cf name \"${hit.queue_name}\" does not match derived \"${derivedName}\"`,\n );\n }\n const bindingKey = naming.queueBindingKey(options.logical);\n const key = `queue:${derivedName}`;\n const existing = state.get(key);\n const entry: QueueStateEntry = {\n type: \"queue\",\n logicalName: options.logical,\n derivedName,\n bindingKey,\n cfId: options.cfId,\n producerBinding: existing?.type === \"queue\" ? existing.producerBinding : true,\n createdAt: existing?.type === \"queue\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","import type { HyperdriveResourceConfig } from \"../../types.js\";\n\n/**\n * Resolve a value that is either a literal string or `{ fromEnv: \"VAR\" }`\n * lookup against `process.env`. Throws a clear error when the env var is\n * missing — these values are sent to Cloudflare on create and never\n * persisted in Tamer state.\n */\nexport function resolveSecret(\n value: string | { fromEnv: string },\n label: string,\n): string {\n if (typeof value === \"string\") return value;\n const envName = value.fromEnv;\n const v = process.env[envName];\n if (!v) {\n throw new Error(\n `hyperdrive: ${label} requires env var ${envName} (set it before running 'tamer apply')`,\n );\n }\n return v;\n}\n\nexport interface ResolvedHyperdriveOrigin {\n scheme: string;\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n access_client_id?: string;\n access_client_secret?: string;\n}\n\nexport function resolveHyperdriveOrigin(\n config: HyperdriveResourceConfig,\n): ResolvedHyperdriveOrigin {\n const o = config.origin;\n return {\n scheme: o.scheme,\n host: o.host,\n port: o.port,\n database: o.database,\n user: o.user,\n password: resolveSecret(o.password, `${config.logicalName}.origin.password`),\n access_client_id: o.access_client_id,\n access_client_secret: o.access_client_secret\n ? resolveSecret(\n o.access_client_secret,\n `${config.logicalName}.origin.access_client_secret`,\n )\n : undefined,\n };\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveHyperdriveCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { HyperdriveResourceConfig } from \"../../types.js\";\n\nexport function hyperdriveDeriveName(\n config: HyperdriveResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveHyperdriveCloudflareName(config, env, naming);\n}\n\nexport function hyperdriveMatchPattern(\n config: HyperdriveResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveHyperdriveCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","/**\n * Plan-time field-level diff for declared Hyperdrive configurations.\n * Mirrors the PATCH path in {@link hyperdriveApply}: Cloudflare's\n * `PATCH /accounts/{id}/hyperdrive/configs/{id}` accepts in-place edits\n * to `origin` (host / database / scheme / user / port / password) so any\n * drift on the **state-tracked** origin metadata (`scheme`, `originHost`,\n * `originDatabase`) becomes an `update` action — Tamer never destroys\n * and recreates a Hyperdrive config.\n *\n * Origin password is intentionally **not** in state (write-only on\n * Cloudflare's side, never returned), so it cannot be diffed; users who\n * rotate via `{ fromEnv: \"DATABASE_PASSWORD\" }` should run `tamer apply`\n * which always re-sends the resolved origin payload.\n *\n * Resources without a state row are reported by `hyperdriveDrift` as\n * `undeployed` and become `create` items.\n */\n\nimport type {\n HyperdriveResourceConfig,\n HyperdriveStateEntry,\n} from \"../../types.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { PlanFieldChange, PlanItem } from \"../../core/plan/plan.types.js\";\n\nexport function hyperdriveDiffPlanItems(args: {\n resources: HyperdriveResourceConfig[];\n env: string;\n state: StateManager;\n naming: NamingEngine;\n}): PlanItem[] {\n const { resources, env, state, naming } = args;\n const items: PlanItem[] = [];\n\n for (const config of resources) {\n const derivedName = hyperdriveDeriveName(config, env, naming);\n const entry = state.get(`hyperdrive:${derivedName}`);\n if (!entry || entry.type !== \"hyperdrive\") continue;\n\n const changes = computeChanges(entry as HyperdriveStateEntry, config);\n if (changes.length === 0) continue;\n items.push({\n kind: \"hyperdrive\",\n action: \"update\",\n logicalName: config.logicalName,\n derivedName,\n detail: changes\n .map((c) => `${c.field}: ${formatVal(c.from)} -> ${formatVal(c.to)}`)\n .join(\", \"),\n changes,\n });\n }\n\n return items;\n}\n\n/**\n * Pure comparison shared with `hyperdriveApply` so plan and apply agree\n * on what counts as drift on the origin fields Tamer persists.\n */\nexport function computeHyperdriveChanges(\n state: HyperdriveStateEntry,\n config: HyperdriveResourceConfig,\n): PlanFieldChange[] {\n return computeChanges(state, config);\n}\n\nfunction computeChanges(\n state: HyperdriveStateEntry,\n config: HyperdriveResourceConfig,\n): PlanFieldChange[] {\n const changes: PlanFieldChange[] = [];\n if (state.scheme !== config.origin.scheme) {\n changes.push({\n field: \"origin.scheme\",\n from: state.scheme,\n to: config.origin.scheme,\n kind: \"mutable\",\n });\n }\n if (state.originHost !== config.origin.host) {\n changes.push({\n field: \"origin.host\",\n from: state.originHost,\n to: config.origin.host,\n kind: \"mutable\",\n });\n }\n if (state.originDatabase !== config.origin.database) {\n changes.push({\n field: \"origin.database\",\n from: state.originDatabase,\n to: config.origin.database,\n kind: \"mutable\",\n });\n }\n return changes;\n}\n\nfunction formatVal(v: unknown): string {\n if (v === undefined) return \"(unset)\";\n if (typeof v === \"string\") return v.length > 32 ? `${v.slice(0, 29)}...` : v;\n return String(v);\n}\n","import type { HyperdriveStateEntry, TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { HyperdriveResourceConfig } from \"./hyperdrive.types.js\";\nimport { resolveHyperdriveOrigin } from \"./hyperdrive.secrets.js\";\nimport { computeHyperdriveChanges } from \"./hyperdrive.diff.js\";\nimport { logApplyChange } from \"../../core/plan/planFormat.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\n\nconst STATE_KEY_PREFIX = \"hyperdrive:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\nexport async function hyperdriveApply(\n resources: HyperdriveResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = hyperdriveDeriveName(config, env, naming);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n const ts = new Date().toISOString();\n\n if (existing && existing.type === \"hyperdrive\") {\n const stateEntry = existing as HyperdriveStateEntry;\n const changes = computeHyperdriveChanges(stateEntry, config);\n if (changes.length === 0) continue;\n logApplyChange({\n kind: \"hyperdrive\",\n action: \"update\",\n logical: config.logicalName,\n derived: derivedName,\n changes,\n });\n // Cloudflare's PATCH treats `origin` as a unit (password is\n // write-only and never echoed back). Re-resolve the full origin\n // from config — this also re-reads `{ fromEnv: ... }` secrets so\n // password rotation flows through naturally.\n const origin = resolveHyperdriveOrigin(config);\n await api.hyperdrivePatch(stateEntry.cfId, { origin });\n state.set(key, {\n ...stateEntry,\n scheme: config.origin.scheme,\n originHost: config.origin.host,\n originDatabase: config.origin.database,\n updatedAt: ts,\n });\n continue;\n }\n\n logApplyChange({\n kind: \"hyperdrive\",\n action: \"create\",\n logical: config.logicalName,\n derived: derivedName,\n });\n const origin = resolveHyperdriveOrigin(config);\n const { id } = await api.hyperdriveCreate({\n name: derivedName,\n origin,\n caching: config.caching,\n mtls: config.mtls,\n });\n state.set(key, {\n type: \"hyperdrive\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() ||\n naming.hyperdriveBindingKey(config.logicalName),\n cfId: id,\n scheme: config.origin.scheme,\n originHost: config.origin.host,\n originDatabase: config.origin.database,\n createdAt: ts,\n updatedAt: ts,\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { HyperdriveResourceConfig } from \"./hyperdrive.types.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\n\ninterface CFHyperdrive {\n id: string;\n name: string;\n origin?: { scheme?: string; host?: string; database?: string };\n}\n\nexport function hyperdriveSync(\n allHyperdrive: CFHyperdrive[],\n resources: HyperdriveResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = hyperdriveDeriveName(config, env, naming);\n const match = allHyperdrive.find((h) => h.name === derivedName);\n if (!match) continue;\n const key = `hyperdrive:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n state.set(key, {\n type: \"hyperdrive\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() ||\n naming.hyperdriveBindingKey(config.logicalName),\n cfId: match.id,\n scheme: config.origin.scheme,\n originHost: match.origin?.host ?? config.origin.host,\n originDatabase: match.origin?.database ?? config.origin.database,\n createdAt: existing?.type === \"hyperdrive\" ? existing.createdAt : ts,\n updatedAt: ts,\n });\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { HyperdriveResourceConfig } from \"./hyperdrive.types.js\";\nimport type { HyperdriveStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\n\ninterface CFHyperdrive {\n id: string;\n name: string;\n}\n\nexport function hyperdriveDrift(\n allHyperdrive: CFHyperdrive[],\n resources: HyperdriveResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"hyperdrive\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(allHyperdrive.map((h) => [h.name, h.id]));\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is HyperdriveStateEntry => e.type === \"hyperdrive\",\n );\n\n for (const config of resources) {\n const derivedName = hyperdriveDeriveName(config, env, naming);\n const cfId = cfByName.get(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !cfId) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (cfId && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId,\n });\n } else if (!cfId && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, HyperdriveStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function hyperdriveDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(\n config,\n baseDir,\n \"hyperdrive\",\n );\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, HyperdriveStateEntry] => kv[1].type === \"hyperdrive\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.hyperdriveDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(`Failed to delete hyperdrive ${entry.derivedName}:`, err);\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { HyperdriveResourceConfig } from \"./hyperdrive.types.js\";\nimport type { StateEntry } from \"../../types.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\n\nexport interface HyperdriveStateLike {\n get(key: string): StateEntry | undefined;\n getAll(): Record<string, StateEntry>;\n}\n\nexport interface GeneratedHyperdriveBinding {\n binding: string;\n id: string;\n localConnectionString?: string;\n}\n\nexport function hyperdriveGenerate(\n resources: HyperdriveResourceConfig[],\n env: string,\n state: HyperdriveStateLike,\n naming: NamingEngine,\n): GeneratedHyperdriveBinding[] {\n const out: GeneratedHyperdriveBinding[] = [];\n for (const config of resources) {\n const derivedName = hyperdriveDeriveName(config, env, naming);\n const entry = state.get(`hyperdrive:${derivedName}`);\n if (!entry || entry.type !== \"hyperdrive\") {\n throw new Error(\n `Hyperdrive \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`,\n );\n }\n out.push({\n binding: entry.bindingKey,\n id: entry.cfId,\n localConnectionString: config.localConnectionString,\n });\n }\n return out;\n}\n","import type { ResourceStatus, HyperdriveStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { HyperdriveResourceConfig } from \"./hyperdrive.types.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\n\nexport interface HyperdriveStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function hyperdriveStatus(\n resources: HyperdriveResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): HyperdriveStatusResult[] {\n const out: HyperdriveStatusResult[] = [];\n for (const config of resources) {\n const derivedName = hyperdriveDeriveName(config, env, naming);\n const entry = state.get(`hyperdrive:${derivedName}`) as\n | HyperdriveStateEntry\n | undefined;\n out.push({\n binding:\n config.binding?.trim() ||\n naming.hyperdriveBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { HyperdriveResourceConfig } from \"./hyperdrive.types.js\";\nimport type {\n WorkerConfig,\n WorkerResources,\n HyperdriveStateEntry,\n} from \"../../types.js\";\nimport { hyperdriveApply } from \"./hyperdrive.apply.js\";\nimport { hyperdriveSync } from \"./hyperdrive.sync.js\";\nimport { hyperdriveDrift } from \"./hyperdrive.drift.js\";\nimport { hyperdriveDestroy } from \"./hyperdrive.destroy.js\";\nimport { hyperdriveGenerate } from \"./hyperdrive.generate.js\";\nimport { hyperdriveStatus } from \"./hyperdrive.status.js\";\nimport { hyperdriveDiffPlanItems } from \"./hyperdrive.diff.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { hyperdriveDeriveName } from \"./hyperdrive.naming.js\";\n\ninterface CFHyperdrive {\n id: string;\n name: string;\n origin?: { scheme?: string; host?: string; database?: string };\n}\n\nexport const hyperdriveModule: ResourceModule<\n HyperdriveResourceConfig,\n CFHyperdrive\n> = {\n kind: \"hyperdrive\",\n label: \"Hyperdrive\",\n configKey: \"hyperdrive\",\n stateEntryType: \"hyperdrive\",\n\n async fetchAll(api: CFApiClient): Promise<CFHyperdrive[]> {\n const all = await api.hyperdriveListAll();\n return all.map((h) => ({ id: h.id, name: h.name, origin: h.origin }));\n },\n\n async apply(ctx) {\n await hyperdriveApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n hyperdriveSync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return hyperdriveDrift(\n ctx.all,\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n diff(ctx) {\n return hyperdriveDiffPlanItems({\n resources: ctx.resources,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n });\n },\n\n async destroy(ctx) {\n await hyperdriveDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return hyperdriveStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n const generated =\n ctx.resources.length > 0\n ? hyperdriveGenerate(ctx.resources, ctx.env, ctx.state, ctx.naming)\n : [];\n const passthrough = ctx.passthrough?.hyperdrive ?? [];\n if (generated.length === 0 && passthrough.length === 0) return {};\n return { hyperdrive: [...passthrough, ...generated] };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): HyperdriveResourceConfig[] {\n return resourcesFrom(source)?.hyperdrive ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"hyperdrive\") return;\n try {\n await api.hyperdriveDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete Hyperdrive ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n if (!options.cfId) {\n throw new Error(\"import hyperdrive: --cf-id <config-id> is required\");\n }\n const resourceConfig =\n await findWorkerResourceByLogicalName<HyperdriveResourceConfig>(\n config,\n \"hyperdrive\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import hyperdrive: no resources.hyperdrive entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.hyperdriveListAll();\n const hit = all.find((h) => h.id === options.cfId);\n if (!hit) {\n throw new Error(\n `import hyperdrive: config id \"${options.cfId}\" not found in account`,\n );\n }\n const derivedName = hyperdriveDeriveName(resourceConfig, env, naming);\n if (hit.name !== derivedName) {\n throw new Error(\n `import hyperdrive: cf name \"${hit.name}\" does not match derived \"${derivedName}\"`,\n );\n }\n const bindingKey = naming.hyperdriveBindingKey(options.logical);\n const key = `hyperdrive:${derivedName}`;\n const existing = state.get(key);\n const scheme = (\n hit.origin?.scheme === \"mysql\"\n ? \"mysql\"\n : hit.origin?.scheme === \"postgresql\"\n ? \"postgresql\"\n : \"postgres\"\n ) as \"postgres\" | \"postgresql\" | \"mysql\";\n const entry: HyperdriveStateEntry = {\n type: \"hyperdrive\",\n logicalName: options.logical,\n derivedName,\n bindingKey,\n cfId: options.cfId,\n scheme,\n originHost: hit.origin?.host ?? \"\",\n originDatabase: hit.origin?.database ?? \"\",\n createdAt: existing?.type === \"hyperdrive\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveVectorizeCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { VectorizeResourceConfig } from \"../../types.js\";\n\nexport function vectorizeDeriveName(\n config: VectorizeResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveVectorizeCloudflareName(config, env, naming);\n}\n\nexport function vectorizeMatchPattern(\n config: VectorizeResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveVectorizeCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { VectorizeResourceConfig } from \"./vectorize.types.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\n\nconst STATE_KEY_PREFIX = \"vectorize:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\nexport async function vectorizeApply(\n resources: VectorizeResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = vectorizeDeriveName(config, env, naming);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n if (existing) {\n if (existing.type === \"vectorize\") {\n if (\n existing.dimensions !== config.dimensions ||\n existing.metric !== config.metric\n ) {\n throw new Error(\n `Vectorize index \"${config.logicalName}\" config changed (dimensions/metric are immutable). ` +\n `Run 'tamer destroy --resource ${config.logicalName}' first, then re-apply.`,\n );\n }\n }\n continue;\n }\n\n const ts = new Date().toISOString();\n const created = await api.vectorizeCreate({\n name: derivedName,\n description: config.description,\n config: { dimensions: config.dimensions, metric: config.metric },\n });\n state.set(key, {\n type: \"vectorize\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() ||\n naming.vectorizeBindingKey(config.logicalName),\n cfId: created.id ?? derivedName,\n dimensions: config.dimensions,\n metric: config.metric,\n createdAt: ts,\n updatedAt: ts,\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { VectorizeResourceConfig } from \"./vectorize.types.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\n\ninterface CFVectorize {\n id?: string;\n name: string;\n config?: { dimensions: number; metric: string };\n}\n\nexport function vectorizeSync(\n allIndexes: CFVectorize[],\n resources: VectorizeResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = vectorizeDeriveName(config, env, naming);\n const match = allIndexes.find((i) => i.name === derivedName);\n if (!match) continue;\n const key = `vectorize:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n state.set(key, {\n type: \"vectorize\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() ||\n naming.vectorizeBindingKey(config.logicalName),\n cfId: match.id ?? derivedName,\n dimensions: match.config?.dimensions ?? config.dimensions,\n metric:\n ((match.config?.metric as VectorizeResourceConfig[\"metric\"]) ?? null) ||\n config.metric,\n createdAt: existing?.type === \"vectorize\" ? existing.createdAt : ts,\n updatedAt: ts,\n });\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { VectorizeResourceConfig } from \"./vectorize.types.js\";\nimport type { VectorizeStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\n\ninterface CFVectorize {\n id?: string;\n name: string;\n}\n\nexport function vectorizeDrift(\n allIndexes: CFVectorize[],\n resources: VectorizeResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"vectorize\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(\n allIndexes.map((i) => [i.name, i.id ?? i.name]),\n );\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is VectorizeStateEntry => e.type === \"vectorize\",\n );\n\n for (const config of resources) {\n const derivedName = vectorizeDeriveName(config, env, naming);\n const cfId = cfByName.get(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !cfId) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (cfId && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId,\n });\n } else if (!cfId && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, VectorizeStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function vectorizeDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"vectorize\");\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, VectorizeStateEntry] => kv[1].type === \"vectorize\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.vectorizeDelete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(`Failed to delete vectorize index ${entry.derivedName}:`, err);\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { VectorizeResourceConfig } from \"./vectorize.types.js\";\nimport type { StateEntry } from \"../../types.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\n\nexport interface VectorizeStateLike {\n get(key: string): StateEntry | undefined;\n}\n\nexport interface GeneratedVectorizeBinding {\n binding: string;\n index_name: string;\n}\n\n/**\n * Emit `vectorize[]` bindings for declared indexes. Each binding requires\n * the index to exist in state (i.e. `tamer apply` has run). Throws otherwise\n * so the operator gets an actionable error before `wrangler deploy`.\n */\nexport function vectorizeGenerate(\n resources: VectorizeResourceConfig[],\n env: string,\n state: VectorizeStateLike,\n naming: NamingEngine,\n): GeneratedVectorizeBinding[] {\n const out: GeneratedVectorizeBinding[] = [];\n for (const config of resources) {\n const derivedName = vectorizeDeriveName(config, env, naming);\n const entry = state.get(`vectorize:${derivedName}`);\n if (!entry || entry.type !== \"vectorize\") {\n throw new Error(\n `Vectorize index \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`,\n );\n }\n out.push({\n binding: entry.bindingKey,\n index_name: entry.derivedName,\n });\n }\n return out;\n}\n","import type { ResourceStatus, VectorizeStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { VectorizeResourceConfig } from \"./vectorize.types.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\n\nexport interface VectorizeStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function vectorizeStatus(\n resources: VectorizeResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): VectorizeStatusResult[] {\n const out: VectorizeStatusResult[] = [];\n for (const config of resources) {\n const derivedName = vectorizeDeriveName(config, env, naming);\n const entry = state.get(`vectorize:${derivedName}`) as\n | VectorizeStateEntry\n | undefined;\n out.push({\n binding:\n config.binding?.trim() ||\n naming.vectorizeBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","/**\n * Plan-time diff for Vectorize indexes. `dimensions` and `metric` are\n * **immutable** per the Vectorize V2 API — Cloudflare rejects PATCH on\n * either field, so any drift surfaces as `replace` (delete + recreate\n * via `tamer destroy --resource <logical>` then `apply`). No `update`\n * action is ever emitted for this kind today.\n */\n\nimport type {\n VectorizeResourceConfig,\n VectorizeStateEntry,\n} from \"../../types.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { PlanFieldChange, PlanItem } from \"../../core/plan/plan.types.js\";\n\nexport function vectorizeDiffPlanItems(args: {\n resources: VectorizeResourceConfig[];\n env: string;\n state: StateManager;\n naming: NamingEngine;\n}): PlanItem[] {\n const { resources, env, state, naming } = args;\n const items: PlanItem[] = [];\n\n for (const config of resources) {\n const derivedName = vectorizeDeriveName(config, env, naming);\n const key = `vectorize:${derivedName}`;\n const entry = state.get(key);\n if (!entry || entry.type !== \"vectorize\") continue;\n const stateEntry = entry as VectorizeStateEntry;\n\n const changes: PlanFieldChange[] = [];\n if (stateEntry.dimensions !== config.dimensions) {\n changes.push({\n field: \"dimensions\",\n from: stateEntry.dimensions,\n to: config.dimensions,\n kind: \"immutable\",\n });\n }\n if (stateEntry.metric !== config.metric) {\n changes.push({\n field: \"metric\",\n from: stateEntry.metric,\n to: config.metric,\n kind: \"immutable\",\n });\n }\n\n if (changes.length === 0) continue;\n items.push({\n kind: \"vectorize\",\n action: \"replace\",\n logicalName: config.logicalName,\n derivedName,\n detail: changes\n .map((c) => `${c.field}: ${c.from} -> ${c.to}`)\n .join(\", \"),\n changes,\n });\n }\n\n return items;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { VectorizeResourceConfig } from \"./vectorize.types.js\";\nimport type {\n WorkerConfig,\n WorkerResources,\n VectorizeStateEntry,\n} from \"../../types.js\";\nimport { vectorizeApply } from \"./vectorize.apply.js\";\nimport { vectorizeSync } from \"./vectorize.sync.js\";\nimport { vectorizeDrift } from \"./vectorize.drift.js\";\nimport { vectorizeDestroy } from \"./vectorize.destroy.js\";\nimport { vectorizeGenerate } from \"./vectorize.generate.js\";\nimport { vectorizeStatus } from \"./vectorize.status.js\";\nimport { vectorizeDiffPlanItems } from \"./vectorize.diff.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { vectorizeDeriveName } from \"./vectorize.naming.js\";\n\ninterface CFVectorize {\n id?: string;\n name: string;\n config?: { dimensions: number; metric: string };\n}\n\nexport const vectorizeModule: ResourceModule<\n VectorizeResourceConfig,\n CFVectorize\n> = {\n kind: \"vectorize\",\n label: \"Vectorize\",\n configKey: \"vectorize\",\n stateEntryType: \"vectorize\",\n\n async fetchAll(api: CFApiClient): Promise<CFVectorize[]> {\n const all = await api.vectorizeListAll();\n return all.map((v) => ({ id: v.id, name: v.name, config: v.config }));\n },\n\n async apply(ctx) {\n await vectorizeApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n vectorizeSync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return vectorizeDrift(\n ctx.all,\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n diff(ctx) {\n return vectorizeDiffPlanItems({\n resources: ctx.resources,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n });\n },\n\n async destroy(ctx) {\n await vectorizeDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return vectorizeStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n const generated =\n ctx.resources.length > 0\n ? vectorizeGenerate(ctx.resources, ctx.env, ctx.state, ctx.naming)\n : [];\n const passthrough = ctx.passthrough?.vectorize ?? [];\n if (generated.length === 0 && passthrough.length === 0) return {};\n return { vectorize: [...passthrough, ...generated] };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): VectorizeResourceConfig[] {\n return resourcesFrom(source)?.vectorize ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"vectorize\") return;\n try {\n await api.vectorizeDelete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete Vectorize ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n const indexName = options.cfId;\n if (!indexName) {\n throw new Error(\"import vectorize: --cf-id <index-name> is required\");\n }\n const resourceConfig =\n await findWorkerResourceByLogicalName<VectorizeResourceConfig>(\n config,\n \"vectorize\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import vectorize: no resources.vectorize entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.vectorizeListAll();\n const hit = all.find((v) => v.name === indexName);\n if (!hit) {\n throw new Error(\n `import vectorize: index \"${indexName}\" not found in account`,\n );\n }\n const derivedName = vectorizeDeriveName(resourceConfig, env, naming);\n if (hit.name !== derivedName) {\n throw new Error(\n `import vectorize: cf name \"${hit.name}\" does not match derived \"${derivedName}\"`,\n );\n }\n if (!hit.config) {\n throw new Error(\n `import vectorize: cf index \"${hit.name}\" returned no config (dimensions/metric)`,\n );\n }\n const metric = hit.config.metric as \"cosine\" | \"euclidean\" | \"dot-product\";\n const bindingKey = naming.vectorizeBindingKey(options.logical);\n const key = `vectorize:${derivedName}`;\n const existing = state.get(key);\n const entry: VectorizeStateEntry = {\n type: \"vectorize\",\n logicalName: options.logical,\n derivedName,\n bindingKey,\n cfId: hit.id ?? derivedName,\n dimensions: hit.config.dimensions,\n metric,\n createdAt: existing?.type === \"vectorize\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","import type { AIGatewayResourceConfig } from \"../../types.js\";\n\nexport type { AIGatewayResourceConfig };\n\n/**\n * Default values applied to optional `AIGatewayResourceConfig` fields. Kept\n * here so apply / sync / drift agree on what \"no override\" actually means\n * when comparing config to Cloudflare state.\n */\nexport const AI_GATEWAY_DEFAULTS = {\n cacheTtl: 0,\n cacheInvalidateOnUpdate: false,\n collectLogs: true,\n authentication: false,\n rateLimitingInterval: 0,\n rateLimitingLimit: 0,\n rateLimitingTechnique: \"fixed\" as const,\n};\n\nexport type ResolvedAIGatewayConfig = Required<\n Pick<\n AIGatewayResourceConfig,\n | \"cacheTtl\"\n | \"cacheInvalidateOnUpdate\"\n | \"collectLogs\"\n | \"authentication\"\n | \"rateLimitingInterval\"\n | \"rateLimitingLimit\"\n | \"rateLimitingTechnique\"\n >\n>;\n\nexport function resolveAIGatewayConfig(\n config: AIGatewayResourceConfig,\n): ResolvedAIGatewayConfig {\n return {\n cacheTtl: config.cacheTtl ?? AI_GATEWAY_DEFAULTS.cacheTtl,\n cacheInvalidateOnUpdate:\n config.cacheInvalidateOnUpdate ??\n AI_GATEWAY_DEFAULTS.cacheInvalidateOnUpdate,\n collectLogs: config.collectLogs ?? AI_GATEWAY_DEFAULTS.collectLogs,\n authentication: config.authentication ?? AI_GATEWAY_DEFAULTS.authentication,\n rateLimitingInterval:\n config.rateLimitingInterval ?? AI_GATEWAY_DEFAULTS.rateLimitingInterval,\n rateLimitingLimit:\n config.rateLimitingLimit ?? AI_GATEWAY_DEFAULTS.rateLimitingLimit,\n rateLimitingTechnique:\n config.rateLimitingTechnique ?? AI_GATEWAY_DEFAULTS.rateLimitingTechnique,\n };\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveAIGatewayCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { AIGatewayResourceConfig } from \"../../types.js\";\n\nexport function aiGatewayDeriveName(\n config: AIGatewayResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveAIGatewayCloudflareName(config, env, naming);\n}\n\nexport function aiGatewayMatchPattern(\n config: AIGatewayResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveAIGatewayCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","/**\n * Plan-time field-level diff for declared AI Gateways. Pure: takes the\n * recorded {@link AIGatewayStateEntry} and the declared\n * {@link AIGatewayResourceConfig}, and returns the `update` items\n * `tamer plan` should emit.\n *\n * All AI Gateway settings tracked here are mutable via\n * `PUT /accounts/{id}/ai-gateway/gateways/{id}` (Cloudflare's API uses\n * full-PUT, not PATCH, but it never rejects in-place edits on these\n * fields), so every detected drift becomes an `update` action — never\n * `replace`. Gateway id itself is part of the derived name and changes to\n * `logicalName` would surface as a different state row entirely.\n *\n * Resources without a state row are reported by `aiGatewayDrift` as\n * `undeployed` and become `create` items.\n */\n\nimport type {\n AIGatewayResourceConfig,\n AIGatewayStateEntry,\n} from \"../../types.js\";\nimport { aiGatewayDeriveName } from \"./ai-gateway.naming.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { PlanFieldChange, PlanItem } from \"../../core/plan/plan.types.js\";\nimport { resolveAIGatewayConfig } from \"./ai-gateway.types.js\";\n\nexport function aiGatewayDiffPlanItems(args: {\n resources: AIGatewayResourceConfig[];\n env: string;\n state: StateManager;\n naming: NamingEngine;\n}): PlanItem[] {\n const { resources, env, state, naming } = args;\n const items: PlanItem[] = [];\n\n for (const config of resources) {\n const derivedName = aiGatewayDeriveName(config, env, naming);\n const entry = state.get(`ai_gateway:${derivedName}`);\n if (!entry || entry.type !== \"ai_gateway\") continue;\n\n const changes = computeChanges(entry as AIGatewayStateEntry, config);\n if (changes.length === 0) continue;\n items.push({\n kind: \"ai_gateway\",\n action: \"update\",\n logicalName: config.logicalName,\n derivedName,\n detail: changes\n .map((c) => `${c.field}: ${formatVal(c.from)} -> ${formatVal(c.to)}`)\n .join(\", \"),\n changes,\n });\n }\n\n return items;\n}\n\n/**\n * Pure comparison shared with `aiGatewayApply` — keeps the plan and the\n * apply path in lockstep about which fields count as drift.\n */\nexport function computeAIGatewayChanges(\n state: AIGatewayStateEntry,\n config: AIGatewayResourceConfig,\n): PlanFieldChange[] {\n return computeChanges(state, config);\n}\n\nfunction computeChanges(\n state: AIGatewayStateEntry,\n config: AIGatewayResourceConfig,\n): PlanFieldChange[] {\n const resolved = resolveAIGatewayConfig(config);\n const changes: PlanFieldChange[] = [];\n\n if (state.cacheTtl !== resolved.cacheTtl) {\n changes.push({\n field: \"cacheTtl\",\n from: state.cacheTtl,\n to: resolved.cacheTtl,\n kind: \"mutable\",\n });\n }\n if (state.cacheInvalidateOnUpdate !== resolved.cacheInvalidateOnUpdate) {\n changes.push({\n field: \"cacheInvalidateOnUpdate\",\n from: state.cacheInvalidateOnUpdate,\n to: resolved.cacheInvalidateOnUpdate,\n kind: \"mutable\",\n });\n }\n if (state.collectLogs !== resolved.collectLogs) {\n changes.push({\n field: \"collectLogs\",\n from: state.collectLogs,\n to: resolved.collectLogs,\n kind: \"mutable\",\n });\n }\n if (state.authentication !== resolved.authentication) {\n changes.push({\n field: \"authentication\",\n from: state.authentication,\n to: resolved.authentication,\n kind: \"mutable\",\n });\n }\n if (state.rateLimitingInterval !== resolved.rateLimitingInterval) {\n changes.push({\n field: \"rateLimitingInterval\",\n from: state.rateLimitingInterval,\n to: resolved.rateLimitingInterval,\n kind: \"mutable\",\n });\n }\n if (state.rateLimitingLimit !== resolved.rateLimitingLimit) {\n changes.push({\n field: \"rateLimitingLimit\",\n from: state.rateLimitingLimit,\n to: resolved.rateLimitingLimit,\n kind: \"mutable\",\n });\n }\n if (state.rateLimitingTechnique !== resolved.rateLimitingTechnique) {\n changes.push({\n field: \"rateLimitingTechnique\",\n from: state.rateLimitingTechnique,\n to: resolved.rateLimitingTechnique,\n kind: \"mutable\",\n });\n }\n return changes;\n}\n\nfunction formatVal(v: unknown): string {\n if (v === undefined) return \"(unset)\";\n if (typeof v === \"string\") return v.length > 32 ? `${v.slice(0, 29)}...` : v;\n return String(v);\n}\n","import type { AIGatewayStateEntry, TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { AIGatewayResourceConfig } from \"./ai-gateway.types.js\";\nimport { resolveAIGatewayConfig } from \"./ai-gateway.types.js\";\nimport { computeAIGatewayChanges } from \"./ai-gateway.diff.js\";\nimport { logApplyChange } from \"../../core/plan/planFormat.js\";\nimport { aiGatewayDeriveName } from \"./ai-gateway.naming.js\";\n\nconst STATE_KEY_PREFIX = \"ai_gateway:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\nexport async function aiGatewayApply(\n resources: AIGatewayResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = aiGatewayDeriveName(config, env, naming);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n const resolved = resolveAIGatewayConfig(config);\n const ts = new Date().toISOString();\n\n if (existing && existing.type === \"ai_gateway\") {\n const changes = computeAIGatewayChanges(\n existing as AIGatewayStateEntry,\n config,\n );\n if (changes.length === 0) continue;\n logApplyChange({\n kind: \"ai_gateway\",\n action: \"update\",\n logical: config.logicalName,\n derived: derivedName,\n changes,\n });\n await api.aiGatewayUpdate(derivedName, {\n cache_ttl: resolved.cacheTtl,\n cache_invalidate_on_update: resolved.cacheInvalidateOnUpdate,\n collect_logs: resolved.collectLogs,\n authentication: resolved.authentication,\n rate_limiting_interval: resolved.rateLimitingInterval,\n rate_limiting_limit: resolved.rateLimitingLimit,\n rate_limiting_technique: resolved.rateLimitingTechnique,\n });\n state.set(key, {\n ...(existing as AIGatewayStateEntry),\n cacheTtl: resolved.cacheTtl,\n cacheInvalidateOnUpdate: resolved.cacheInvalidateOnUpdate,\n collectLogs: resolved.collectLogs,\n authentication: resolved.authentication,\n rateLimitingInterval: resolved.rateLimitingInterval,\n rateLimitingLimit: resolved.rateLimitingLimit,\n rateLimitingTechnique: resolved.rateLimitingTechnique,\n updatedAt: ts,\n });\n continue;\n }\n\n logApplyChange({\n kind: \"ai_gateway\",\n action: \"create\",\n logical: config.logicalName,\n derived: derivedName,\n });\n await api.aiGatewayCreate({\n id: derivedName,\n cache_ttl: resolved.cacheTtl,\n cache_invalidate_on_update: resolved.cacheInvalidateOnUpdate,\n collect_logs: resolved.collectLogs,\n authentication: resolved.authentication,\n rate_limiting_interval: resolved.rateLimitingInterval,\n rate_limiting_limit: resolved.rateLimitingLimit,\n rate_limiting_technique: resolved.rateLimitingTechnique,\n });\n state.set(key, {\n type: \"ai_gateway\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey: naming.aiGatewayBindingKey(config.logicalName),\n cfId: derivedName,\n cacheTtl: resolved.cacheTtl,\n cacheInvalidateOnUpdate: resolved.cacheInvalidateOnUpdate,\n collectLogs: resolved.collectLogs,\n authentication: resolved.authentication,\n rateLimitingInterval: resolved.rateLimitingInterval,\n rateLimitingLimit: resolved.rateLimitingLimit,\n rateLimitingTechnique: resolved.rateLimitingTechnique,\n createdAt: ts,\n updatedAt: ts,\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { AIGatewayResourceConfig } from \"./ai-gateway.types.js\";\nimport { resolveAIGatewayConfig } from \"./ai-gateway.types.js\";\nimport { aiGatewayDeriveName } from \"./ai-gateway.naming.js\";\n\ninterface CFAIGateway {\n id: string;\n cache_ttl?: number;\n cache_invalidate_on_update?: boolean;\n collect_logs?: boolean;\n authentication?: boolean;\n rate_limiting_interval?: number;\n rate_limiting_limit?: number;\n rate_limiting_technique?: \"fixed\" | \"sliding\";\n}\n\nexport function aiGatewaySync(\n allGateways: CFAIGateway[],\n resources: AIGatewayResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = aiGatewayDeriveName(config, env, naming);\n const match = allGateways.find((g) => g.id === derivedName);\n if (!match) continue;\n const key = `ai_gateway:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n const resolved = resolveAIGatewayConfig(config);\n state.set(key, {\n type: \"ai_gateway\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey: naming.aiGatewayBindingKey(config.logicalName),\n cfId: derivedName,\n cacheTtl: match.cache_ttl ?? resolved.cacheTtl,\n cacheInvalidateOnUpdate:\n match.cache_invalidate_on_update ?? resolved.cacheInvalidateOnUpdate,\n collectLogs: match.collect_logs ?? resolved.collectLogs,\n authentication: match.authentication ?? resolved.authentication,\n rateLimitingInterval:\n match.rate_limiting_interval ?? resolved.rateLimitingInterval,\n rateLimitingLimit:\n match.rate_limiting_limit ?? resolved.rateLimitingLimit,\n rateLimitingTechnique:\n match.rate_limiting_technique ?? resolved.rateLimitingTechnique,\n createdAt: existing?.type === \"ai_gateway\" ? existing.createdAt : ts,\n updatedAt: ts,\n });\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { AIGatewayResourceConfig } from \"./ai-gateway.types.js\";\nimport type { AIGatewayStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { aiGatewayDeriveName } from \"./ai-gateway.naming.js\";\n\ninterface CFAIGateway {\n id: string;\n}\n\nexport function aiGatewayDrift(\n allGateways: CFAIGateway[],\n resources: AIGatewayResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"ai_gateway\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfIds = new Set(allGateways.map((g) => g.id));\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is AIGatewayStateEntry => e.type === \"ai_gateway\",\n );\n\n for (const config of resources) {\n const derivedName = aiGatewayDeriveName(config, env, naming);\n const inCloudflare = cfIds.has(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !inCloudflare) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (inCloudflare && !stateEntry) {\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId: derivedName,\n });\n } else if (!inCloudflare && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { AIGatewayStateEntry, CfiConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function aiGatewayDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"ai_gateway\");\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, AIGatewayStateEntry] => kv[1].type === \"ai_gateway\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.aiGatewayDelete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Failed to delete AI Gateway ${entry.derivedName}:`,\n err,\n );\n }\n }\n}\n","import type { AIGatewayStateEntry, ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { AIGatewayResourceConfig } from \"./ai-gateway.types.js\";\nimport { aiGatewayDeriveName } from \"./ai-gateway.naming.js\";\n\nexport interface AIGatewayStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function aiGatewayStatus(\n resources: AIGatewayResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): AIGatewayStatusResult[] {\n const out: AIGatewayStatusResult[] = [];\n for (const config of resources) {\n const derivedName = aiGatewayDeriveName(config, env, naming);\n const entry = state.get(`ai_gateway:${derivedName}`) as\n | AIGatewayStateEntry\n | undefined;\n out.push({\n binding: naming.aiGatewayBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { AIGatewayResourceConfig } from \"./ai-gateway.types.js\";\nimport type {\n AIGatewayStateEntry,\n WorkerConfig,\n WorkerResources,\n} from \"../../types.js\";\nimport { aiGatewayApply } from \"./ai-gateway.apply.js\";\nimport { aiGatewaySync } from \"./ai-gateway.sync.js\";\nimport { aiGatewayDrift } from \"./ai-gateway.drift.js\";\nimport { aiGatewayDestroy } from \"./ai-gateway.destroy.js\";\nimport { aiGatewayStatus } from \"./ai-gateway.status.js\";\nimport { aiGatewayDiffPlanItems } from \"./ai-gateway.diff.js\";\nimport { resolveAIGatewayConfig } from \"./ai-gateway.types.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { aiGatewayDeriveName } from \"./ai-gateway.naming.js\";\n\ninterface CFAIGateway {\n id: string;\n cache_ttl?: number;\n cache_invalidate_on_update?: boolean;\n collect_logs?: boolean;\n authentication?: boolean;\n rate_limiting_interval?: number;\n rate_limiting_limit?: number;\n rate_limiting_technique?: \"fixed\" | \"sliding\";\n}\n\nexport const aiGatewayModule: ResourceModule<\n AIGatewayResourceConfig,\n CFAIGateway\n> = {\n kind: \"ai_gateway\",\n label: \"AI Gateway\",\n configKey: \"aiGateway\",\n stateEntryType: \"ai_gateway\",\n\n async fetchAll(api: CFApiClient): Promise<CFAIGateway[]> {\n return await api.aiGatewayListAll();\n },\n\n async apply(ctx) {\n await aiGatewayApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n aiGatewaySync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return aiGatewayDrift(\n ctx.all,\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n diff(ctx) {\n return aiGatewayDiffPlanItems({\n resources: ctx.resources,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n });\n },\n\n async destroy(ctx) {\n await aiGatewayDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return aiGatewayStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n /**\n * AI Gateway has no Wrangler binding kind — gateways are referenced per\n * request via `env.AI.run(model, opts, { gateway: { id } })`. Cross-resource\n * refs (`${tamer:ai_gateway:my_gw.name}`) are how the derived id reaches\n * worker code.\n */\n generate() {\n return {};\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): AIGatewayResourceConfig[] {\n return resourcesFrom(source)?.aiGateway ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"ai_gateway\") return;\n try {\n await api.aiGatewayDelete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete AI Gateway ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n const gatewayId = options.cfId;\n if (!gatewayId) {\n throw new Error(\"import ai_gateway: --cf-id <gateway-id> is required\");\n }\n const resourceConfig =\n await findWorkerResourceByLogicalName<AIGatewayResourceConfig>(\n config,\n \"aiGateway\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import ai_gateway: no resources.aiGateway entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.aiGatewayListAll();\n const hit = all.find((g) => g.id === gatewayId);\n if (!hit) {\n throw new Error(\n `import ai_gateway: gateway \"${gatewayId}\" not found in account`,\n );\n }\n const derivedName = aiGatewayDeriveName(resourceConfig, env, naming);\n if (hit.id !== derivedName) {\n throw new Error(\n `import ai_gateway: cf id \"${hit.id}\" does not match derived \"${derivedName}\"`,\n );\n }\n const key = `ai_gateway:${derivedName}`;\n const existing = state.get(key);\n const defaults = resolveAIGatewayConfig({ logicalName: options.logical });\n const entry: AIGatewayStateEntry = {\n type: \"ai_gateway\",\n logicalName: options.logical,\n derivedName,\n bindingKey: naming.aiGatewayBindingKey(options.logical),\n cfId: hit.id,\n cacheTtl: hit.cache_ttl ?? defaults.cacheTtl,\n cacheInvalidateOnUpdate:\n hit.cache_invalidate_on_update ?? defaults.cacheInvalidateOnUpdate,\n collectLogs: hit.collect_logs ?? defaults.collectLogs,\n authentication: hit.authentication ?? defaults.authentication,\n rateLimitingInterval:\n hit.rate_limiting_interval ?? defaults.rateLimitingInterval,\n rateLimitingLimit: hit.rate_limiting_limit ?? defaults.rateLimitingLimit,\n rateLimitingTechnique:\n hit.rate_limiting_technique ?? defaults.rateLimitingTechnique,\n createdAt: existing?.type === \"ai_gateway\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolvePipelineCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { PipelineResourceConfig } from \"../../types.js\";\n\nexport function pipelineDeriveName(\n config: PipelineResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolvePipelineCloudflareName(config, env, naming);\n}\n\nexport function pipelineMatchPattern(\n config: PipelineResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolvePipelineCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { PipelineResourceConfig } from \"./pipelines.types.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\n\nconst STATE_KEY_PREFIX = \"pipeline:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\n/**\n * Idempotent create — skips when a state entry already exists. Pipeline SQL\n * updates on existing pipelines are deliberately not handled here (Cloudflare's\n * V1 endpoint has no PATCH today; SQL changes require a destroy + recreate).\n * Drift surfaces SQL mismatches so operators can recover explicitly.\n */\nexport async function pipelinesApply(\n resources: PipelineResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = pipelineDeriveName(config, env, naming);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n if (existing) continue;\n\n const ts = new Date().toISOString();\n const created = await api.pipelineCreate({\n name: derivedName,\n sql: config.sql,\n });\n state.set(key, {\n type: \"pipeline\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.pipelineBindingKey(config.logicalName),\n cfId: created.id,\n sql: created.sql ?? config.sql,\n status: created.status,\n createdAt: ts,\n updatedAt: ts,\n });\n }\n}\n","import type { TenantMeta } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { PipelineResourceConfig } from \"./pipelines.types.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\n\ninterface CFPipeline {\n id: string;\n name: string;\n sql: string;\n status?: string;\n}\n\nexport function pipelinesSync(\n allPipelines: CFPipeline[],\n resources: PipelineResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = pipelineDeriveName(config, env, naming);\n const match = allPipelines.find((p) => p.name === derivedName);\n if (!match) continue;\n const key = `pipeline:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n state.set(key, {\n type: \"pipeline\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() || naming.pipelineBindingKey(config.logicalName),\n cfId: match.id,\n sql: match.sql,\n status: match.status,\n createdAt: existing?.type === \"pipeline\" ? existing.createdAt : ts,\n updatedAt: ts,\n });\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { PipelineResourceConfig } from \"./pipelines.types.js\";\nimport type { PipelineStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\n\ninterface CFPipeline {\n id: string;\n name: string;\n sql: string;\n}\n\nexport function pipelinesDrift(\n allPipelines: CFPipeline[],\n resources: PipelineResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"pipeline\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(allPipelines.map((p) => [p.name, p]));\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is PipelineStateEntry => e.type === \"pipeline\",\n );\n\n for (const config of resources) {\n const derivedName = pipelineDeriveName(config, env, naming);\n const inCloudflare = cfByName.has(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !inCloudflare) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (inCloudflare && !stateEntry) {\n const cf = cfByName.get(derivedName)!;\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId: cf.id,\n });\n } else if (!inCloudflare && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, PipelineStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function pipelinesDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"pipeline\");\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, PipelineStateEntry] => kv[1].type === \"pipeline\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.pipelineDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Failed to delete Pipeline ${entry.derivedName}:`,\n err,\n );\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { PipelineResourceConfig } from \"./pipelines.types.js\";\nimport type { StateEntry } from \"../../types.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\n\nexport interface PipelineStateLike {\n get(key: string): StateEntry | undefined;\n}\n\nexport interface GeneratedPipelineBinding {\n binding: string;\n pipeline: string;\n}\n\n/**\n * Emit `pipelines[]` bindings for declared pipelines. Each binding requires\n * the pipeline to exist in state (i.e. `tamer apply` has run). Throws\n * otherwise so the operator gets an actionable error before `wrangler deploy`.\n *\n * Note: Wrangler's `pipeline` field accepts the pipeline **name**, not the\n * server-assigned id, so we emit the derived name here.\n */\nexport function pipelinesGenerate(\n resources: PipelineResourceConfig[],\n env: string,\n state: PipelineStateLike,\n naming: NamingEngine,\n): GeneratedPipelineBinding[] {\n const out: GeneratedPipelineBinding[] = [];\n for (const config of resources) {\n const derivedName = pipelineDeriveName(config, env, naming);\n const entry = state.get(`pipeline:${derivedName}`);\n if (!entry || entry.type !== \"pipeline\") {\n throw new Error(\n `Pipeline \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`,\n );\n }\n out.push({\n binding: entry.bindingKey,\n pipeline: entry.derivedName,\n });\n }\n return out;\n}\n","import type { PipelineStateEntry, ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { PipelineResourceConfig } from \"./pipelines.types.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\n\nexport interface PipelineStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function pipelinesStatus(\n resources: PipelineResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): PipelineStatusResult[] {\n const out: PipelineStatusResult[] = [];\n for (const config of resources) {\n const derivedName = pipelineDeriveName(config, env, naming);\n const entry = state.get(`pipeline:${derivedName}`) as\n | PipelineStateEntry\n | undefined;\n out.push({\n binding:\n config.binding?.trim() || naming.pipelineBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","/**\n * Plan-time diff for Cloudflare Pipelines (V1, SQL). The pipeline `sql`\n * body is the only mutable knob today, but Cloudflare V1 has no PATCH\n * endpoint — SQL changes require destroy + recreate. Plan signals this as\n * `replace` so the operator (or `apply --replace`, future work) can act on\n * it explicitly.\n *\n * The `binding` key is stored alongside the state row but is a wrangler-\n * generation concern (no Cloudflare-side resource changes), so a binding-\n * only drift is reported as `update` rather than `replace`.\n */\n\nimport type {\n PipelineResourceConfig,\n PipelineStateEntry,\n} from \"../../types.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { PlanFieldChange, PlanItem } from \"../../core/plan/plan.types.js\";\n\nexport function pipelinesDiffPlanItems(args: {\n resources: PipelineResourceConfig[];\n env: string;\n state: StateManager;\n naming: NamingEngine;\n}): PlanItem[] {\n const { resources, env, state, naming } = args;\n const items: PlanItem[] = [];\n\n for (const config of resources) {\n const derivedName = pipelineDeriveName(config, env, naming);\n const key = `pipeline:${derivedName}`;\n const entry = state.get(key);\n if (!entry || entry.type !== \"pipeline\") continue;\n const stateEntry = entry as PipelineStateEntry;\n\n const expectedBinding =\n config.binding?.trim() || naming.pipelineBindingKey(config.logicalName);\n\n const changes: PlanFieldChange[] = [];\n if (stateEntry.sql !== config.sql) {\n changes.push({\n field: \"sql\",\n from: truncate(stateEntry.sql),\n to: truncate(config.sql),\n kind: \"immutable\",\n });\n }\n if (stateEntry.bindingKey !== expectedBinding) {\n changes.push({\n field: \"binding\",\n from: stateEntry.bindingKey,\n to: expectedBinding,\n kind: \"mutable\",\n });\n }\n\n if (changes.length === 0) continue;\n const hasImmutable = changes.some((c) => c.kind === \"immutable\");\n items.push({\n kind: \"pipeline\",\n action: hasImmutable ? \"replace\" : \"update\",\n logicalName: config.logicalName,\n derivedName,\n detail: changes.map((c) => c.field).join(\", \"),\n changes,\n });\n }\n\n return items;\n}\n\nfunction truncate(v: string): string {\n return v.length > 60 ? `${v.slice(0, 57)}...` : v;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { PipelineResourceConfig } from \"./pipelines.types.js\";\nimport type {\n PipelineStateEntry,\n WorkerConfig,\n WorkerResources,\n} from \"../../types.js\";\nimport { pipelinesApply } from \"./pipelines.apply.js\";\nimport { pipelinesSync } from \"./pipelines.sync.js\";\nimport { pipelinesDrift } from \"./pipelines.drift.js\";\nimport { pipelinesDestroy } from \"./pipelines.destroy.js\";\nimport { pipelinesGenerate } from \"./pipelines.generate.js\";\nimport { pipelinesStatus } from \"./pipelines.status.js\";\nimport { pipelinesDiffPlanItems } from \"./pipelines.diff.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { pipelineDeriveName } from \"./pipelines.naming.js\";\n\ninterface CFPipeline {\n id: string;\n name: string;\n sql: string;\n status?: string;\n}\n\nexport const pipelinesModule: ResourceModule<\n PipelineResourceConfig,\n CFPipeline\n> = {\n kind: \"pipeline\",\n label: \"Pipeline\",\n configKey: \"pipelines\",\n stateEntryType: \"pipeline\",\n\n async fetchAll(api: CFApiClient): Promise<CFPipeline[]> {\n const all = await api.pipelineListAll();\n return all.map((p) => ({\n id: p.id,\n name: p.name,\n sql: p.sql,\n status: p.status,\n }));\n },\n\n async apply(ctx) {\n await pipelinesApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n pipelinesSync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return pipelinesDrift(\n ctx.all,\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n diff(ctx) {\n return pipelinesDiffPlanItems({\n resources: ctx.resources,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n });\n },\n\n async destroy(ctx) {\n await pipelinesDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return pipelinesStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n const generated =\n ctx.resources.length > 0\n ? pipelinesGenerate(ctx.resources, ctx.env, ctx.state, ctx.naming)\n : [];\n const passthrough = ctx.passthrough?.pipelines ?? [];\n if (generated.length === 0 && passthrough.length === 0) return {};\n return { pipelines: [...passthrough, ...generated] };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): PipelineResourceConfig[] {\n return resourcesFrom(source)?.pipelines ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"pipeline\") return;\n try {\n await api.pipelineDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete Pipeline ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n const pipelineId = options.cfId;\n if (!pipelineId) {\n throw new Error(\"import pipeline: --cf-id <pipeline-id> is required\");\n }\n const resourceConfig =\n await findWorkerResourceByLogicalName<PipelineResourceConfig>(\n config,\n \"pipelines\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import pipeline: no resources.pipelines entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.pipelineListAll();\n const hit = all.find((p) => p.id === pipelineId);\n if (!hit) {\n throw new Error(\n `import pipeline: pipeline \"${pipelineId}\" not found in account`,\n );\n }\n const derivedName = pipelineDeriveName(resourceConfig, env, naming);\n if (hit.name !== derivedName) {\n throw new Error(\n `import pipeline: cf name \"${hit.name}\" does not match derived \"${derivedName}\"`,\n );\n }\n const key = `pipeline:${derivedName}`;\n const existing = state.get(key);\n const entry: PipelineStateEntry = {\n type: \"pipeline\",\n logicalName: options.logical,\n derivedName,\n bindingKey: naming.pipelineBindingKey(options.logical),\n cfId: hit.id,\n sql: hit.sql,\n status: hit.status,\n createdAt: existing?.type === \"pipeline\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveWorkflowCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\n\nexport function workflowDeriveName(\n config: WorkflowResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveWorkflowCloudflareName(config, env, naming);\n}\n\nexport function workflowMatchPattern(\n config: WorkflowResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveWorkflowCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","/**\n * Plan-time field-level diff for declared Workflows. Compares the recorded\n * {@link WorkflowStateEntry} against the {@link WorkflowResourceConfig} the\n * user wrote, and returns `update` {@link PlanItem}s for any drifted field.\n *\n * Workflows are upserted via `PUT /accounts/{id}/workflows/{name}` —\n * Cloudflare treats the call as create-or-update across `class_name`,\n * `script_name`, and `limits`, so every meaningful drift is an in-place\n * `update` (never a `replace`). Drift in just the binding key is also\n * tracked since `wrangler deploy` would emit a different fragment.\n *\n * Resources without a recorded state entry are not surfaced here — they\n * appear as `create` items via the `drift().undeployed` path in\n * `computePlan`.\n */\n\nimport type {\n WorkflowResourceConfig,\n WorkflowStateEntry,\n} from \"../../types.js\";\nimport { workflowDeriveName } from \"./workflows.naming.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { WorkerScope } from \"../../core/registry/types.js\";\nimport type { PlanFieldChange, PlanItem } from \"../../core/plan/plan.types.js\";\n\nexport function workflowsDiffPlanItems(args: {\n resources: WorkflowResourceConfig[];\n env: string;\n state: StateManager;\n naming: NamingEngine;\n worker?: WorkerScope;\n}): PlanItem[] {\n const { resources, env, state, naming, worker } = args;\n const items: PlanItem[] = [];\n\n for (const config of resources) {\n const derivedName = workflowDeriveName(config, env, naming);\n const key = `workflow:${derivedName}`;\n const entry = state.get(key);\n if (!entry || entry.type !== \"workflow\") continue;\n\n const stateEntry = entry as WorkflowStateEntry;\n const changes = computeWorkflowChanges(stateEntry, config, naming, worker);\n if (changes.length === 0) continue;\n items.push({\n kind: \"workflow\",\n action: \"update\",\n logicalName: config.logicalName,\n derivedName,\n detail: changes\n .map((c) => `${c.field}: ${formatVal(c.from)} -> ${formatVal(c.to)}`)\n .join(\", \"),\n changes,\n });\n }\n\n return items;\n}\n\n/**\n * Pure comparison shared with `workflowsApply` so plan and apply agree\n * on what counts as drift on a registered workflow. Drift in any of\n * `className`, `scriptName` (defaulting to the owning worker's\n * deployed name), `limits.steps`, or the binding key triggers an\n * in-place PUT — Cloudflare treats `PUT /accounts/{id}/workflows/{name}`\n * as create-or-update.\n */\nexport function computeWorkflowChanges(\n state: WorkflowStateEntry,\n config: WorkflowResourceConfig,\n naming: NamingEngine,\n worker: WorkerScope | undefined,\n): PlanFieldChange[] {\n const expectedScriptName =\n config.scriptName?.trim() ?? worker?.deployedName;\n const expectedBindingKey =\n config.binding?.trim() || naming.workflowBindingKey(config.logicalName);\n\n const changes: PlanFieldChange[] = [];\n\n if (state.className !== config.className) {\n changes.push({\n field: \"className\",\n from: state.className,\n to: config.className,\n kind: \"mutable\",\n });\n }\n if (\n expectedScriptName !== undefined &&\n state.scriptName !== expectedScriptName\n ) {\n changes.push({\n field: \"scriptName\",\n from: state.scriptName,\n to: expectedScriptName,\n kind: \"mutable\",\n });\n }\n const stateSteps = state.limits?.steps;\n const configSteps = config.limits?.steps;\n if ((stateSteps ?? null) !== (configSteps ?? null)) {\n changes.push({\n field: \"limits.steps\",\n from: stateSteps,\n to: configSteps,\n kind: \"mutable\",\n });\n }\n if (state.bindingKey !== expectedBindingKey) {\n changes.push({\n field: \"binding\",\n from: state.bindingKey,\n to: expectedBindingKey,\n kind: \"mutable\",\n });\n }\n\n return changes;\n}\n\nfunction formatVal(v: unknown): string {\n if (v === undefined || v === null) return \"(unset)\";\n if (typeof v === \"string\") return v.length > 32 ? `${v.slice(0, 29)}...` : v;\n return String(v);\n}\n","import type { TenantMeta, WorkflowStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { WorkerScope } from \"../../core/registry/types.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\nimport { computeWorkflowChanges } from \"./workflows.diff.js\";\nimport { logApplyChange } from \"../../core/plan/planFormat.js\";\nimport { workflowDeriveName } from \"./workflows.naming.js\";\n\nconst STATE_KEY_PREFIX = \"workflow:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\nfunction resolveScriptName(\n config: WorkflowResourceConfig,\n worker: WorkerScope | undefined,\n): string {\n const explicit = config.scriptName?.trim();\n if (explicit) return explicit;\n if (!worker) {\n throw new Error(\n `workflow \"${config.logicalName}\": no scriptName given and module ran ` +\n `without a worker scope — set scriptName on the resource or invoke ` +\n `apply per-worker.`,\n );\n }\n return worker.deployedName;\n}\n\nfunction limitsEqual(\n a: { steps?: number } | undefined,\n b: { steps?: number } | undefined,\n): boolean {\n return (a?.steps ?? null) === (b?.steps ?? null);\n}\n\n/**\n * Idempotent upsert via `PUT /accounts/{id}/workflows/{name}`. Cloudflare\n * treats PUT as create-or-update, so we issue it whenever the recorded\n * `(class_name, script_name, limits)` triple has drifted from config (or\n * the workflow has never been registered at all). Drift between recorded\n * state and *live* Cloudflare is surfaced separately by `workflowsDrift`.\n */\nexport async function workflowsApply(\n resources: WorkflowResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n worker?: WorkerScope,\n): Promise<void> {\n for (const config of resources) {\n const derivedName = workflowDeriveName(config, env, naming);\n const scriptName = resolveScriptName(config, worker);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n const wantsBindingKey =\n config.binding?.trim() || naming.workflowBindingKey(config.logicalName);\n\n if (\n existing &&\n existing.type === \"workflow\" &&\n existing.className === config.className &&\n existing.scriptName === scriptName &&\n limitsEqual(existing.limits, config.limits) &&\n existing.bindingKey === wantsBindingKey\n ) {\n continue;\n }\n\n if (existing && existing.type === \"workflow\") {\n const changes = computeWorkflowChanges(existing, config, naming, worker);\n logApplyChange({\n kind: \"workflow\",\n action: \"update\",\n logical: config.logicalName,\n derived: derivedName,\n changes,\n });\n } else {\n logApplyChange({\n kind: \"workflow\",\n action: \"create\",\n logical: config.logicalName,\n derived: derivedName,\n });\n }\n\n const ts = new Date().toISOString();\n const upserted = await api.workflowUpsert(derivedName, {\n class_name: config.className,\n script_name: scriptName,\n ...(config.limits ? { limits: config.limits } : {}),\n });\n const entry: WorkflowStateEntry = {\n type: \"workflow\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey: wantsBindingKey,\n cfId: upserted.id,\n className: upserted.class_name,\n scriptName: upserted.script_name,\n limits: config.limits,\n createdAt: existing?.type === \"workflow\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n }\n}\n","import type { TenantMeta, WorkflowStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\nimport { workflowDeriveName, workflowMatchPattern } from \"./workflows.naming.js\";\n\ninterface CFWorkflow {\n id: string;\n name: string;\n class_name: string;\n script_name: string;\n}\n\n/**\n * Match each declared workflow against `GET /accounts/{id}/workflows` and\n * upsert into state. Stack-scoped: `resources` is already filtered to the\n * current config, so we never persist a workflow owned by another stack\n * sharing this state row.\n */\nexport function workflowsSync(\n allWorkflows: CFWorkflow[],\n resources: WorkflowResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = workflowDeriveName(config, env, naming);\n const pattern = workflowMatchPattern(config, env, naming);\n const match = allWorkflows.find((w) => pattern(w.name));\n if (!match) continue;\n const key = `workflow:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n const entry: WorkflowStateEntry = {\n type: \"workflow\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey:\n config.binding?.trim() ||\n naming.workflowBindingKey(config.logicalName),\n cfId: match.id,\n className: match.class_name,\n scriptName: match.script_name,\n limits:\n existing?.type === \"workflow\" ? existing.limits : config.limits,\n createdAt: existing?.type === \"workflow\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\nimport type { WorkflowStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { workflowDeriveName } from \"./workflows.naming.js\";\n\ninterface CFWorkflow {\n id: string;\n name: string;\n class_name: string;\n script_name: string;\n}\n\nexport function workflowsDrift(\n allWorkflows: CFWorkflow[],\n resources: WorkflowResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"workflow\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(allWorkflows.map((w) => [w.name, w]));\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is WorkflowStateEntry => e.type === \"workflow\",\n );\n\n for (const config of resources) {\n const derivedName = workflowDeriveName(config, env, naming);\n const inCloudflare = cfByName.has(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !inCloudflare) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (inCloudflare && !stateEntry) {\n const cf = cfByName.get(derivedName)!;\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId: cf.id,\n });\n } else if (!inCloudflare && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, WorkflowStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function workflowsDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(config, baseDir, \"workflow\");\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, WorkflowStateEntry] => kv[1].type === \"workflow\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.workflowDelete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Failed to delete Workflow ${entry.derivedName}:`,\n err,\n );\n }\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\nimport type { StateEntry } from \"../../types.js\";\nimport type { WorkerScope } from \"../../core/registry/types.js\";\nimport { workflowDeriveName } from \"./workflows.naming.js\";\n\nexport interface WorkflowStateLike {\n get(key: string): StateEntry | undefined;\n}\n\nexport interface GeneratedWorkflowBinding {\n binding: string;\n name: string;\n class_name: string;\n /**\n * Optional per Cloudflare's wrangler schema — omitted when the workflow\n * lives in the same script as the binding (Wrangler defaults `script_name`\n * to the worker's own `name`). Emitted only when an explicit\n * `WorkflowResourceConfig.scriptName` was provided.\n */\n script_name?: string;\n}\n\n/**\n * Emit `workflows[]` bindings for declared workflows. Requires `tamer apply`\n * to have run (state row present) so we can fail fast with a clear message\n * before `wrangler deploy` would surface a less actionable error.\n *\n * `script_name` is only emitted when the user pinned an explicit override\n * — without it, Wrangler binds to the current worker's own script, which\n * matches our default-to-owning-worker semantics in apply.\n */\nexport function workflowsGenerate(\n resources: WorkflowResourceConfig[],\n env: string,\n state: WorkflowStateLike,\n naming: NamingEngine,\n worker?: WorkerScope,\n): GeneratedWorkflowBinding[] {\n const out: GeneratedWorkflowBinding[] = [];\n for (const config of resources) {\n const derivedName = workflowDeriveName(config, env, naming);\n const entry = state.get(`workflow:${derivedName}`);\n if (!entry || entry.type !== \"workflow\") {\n throw new Error(\n `Workflow \"${config.logicalName}\" not in state. Run 'tamer apply --env ${env}' first.`,\n );\n }\n const explicitScript = config.scriptName?.trim();\n const ownerScript = worker?.deployedName;\n const binding: GeneratedWorkflowBinding = {\n binding: entry.bindingKey,\n name: entry.derivedName,\n class_name: entry.className,\n };\n if (explicitScript) {\n binding.script_name = explicitScript;\n } else if (ownerScript && ownerScript !== entry.scriptName) {\n // Recorded scriptName diverges from the current worker we're emitting\n // wrangler.json for — pin it explicitly so the binding still resolves.\n binding.script_name = entry.scriptName;\n }\n out.push(binding);\n }\n return out;\n}\n","import type { WorkflowStateEntry, ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\nimport { workflowDeriveName } from \"./workflows.naming.js\";\n\nexport interface WorkflowStatusResult {\n binding: string;\n name: string;\n status: ResourceStatus;\n}\n\nexport function workflowsStatus(\n resources: WorkflowResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): WorkflowStatusResult[] {\n const out: WorkflowStatusResult[] = [];\n for (const config of resources) {\n const derivedName = workflowDeriveName(config, env, naming);\n const entry = state.get(`workflow:${derivedName}`) as\n | WorkflowStateEntry\n | undefined;\n out.push({\n binding:\n config.binding?.trim() ||\n naming.workflowBindingKey(config.logicalName),\n name: derivedName,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { WorkflowResourceConfig } from \"./workflows.types.js\";\nimport type {\n WorkflowStateEntry,\n WorkerConfig,\n WorkerResources,\n} from \"../../types.js\";\nimport { workflowsApply } from \"./workflows.apply.js\";\nimport { workflowsSync } from \"./workflows.sync.js\";\nimport { workflowsDrift } from \"./workflows.drift.js\";\nimport { workflowsDiffPlanItems } from \"./workflows.diff.js\";\nimport { workflowsDestroy } from \"./workflows.destroy.js\";\nimport { workflowsGenerate } from \"./workflows.generate.js\";\nimport { workflowsStatus } from \"./workflows.status.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { workflowDeriveName } from \"./workflows.naming.js\";\n\ninterface CFWorkflow {\n id: string;\n name: string;\n class_name: string;\n script_name: string;\n}\n\nexport const workflowsModule: ResourceModule<\n WorkflowResourceConfig,\n CFWorkflow\n> = {\n kind: \"workflow\",\n label: \"Workflow\",\n configKey: \"workflows\",\n stateEntryType: \"workflow\",\n\n async fetchAll(api: CFApiClient): Promise<CFWorkflow[]> {\n const all = await api.workflowListAll();\n return all.map((w) => ({\n id: w.id,\n name: w.name,\n class_name: w.class_name,\n script_name: w.script_name,\n }));\n },\n\n async apply(ctx) {\n await workflowsApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n ctx.worker,\n );\n },\n\n sync(ctx) {\n workflowsSync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return workflowsDrift(\n ctx.all,\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n diff(ctx) {\n return workflowsDiffPlanItems({\n resources: ctx.resources,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n worker: ctx.worker,\n });\n },\n\n async destroy(ctx) {\n await workflowsDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return workflowsStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n generate(ctx) {\n const generated =\n ctx.resources.length > 0\n ? workflowsGenerate(\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n ctx.worker,\n )\n : [];\n const passthrough = ctx.passthrough?.workflows ?? [];\n if (generated.length === 0 && passthrough.length === 0) return {};\n return { workflows: [...passthrough, ...generated] };\n },\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): WorkflowResourceConfig[] {\n return resourcesFrom(source)?.workflows ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"workflow\") return;\n try {\n await api.workflowDelete(entry.derivedName);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete Workflow ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n const resourceConfig =\n await findWorkerResourceByLogicalName<WorkflowResourceConfig>(\n config,\n \"workflows\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import workflow: no resources.workflows entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const derivedName = workflowDeriveName(resourceConfig, env, naming);\n const all = await api.workflowListAll();\n const hit = all.find((w) => w.name === derivedName);\n if (!hit) {\n throw new Error(\n `import workflow: no workflow named \"${derivedName}\" found in account`,\n );\n }\n if (options.cfId && hit.id !== options.cfId) {\n throw new Error(\n `import workflow: cf id \"${hit.id}\" does not match --cf-id \"${options.cfId}\"`,\n );\n }\n const key = `workflow:${derivedName}`;\n const existing = state.get(key);\n const entry: WorkflowStateEntry = {\n type: \"workflow\",\n logicalName: options.logical,\n derivedName,\n bindingKey: naming.workflowBindingKey(options.logical),\n cfId: hit.id,\n className: hit.class_name,\n scriptName: hit.script_name,\n limits:\n existing?.type === \"workflow\" ? existing.limits : undefined,\n createdAt: existing?.type === \"workflow\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport { resolveSecretsStoreCloudflareName } from \"../../core/naming/resolveCloudflareName.js\";\nimport type { SecretsStoreResourceConfig } from \"../../types.js\";\n\nexport function secretsStoreDeriveName(\n config: SecretsStoreResourceConfig,\n env: string,\n naming: NamingEngine,\n): string {\n return resolveSecretsStoreCloudflareName(config, env, naming);\n}\n\nexport function secretsStoreMatchPattern(\n config: SecretsStoreResourceConfig,\n env: string,\n naming: NamingEngine,\n): (name: string) => boolean {\n const expected = resolveSecretsStoreCloudflareName(config, env, naming);\n return (name: string) => name === expected;\n}\n","import type { TenantMeta, SecretsStoreStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { SecretsStoreResourceConfig } from \"./secrets-store.types.js\";\nimport { secretsStoreDeriveName } from \"./secrets-store.naming.js\";\n\nconst STATE_KEY_PREFIX = \"secrets_store:\";\n\nfunction stateKey(derivedName: string): string {\n return `${STATE_KEY_PREFIX}${derivedName}`;\n}\n\n/**\n * Idempotent provisioning for Secrets Store stores. The Cloudflare create\n * endpoint is non-idempotent (a duplicate name returns 409), so we list\n * first and short-circuit when a matching name already exists. Secret\n * **values** are deliberately out of scope — Tamer only manages the\n * account-scoped container. See `SecretsStoreSecretBinding` for how\n * worker bindings reference the resolved `store_id`.\n */\nexport async function secretsStoreApply(\n resources: SecretsStoreResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n api: CFApiClient,\n state: StateManager,\n naming: NamingEngine,\n): Promise<void> {\n if (resources.length === 0) return;\n\n let allStores:\n | Awaited<ReturnType<typeof api.secretsStoreListAll>>\n | null = null;\n\n for (const config of resources) {\n const derivedName = secretsStoreDeriveName(config, env, naming);\n const key = stateKey(derivedName);\n const existing = state.get(key);\n const wantsBindingKey = naming.secretsStoreBindingKey(config.logicalName);\n\n if (\n existing &&\n existing.type === \"secrets_store\" &&\n existing.bindingKey === wantsBindingKey\n ) {\n continue;\n }\n\n if (allStores === null) {\n allStores = await api.secretsStoreListAll();\n }\n const match = allStores.find((s) => s.name === derivedName);\n\n const ts = new Date().toISOString();\n let cfId: string;\n if (match) {\n cfId = match.id;\n } else {\n const created = await api.secretsStoreCreate(derivedName);\n cfId = created.id;\n }\n\n const entry: SecretsStoreStateEntry = {\n type: \"secrets_store\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey: wantsBindingKey,\n cfId,\n createdAt:\n existing?.type === \"secrets_store\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n }\n}\n","import type { TenantMeta, SecretsStoreStateEntry } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { SecretsStoreResourceConfig } from \"./secrets-store.types.js\";\nimport { secretsStoreDeriveName } from \"./secrets-store.naming.js\";\n\ninterface CFSecretsStore {\n id: string;\n name: string;\n}\n\n/**\n * Match each declared store against `GET /accounts/{id}/secrets_store/stores`\n * and upsert into state. Stack-scoped: `resources` is already filtered to\n * the current config so we never persist a store owned by another stack\n * sharing this state row.\n */\nexport function secretsStoreSync(\n allStores: CFSecretsStore[],\n resources: SecretsStoreResourceConfig[],\n _tenant: TenantMeta,\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): void {\n for (const config of resources) {\n const derivedName = secretsStoreDeriveName(config, env, naming);\n const match = allStores.find((s) => s.name === derivedName);\n if (!match) continue;\n const key = `secrets_store:${derivedName}`;\n const existing = state.get(key);\n const ts = new Date().toISOString();\n const entry: SecretsStoreStateEntry = {\n type: \"secrets_store\",\n logicalName: config.logicalName,\n derivedName,\n bindingKey: naming.secretsStoreBindingKey(config.logicalName),\n cfId: match.id,\n createdAt:\n existing?.type === \"secrets_store\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n }\n}\n","import type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { SecretsStoreResourceConfig } from \"./secrets-store.types.js\";\nimport type { SecretsStoreStateEntry } from \"../../types.js\";\nimport type { ResourceDrift } from \"../../core/drift/drift.types.js\";\nimport { secretsStoreDeriveName } from \"./secrets-store.naming.js\";\n\ninterface CFSecretsStore {\n id: string;\n name: string;\n}\n\nexport function secretsStoreDrift(\n allStores: CFSecretsStore[],\n resources: SecretsStoreResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): ResourceDrift {\n const drift: ResourceDrift = {\n kind: \"secret_store\",\n missingFromCloudflare: [],\n unrecordedInState: [],\n undeployed: [],\n };\n\n const cfByName = new Map(allStores.map((s) => [s.name, s]));\n const stateEntries = Object.values(state.getAll()).filter(\n (e): e is SecretsStoreStateEntry => e.type === \"secrets_store\",\n );\n\n for (const config of resources) {\n const derivedName = secretsStoreDeriveName(config, env, naming);\n const inCloudflare = cfByName.has(derivedName);\n const stateEntry = stateEntries.find(\n (e) => e.logicalName === config.logicalName,\n );\n if (stateEntry && !inCloudflare) {\n drift.missingFromCloudflare.push({\n logicalName: stateEntry.logicalName,\n derivedName: stateEntry.derivedName,\n cfId: stateEntry.cfId,\n });\n } else if (inCloudflare && !stateEntry) {\n const cf = cfByName.get(derivedName)!;\n drift.unrecordedInState.push({\n logicalName: config.logicalName,\n derivedName,\n cfId: cf.id,\n });\n } else if (!inCloudflare && !stateEntry) {\n drift.undeployed.push({\n logicalName: config.logicalName,\n derivedName,\n });\n }\n }\n\n return drift;\n}\n","import type { CfiConfig, SecretsStoreStateEntry } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { logicalNamesForResourceKind } from \"../../core/config/resourcesFromConfig.js\";\n\nexport async function secretsStoreDestroy(\n _env: string,\n state: StateManager,\n api: CFApiClient,\n config: CfiConfig,\n baseDir: string,\n _force?: boolean,\n): Promise<void> {\n const owned = await logicalNamesForResourceKind(\n config,\n baseDir,\n \"secret_store\",\n );\n const resources = state.getAll();\n const entries = Object.entries(resources).filter(\n (kv): kv is [string, SecretsStoreStateEntry] =>\n kv[1].type === \"secrets_store\",\n );\n\n for (const [key, entry] of entries) {\n if (!owned.has(entry.logicalName)) continue;\n try {\n await api.secretsStoreDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Failed to delete Secrets Store ${entry.derivedName}:`,\n err,\n );\n }\n }\n}\n","import type { SecretsStoreStateEntry, ResourceStatus } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { SecretsStoreResourceConfig } from \"./secrets-store.types.js\";\nimport { secretsStoreDeriveName } from \"./secrets-store.naming.js\";\n\nexport interface SecretsStoreStatusResult {\n binding: string;\n name: string;\n cfId?: string;\n status: ResourceStatus;\n}\n\nexport function secretsStoreStatus(\n resources: SecretsStoreResourceConfig[],\n env: string,\n state: StateManager,\n naming: NamingEngine,\n): SecretsStoreStatusResult[] {\n const out: SecretsStoreStatusResult[] = [];\n for (const config of resources) {\n const derivedName = secretsStoreDeriveName(config, env, naming);\n const entry = state.get(`secrets_store:${derivedName}`) as\n | SecretsStoreStateEntry\n | undefined;\n out.push({\n binding: naming.secretsStoreBindingKey(config.logicalName),\n name: derivedName,\n cfId: entry?.cfId,\n status: entry ? \"ok\" : \"missing\",\n });\n }\n return out;\n}\n","import type { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport type { ResourceModule } from \"../../core/registry/types.js\";\nimport type { SecretsStoreResourceConfig } from \"./secrets-store.types.js\";\nimport type {\n SecretsStoreStateEntry,\n WorkerConfig,\n WorkerResources,\n} from \"../../types.js\";\nimport { secretsStoreApply } from \"./secrets-store.apply.js\";\nimport { secretsStoreSync } from \"./secrets-store.sync.js\";\nimport { secretsStoreDrift } from \"./secrets-store.drift.js\";\nimport { secretsStoreDestroy } from \"./secrets-store.destroy.js\";\nimport { secretsStoreStatus } from \"./secrets-store.status.js\";\nimport { resourcesFrom } from \"../../core/registry/pickResources.js\";\nimport { findWorkerResourceByLogicalName } from \"../../core/registry/findResourceForImport.js\";\nimport { secretsStoreDeriveName } from \"./secrets-store.naming.js\";\n\ninterface CFSecretsStore {\n id: string;\n name: string;\n}\n\nexport const secretsStoreModule: ResourceModule<\n SecretsStoreResourceConfig,\n CFSecretsStore\n> = {\n kind: \"secret_store\",\n label: \"Secrets Store\",\n configKey: \"secretsStores\",\n stateEntryType: \"secrets_store\",\n\n async fetchAll(api: CFApiClient): Promise<CFSecretsStore[]> {\n const all = await api.secretsStoreListAll();\n return all.map((s) => ({ id: s.id, name: s.name }));\n },\n\n async apply(ctx) {\n await secretsStoreApply(\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.api,\n ctx.state,\n ctx.naming,\n );\n },\n\n sync(ctx) {\n secretsStoreSync(\n ctx.all,\n ctx.resources,\n ctx.tenant,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n drift(ctx) {\n return secretsStoreDrift(\n ctx.all,\n ctx.resources,\n ctx.env,\n ctx.state,\n ctx.naming,\n );\n },\n\n async destroy(ctx) {\n await secretsStoreDestroy(\n ctx.env,\n ctx.state,\n ctx.api,\n ctx.config,\n ctx.baseDir,\n ctx.force,\n );\n },\n\n status(ctx) {\n return secretsStoreStatus(ctx.resources, ctx.env, ctx.state, ctx.naming);\n },\n\n /**\n * Stores themselves contribute no wrangler binding — `secrets_store_secrets[]`\n * rows are emitted in `generator.ts` after all module fragments merge,\n * because they reference the worker's `secretsStoreSecrets` (a separate\n * deploy-time field, not a managed lifecycle resource).\n */\n generate() {\n return {};\n },\n\n /**\n * No `diff()` opt-in: Cloudflare's Secrets Store API exposes **no update\n * endpoint** for stores themselves (only `POST` / `GET` / `DELETE`;\n * `PATCH /accounts/{id}/secrets_store/stores/{store_id}/secrets/{secret_id}`\n * targets individual *secrets*, which Tamer deliberately does not manage —\n * see `SECRETS_STORE_DEFAULTS`). `SecretsStoreResourceConfig` is also just\n * `{ logicalName }`, so there are no Tamer-tracked fields whose drift could\n * become an `update` plan item. Renaming a store's `logicalName` changes\n * the **derived** name (identity), which falls into the registry's normal\n * delete-and-recreate path via `pickResources` / `destroyOne`. If\n * Cloudflare ever exposes per-store mutable settings (e.g. retention,\n * region pin), wire them through `SECRETS_STORE_DEFAULTS` and add a\n * `diff()` here following the AI Gateway / Hyperdrive pattern.\n */\n\n pickResources(\n source: WorkerConfig | WorkerResources | undefined,\n ): SecretsStoreResourceConfig[] {\n return resourcesFrom(source)?.secretsStores ?? [];\n },\n\n async destroyOne({ api, state, key, entry }) {\n if (entry.type !== \"secrets_store\") return;\n try {\n await api.secretsStoreDelete(entry.cfId);\n state.delete(key);\n } catch (err) {\n console.warn(\n `Rollback: failed to delete Secrets Store ${entry.derivedName}:`,\n err,\n );\n }\n },\n\n async importOne({ options, env, api, state, naming, config, baseDir, ts }) {\n const resourceConfig =\n await findWorkerResourceByLogicalName<SecretsStoreResourceConfig>(\n config,\n \"secretsStores\",\n options.logical,\n baseDir,\n );\n if (!resourceConfig) {\n throw new Error(\n `import secret_store: no resources.secretsStores entry with logicalName \"${options.logical}\" in the Tamer project config`,\n );\n }\n const all = await api.secretsStoreListAll();\n const derivedName = secretsStoreDeriveName(resourceConfig, env, naming);\n const hit = all.find((s) => s.name === derivedName);\n if (!hit) {\n throw new Error(\n `import secret_store: no store named \"${derivedName}\" found in account`,\n );\n }\n if (options.cfId && hit.id !== options.cfId) {\n throw new Error(\n `import secret_store: cf id \"${hit.id}\" does not match --cf-id \"${options.cfId}\"`,\n );\n }\n const key = `secrets_store:${derivedName}`;\n const existing = state.get(key);\n const entry: SecretsStoreStateEntry = {\n type: \"secrets_store\",\n logicalName: options.logical,\n derivedName,\n bindingKey: naming.secretsStoreBindingKey(options.logical),\n cfId: hit.id,\n createdAt:\n existing?.type === \"secrets_store\" ? existing.createdAt : ts,\n updatedAt: ts,\n };\n state.set(key, entry);\n },\n};\n","/**\n * Single source of truth for Tamer-managed Cloudflare resource kinds.\n *\n * To add a new resource (e.g. Pipelines, Workflows, Pages):\n * 1. Add the config + state types to `src/types.ts` and Zod schema.\n * 2. Implement the per-resource feature module under `src/features/<kind>/`.\n * 3. Author `<kind>.module.ts` exporting a {@link ResourceModule}.\n * 4. Append it to {@link resourceModules} below.\n *\n * Every command (`apply`, `sync`, `drift`, `destroy`, `status`, `import`,\n * the wrangler generator) iterates this array — no additional plumbing is\n * required for the resource to be honored across all commands.\n */\n\nimport type { ResourceKind, ResourceModule } from \"./types.js\";\nimport { d1Module } from \"../../features/d1/d1.module.js\";\nimport { r2Module } from \"../../features/r2/r2.module.js\";\nimport { kvModule } from \"../../features/kv/kv.module.js\";\nimport { queuesModule } from \"../../features/queues/queues.module.js\";\nimport { hyperdriveModule } from \"../../features/hyperdrive/hyperdrive.module.js\";\nimport { vectorizeModule } from \"../../features/vectorize/vectorize.module.js\";\nimport { aiGatewayModule } from \"../../features/ai-gateway/ai-gateway.module.js\";\nimport { pipelinesModule } from \"../../features/pipelines/pipelines.module.js\";\nimport { workflowsModule } from \"../../features/workflows/workflows.module.js\";\nimport { secretsStoreModule } from \"../../features/secrets-store/secrets-store.module.js\";\n\nexport const resourceModules: ReadonlyArray<ResourceModule> = [\n d1Module as ResourceModule,\n r2Module as ResourceModule,\n kvModule as ResourceModule,\n queuesModule as ResourceModule,\n hyperdriveModule as ResourceModule,\n vectorizeModule as ResourceModule,\n aiGatewayModule as ResourceModule,\n pipelinesModule as ResourceModule,\n workflowsModule as ResourceModule,\n secretsStoreModule as ResourceModule,\n];\n\nconst moduleByKind: Map<ResourceKind, ResourceModule> = new Map(\n resourceModules.map((m) => [m.kind, m]),\n);\n\n/** Lookup by stable kind. Returns `undefined` for unknown kinds. */\nexport function getResourceModule(\n kind: ResourceKind,\n): ResourceModule | undefined {\n return moduleByKind.get(kind);\n}\n\n/** Throws if no module is registered for `kind`. */\nexport function requireResourceModule(kind: ResourceKind): ResourceModule {\n const m = moduleByKind.get(kind);\n if (!m) throw new Error(`No registered resource module for kind \"${kind}\"`);\n return m;\n}\n\nexport type { ResourceKind, ResourceModule } from \"./types.js\";\n","/**\n * Cross-stack import pre-fetch.\n *\n * `${tamer:import:<stack>.<output>}` is Tamer's CloudFormation\n * `Fn::ImportValue` analogue — a stack reads outputs published by a sibling\n * stack that lives in the same `tamer-state-{env}` D1 (see\n * `cfi_state:{stack}` row keying). This module:\n *\n * 1. Statically scans the current project config for every\n * `${tamer:import:<stack>.<output>}` reference (vars, tamerRoutes, worker\n * `services[].service`, `dispatch_namespaces[].namespace`, `outputs`, …).\n * 2. Pre-fetches each referenced sibling stack's persisted outputs at\n * command start so {@link ReferenceContext.imports} is fully populated\n * before any `resolveReferencesInString` call fires. Resolution is\n * then a pure map lookup (no D1 round-trips mid-resolution → no\n * partial-failure modes).\n *\n * Pre-fetch failures are intentionally surfaced eagerly. If an imported\n * stack has no state row at all (never `apply`d) we record an empty\n * outputs map; the `lookupImport` step then throws with a clear \"run\n * apply on <stack>\" message rather than a generic \"no such reference\".\n */\nimport type { CFApiClient } from \"../api/CFApiClient.js\";\nimport { materializeTamerResolvable } from \"../../dx/normalize.js\";\nimport type {\n CfiConfig,\n TamerResolvableString,\n WranglerR2BucketResolvable,\n} from \"../../types.js\";\nimport { getDispatchNamespaces } from \"../../types.js\";\nimport { StateManager } from \"../state/StateManager.js\";\nimport { stackNameForConfig } from \"../state/stackName.js\";\n\nconst IMPORT_RE = /\\$\\{tamer:import:([a-zA-Z0-9_-]+)\\.([a-zA-Z0-9_-]+)\\}/g;\n\n/** A single `${tamer:import:<stack>.<output>}` site collected by scan. */\nexport interface DiscoveredImportRef {\n stack: string;\n output: string;\n /** Free-form pointer for diagnostics (e.g. `worker[api].vars.DB_ID`). */\n fieldPath: string;\n}\n\n/**\n * Walk the merged `CfiConfig` and collect every `${tamer:import:…}` ref\n * site along with where it was found. Used both to drive the pre-fetch\n * (which sibling stacks to load) and by `tamer status` to render an\n * \"inbound imports\" panel even before any `apply` has run.\n *\n * Self-imports (current stack importing from its own name) are filtered\n * out — they are almost always a config typo and would otherwise\n * silently resolve via the same row this command is about to write.\n */\nexport function scanConfigForImports(\n config: CfiConfig,\n): DiscoveredImportRef[] {\n const selfStack = stackNameForConfig(config);\n const refs: DiscoveredImportRef[] = [];\n const seen = new Set<string>();\n const push = (raw: string | undefined, fieldPath: string) => {\n if (!raw) return;\n IMPORT_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = IMPORT_RE.exec(raw)) !== null) {\n const stack = m[1]!;\n const output = m[2]!;\n if (stack === selfStack) continue;\n const key = `${fieldPath}::${stack}.${output}`;\n if (seen.has(key)) continue;\n seen.add(key);\n refs.push({ stack, output, fieldPath });\n }\n };\n\n const walkVars = (\n vars: Record<string, TamerResolvableString> | undefined,\n pathPrefix: string,\n ) => {\n if (!vars) return;\n for (const [k, v] of Object.entries(vars)) {\n push(materializeTamerResolvable(v), `${pathPrefix}.${k}`);\n }\n };\n\n const walkR2BucketNames = (\n w: { r2_buckets?: WranglerR2BucketResolvable[] | undefined },\n pathPrefix: string,\n ) => {\n if (!w.r2_buckets) return;\n w.r2_buckets.forEach((b, i) => {\n if (b.bucket_name === undefined) return;\n push(\n materializeTamerResolvable(b.bucket_name),\n `${pathPrefix}.r2_buckets[${i}].bucket_name`,\n );\n });\n };\n\n const walkD1DatabaseNames = (\n w: { resources?: { d1?: Array<{ databaseName?: TamerResolvableString }> } },\n pathPrefix: string,\n ) => {\n const d1 = w.resources?.d1;\n if (!d1) return;\n d1.forEach((d, i) => {\n if (d.databaseName === undefined) return;\n push(\n materializeTamerResolvable(d.databaseName),\n `${pathPrefix}.resources.d1[${i}].databaseName`,\n );\n });\n };\n\n /** Service bindings / WfP namespace strings may carry `${tamer:import:…}`. */\n const walkBindingsWithRefs = (\n w: {\n services?: Array<{ service?: TamerResolvableString }>;\n dispatch_namespaces?: Array<{ namespace?: TamerResolvableString }>;\n },\n pathPrefix: string,\n ) => {\n w.services?.forEach((s, i) => {\n if (s.service === undefined) return;\n push(\n materializeTamerResolvable(s.service),\n `${pathPrefix}.services[${i}].service`,\n );\n });\n w.dispatch_namespaces?.forEach((d, i) => {\n if (d.namespace === undefined) return;\n push(\n materializeTamerResolvable(d.namespace),\n `${pathPrefix}.dispatch_namespaces[${i}].namespace`,\n );\n });\n };\n\n if (config.worker) {\n walkVars(config.worker.vars, \"worker.vars\");\n walkR2BucketNames(config.worker, \"worker\");\n walkD1DatabaseNames(config.worker, \"worker\");\n walkBindingsWithRefs(config.worker, \"worker\");\n if (config.worker.tamerRoutes) {\n config.worker.tamerRoutes.forEach((r, i) => {\n push(r.host, `worker.tamerRoutes[${i}].host`);\n push(r.zone, `worker.tamerRoutes[${i}].zone`);\n });\n }\n }\n if (config.workers) {\n for (const [key, w] of Object.entries(config.workers)) {\n walkVars(w.vars, `worker[${key}].vars`);\n walkR2BucketNames(w, `worker[${key}]`);\n walkD1DatabaseNames(w, `worker[${key}]`);\n walkBindingsWithRefs(w, `worker[${key}]`);\n if (w.tamerRoutes) {\n w.tamerRoutes.forEach((r, i) => {\n push(r.host, `worker[${key}].tamerRoutes[${i}].host`);\n push(r.zone, `worker[${key}].tamerRoutes[${i}].zone`);\n });\n }\n }\n }\n if (config.outputs) {\n for (const [name, source] of Object.entries(config.outputs)) {\n push(materializeTamerResolvable(source), `outputs.${name}`);\n }\n }\n // Dispatch namespace declarations are static identifiers today — no\n // string-interpolated fields that could carry imports — but if that\n // changes, extend here. Keeping the call site documented:\n void getDispatchNamespaces;\n\n return refs;\n}\n\n/** Distinct sibling stack names referenced anywhere in `config`. */\nexport function importedStackNames(config: CfiConfig): string[] {\n const refs = scanConfigForImports(config);\n return [...new Set(refs.map((r) => r.stack))].sort();\n}\n\n/**\n * Hydrate every imported sibling stack's persisted outputs and return\n * them shaped for {@link ReferenceContext.imports}.\n *\n * - `local` env: returns `{}` immediately. Local mode never persists\n * state, so cross-stack imports are inherently unresolvable. Callers\n * running in tolerant mode (`plan`, `status`) will see the placeholder\n * verbatim; strict callers (`apply`, `deploy`) will fail at resolution\n * with a clear \"no imported stack\" message.\n * - Missing sibling state row: recorded as an empty outputs map, so\n * `lookupImport` can produce a \"no published outputs\" diagnostic\n * (vs. the generic \"stack not pre-fetched\" error).\n *\n * The {@link CFApiClient} is shared with the caller for socket reuse.\n */\nexport async function fetchStackImports(\n api: CFApiClient,\n config: CfiConfig,\n env: string,\n): Promise<Record<string, Record<string, string>>> {\n const stacks = importedStackNames(config);\n if (stacks.length === 0 || env === \"local\") return {};\n\n const out: Record<string, Record<string, string>> = {};\n for (const stack of stacks) {\n // Each sibling gets its own StateManager so the returned outputs are\n // fully decoupled from the current stack's mutable state. We never\n // call `persist` on these — read-only.\n const sibling = new StateManager(config.tenant.id, env, stack);\n try {\n await sibling.hydrate(api);\n } catch (err) {\n // A missing tamer-state-{env} D1 surfaces here as \"Tamer state\n // database not found\"; that's a hard error common to every stack\n // in the env, so re-throw rather than silently degrade.\n throw new Error(\n `Failed to hydrate imported stack \"${stack}\" from env \"${env}\": ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n const persisted = sibling.getStackOutputs();\n const flat: Record<string, string> = {};\n for (const [name, v] of Object.entries(persisted)) {\n flat[name] = v.value;\n }\n out[stack] = flat;\n }\n return out;\n}\n"],"mappings":"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"}