@dragonmastery/tamer 0.38.0 → 0.40.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 (99) hide show
  1. package/README.md +14 -12
  2. package/dist/{apply-ByHaKpxD.mjs → apply-CV4_3Jv4.mjs} +15 -15
  3. package/dist/{apply-ByHaKpxD.mjs.map → apply-CV4_3Jv4.mjs.map} +1 -1
  4. package/dist/{applyTarget-BkBg8MFW.mjs → applyTarget-B1YPgkb3.mjs} +3 -3
  5. package/dist/{applyTarget-BkBg8MFW.mjs.map → applyTarget-B1YPgkb3.mjs.map} +1 -1
  6. package/dist/{bootstrap-DvOce6vA.mjs → bootstrap-ilkixdmD.mjs} +4 -4
  7. package/dist/{bootstrap-DvOce6vA.mjs.map → bootstrap-ilkixdmD.mjs.map} +1 -1
  8. package/dist/{buildDispatchUploadForm-D9ZrefZX.mjs → buildDispatchUploadForm-D_fM8JaL.mjs} +11 -14
  9. package/dist/buildDispatchUploadForm-D_fM8JaL.mjs.map +1 -0
  10. package/dist/{cloudflareSnapshot-CjXNMr4X.mjs → cloudflareSnapshot-BAeNVohz.mjs} +5 -5
  11. package/dist/{cloudflareSnapshot-CjXNMr4X.mjs.map → cloudflareSnapshot-BAeNVohz.mjs.map} +1 -1
  12. package/dist/{deploy-C4NOE5S1.mjs → deploy-BEaNADU6.mjs} +10 -10
  13. package/dist/{deploy-C4NOE5S1.mjs.map → deploy-BEaNADU6.mjs.map} +1 -1
  14. package/dist/{destroy-BeOYY2U6.mjs → destroy-Krf35oqE.mjs} +11 -11
  15. package/dist/{destroy-BeOYY2U6.mjs.map → destroy-Krf35oqE.mjs.map} +1 -1
  16. package/dist/{destroy-tenant-B9ZTeUDk.mjs → destroy-tenant-C95ljuon.mjs} +2 -2
  17. package/dist/{destroy-tenant-B9ZTeUDk.mjs.map → destroy-tenant-C95ljuon.mjs.map} +1 -1
  18. package/dist/{dev-0zkF2iqF.mjs → dev-C__1rLos.mjs} +8 -8
  19. package/dist/{dev-0zkF2iqF.mjs.map → dev-C__1rLos.mjs.map} +1 -1
  20. package/dist/{dns-records.resolve-BBTlY3T5.mjs → dns-records.resolve-C2T0m4NG.mjs} +1 -1
  21. package/dist/{dns-records.resolve-DV6XBZf3.mjs → dns-records.resolve-DwBR_1WI.mjs} +1 -1
  22. package/dist/{dns-records.resolve-DV6XBZf3.mjs.map → dns-records.resolve-DwBR_1WI.mjs.map} +1 -1
  23. package/dist/{dns-records.sync-FyzKl-Ph.mjs → dns-records.sync-Dfwk76J_.mjs} +3 -3
  24. package/dist/{dns-records.sync-FyzKl-Ph.mjs.map → dns-records.sync-Dfwk76J_.mjs.map} +1 -1
  25. package/dist/{doctor-fm_vGe2C.mjs → doctor-BIaLEVFR.mjs} +2 -2
  26. package/dist/{doctor-fm_vGe2C.mjs.map → doctor-BIaLEVFR.mjs.map} +1 -1
  27. package/dist/drift-08k11FV6.mjs +8 -0
  28. package/dist/{drift-Ci368_WQ.mjs → drift-CLsSBorO.mjs} +7 -7
  29. package/dist/{drift-Ci368_WQ.mjs.map → drift-CLsSBorO.mjs.map} +1 -1
  30. package/dist/{emit-DDTQVfi_.mjs → emit-Dh68dvo5.mjs} +2 -2
  31. package/dist/{emit-DDTQVfi_.mjs.map → emit-Dh68dvo5.mjs.map} +1 -1
  32. package/dist/{env-gc-DlQxkZPj.mjs → env-gc-0vX5Av4i.mjs} +11 -11
  33. package/dist/{env-gc-DlQxkZPj.mjs.map → env-gc-0vX5Av4i.mjs.map} +1 -1
  34. package/dist/{env-list-DhbYisDn.mjs → env-list-DYCprcLb.mjs} +2 -2
  35. package/dist/{env-list-DhbYisDn.mjs.map → env-list-DYCprcLb.mjs.map} +1 -1
  36. package/dist/{events-C7wAGJae.mjs → events-CnWvxyX_.mjs} +2 -2
  37. package/dist/{events-C7wAGJae.mjs.map → events-CnWvxyX_.mjs.map} +1 -1
  38. package/dist/{generator-MX8MAHd9.mjs → generator-DAU5K77L.mjs} +2 -2
  39. package/dist/{generator-MX8MAHd9.mjs.map → generator-DAU5K77L.mjs.map} +1 -1
  40. package/dist/{import-Bzow4TPf.mjs → import-BNbHjR9t.mjs} +6 -6
  41. package/dist/{import-Bzow4TPf.mjs.map → import-BNbHjR9t.mjs.map} +1 -1
  42. package/dist/index.d.mts +19 -0
  43. package/dist/index.d.mts.map +1 -1
  44. package/dist/{logpush-job-GqVKG_HI.mjs → logpush-job-C_6uzGUC.mjs} +2 -2
  45. package/dist/{logpush-job-GqVKG_HI.mjs.map → logpush-job-C_6uzGUC.mjs.map} +1 -1
  46. package/dist/{migrate-YfRtATkG.mjs → migrate-EVfFlJOM.mjs} +6 -6
  47. package/dist/{migrate-YfRtATkG.mjs.map → migrate-EVfFlJOM.mjs.map} +1 -1
  48. package/dist/normalize-DVSTRZhO.mjs.map +1 -1
  49. package/dist/{plan-C0XRZK_J.mjs → plan-tnUWkiM1.mjs} +12 -12
  50. package/dist/{plan-C0XRZK_J.mjs.map → plan-tnUWkiM1.mjs.map} +1 -1
  51. package/dist/{planFormat-5XMJK879.mjs → planFormat-DpA8XhzX.mjs} +1 -1
  52. package/dist/{planFormat-5XMJK879.mjs.map → planFormat-DpA8XhzX.mjs.map} +1 -1
  53. package/dist/{provision-tenant-B4VgWlbl.mjs → provision-tenant-DW4eg-7P.mjs} +85 -13
  54. package/dist/provision-tenant-DW4eg-7P.mjs.map +1 -0
  55. package/dist/{r2S3EmptyBucket-B9_pHfvB.mjs → r2S3EmptyBucket-CXLmOrYF.mjs} +1 -1
  56. package/dist/{r2S3EmptyBucket-B9_pHfvB.mjs.map → r2S3EmptyBucket-CXLmOrYF.mjs.map} +1 -1
  57. package/dist/{registry-BrOxbA2i.mjs → registry-X9dlQxG3.mjs} +4 -4
  58. package/dist/{registry-BrOxbA2i.mjs.map → registry-X9dlQxG3.mjs.map} +1 -1
  59. package/dist/resolveTenantBindings-DJDPhILD.mjs +80 -0
  60. package/dist/resolveTenantBindings-DJDPhILD.mjs.map +1 -0
  61. package/dist/{stackOutputs-CkpNSng8.mjs → stackOutputs-CU2oxjpU.mjs} +1 -1
  62. package/dist/{stackOutputs-CkpNSng8.mjs.map → stackOutputs-CU2oxjpU.mjs.map} +1 -1
  63. package/dist/{status-B-ei_QXO.mjs → status-srUxsBIB.mjs} +7 -7
  64. package/dist/{status-B-ei_QXO.mjs.map → status-srUxsBIB.mjs.map} +1 -1
  65. package/dist/sync-CfNyelDN.mjs +7 -0
  66. package/dist/{sync-kl7MaCQV.mjs → sync-DfJGkOME.mjs} +6 -6
  67. package/dist/{sync-kl7MaCQV.mjs.map → sync-DfJGkOME.mjs.map} +1 -1
  68. package/dist/tamer.mjs +68 -82
  69. package/dist/tamer.mjs.map +1 -1
  70. package/dist/{tamerArtifactsR2-COndFmk5.mjs → tamerArtifactsR2-B9myb-IA.mjs} +2 -2
  71. package/dist/{tamerArtifactsR2-COndFmk5.mjs.map → tamerArtifactsR2-B9myb-IA.mjs.map} +1 -1
  72. package/dist/{tenant-0dRh3gLI.mjs → tenant-MWIs0esz.mjs} +2 -2
  73. package/dist/{tenant-0dRh3gLI.mjs.map → tenant-MWIs0esz.mjs.map} +1 -1
  74. package/dist/tenant-migrate-CT-qyTUD.mjs +100 -0
  75. package/dist/tenant-migrate-CT-qyTUD.mjs.map +1 -0
  76. package/dist/{types-BpTmpzBy.mjs → types-BPxuutXk.mjs} +6 -6
  77. package/dist/{types-BpTmpzBy.mjs.map → types-BPxuutXk.mjs.map} +1 -1
  78. package/dist/{verifyPlanFile-D_-Qbh1J.mjs → verifyPlanFile-CoAOsD3W.mjs} +2 -2
  79. package/dist/{verifyPlanFile-D_-Qbh1J.mjs.map → verifyPlanFile-CoAOsD3W.mjs.map} +1 -1
  80. package/dist/{wfp-delete-COWm9F8p.mjs → wfp-delete-CwWQFxxj.mjs} +2 -2
  81. package/dist/{wfp-delete-COWm9F8p.mjs.map → wfp-delete-CwWQFxxj.mjs.map} +1 -1
  82. package/dist/{wfp-put-Dzs2zAj2.mjs → wfp-put-BBitXJep.mjs} +3 -3
  83. package/dist/{wfp-put-Dzs2zAj2.mjs.map → wfp-put-BBitXJep.mjs.map} +1 -1
  84. package/dist/{worker-route-CUQBu9xe.mjs → worker-route-CvuUPq1k.mjs} +3 -3
  85. package/dist/{worker-route-CUQBu9xe.mjs.map → worker-route-CvuUPq1k.mjs.map} +1 -1
  86. package/dist/{workers-DWXnZAzG.mjs → workers-DSlrKeNL.mjs} +3 -3
  87. package/dist/{workers-DWXnZAzG.mjs.map → workers-DSlrKeNL.mjs.map} +1 -1
  88. package/dist/wranglerOutFile-f08VsoAj.mjs +3 -0
  89. package/dist/{wranglerSpawn-Dx4I0Wu-.mjs → wranglerSpawn-DWdgrsmQ.mjs} +2 -2
  90. package/dist/{wranglerSpawn-Dx4I0Wu-.mjs.map → wranglerSpawn-DWdgrsmQ.mjs.map} +1 -1
  91. package/dist/wranglerSpawn-aARBLHpA.mjs +3 -0
  92. package/dist/{zoneResolver-D9bz6-0l.mjs → zoneResolver-VoxLHM4N.mjs} +1 -1
  93. package/dist/{zoneResolver-D9bz6-0l.mjs.map → zoneResolver-VoxLHM4N.mjs.map} +1 -1
  94. package/package.json +1 -1
  95. package/dist/buildDispatchUploadForm-D9ZrefZX.mjs.map +0 -1
  96. package/dist/drift-CryXFwSh.mjs +0 -8
  97. package/dist/provision-tenant-B4VgWlbl.mjs.map +0 -1
  98. package/dist/sync-Bky8pptf.mjs +0 -7
  99. /package/dist/{secrets-CnzjvndT.mjs → secrets-2Hy5LMHs.mjs} +0 -0
@@ -0,0 +1,80 @@
1
+ import { n as materializeTamerResolvable } from "./normalize-DVSTRZhO.mjs";
2
+ import { j as resolveReferencesInString } from "./tamer.mjs";
3
+
4
+ //#region src/core/tenant/resolveTenantBindings.ts
5
+ /**
6
+ * Collect all D1 resource configs across all workers in the stack.
7
+ * Returns a map of `registryRole` → `{ binding, migrationsDir, migrationsTable }`.
8
+ */
9
+ function collectD1RegistryRoles(config) {
10
+ const out = /* @__PURE__ */ new Map();
11
+ const workers = config.workers ? config.workers : config.worker ? { default: config.worker } : {};
12
+ for (const wc of Object.values(workers)) {
13
+ const d1s = wc.resources?.d1;
14
+ if (!d1s) continue;
15
+ for (const d1 of d1s) {
16
+ const role = d1.registryRole ?? d1.logicalName;
17
+ const binding = d1.binding?.trim() || `DB_${role.toUpperCase()}`;
18
+ if (!out.has(role)) out.set(role, {
19
+ binding,
20
+ migrationsDir: d1.migrationsDir,
21
+ migrationsTable: d1.migrationsTable
22
+ });
23
+ }
24
+ }
25
+ return out;
26
+ }
27
+ /**
28
+ * Resolve D1 bindings for the tenant dispatch script.
29
+ * Matches shard roles to `resources.d1[].registryRole` and produces
30
+ * `{ name: binding, id: cfId }` entries for the multipart metadata.
31
+ */
32
+ function resolveTenantD1Bindings(config, shards, naming) {
33
+ const registryRoles = collectD1RegistryRoles(config);
34
+ return shards.map((shard) => {
35
+ return {
36
+ name: registryRoles.get(shard.role)?.binding ?? naming.workflowBindingKey(shard.role),
37
+ id: shard.cfId
38
+ };
39
+ });
40
+ }
41
+ /**
42
+ * Resolve all dispatch script bindings (D1 + vars + services).
43
+ * References in vars/services are resolved against state.
44
+ */
45
+ function resolveTenantBindings(config, shards, naming, state, env, accountId) {
46
+ const bindings = {};
47
+ const d1Bindings = resolveTenantD1Bindings(config, shards, naming);
48
+ if (d1Bindings.length > 0) bindings.d1_databases = d1Bindings;
49
+ if (config.tenant.dispatchVars) {
50
+ const refCtx = {
51
+ config,
52
+ env,
53
+ state,
54
+ naming,
55
+ accountId
56
+ };
57
+ const vars = {};
58
+ for (const [key, value] of Object.entries(config.tenant.dispatchVars)) vars[key] = resolveReferencesInString(materializeTamerResolvable(value), refCtx, `tenant.dispatchVars.${key}`);
59
+ if (Object.keys(vars).length > 0) bindings.vars = vars;
60
+ }
61
+ if (config.tenant.dispatchServices?.length) {
62
+ const refCtx = {
63
+ config,
64
+ env,
65
+ state,
66
+ naming,
67
+ accountId
68
+ };
69
+ bindings.services = config.tenant.dispatchServices.map((s) => ({
70
+ name: s.name,
71
+ service: resolveReferencesInString(materializeTamerResolvable(s.service), refCtx, `tenant.dispatchServices.${s.name}.service`),
72
+ ...s.environment ? { environment: s.environment } : {}
73
+ }));
74
+ }
75
+ return bindings;
76
+ }
77
+
78
+ //#endregion
79
+ export { resolveTenantBindings, resolveTenantD1Bindings };
80
+ //# sourceMappingURL=resolveTenantBindings-DJDPhILD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveTenantBindings-DJDPhILD.mjs","names":["workers: Record<string, WorkerConfig>","bindings: DispatchScriptBindings","refCtx: ReferenceContext","vars: Record<string, string>"],"sources":["../src/core/tenant/resolveTenantBindings.ts"],"sourcesContent":["/**\n * Resolve dispatch script bindings for a provisioned tenant.\n *\n * D1 bindings derive automatically from `resources.d1[].registryRole`\n * matched to the tenant's shard roles. Vars and services come from\n * `tenant.dispatchVars` / `tenant.dispatchServices` (resolved against\n * state for `${tamer:...}` references).\n */\nimport type { CfiConfig, WorkerConfig, WorkerResources, TamerResolvableString } from \"../../types.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { TenantD1ShardRef } from \"../../types.js\";\nimport type { DispatchScriptBindings } from \"../../core/wfp/buildDispatchUploadForm.js\";\nimport { materializeTamerResolvable } from \"../../dx/normalize.js\";\nimport {\n resolveReferencesInString,\n type ReferenceContext,\n} from \"../../core/references/references.js\";\n\n/**\n * Collect all D1 resource configs across all workers in the stack.\n * Returns a map of `registryRole` → `{ binding, migrationsDir, migrationsTable }`.\n */\nfunction collectD1RegistryRoles(\n config: CfiConfig,\n): Map<string, { binding: string; migrationsDir?: string; migrationsTable?: string }> {\n const out = new Map<\n string,\n { binding: string; migrationsDir?: string; migrationsTable?: string }\n >();\n const workers: Record<string, WorkerConfig> = config.workers\n ? (config.workers as Record<string, WorkerConfig>)\n : config.worker\n ? { default: config.worker as WorkerConfig }\n : {};\n for (const wc of Object.values(workers)) {\n const d1s = (wc as WorkerConfig & { resources?: WorkerResources }).resources?.d1;\n if (!d1s) continue;\n for (const d1 of d1s) {\n const role = d1.registryRole ?? d1.logicalName;\n const binding = d1.binding?.trim() || `DB_${role.toUpperCase()}`;\n if (!out.has(role)) {\n out.set(role, {\n binding,\n migrationsDir: d1.migrationsDir,\n migrationsTable: d1.migrationsTable,\n });\n }\n }\n }\n return out;\n}\n\n/**\n * Resolve D1 bindings for the tenant dispatch script.\n * Matches shard roles to `resources.d1[].registryRole` and produces\n * `{ name: binding, id: cfId }` entries for the multipart metadata.\n */\nexport function resolveTenantD1Bindings(\n config: CfiConfig,\n shards: TenantD1ShardRef[],\n naming: NamingEngine,\n): Array<{ name: string; id: string }> {\n const registryRoles = collectD1RegistryRoles(config);\n return shards.map((shard) => {\n const roleInfo = registryRoles.get(shard.role);\n const binding = roleInfo?.binding ?? naming.workflowBindingKey(shard.role);\n return { name: binding, id: shard.cfId };\n });\n}\n\n/**\n * Resolve all dispatch script bindings (D1 + vars + services).\n * References in vars/services are resolved against state.\n */\nexport function resolveTenantBindings(\n config: CfiConfig,\n shards: TenantD1ShardRef[],\n naming: NamingEngine,\n state: StateManager,\n env: string,\n accountId: string,\n): DispatchScriptBindings {\n const bindings: DispatchScriptBindings = {};\n\n // D1 bindings from shard roles\n const d1Bindings = resolveTenantD1Bindings(config, shards, naming);\n if (d1Bindings.length > 0) {\n bindings.d1_databases = d1Bindings;\n }\n\n // Vars from config.tenant.dispatchVars\n if (config.tenant.dispatchVars) {\n const refCtx: ReferenceContext = {\n config,\n env,\n state,\n naming,\n accountId,\n };\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(config.tenant.dispatchVars)) {\n vars[key] = resolveReferencesInString(\n materializeTamerResolvable(value),\n refCtx,\n `tenant.dispatchVars.${key}`,\n );\n }\n if (Object.keys(vars).length > 0) {\n bindings.vars = vars;\n }\n }\n\n // Service bindings from config.tenant.dispatchServices\n if (config.tenant.dispatchServices?.length) {\n const refCtx: ReferenceContext = {\n config,\n env,\n state,\n naming,\n accountId,\n };\n bindings.services = config.tenant.dispatchServices.map((s) => ({\n name: s.name,\n service: resolveReferencesInString(\n materializeTamerResolvable(s.service),\n refCtx,\n `tenant.dispatchServices.${s.name}.service`,\n ),\n ...(s.environment ? { environment: s.environment } : {}),\n }));\n }\n\n return bindings;\n}\n"],"mappings":";;;;;;;;AAuBA,SAAS,uBACP,QACoF;CACpF,MAAM,sBAAM,IAAI,KAGb;CACH,MAAMA,UAAwC,OAAO,UAChD,OAAO,UACR,OAAO,SACL,EAAE,SAAS,OAAO,QAAwB,GAC1C,EAAE;AACR,MAAK,MAAM,MAAM,OAAO,OAAO,QAAQ,EAAE;EACvC,MAAM,MAAO,GAAsD,WAAW;AAC9E,MAAI,CAAC,IAAK;AACV,OAAK,MAAM,MAAM,KAAK;GACpB,MAAM,OAAO,GAAG,gBAAgB,GAAG;GACnC,MAAM,UAAU,GAAG,SAAS,MAAM,IAAI,MAAM,KAAK,aAAa;AAC9D,OAAI,CAAC,IAAI,IAAI,KAAK,CAChB,KAAI,IAAI,MAAM;IACZ;IACA,eAAe,GAAG;IAClB,iBAAiB,GAAG;IACrB,CAAC;;;AAIR,QAAO;;;;;;;AAQT,SAAgB,wBACd,QACA,QACA,QACqC;CACrC,MAAM,gBAAgB,uBAAuB,OAAO;AACpD,QAAO,OAAO,KAAK,UAAU;AAG3B,SAAO;GAAE,MAFQ,cAAc,IAAI,MAAM,KAAK,EACpB,WAAW,OAAO,mBAAmB,MAAM,KAAK;GAClD,IAAI,MAAM;GAAM;GACxC;;;;;;AAOJ,SAAgB,sBACd,QACA,QACA,QACA,OACA,KACA,WACwB;CACxB,MAAMC,WAAmC,EAAE;CAG3C,MAAM,aAAa,wBAAwB,QAAQ,QAAQ,OAAO;AAClE,KAAI,WAAW,SAAS,EACtB,UAAS,eAAe;AAI1B,KAAI,OAAO,OAAO,cAAc;EAC9B,MAAMC,SAA2B;GAC/B;GACA;GACA;GACA;GACA;GACD;EACD,MAAMC,OAA+B,EAAE;AACvC,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,aAAa,CACnE,MAAK,OAAO,0BACV,2BAA2B,MAAM,EACjC,QACA,uBAAuB,MACxB;AAEH,MAAI,OAAO,KAAK,KAAK,CAAC,SAAS,EAC7B,UAAS,OAAO;;AAKpB,KAAI,OAAO,OAAO,kBAAkB,QAAQ;EAC1C,MAAMD,SAA2B;GAC/B;GACA;GACA;GACA;GACA;GACD;AACD,WAAS,WAAW,OAAO,OAAO,iBAAiB,KAAK,OAAO;GAC7D,MAAM,EAAE;GACR,SAAS,0BACP,2BAA2B,EAAE,QAAQ,EACrC,QACA,2BAA2B,EAAE,KAAK,UACnC;GACD,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,GAAG,EAAE;GACxD,EAAE;;AAGL,QAAO"}
@@ -66,4 +66,4 @@ function buildOutputsView(config, state) {
66
66
 
67
67
  //#endregion
68
68
  export { resolveStackOutputs as n, buildOutputsView as t };
69
- //# sourceMappingURL=stackOutputs-CkpNSng8.mjs.map
69
+ //# sourceMappingURL=stackOutputs-CU2oxjpU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stackOutputs-CkpNSng8.mjs","names":["out: Record<string, CfiStackOutputValue>","rows: StackOutputRow[]","status: StackOutputRow[\"status\"]"],"sources":["../src/core/outputs/stackOutputs.ts"],"sourcesContent":["/**\n * Tamer's CloudFormation `Outputs` analogue.\n *\n * `tamer.config.ts > outputs` declares named exports as Tamer reference\n * strings (e.g. `\"${tamer:d1:users.id}\"`). After a successful `apply` the\n * engine resolves every entry against the just-completed state and persists\n * the literal under {@link CfiState.stackOutputs}. Sibling stacks consume\n * them via `${tamer:import:<stackName>.<outputName>}` (added separately).\n *\n * Resolution is **strict**: any unresolved/unknown reference fails the\n * apply (and rolls back when `--rollback-on-failure` is set). Read-only\n * commands like `status` use {@link buildOutputsView} which is tolerant\n * and shows the placeholder verbatim alongside the persisted value.\n */\nimport type {\n CfiConfig,\n CfiStackOutputValue,\n} from \"../../types.js\";\nimport { materializeTamerResolvable } from \"../../dx/normalize.js\";\nimport type { NamingEngine } from \"../naming/NamingEngine.js\";\nimport type { StateManager } from \"../state/StateManager.js\";\nimport {\n resolveReferencesInString,\n TamerReferenceError,\n} from \"../references/references.js\";\n\n/**\n * Resolve every `outputs:` entry against the current state. Throws\n * {@link TamerReferenceError} on the first unresolved reference so a failed\n * apply can roll back instead of silently persisting half-resolved values.\n *\n * Pass an explicit `now` only from tests — production code should let it\n * default to wall-clock so `resolvedAt` reflects the real persist time.\n */\nexport function resolveStackOutputs(\n config: CfiConfig,\n ctx: {\n env: string;\n state: StateManager;\n naming: NamingEngine;\n /**\n * Outputs from sibling stacks pre-fetched by `fetchStackImports`.\n * An output may chain through an import (e.g.\n * `outputs: { region: \"${tamer:import:net.region}\" }`) — strict\n * resolution requires the sibling row to be hydrated already.\n */\n imports?: Record<string, Record<string, string>>;\n /** Same as wrangler / apply `accountId` (for `${tamer:config:stack.account_id}` in outputs). */\n accountId?: string;\n },\n now: () => string = () => new Date().toISOString(),\n): Record<string, CfiStackOutputValue> {\n const outputs = config.outputs;\n if (!outputs || Object.keys(outputs).length === 0) return {};\n const refCtx = {\n config,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n tolerant: false,\n imports: ctx.imports,\n accountId: ctx.accountId,\n };\n const resolvedAt = now();\n const out: Record<string, CfiStackOutputValue> = {};\n for (const [name, source] of Object.entries(outputs)) {\n const sourceStr = materializeTamerResolvable(source);\n const value = resolveReferencesInString(\n sourceStr,\n refCtx,\n `outputs.${name}`,\n );\n out[name] = { value, source: sourceStr, resolvedAt };\n }\n return out;\n}\n\n/**\n * One row in the `tamer status` outputs panel. Combines the *declared*\n * source (from `tamer.config.ts`) with the *persisted* value (from state)\n * so operators can see drift between \"what the config says\" and \"what we\n * last resolved\". `value` is `null` when the output is declared but has\n * never been resolved (no `apply` yet), or when a stale persisted entry\n * exists for an output that has since been removed from config.\n */\nexport interface StackOutputRow {\n name: string;\n /** Live source from `tamer.config.ts > outputs[name]`, if still declared. */\n declaredSource: string | undefined;\n /** Persisted resolved literal, if `apply` has run for this output. */\n value: string | null;\n /** Source string at last persist (drifts vs. `declaredSource` after edits). */\n persistedSource: string | undefined;\n /** ISO timestamp of last persist (undefined when never resolved). */\n resolvedAt: string | undefined;\n /**\n * `\"resolved\"` when persisted matches declared source, `\"stale\"` when\n * source has drifted since persist (re-run apply), `\"orphan\"` when\n * persisted but no longer declared, `\"pending\"` when declared but never\n * resolved.\n */\n status: \"resolved\" | \"stale\" | \"orphan\" | \"pending\";\n}\n\n/**\n * Tolerant union of declared + persisted outputs for `tamer status` and the\n * machine-readable `--json` envelope. Never throws.\n */\nexport function buildOutputsView(\n config: CfiConfig,\n state: StateManager,\n): StackOutputRow[] {\n const declared = config.outputs ?? {};\n const persisted = state.getStackOutputs();\n const names = new Set<string>([\n ...Object.keys(declared),\n ...Object.keys(persisted),\n ]);\n const rows: StackOutputRow[] = [];\n for (const name of [...names].sort()) {\n const rawDeclared = declared[name];\n const declaredSource =\n rawDeclared !== undefined ? materializeTamerResolvable(rawDeclared) : undefined;\n const p = persisted[name];\n let status: StackOutputRow[\"status\"];\n if (declaredSource && !p) status = \"pending\";\n else if (!declaredSource && p) status = \"orphan\";\n else if (declaredSource && p && declaredSource !== p.source) status = \"stale\";\n else status = \"resolved\";\n rows.push({\n name,\n declaredSource,\n value: p?.value ?? null,\n persistedSource: p?.source,\n resolvedAt: p?.resolvedAt,\n status,\n });\n }\n return rows;\n}\n\nexport { TamerReferenceError };\n"],"mappings":";;;;;;;;;;;;AAkCA,SAAgB,oBACd,QACA,KAcA,6BAA0B,IAAI,MAAM,EAAC,aAAa,EACb;CACrC,MAAM,UAAU,OAAO;AACvB,KAAI,CAAC,WAAW,OAAO,KAAK,QAAQ,CAAC,WAAW,EAAG,QAAO,EAAE;CAC5D,MAAM,SAAS;EACb;EACA,KAAK,IAAI;EACT,OAAO,IAAI;EACX,QAAQ,IAAI;EACZ,UAAU;EACV,SAAS,IAAI;EACb,WAAW,IAAI;EAChB;CACD,MAAM,aAAa,KAAK;CACxB,MAAMA,MAA2C,EAAE;AACnD,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,YAAY,2BAA2B,OAAO;AAMpD,MAAI,QAAQ;GAAE,OALA,0BACZ,WACA,QACA,WAAW,OACZ;GACoB,QAAQ;GAAW;GAAY;;AAEtD,QAAO;;;;;;AAkCT,SAAgB,iBACd,QACA,OACkB;CAClB,MAAM,WAAW,OAAO,WAAW,EAAE;CACrC,MAAM,YAAY,MAAM,iBAAiB;CACzC,MAAM,QAAQ,IAAI,IAAY,CAC5B,GAAG,OAAO,KAAK,SAAS,EACxB,GAAG,OAAO,KAAK,UAAU,CAC1B,CAAC;CACF,MAAMC,OAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;EACpC,MAAM,cAAc,SAAS;EAC7B,MAAM,iBACJ,gBAAgB,SAAY,2BAA2B,YAAY,GAAG;EACxE,MAAM,IAAI,UAAU;EACpB,IAAIC;AACJ,MAAI,kBAAkB,CAAC,EAAG,UAAS;WAC1B,CAAC,kBAAkB,EAAG,UAAS;WAC/B,kBAAkB,KAAK,mBAAmB,EAAE,OAAQ,UAAS;MACjE,UAAS;AACd,OAAK,KAAK;GACR;GACA;GACA,OAAO,GAAG,SAAS;GACnB,iBAAiB,GAAG;GACpB,YAAY,GAAG;GACf;GACD,CAAC;;AAEJ,QAAO"}
1
+ {"version":3,"file":"stackOutputs-CU2oxjpU.mjs","names":["out: Record<string, CfiStackOutputValue>","rows: StackOutputRow[]","status: StackOutputRow[\"status\"]"],"sources":["../src/core/outputs/stackOutputs.ts"],"sourcesContent":["/**\n * Tamer's CloudFormation `Outputs` analogue.\n *\n * `tamer.config.ts > outputs` declares named exports as Tamer reference\n * strings (e.g. `\"${tamer:d1:users.id}\"`). After a successful `apply` the\n * engine resolves every entry against the just-completed state and persists\n * the literal under {@link CfiState.stackOutputs}. Sibling stacks consume\n * them via `${tamer:import:<stackName>.<outputName>}` (added separately).\n *\n * Resolution is **strict**: any unresolved/unknown reference fails the\n * apply (and rolls back when `--rollback-on-failure` is set). Read-only\n * commands like `status` use {@link buildOutputsView} which is tolerant\n * and shows the placeholder verbatim alongside the persisted value.\n */\nimport type {\n CfiConfig,\n CfiStackOutputValue,\n} from \"../../types.js\";\nimport { materializeTamerResolvable } from \"../../dx/normalize.js\";\nimport type { NamingEngine } from \"../naming/NamingEngine.js\";\nimport type { StateManager } from \"../state/StateManager.js\";\nimport {\n resolveReferencesInString,\n TamerReferenceError,\n} from \"../references/references.js\";\n\n/**\n * Resolve every `outputs:` entry against the current state. Throws\n * {@link TamerReferenceError} on the first unresolved reference so a failed\n * apply can roll back instead of silently persisting half-resolved values.\n *\n * Pass an explicit `now` only from tests — production code should let it\n * default to wall-clock so `resolvedAt` reflects the real persist time.\n */\nexport function resolveStackOutputs(\n config: CfiConfig,\n ctx: {\n env: string;\n state: StateManager;\n naming: NamingEngine;\n /**\n * Outputs from sibling stacks pre-fetched by `fetchStackImports`.\n * An output may chain through an import (e.g.\n * `outputs: { region: \"${tamer:import:net.region}\" }`) — strict\n * resolution requires the sibling row to be hydrated already.\n */\n imports?: Record<string, Record<string, string>>;\n /** Same as wrangler / apply `accountId` (for `${tamer:config:stack.account_id}` in outputs). */\n accountId?: string;\n },\n now: () => string = () => new Date().toISOString(),\n): Record<string, CfiStackOutputValue> {\n const outputs = config.outputs;\n if (!outputs || Object.keys(outputs).length === 0) return {};\n const refCtx = {\n config,\n env: ctx.env,\n state: ctx.state,\n naming: ctx.naming,\n tolerant: false,\n imports: ctx.imports,\n accountId: ctx.accountId,\n };\n const resolvedAt = now();\n const out: Record<string, CfiStackOutputValue> = {};\n for (const [name, source] of Object.entries(outputs)) {\n const sourceStr = materializeTamerResolvable(source);\n const value = resolveReferencesInString(\n sourceStr,\n refCtx,\n `outputs.${name}`,\n );\n out[name] = { value, source: sourceStr, resolvedAt };\n }\n return out;\n}\n\n/**\n * One row in the `tamer status` outputs panel. Combines the *declared*\n * source (from `tamer.config.ts`) with the *persisted* value (from state)\n * so operators can see drift between \"what the config says\" and \"what we\n * last resolved\". `value` is `null` when the output is declared but has\n * never been resolved (no `apply` yet), or when a stale persisted entry\n * exists for an output that has since been removed from config.\n */\nexport interface StackOutputRow {\n name: string;\n /** Live source from `tamer.config.ts > outputs[name]`, if still declared. */\n declaredSource: string | undefined;\n /** Persisted resolved literal, if `apply` has run for this output. */\n value: string | null;\n /** Source string at last persist (drifts vs. `declaredSource` after edits). */\n persistedSource: string | undefined;\n /** ISO timestamp of last persist (undefined when never resolved). */\n resolvedAt: string | undefined;\n /**\n * `\"resolved\"` when persisted matches declared source, `\"stale\"` when\n * source has drifted since persist (re-run apply), `\"orphan\"` when\n * persisted but no longer declared, `\"pending\"` when declared but never\n * resolved.\n */\n status: \"resolved\" | \"stale\" | \"orphan\" | \"pending\";\n}\n\n/**\n * Tolerant union of declared + persisted outputs for `tamer status` and the\n * machine-readable `--json` envelope. Never throws.\n */\nexport function buildOutputsView(\n config: CfiConfig,\n state: StateManager,\n): StackOutputRow[] {\n const declared = config.outputs ?? {};\n const persisted = state.getStackOutputs();\n const names = new Set<string>([\n ...Object.keys(declared),\n ...Object.keys(persisted),\n ]);\n const rows: StackOutputRow[] = [];\n for (const name of [...names].sort()) {\n const rawDeclared = declared[name];\n const declaredSource =\n rawDeclared !== undefined ? materializeTamerResolvable(rawDeclared) : undefined;\n const p = persisted[name];\n let status: StackOutputRow[\"status\"];\n if (declaredSource && !p) status = \"pending\";\n else if (!declaredSource && p) status = \"orphan\";\n else if (declaredSource && p && declaredSource !== p.source) status = \"stale\";\n else status = \"resolved\";\n rows.push({\n name,\n declaredSource,\n value: p?.value ?? null,\n persistedSource: p?.source,\n resolvedAt: p?.resolvedAt,\n status,\n });\n }\n return rows;\n}\n\nexport { TamerReferenceError };\n"],"mappings":";;;;;;;;;;;;AAkCA,SAAgB,oBACd,QACA,KAcA,6BAA0B,IAAI,MAAM,EAAC,aAAa,EACb;CACrC,MAAM,UAAU,OAAO;AACvB,KAAI,CAAC,WAAW,OAAO,KAAK,QAAQ,CAAC,WAAW,EAAG,QAAO,EAAE;CAC5D,MAAM,SAAS;EACb;EACA,KAAK,IAAI;EACT,OAAO,IAAI;EACX,QAAQ,IAAI;EACZ,UAAU;EACV,SAAS,IAAI;EACb,WAAW,IAAI;EAChB;CACD,MAAM,aAAa,KAAK;CACxB,MAAMA,MAA2C,EAAE;AACnD,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;EACpD,MAAM,YAAY,2BAA2B,OAAO;AAMpD,MAAI,QAAQ;GAAE,OALA,0BACZ,WACA,QACA,WAAW,OACZ;GACoB,QAAQ;GAAW;GAAY;;AAEtD,QAAO;;;;;;AAkCT,SAAgB,iBACd,QACA,OACkB;CAClB,MAAM,WAAW,OAAO,WAAW,EAAE;CACrC,MAAM,YAAY,MAAM,iBAAiB;CACzC,MAAM,QAAQ,IAAI,IAAY,CAC5B,GAAG,OAAO,KAAK,SAAS,EACxB,GAAG,OAAO,KAAK,UAAU,CAC1B,CAAC;CACF,MAAMC,OAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;EACpC,MAAM,cAAc,SAAS;EAC7B,MAAM,iBACJ,gBAAgB,SAAY,2BAA2B,YAAY,GAAG;EACxE,MAAM,IAAI,UAAU;EACpB,IAAIC;AACJ,MAAI,kBAAkB,CAAC,EAAG,UAAS;WAC1B,CAAC,kBAAkB,EAAG,UAAS;WAC/B,kBAAkB,KAAK,mBAAmB,EAAE,OAAQ,UAAS;MACjE,UAAS;AACd,OAAK,KAAK;GACR;GACA;GACA,OAAO,GAAG,SAAS;GACnB,iBAAiB,GAAG;GACpB,YAAY,GAAG;GACf;GACD,CAAC;;AAEJ,QAAO"}
@@ -1,10 +1,10 @@
1
1
  import { f as getDispatchNamespaces, m as getLogpushJobs, p as getDnsRecords } from "./normalize-DVSTRZhO.mjs";
2
- import { B as getConfigBaseDir, E as mergeWorkerConfigForResourcePick, H as loadConfig, L as CFApiClient, N as effectiveDispatchNamespaceName, O as resolveDeployedWorkerName, R as cloudflareAccountIdFromEnv, V as getWorkers, f as fetchStackImports, h as StateManager, m as scanConfigForImports, u as namingFromConfig, w as stackNameForConfig, y as tenantStateKey } from "./tamer.mjs";
3
- import { n as resourceModules } from "./registry-BrOxbA2i.mjs";
4
- import "./r2S3EmptyBucket-B9_pHfvB.mjs";
5
- import { r as dnsRecordStateKey, t as dnsRecordAppliesToEnv } from "./dns-records.resolve-DV6XBZf3.mjs";
6
- import { t as logpushJobStatus } from "./logpush-job-GqVKG_HI.mjs";
7
- import { t as buildOutputsView } from "./stackOutputs-CkpNSng8.mjs";
2
+ import { E as mergeWorkerConfigForResourcePick, H as getWorkers, O as resolveDeployedWorkerName, P as effectiveDispatchNamespaceName, R as CFApiClient, U as loadConfig, V as getConfigBaseDir, f as fetchStackImports, h as StateManager, m as scanConfigForImports, u as namingFromConfig, w as stackNameForConfig, y as tenantStateKey, z as cloudflareAccountIdFromEnv } from "./tamer.mjs";
3
+ import { n as resourceModules } from "./registry-X9dlQxG3.mjs";
4
+ import "./r2S3EmptyBucket-CXLmOrYF.mjs";
5
+ import { r as dnsRecordStateKey, t as dnsRecordAppliesToEnv } from "./dns-records.resolve-DwBR_1WI.mjs";
6
+ import { t as logpushJobStatus } from "./logpush-job-C_6uzGUC.mjs";
7
+ import { t as buildOutputsView } from "./stackOutputs-CU2oxjpU.mjs";
8
8
 
9
9
  //#region src/features/dispatch-namespace/dispatch-namespace.status.ts
10
10
  function dispatchNamespaceStatus(resources, env, state, _naming, config) {
@@ -203,4 +203,4 @@ async function runStatus(options) {
203
203
 
204
204
  //#endregion
205
205
  export { runStatus };
206
- //# sourceMappingURL=status-B-ei_QXO.mjs.map
206
+ //# sourceMappingURL=status-srUxsBIB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-B-ei_QXO.mjs","names":["results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }>","rows: DnsRecordStatusRow[]","meta: string[]","siblingImports: Record<string, Record<string, string>>","logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined","hints: string[]"],"sources":["../src/features/dispatch-namespace/dispatch-namespace.status.ts","../src/features/dns-records/dns-records.status.ts","../src/cli/commands/status.ts"],"sourcesContent":["import type { DispatchNamespaceResourceConfig, CfiConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { ResourceStatus } from \"../../types.js\";\nimport { effectiveDispatchNamespaceName } from \"./dispatch-namespace.resolve.js\";\n\nexport function dispatchNamespaceStatus(\n resources: DispatchNamespaceResourceConfig[],\n env: string,\n state: StateManager,\n _naming: NamingEngine,\n config: CfiConfig,\n): Array<{ logicalName: string; namespace: string; status: ResourceStatus }> {\n const results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }> = [];\n\n for (const nsConfig of resources) {\n const resolvedName = effectiveDispatchNamespaceName(nsConfig, env, config.tenant);\n const key = `dispatch_ns:${resolvedName}`;\n const entry = state.get(key);\n results.push({\n logicalName: nsConfig.logicalName,\n namespace: resolvedName,\n status:\n entry?.type === \"dispatch_namespace\" ? \"ok\" : \"missing\",\n });\n }\n\n return results;\n}\n","import type { DnsRecordResourceConfig, ResourceStatus } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport {\n dnsRecordAppliesToEnv,\n dnsRecordStateKey,\n} from \"./dns-records.resolve.js\";\n\nexport interface DnsRecordStatusRow {\n logicalName: string;\n type: string;\n name: string;\n recordId?: string;\n status: ResourceStatus;\n}\n\nexport function dnsRecordStatus(\n resources: DnsRecordResourceConfig[],\n env: string,\n state: StateManager,\n): DnsRecordStatusRow[] {\n const rows: DnsRecordStatusRow[] = [];\n for (const config of resources) {\n if (!dnsRecordAppliesToEnv(config, env)) {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"ok\",\n });\n continue;\n }\n const entry = state.get(\n dnsRecordStateKey(config.zoneId, config.type, config.name),\n );\n if (entry?.type === \"dns_record\") {\n rows.push({\n logicalName: config.logicalName,\n type: entry.recordType,\n name: entry.name,\n recordId: entry.recordId,\n status: \"ok\",\n });\n } else {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"missing\",\n });\n }\n }\n return rows;\n}\n","import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceStatus } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordStatus } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobStatus } from \"../../features/logpush-job/index.js\";\nimport { tenantStateKey } from \"../../core/tenant/tenantKeys.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport {\n resolveDeployedWorkerName,\n mergeWorkerConfigForResourcePick,\n} from \"../../core/config/resolver.js\";\nimport { buildOutputsView } from \"../../core/outputs/stackOutputs.js\";\nimport {\n fetchStackImports,\n scanConfigForImports,\n} from \"../../core/imports/fetchStackImports.js\";\n\nexport async function runStatus(options: {\n env?: string;\n configPath?: string;\n /** `product:workspace` — show only this workspace tenant from state. */\n tenant?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\n const accountId =\n config.account_id ?? cloudflareAccountIdFromEnv();\n if (!accountId) {\n throw new Error(\n \"account_id required in config or CLOUDFLARE_ACCOUNT_ID env var\",\n );\n }\n const naming = namingFromConfig(config);\n const api = new CFApiClient(accountId);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n\n const workers = await getWorkers(config, baseDir);\n console.log(\n `\\nStatus for ${config.tenant.name} (${config.tenant.slug}) — env: ${env}\\n`,\n );\n\n if (options.tenant?.trim()) {\n const raw = options.tenant.trim();\n const colon = raw.indexOf(\":\");\n if (colon < 1) {\n throw new Error(\n 'status --tenant expects \"product:workspace\" (e.g. todo:acme)',\n );\n }\n const product = raw.slice(0, colon);\n const workspace = raw.slice(colon + 1);\n const t = state.getTenant(product, workspace);\n console.log(`Workspace tenant ${tenantStateKey(product, workspace)}:`);\n if (!t) {\n console.log(\" (no record in tamer state)\\n\");\n return;\n }\n console.log(` status: ${t.provisioningStatus}`);\n console.log(` dispatch namespace: ${t.dispatchNamespaceName}`);\n console.log(` script: ${t.scriptName}`);\n if (t.d1Shards?.length) {\n console.log(\" D1 shards:\");\n for (const s of t.d1Shards) {\n console.log(` ${s.role}: ${s.derivedName} [${s.cfId}]`);\n }\n }\n console.log();\n return;\n }\n\n const outputRows = buildOutputsView(config, state);\n if (outputRows.length > 0) {\n console.log(\"Stack outputs:\");\n for (const r of outputRows) {\n const valueText =\n r.value === null\n ? \"(unresolved — run apply)\"\n : r.value;\n const meta: string[] = [r.status];\n if (r.status === \"stale\" && r.declaredSource) {\n meta.push(`source drifted → ${r.declaredSource}`);\n }\n console.log(` ${r.name}: ${valueText} [${meta.join(\", \")}]`);\n }\n console.log();\n }\n\n // Inbound imports — show every `${tamer:import:<stack>.<output>}`\n // referenced by config, grouped by source stack. We tolerate fetch\n // failures so `tamer status` still works in offline / partial-cred\n // environments; a missing sibling row just displays \"(unresolved)\".\n const importRefs = scanConfigForImports(config);\n let siblingImports: Record<string, Record<string, string>> = {};\n try {\n siblingImports = await fetchStackImports(api, config, env);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`(could not pre-fetch imported stacks: ${msg})`);\n }\n if (importRefs.length > 0) {\n console.log(\"Stack imports:\");\n const byStack = new Map<string, Set<string>>();\n for (const r of importRefs) {\n if (!byStack.has(r.stack)) byStack.set(r.stack, new Set());\n byStack.get(r.stack)!.add(r.output);\n }\n for (const [stack, outputs] of [...byStack].sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n console.log(` from stack \"${stack}\":`);\n const stackOutputs = siblingImports[stack] ?? {};\n for (const out of [...outputs].sort()) {\n const v = stackOutputs[out];\n const status = v === undefined ? \"unresolved\" : \"resolved\";\n const value = v ?? \"(missing — run `tamer apply` on that stack)\";\n console.log(` ${out}: ${value} [${status}]`);\n }\n }\n console.log();\n }\n\n const dns = dispatchNamespaceStatus(\n getDispatchNamespaces(config),\n env,\n state,\n naming,\n config,\n );\n if (dns.length > 0) {\n console.log(\"Dispatch namespaces:\");\n for (const r of dns) {\n console.log(` ${r.logicalName} (${r.namespace}) [${r.status}]`);\n }\n console.log();\n }\n\n const tenants = state.listTenants();\n if (tenants.length > 0) {\n console.log(`Tenants (${tenants.length}):`);\n for (const t of tenants.sort((a, b) =>\n `${a.product}:${a.workspace}`.localeCompare(`${b.product}:${b.workspace}`),\n )) {\n const shards = t.d1Shards?.length ?? 0;\n console.log(\n ` ${t.product}:${t.workspace} [${t.provisioningStatus}] ${t.scriptName} (${shards} shard(s))`,\n );\n }\n console.log();\n }\n\n const dnsRows = dnsRecordStatus(getDnsRecords(config), env, state);\n if (dnsRows.length > 0) {\n console.log(\"DNS records:\");\n for (const r of dnsRows) {\n const id = r.recordId ? ` [${r.recordId}]` : \"\";\n console.log(` ${r.logicalName}: ${r.type} ${r.name}${id} [${r.status}]`);\n }\n console.log();\n }\n\n let logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined;\n if (env !== \"local\") {\n try {\n logpushLive = await api.logpushAccountJobsList();\n } catch {\n // Token may lack Logpush list; state-only rows still print.\n }\n }\n const logpushRows = logpushJobStatus(\n getLogpushJobs(config),\n config.tenant,\n env,\n state,\n logpushLive,\n );\n if (logpushRows.length > 0) {\n console.log(\"Logpush jobs:\");\n for (const r of logpushRows) {\n const id = r.cfJobId != null ? ` [id ${r.cfJobId}]` : \"\";\n const hints: string[] = [];\n if (r.cfEnabled === false) hints.push(\"disabled on Cloudflare\");\n if (r.cfError) hints.push(`CF error: ${r.cfError}`);\n const hint = hints.length > 0 ? ` — ${hints.join(\"; \")}` : \"\";\n console.log(` ${r.logicalName}: ${r.jobName}${id} [${r.status}]${hint}`);\n }\n console.log();\n }\n\n for (const [workerKey, workerConfig] of workers) {\n console.log(`Worker: ${workerKey}`);\n const deployedName = resolveDeployedWorkerName(\n config,\n workerKey,\n workerConfig,\n env,\n naming,\n );\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports: siblingImports },\n );\n let printedAny = false;\n for (const mod of resourceModules) {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) continue;\n const rows = mod.status({\n resources,\n env,\n state,\n naming,\n worker: { workerKey, deployedName },\n });\n if (rows.length === 0) continue;\n printedAny = true;\n console.log(` ${mod.label}:`);\n for (const r of rows) {\n console.log(` ${r.binding}: ${r.name} [${r.status}]`);\n }\n }\n if (!printedAny) console.log(\" (no resources)\");\n console.log();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"status-srUxsBIB.mjs","names":["results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }>","rows: DnsRecordStatusRow[]","meta: string[]","siblingImports: Record<string, Record<string, string>>","logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined","hints: string[]"],"sources":["../src/features/dispatch-namespace/dispatch-namespace.status.ts","../src/features/dns-records/dns-records.status.ts","../src/cli/commands/status.ts"],"sourcesContent":["import type { DispatchNamespaceResourceConfig, CfiConfig } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport type { NamingEngine } from \"../../core/naming/NamingEngine.js\";\nimport type { ResourceStatus } from \"../../types.js\";\nimport { effectiveDispatchNamespaceName } from \"./dispatch-namespace.resolve.js\";\n\nexport function dispatchNamespaceStatus(\n resources: DispatchNamespaceResourceConfig[],\n env: string,\n state: StateManager,\n _naming: NamingEngine,\n config: CfiConfig,\n): Array<{ logicalName: string; namespace: string; status: ResourceStatus }> {\n const results: Array<{\n logicalName: string;\n namespace: string;\n status: ResourceStatus;\n }> = [];\n\n for (const nsConfig of resources) {\n const resolvedName = effectiveDispatchNamespaceName(nsConfig, env, config.tenant);\n const key = `dispatch_ns:${resolvedName}`;\n const entry = state.get(key);\n results.push({\n logicalName: nsConfig.logicalName,\n namespace: resolvedName,\n status:\n entry?.type === \"dispatch_namespace\" ? \"ok\" : \"missing\",\n });\n }\n\n return results;\n}\n","import type { DnsRecordResourceConfig, ResourceStatus } from \"../../types.js\";\nimport type { StateManager } from \"../../core/state/StateManager.js\";\nimport {\n dnsRecordAppliesToEnv,\n dnsRecordStateKey,\n} from \"./dns-records.resolve.js\";\n\nexport interface DnsRecordStatusRow {\n logicalName: string;\n type: string;\n name: string;\n recordId?: string;\n status: ResourceStatus;\n}\n\nexport function dnsRecordStatus(\n resources: DnsRecordResourceConfig[],\n env: string,\n state: StateManager,\n): DnsRecordStatusRow[] {\n const rows: DnsRecordStatusRow[] = [];\n for (const config of resources) {\n if (!dnsRecordAppliesToEnv(config, env)) {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"ok\",\n });\n continue;\n }\n const entry = state.get(\n dnsRecordStateKey(config.zoneId, config.type, config.name),\n );\n if (entry?.type === \"dns_record\") {\n rows.push({\n logicalName: config.logicalName,\n type: entry.recordType,\n name: entry.name,\n recordId: entry.recordId,\n status: \"ok\",\n });\n } else {\n rows.push({\n logicalName: config.logicalName,\n type: config.type,\n name: config.name,\n status: \"missing\",\n });\n }\n }\n return rows;\n}\n","import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceStatus } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordStatus } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobStatus } from \"../../features/logpush-job/index.js\";\nimport { tenantStateKey } from \"../../core/tenant/tenantKeys.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport {\n resolveDeployedWorkerName,\n mergeWorkerConfigForResourcePick,\n} from \"../../core/config/resolver.js\";\nimport { buildOutputsView } from \"../../core/outputs/stackOutputs.js\";\nimport {\n fetchStackImports,\n scanConfigForImports,\n} from \"../../core/imports/fetchStackImports.js\";\n\nexport async function runStatus(options: {\n env?: string;\n configPath?: string;\n /** `product:workspace` — show only this workspace tenant from state. */\n tenant?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\n const accountId =\n config.account_id ?? cloudflareAccountIdFromEnv();\n if (!accountId) {\n throw new Error(\n \"account_id required in config or CLOUDFLARE_ACCOUNT_ID env var\",\n );\n }\n const naming = namingFromConfig(config);\n const api = new CFApiClient(accountId);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n\n const workers = await getWorkers(config, baseDir);\n console.log(\n `\\nStatus for ${config.tenant.name} (${config.tenant.slug}) — env: ${env}\\n`,\n );\n\n if (options.tenant?.trim()) {\n const raw = options.tenant.trim();\n const colon = raw.indexOf(\":\");\n if (colon < 1) {\n throw new Error(\n 'status --tenant expects \"product:workspace\" (e.g. todo:acme)',\n );\n }\n const product = raw.slice(0, colon);\n const workspace = raw.slice(colon + 1);\n const t = state.getTenant(product, workspace);\n console.log(`Workspace tenant ${tenantStateKey(product, workspace)}:`);\n if (!t) {\n console.log(\" (no record in tamer state)\\n\");\n return;\n }\n console.log(` status: ${t.provisioningStatus}`);\n console.log(` dispatch namespace: ${t.dispatchNamespaceName}`);\n console.log(` script: ${t.scriptName}`);\n if (t.d1Shards?.length) {\n console.log(\" D1 shards:\");\n for (const s of t.d1Shards) {\n console.log(` ${s.role}: ${s.derivedName} [${s.cfId}]`);\n }\n }\n console.log();\n return;\n }\n\n const outputRows = buildOutputsView(config, state);\n if (outputRows.length > 0) {\n console.log(\"Stack outputs:\");\n for (const r of outputRows) {\n const valueText =\n r.value === null\n ? \"(unresolved — run apply)\"\n : r.value;\n const meta: string[] = [r.status];\n if (r.status === \"stale\" && r.declaredSource) {\n meta.push(`source drifted → ${r.declaredSource}`);\n }\n console.log(` ${r.name}: ${valueText} [${meta.join(\", \")}]`);\n }\n console.log();\n }\n\n // Inbound imports — show every `${tamer:import:<stack>.<output>}`\n // referenced by config, grouped by source stack. We tolerate fetch\n // failures so `tamer status` still works in offline / partial-cred\n // environments; a missing sibling row just displays \"(unresolved)\".\n const importRefs = scanConfigForImports(config);\n let siblingImports: Record<string, Record<string, string>> = {};\n try {\n siblingImports = await fetchStackImports(api, config, env);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`(could not pre-fetch imported stacks: ${msg})`);\n }\n if (importRefs.length > 0) {\n console.log(\"Stack imports:\");\n const byStack = new Map<string, Set<string>>();\n for (const r of importRefs) {\n if (!byStack.has(r.stack)) byStack.set(r.stack, new Set());\n byStack.get(r.stack)!.add(r.output);\n }\n for (const [stack, outputs] of [...byStack].sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n console.log(` from stack \"${stack}\":`);\n const stackOutputs = siblingImports[stack] ?? {};\n for (const out of [...outputs].sort()) {\n const v = stackOutputs[out];\n const status = v === undefined ? \"unresolved\" : \"resolved\";\n const value = v ?? \"(missing — run `tamer apply` on that stack)\";\n console.log(` ${out}: ${value} [${status}]`);\n }\n }\n console.log();\n }\n\n const dns = dispatchNamespaceStatus(\n getDispatchNamespaces(config),\n env,\n state,\n naming,\n config,\n );\n if (dns.length > 0) {\n console.log(\"Dispatch namespaces:\");\n for (const r of dns) {\n console.log(` ${r.logicalName} (${r.namespace}) [${r.status}]`);\n }\n console.log();\n }\n\n const tenants = state.listTenants();\n if (tenants.length > 0) {\n console.log(`Tenants (${tenants.length}):`);\n for (const t of tenants.sort((a, b) =>\n `${a.product}:${a.workspace}`.localeCompare(`${b.product}:${b.workspace}`),\n )) {\n const shards = t.d1Shards?.length ?? 0;\n console.log(\n ` ${t.product}:${t.workspace} [${t.provisioningStatus}] ${t.scriptName} (${shards} shard(s))`,\n );\n }\n console.log();\n }\n\n const dnsRows = dnsRecordStatus(getDnsRecords(config), env, state);\n if (dnsRows.length > 0) {\n console.log(\"DNS records:\");\n for (const r of dnsRows) {\n const id = r.recordId ? ` [${r.recordId}]` : \"\";\n console.log(` ${r.logicalName}: ${r.type} ${r.name}${id} [${r.status}]`);\n }\n console.log();\n }\n\n let logpushLive:\n | Awaited<ReturnType<CFApiClient[\"logpushAccountJobsList\"]>>\n | undefined;\n if (env !== \"local\") {\n try {\n logpushLive = await api.logpushAccountJobsList();\n } catch {\n // Token may lack Logpush list; state-only rows still print.\n }\n }\n const logpushRows = logpushJobStatus(\n getLogpushJobs(config),\n config.tenant,\n env,\n state,\n logpushLive,\n );\n if (logpushRows.length > 0) {\n console.log(\"Logpush jobs:\");\n for (const r of logpushRows) {\n const id = r.cfJobId != null ? ` [id ${r.cfJobId}]` : \"\";\n const hints: string[] = [];\n if (r.cfEnabled === false) hints.push(\"disabled on Cloudflare\");\n if (r.cfError) hints.push(`CF error: ${r.cfError}`);\n const hint = hints.length > 0 ? ` — ${hints.join(\"; \")}` : \"\";\n console.log(` ${r.logicalName}: ${r.jobName}${id} [${r.status}]${hint}`);\n }\n console.log();\n }\n\n for (const [workerKey, workerConfig] of workers) {\n console.log(`Worker: ${workerKey}`);\n const deployedName = resolveDeployedWorkerName(\n config,\n workerKey,\n workerConfig,\n env,\n naming,\n );\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports: siblingImports },\n );\n let printedAny = false;\n for (const mod of resourceModules) {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) continue;\n const rows = mod.status({\n resources,\n env,\n state,\n naming,\n worker: { workerKey, deployedName },\n });\n if (rows.length === 0) continue;\n printedAny = true;\n console.log(` ${mod.label}:`);\n for (const r of rows) {\n console.log(` ${r.binding}: ${r.name} [${r.status}]`);\n }\n }\n if (!printedAny) console.log(\" (no resources)\");\n console.log();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import "./registry-X9dlQxG3.mjs";
2
+ import "./r2S3EmptyBucket-CXLmOrYF.mjs";
3
+ import "./logpush-job-C_6uzGUC.mjs";
4
+ import "./worker-route-CvuUPq1k.mjs";
5
+ import { t as runSync } from "./sync-DfJGkOME.mjs";
6
+
7
+ export { runSync };
@@ -1,9 +1,9 @@
1
1
  import { f as getDispatchNamespaces, m as getLogpushJobs, p as getDnsRecords } from "./normalize-DVSTRZhO.mjs";
2
- import { B as getConfigBaseDir, E as mergeWorkerConfigForResourcePick, H as loadConfig, L as CFApiClient, R as cloudflareAccountIdFromEnv, V as getWorkers, f as fetchStackImports, h as StateManager, u as namingFromConfig, w as stackNameForConfig } from "./tamer.mjs";
3
- import { n as resourceModules } from "./registry-BrOxbA2i.mjs";
4
- import { n as dispatchNamespaceSync, t as dnsRecordSync } from "./dns-records.sync-FyzKl-Ph.mjs";
5
- import { i as logpushJobSync } from "./logpush-job-GqVKG_HI.mjs";
6
- import { i as workerRouteSync } from "./worker-route-CUQBu9xe.mjs";
2
+ import { E as mergeWorkerConfigForResourcePick, H as getWorkers, R as CFApiClient, U as loadConfig, V as getConfigBaseDir, f as fetchStackImports, h as StateManager, u as namingFromConfig, w as stackNameForConfig, z as cloudflareAccountIdFromEnv } from "./tamer.mjs";
3
+ import { n as resourceModules } from "./registry-X9dlQxG3.mjs";
4
+ import { n as dispatchNamespaceSync, t as dnsRecordSync } from "./dns-records.sync-Dfwk76J_.mjs";
5
+ import { i as logpushJobSync } from "./logpush-job-C_6uzGUC.mjs";
6
+ import { i as workerRouteSync } from "./worker-route-CvuUPq1k.mjs";
7
7
 
8
8
  //#region src/cli/commands/sync.ts
9
9
  async function runSync(options) {
@@ -84,4 +84,4 @@ async function runSync(options) {
84
84
 
85
85
  //#endregion
86
86
  export { runSync as t };
87
- //# sourceMappingURL=sync-kl7MaCQV.mjs.map
87
+ //# sourceMappingURL=sync-DfJGkOME.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-kl7MaCQV.mjs","names":[],"sources":["../src/cli/commands/sync.ts"],"sourcesContent":["import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceSync } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordSync } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobSync } from \"../../features/logpush-job/index.js\";\nimport { workerRouteSync } from \"../../features/worker-route/index.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport { fetchStackImports } from \"../../core/imports/fetchStackImports.js\";\nimport { mergeWorkerConfigForResourcePick } from \"../../core/config/resolver.js\";\n\nexport async function runSync(options: {\n env?: string;\n configPath?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\n const accountId =\n config.account_id ?? cloudflareAccountIdFromEnv();\n if (!accountId) {\n throw new Error(\n \"account_id required in config or CLOUDFLARE_ACCOUNT_ID env var\",\n );\n }\n\n const api = new CFApiClient(accountId);\n const naming = namingFromConfig(config);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n // Tolerant pre-fetch: sync runs against existing cloud state, so we\n // pass real import values into worker-route resolution to avoid\n // matching against `${tamer:import:…}` placeholders.\n const imports = await fetchStackImports(api, config, env).catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping cross-stack imports: ${msg}`);\n return {} as Record<string, Record<string, string>>;\n });\n\n async function safeList<T>(\n label: string,\n fn: () => Promise<T[]>,\n ): Promise<T[]> {\n try {\n return await fn();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping ${label}: ${msg}`);\n return [];\n }\n }\n\n const lists = await Promise.all(\n resourceModules.map((m) =>\n safeList(`${m.label} list`, () => m.fetchAll(api)),\n ),\n );\n\n if (getDispatchNamespaces(config).length > 0) {\n try {\n await dispatchNamespaceSync(\n getDispatchNamespaces(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping dispatch namespaces: ${msg}`);\n }\n }\n\n if (getDnsRecords(config).length > 0) {\n try {\n await dnsRecordSync(\n getDnsRecords(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping dns records: ${msg}`);\n }\n }\n\n if (getLogpushJobs(config).length > 0 && env !== \"local\") {\n try {\n await logpushJobSync(\n getLogpushJobs(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping logpush jobs: ${msg}`);\n }\n }\n\n const workers = await getWorkers(config, baseDir);\n for (const [workerKey, workerConfig] of workers) {\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports },\n );\n resourceModules.forEach((mod, i) => {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) return;\n mod.sync({\n resources,\n all: lists[i],\n tenant: config.tenant,\n env,\n api,\n state,\n naming,\n config,\n baseDir,\n });\n });\n }\n\n try {\n await workerRouteSync(env, config, baseDir, accountId, naming, state, api, {\n imports,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping worker routes: ${msg}`);\n }\n\n await state.persist(api);\n console.log(`Synced state for env: ${env}`);\n}\n"],"mappings":";;;;;;;;AAeA,eAAsB,QAAQ,SAGZ;CAChB,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,aAAa,QAAQ;CAE3B,MAAM,SAAS,MAAM,WAAW,YAAY,EAAE,KAAK,CAAC;CACpD,MAAM,UAAU,kBAAkB;CAClC,MAAM,YACJ,OAAO,cAAc,4BAA4B;AACnD,KAAI,CAAC,UACH,OAAM,IAAI,MACR,iEACD;CAGH,MAAM,MAAM,IAAI,YAAY,UAAU;CACtC,MAAM,SAAS,iBAAiB,OAAO;CACvC,MAAM,QAAQ,IAAI,aAChB,OAAO,OAAO,IACd,KACA,mBAAmB,OAAO,CAC3B;AACD,OAAM,MAAM,QAAQ,IAAI;CAIxB,MAAM,UAAU,MAAM,kBAAkB,KAAK,QAAQ,IAAI,CAAC,OAAO,QAAQ;EACvE,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,wCAAwC,MAAM;AAC3D,SAAO,EAAE;GACT;CAEF,eAAe,SACb,OACA,IACc;AACd,MAAI;AACF,UAAO,MAAM,IAAI;WACV,KAAK;GACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,WAAQ,KAAK,mBAAmB,MAAM,IAAI,MAAM;AAChD,UAAO,EAAE;;;CAIb,MAAM,QAAQ,MAAM,QAAQ,IAC1B,gBAAgB,KAAK,MACnB,SAAS,GAAG,EAAE,MAAM,cAAc,EAAE,SAAS,IAAI,CAAC,CACnD,CACF;AAED,KAAI,sBAAsB,OAAO,CAAC,SAAS,EACzC,KAAI;AACF,QAAM,sBACJ,sBAAsB,OAAO,EAC7B,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,wCAAwC,MAAM;;AAI/D,KAAI,cAAc,OAAO,CAAC,SAAS,EACjC,KAAI;AACF,QAAM,cACJ,cAAc,OAAO,EACrB,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,gCAAgC,MAAM;;AAIvD,KAAI,eAAe,OAAO,CAAC,SAAS,KAAK,QAAQ,QAC/C,KAAI;AACF,QAAM,eACJ,eAAe,OAAO,EACtB,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,iCAAiC,MAAM;;CAIxD,MAAM,UAAU,MAAM,WAAW,QAAQ,QAAQ;AACjD,MAAK,MAAM,CAAC,WAAW,iBAAiB,SAAS;EAC/C,MAAM,eAAe,iCACnB,QACA,WACA,cACA,KACA,WACA,QACA,OACA;GAAE,gBAAgB;GAAY;GAAS,CACxC;AACD,kBAAgB,SAAS,KAAK,MAAM;GAClC,MAAM,YAAY,IAAI,cAAc,aAAa;AACjD,OAAI,UAAU,WAAW,EAAG;AAC5B,OAAI,KAAK;IACP;IACA,KAAK,MAAM;IACX,QAAQ,OAAO;IACf;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;IACF;;AAGJ,KAAI;AACF,QAAM,gBAAgB,KAAK,QAAQ,SAAS,WAAW,QAAQ,OAAO,KAAK,EACzE,SACD,CAAC;UACK,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,kCAAkC,MAAM;;AAGvD,OAAM,MAAM,QAAQ,IAAI;AACxB,SAAQ,IAAI,yBAAyB,MAAM"}
1
+ {"version":3,"file":"sync-DfJGkOME.mjs","names":[],"sources":["../src/cli/commands/sync.ts"],"sourcesContent":["import { loadConfig, getWorkers, getConfigBaseDir } from \"../../core/config/loader.js\";\nimport { cloudflareAccountIdFromEnv } from \"../../core/cloudflareEnv.js\";\nimport { namingFromConfig } from \"../../core/config/namingFromConfig.js\";\nimport { StateManager } from \"../../core/state/StateManager.js\";\nimport { stackNameForConfig } from \"../../core/state/stackName.js\";\nimport { CFApiClient } from \"../../core/api/CFApiClient.js\";\nimport { dispatchNamespaceSync } from \"../../features/dispatch-namespace/index.js\";\nimport { dnsRecordSync } from \"../../features/dns-records/index.js\";\nimport { getDispatchNamespaces, getDnsRecords, getLogpushJobs } from \"../../types.js\";\nimport { logpushJobSync } from \"../../features/logpush-job/index.js\";\nimport { workerRouteSync } from \"../../features/worker-route/index.js\";\nimport { resourceModules } from \"../../core/registry/registry.js\";\nimport { fetchStackImports } from \"../../core/imports/fetchStackImports.js\";\nimport { mergeWorkerConfigForResourcePick } from \"../../core/config/resolver.js\";\n\nexport async function runSync(options: {\n env?: string;\n configPath?: string;\n}): Promise<void> {\n const env = options.env ?? \"local\";\n const configPath = options.configPath;\n\n const config = await loadConfig(configPath, { env });\n const baseDir = getConfigBaseDir();\n const accountId =\n config.account_id ?? cloudflareAccountIdFromEnv();\n if (!accountId) {\n throw new Error(\n \"account_id required in config or CLOUDFLARE_ACCOUNT_ID env var\",\n );\n }\n\n const api = new CFApiClient(accountId);\n const naming = namingFromConfig(config);\n const state = new StateManager(\n config.tenant.id,\n env,\n stackNameForConfig(config),\n );\n await state.hydrate(api);\n // Tolerant pre-fetch: sync runs against existing cloud state, so we\n // pass real import values into worker-route resolution to avoid\n // matching against `${tamer:import:…}` placeholders.\n const imports = await fetchStackImports(api, config, env).catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping cross-stack imports: ${msg}`);\n return {} as Record<string, Record<string, string>>;\n });\n\n async function safeList<T>(\n label: string,\n fn: () => Promise<T[]>,\n ): Promise<T[]> {\n try {\n return await fn();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping ${label}: ${msg}`);\n return [];\n }\n }\n\n const lists = await Promise.all(\n resourceModules.map((m) =>\n safeList(`${m.label} list`, () => m.fetchAll(api)),\n ),\n );\n\n if (getDispatchNamespaces(config).length > 0) {\n try {\n await dispatchNamespaceSync(\n getDispatchNamespaces(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping dispatch namespaces: ${msg}`);\n }\n }\n\n if (getDnsRecords(config).length > 0) {\n try {\n await dnsRecordSync(\n getDnsRecords(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping dns records: ${msg}`);\n }\n }\n\n if (getLogpushJobs(config).length > 0 && env !== \"local\") {\n try {\n await logpushJobSync(\n getLogpushJobs(config),\n config.tenant,\n env,\n api,\n state,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping logpush jobs: ${msg}`);\n }\n }\n\n const workers = await getWorkers(config, baseDir);\n for (const [workerKey, workerConfig] of workers) {\n const mergedWorker = mergeWorkerConfigForResourcePick(\n config,\n workerKey,\n workerConfig,\n env,\n accountId,\n naming,\n state,\n { referencesMode: \"tolerant\", imports },\n );\n resourceModules.forEach((mod, i) => {\n const resources = mod.pickResources(mergedWorker);\n if (resources.length === 0) return;\n mod.sync({\n resources,\n all: lists[i],\n tenant: config.tenant,\n env,\n api,\n state,\n naming,\n config,\n baseDir,\n });\n });\n }\n\n try {\n await workerRouteSync(env, config, baseDir, accountId, naming, state, api, {\n imports,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[sync] skipping worker routes: ${msg}`);\n }\n\n await state.persist(api);\n console.log(`Synced state for env: ${env}`);\n}\n"],"mappings":";;;;;;;;AAeA,eAAsB,QAAQ,SAGZ;CAChB,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,aAAa,QAAQ;CAE3B,MAAM,SAAS,MAAM,WAAW,YAAY,EAAE,KAAK,CAAC;CACpD,MAAM,UAAU,kBAAkB;CAClC,MAAM,YACJ,OAAO,cAAc,4BAA4B;AACnD,KAAI,CAAC,UACH,OAAM,IAAI,MACR,iEACD;CAGH,MAAM,MAAM,IAAI,YAAY,UAAU;CACtC,MAAM,SAAS,iBAAiB,OAAO;CACvC,MAAM,QAAQ,IAAI,aAChB,OAAO,OAAO,IACd,KACA,mBAAmB,OAAO,CAC3B;AACD,OAAM,MAAM,QAAQ,IAAI;CAIxB,MAAM,UAAU,MAAM,kBAAkB,KAAK,QAAQ,IAAI,CAAC,OAAO,QAAQ;EACvE,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,wCAAwC,MAAM;AAC3D,SAAO,EAAE;GACT;CAEF,eAAe,SACb,OACA,IACc;AACd,MAAI;AACF,UAAO,MAAM,IAAI;WACV,KAAK;GACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,WAAQ,KAAK,mBAAmB,MAAM,IAAI,MAAM;AAChD,UAAO,EAAE;;;CAIb,MAAM,QAAQ,MAAM,QAAQ,IAC1B,gBAAgB,KAAK,MACnB,SAAS,GAAG,EAAE,MAAM,cAAc,EAAE,SAAS,IAAI,CAAC,CACnD,CACF;AAED,KAAI,sBAAsB,OAAO,CAAC,SAAS,EACzC,KAAI;AACF,QAAM,sBACJ,sBAAsB,OAAO,EAC7B,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,wCAAwC,MAAM;;AAI/D,KAAI,cAAc,OAAO,CAAC,SAAS,EACjC,KAAI;AACF,QAAM,cACJ,cAAc,OAAO,EACrB,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,gCAAgC,MAAM;;AAIvD,KAAI,eAAe,OAAO,CAAC,SAAS,KAAK,QAAQ,QAC/C,KAAI;AACF,QAAM,eACJ,eAAe,OAAO,EACtB,OAAO,QACP,KACA,KACA,MACD;UACM,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,iCAAiC,MAAM;;CAIxD,MAAM,UAAU,MAAM,WAAW,QAAQ,QAAQ;AACjD,MAAK,MAAM,CAAC,WAAW,iBAAiB,SAAS;EAC/C,MAAM,eAAe,iCACnB,QACA,WACA,cACA,KACA,WACA,QACA,OACA;GAAE,gBAAgB;GAAY;GAAS,CACxC;AACD,kBAAgB,SAAS,KAAK,MAAM;GAClC,MAAM,YAAY,IAAI,cAAc,aAAa;AACjD,OAAI,UAAU,WAAW,EAAG;AAC5B,OAAI,KAAK;IACP;IACA,KAAK,MAAM;IACX,QAAQ,OAAO;IACf;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;IACF;;AAGJ,KAAI;AACF,QAAM,gBAAgB,KAAK,QAAQ,SAAS,WAAW,QAAQ,OAAO,KAAK,EACzE,SACD,CAAC;UACK,KAAK;EACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAQ,KAAK,kCAAkC,MAAM;;AAGvD,OAAM,MAAM,QAAQ,IAAI;AACxB,SAAQ,IAAI,yBAAyB,MAAM"}
package/dist/tamer.mjs CHANGED
@@ -8672,7 +8672,9 @@ const ProvisionTenantArgsSchema = object({
8672
8672
  compatibility_date: string().optional(),
8673
8673
  compat_flags: string().optional(),
8674
8674
  shards: string().optional(),
8675
- json: boolean().optional()
8675
+ json: boolean().optional(),
8676
+ migrate: boolean().optional(),
8677
+ no_migrate: boolean().optional()
8676
8678
  }).refine((d) => !!(d.main || d.artifact_key), { message: "Provide --main <file> or --artifact-key <r2-key> (under tamer-artifacts-{env})" });
8677
8679
  const DestroyTenantArgsSchema = object({
8678
8680
  env: string().min(1, { error: "env is required" }),
@@ -8806,7 +8808,8 @@ function parseProvisionTenantArgs(argv) {
8806
8808
  compatibilityDate: d.compatibility_date,
8807
8809
  compatibilityFlags: d.compat_flags?.split(",").map((s) => s.trim()).filter(Boolean),
8808
8810
  shardsRaw: d.shards,
8809
- json: d.json
8811
+ json: d.json,
8812
+ migrate: d.no_migrate ? false : d.migrate ?? true
8810
8813
  };
8811
8814
  }
8812
8815
  function parseDestroyTenantArgs(argv) {
@@ -8896,14 +8899,14 @@ async function main() {
8896
8899
  try {
8897
8900
  switch (command) {
8898
8901
  case "bootstrap":
8899
- await import("./bootstrap-DvOce6vA.mjs").then((m) => m.runBootstrap(parseBootstrapArgs(rest)));
8902
+ await import("./bootstrap-ilkixdmD.mjs").then((m) => m.runBootstrap(parseBootstrapArgs(rest)));
8900
8903
  break;
8901
8904
  case "sync":
8902
- await import("./sync-Bky8pptf.mjs").then((m) => m.runSync(parseSyncArgs(rest)));
8905
+ await import("./sync-CfNyelDN.mjs").then((m) => m.runSync(parseSyncArgs(rest)));
8903
8906
  break;
8904
8907
  case "apply": {
8905
8908
  const a = parseApplyArgs(rest);
8906
- await import("./apply-ByHaKpxD.mjs").then((m) => m.runApply({
8909
+ await import("./apply-CV4_3Jv4.mjs").then((m) => m.runApply({
8907
8910
  env: a.env,
8908
8911
  addShard: a.addShard,
8909
8912
  configPath: a.configPath,
@@ -8915,11 +8918,11 @@ async function main() {
8915
8918
  break;
8916
8919
  }
8917
8920
  case "dev":
8918
- await import("./dev-0zkF2iqF.mjs").then((m) => m.runDev(parseDevArgs(rest)));
8921
+ await import("./dev-C__1rLos.mjs").then((m) => m.runDev(parseDevArgs(rest)));
8919
8922
  break;
8920
8923
  case "deploy": {
8921
8924
  const d = parseDeployArgs(rest);
8922
- await import("./deploy-C4NOE5S1.mjs").then((m) => m.runDeploy({
8925
+ await import("./deploy-BEaNADU6.mjs").then((m) => m.runDeploy({
8923
8926
  worker: d.worker,
8924
8927
  env: d.env,
8925
8928
  configPath: d.configPath,
@@ -8928,23 +8931,23 @@ async function main() {
8928
8931
  break;
8929
8932
  }
8930
8933
  case "migrate":
8931
- await import("./migrate-YfRtATkG.mjs").then((m) => m.runMigrate(parseMigrateArgs(rest)));
8934
+ await import("./migrate-EVfFlJOM.mjs").then((m) => m.runMigrate(parseMigrateArgs(rest)));
8932
8935
  break;
8933
8936
  case "types":
8934
- await import("./types-BpTmpzBy.mjs").then((m) => m.runTypes(parseTypesArgs(rest)));
8937
+ await import("./types-BPxuutXk.mjs").then((m) => m.runTypes(parseTypesArgs(rest)));
8935
8938
  break;
8936
8939
  case "status":
8937
- await import("./status-B-ei_QXO.mjs").then((m) => m.runStatus(parseStatusArgs(rest)));
8940
+ await import("./status-srUxsBIB.mjs").then((m) => m.runStatus(parseStatusArgs(rest)));
8938
8941
  break;
8939
8942
  case "events":
8940
- await import("./events-C7wAGJae.mjs").then((m) => m.runEvents(parseEventsArgs(rest)));
8943
+ await import("./events-CnWvxyX_.mjs").then((m) => m.runEvents(parseEventsArgs(rest)));
8941
8944
  break;
8942
8945
  case "drift":
8943
- exitStatus = await import("./drift-CryXFwSh.mjs").then((m) => m.runDrift(parseDriftArgs(rest)));
8946
+ exitStatus = await import("./drift-08k11FV6.mjs").then((m) => m.runDrift(parseDriftArgs(rest)));
8944
8947
  break;
8945
8948
  case "plan": {
8946
8949
  const p = parsePlanArgs(rest);
8947
- exitStatus = await import("./plan-C0XRZK_J.mjs").then((m) => m.runPlan({
8950
+ exitStatus = await import("./plan-tnUWkiM1.mjs").then((m) => m.runPlan({
8948
8951
  env: p.env,
8949
8952
  configPath: p.configPath,
8950
8953
  json: p.json,
@@ -8956,44 +8959,14 @@ async function main() {
8956
8959
  break;
8957
8960
  }
8958
8961
  case "import":
8959
- await import("./import-Bzow4TPf.mjs").then((m) => m.runImport(parseImportArgs(rest)));
8962
+ await import("./import-BNbHjR9t.mjs").then((m) => m.runImport(parseImportArgs(rest)));
8960
8963
  break;
8961
8964
  case "doctor":
8962
- exitStatus = await import("./doctor-fm_vGe2C.mjs").then((m) => m.runDoctor(parseDoctorArgs(rest)));
8963
- break;
8964
- case "provision-tenant": {
8965
- const p = parseProvisionTenantArgs(rest);
8966
- await import("./provision-tenant-B4VgWlbl.mjs").then((m) => m.runProvisionTenant({
8967
- env: p.env,
8968
- product: p.product,
8969
- workspace: p.workspace,
8970
- main: p.main,
8971
- artifactKey: p.artifactKey,
8972
- moduleName: p.moduleName,
8973
- configPath: p.configPath,
8974
- compatibilityDate: p.compatibilityDate,
8975
- compatibilityFlags: p.compatibilityFlags,
8976
- shardsRaw: p.shardsRaw,
8977
- json: p.json
8978
- }));
8979
- break;
8980
- }
8981
- case "destroy-tenant": {
8982
- const t = parseDestroyTenantArgs(rest);
8983
- await import("./destroy-tenant-B9ZTeUDk.mjs").then((m) => m.runDestroyTenant({
8984
- env: t.env,
8985
- product: t.product,
8986
- workspace: t.workspace,
8987
- force: t.force,
8988
- confirmTenant: t.confirmTenant,
8989
- configPath: t.configPath,
8990
- json: t.json
8991
- }));
8965
+ exitStatus = await import("./doctor-BIaLEVFR.mjs").then((m) => m.runDoctor(parseDoctorArgs(rest)));
8992
8966
  break;
8993
- }
8994
8967
  case "destroy": {
8995
8968
  const d = parseDestroyArgs(rest);
8996
- await import("./destroy-BeOYY2U6.mjs").then((m) => m.runDestroy({
8969
+ await import("./destroy-Krf35oqE.mjs").then((m) => m.runDestroy({
8997
8970
  env: d.env,
8998
8971
  force: d.force,
8999
8972
  skipWorkers: d.skipWorkers,
@@ -9008,52 +8981,67 @@ async function main() {
9008
8981
  case "wfp": {
9009
8982
  const [sub, ...wfpRest] = rest;
9010
8983
  if (sub === "put") {
9011
- const { parseWfpPutArgs, runWfpPut } = await import("./wfp-put-Dzs2zAj2.mjs");
8984
+ const { parseWfpPutArgs, runWfpPut } = await import("./wfp-put-BBitXJep.mjs");
9012
8985
  await runWfpPut(parseWfpPutArgs(wfpRest));
9013
8986
  break;
9014
8987
  }
9015
8988
  if (sub === "delete") {
9016
- const { parseWfpDeleteArgs, runWfpDelete } = await import("./wfp-delete-COWm9F8p.mjs");
8989
+ const { parseWfpDeleteArgs, runWfpDelete } = await import("./wfp-delete-CwWQFxxj.mjs");
9017
8990
  await runWfpDelete(parseWfpDeleteArgs(wfpRest));
9018
8991
  break;
9019
8992
  }
9020
- console.error("usage:\n tamer wfp put --namespace <n> --script-name <s> --main <file> [--compatibility-date <d>] [--compat-flags a,b] [--config <path>]\n tamer wfp delete --namespace <n> --script-name <s> [--force] [--config <path>]");
8993
+ if (sub === "tenant") {
8994
+ const tenantSub = wfpRest[0];
8995
+ const tenantRest = wfpRest.slice(1);
8996
+ if (tenantSub === "list") {
8997
+ await import("./tenant-MWIs0esz.mjs").then((m) => m.runTenantList({
8998
+ env: parseStringFlag(wfpRest, "--env"),
8999
+ configPath: parseStringFlag(wfpRest, "--config"),
9000
+ json: wfpRest.includes("--json")
9001
+ }));
9002
+ break;
9003
+ }
9004
+ if (tenantSub === "status") {
9005
+ await import("./tenant-MWIs0esz.mjs").then((m) => m.runTenantStatus({
9006
+ env: parseStringFlag(wfpRest, "--env"),
9007
+ product: parseStringFlag(wfpRest, "--product") ?? "",
9008
+ workspace: parseStringFlag(wfpRest, "--workspace") ?? "",
9009
+ configPath: parseStringFlag(wfpRest, "--config")
9010
+ }));
9011
+ break;
9012
+ }
9013
+ if (tenantSub === "provision") {
9014
+ await import("./provision-tenant-DW4eg-7P.mjs").then((m) => m.runProvisionTenant(parseProvisionTenantArgs(tenantRest)));
9015
+ break;
9016
+ }
9017
+ if (tenantSub === "destroy") {
9018
+ await import("./destroy-tenant-C95ljuon.mjs").then((m) => m.runDestroyTenant(parseDestroyTenantArgs(tenantRest)));
9019
+ break;
9020
+ }
9021
+ if (tenantSub === "migrate") {
9022
+ await import("./tenant-migrate-CT-qyTUD.mjs").then((m) => m.runTenantMigrate({
9023
+ env: parseStringFlag(wfpRest, "--env"),
9024
+ product: parseStringFlag(wfpRest, "--product") ?? "",
9025
+ workspace: parseStringFlag(wfpRest, "--workspace") ?? "",
9026
+ configPath: parseStringFlag(wfpRest, "--config")
9027
+ }));
9028
+ break;
9029
+ }
9030
+ console.error("Usage: tamer wfp tenant <list|status|provision|destroy|migrate> [options]");
9031
+ process.exit(1);
9032
+ }
9033
+ console.error("usage:\n tamer wfp put --namespace <n> --script-name <s> --main <file> [--config <path>]\n tamer wfp delete --namespace <n> --script-name <s> [--force] [--config <path>]\n tamer wfp tenant <list|status|provision|destroy> [options]");
9021
9034
  process.exit(1);
9022
9035
  }
9023
9036
  case "secrets":
9024
- exitStatus = await import("./secrets-CnzjvndT.mjs").then((m) => m.runSecrets(rest));
9025
- break;
9026
- case "tenant":
9027
- if (rest[0] === "list") await import("./tenant-0dRh3gLI.mjs").then((m) => m.runTenantList({
9028
- env: parseStringFlag(rest, "--env"),
9029
- configPath: parseStringFlag(rest, "--config"),
9030
- json: rest.includes("--json")
9031
- }));
9032
- else if (rest[0] === "status") await import("./tenant-0dRh3gLI.mjs").then((m) => m.runTenantStatus({
9033
- env: parseStringFlag(rest, "--env"),
9034
- product: parseStringFlag(rest, "--product") ?? "",
9035
- workspace: parseStringFlag(rest, "--workspace") ?? "",
9036
- configPath: parseStringFlag(rest, "--config")
9037
- }));
9038
- else if (rest[0] === "provision") await import("./provision-tenant-B4VgWlbl.mjs").then((m) => m.runProvisionTenant(parseProvisionTenantArgs(rest.slice(1))));
9039
- else if (rest[0] === "destroy") await import("./destroy-tenant-B9ZTeUDk.mjs").then((m) => m.runDestroyTenant(parseDestroyTenantArgs(rest.slice(1))));
9040
- else {
9041
- console.error("Usage: tamer tenant <list|status|provision|destroy> [options]");
9042
- exitStatus = 1;
9043
- }
9044
- break;
9045
- case "provision-tenant":
9046
- await import("./provision-tenant-B4VgWlbl.mjs").then((m) => m.runProvisionTenant(parseProvisionTenantArgs(rest)));
9047
- break;
9048
- case "destroy-tenant":
9049
- await import("./destroy-tenant-B9ZTeUDk.mjs").then((m) => m.runDestroyTenant(parseDestroyTenantArgs(rest)));
9037
+ exitStatus = await import("./secrets-2Hy5LMHs.mjs").then((m) => m.runSecrets(rest));
9050
9038
  break;
9051
9039
  case "env":
9052
- if (rest[0] === "list") await import("./env-list-DhbYisDn.mjs").then((m) => m.runEnvList({
9040
+ if (rest[0] === "list") await import("./env-list-DYCprcLb.mjs").then((m) => m.runEnvList({
9053
9041
  configPath: parseStringFlag(rest, "--config"),
9054
9042
  json: rest.includes("--json")
9055
9043
  }));
9056
- else if (rest[0] === "gc") await import("./env-gc-DlQxkZPj.mjs").then((m) => m.runEnvGc({
9044
+ else if (rest[0] === "gc") await import("./env-gc-0vX5Av4i.mjs").then((m) => m.runEnvGc({
9057
9045
  maxAge: parseStringFlag(rest, "--max-age") ?? "72h",
9058
9046
  force: rest.includes("--force"),
9059
9047
  dryRun: rest.includes("--dry-run"),
@@ -9088,15 +9076,13 @@ Commands:
9088
9076
  plan CloudFormation-style preview of apply+deploy (read-only)
9089
9077
  import Register an existing Cloudflare resource into Tamer state by logical name
9090
9078
  doctor Verify CLOUDFLARE_* credentials can read the account API
9091
- provision-tenant Runtime: create per-tenant D1 shards declared in tenant.d1Shards + upload dispatch script (--main or --artifact-key); --shards a,b trims to a subset of the configured layout (omit for all); --json emits machine-readable result for Cloudflare Container callers
9092
- destroy-tenant Runtime: remove tenant script + D1 + state (shared envs need --confirm-tenant); --json emits machine-readable result
9093
9079
  destroy Delete all resources for an env (use with caution)
9094
- tenant Manage WFP tenants: list, status, provision, destroy
9095
9080
  env list List all environments from state (with ages and resource counts)
9096
9081
  env gc Destroy ephemeral envs older than --max-age (default 72h; --dry-run, --force, --json)
9097
- secrets Encrypted secrets vault (init, set, load, get, list, rm, verify, push)
9098
9082
  wfp put Upload a single-module user Worker to a dispatch namespace (multipart API)
9099
9083
  wfp delete Delete a user Worker from a dispatch namespace
9084
+ wfp tenant <list|status|provision|destroy|migrate> Manage WFP tenants (per-workspace scripts + D1 shards)
9085
+ secrets Encrypted secrets vault (init, set, load, copy, get, list, rm, verify, push)
9100
9086
 
9101
9087
  Options:
9102
9088
  --env <name> Environment (default: local for most commands; deploy requires explicit --env)
@@ -9158,5 +9144,5 @@ Environment variables (same as Wrangler):
9158
9144
  main();
9159
9145
 
9160
9146
  //#endregion
9161
- export { rewriteIntraStackServiceTargets as A, getConfigBaseDir as B, listEnvRows as C, mergedWorkerConfigForEnv as D, mergeWorkerConfigForResourcePick as E, deleteEnvSecretRows as F, loadConfig as H, ensureTamerSecretsDatabase as I, CFApiClient as L, wranglerConfigCliArgs as M, effectiveDispatchNamespaceName as N, resolveDeployedWorkerName as O, isEphemeralEnv as P, cloudflareAccountIdFromEnv as R, ensureTamerStateDatabase as S, buildIntraStackScriptNameMap as T, getWorkers as V, tenantDispatchScriptName as _, reconcileSecrets as a, createEmptyCfiState as b, vaultReaderFromMap as c, requiredSecretsForWorker as d, fetchStackImports as f, parseTenantShardRoles as g, StateManager as h, pushSecretsForDeploy as i, resolveReferencesInString as j, resolveWorkerConfig as k, createDeploySecretsResources as l, scanConfigForImports as m, parseSecretsArgs as n, secretsDrift as o, importedStackNames as p, runSecrets as r, secretsPlanItems as s, SECRETS_USAGE as t, namingFromConfig as u, tenantShardDatabaseName as v, stackNameForConfig as w, deleteEnvStateRows as x, tenantStateKey as y, cloudflareApiTokenFromEnv as z };
9147
+ export { rewriteIntraStackServiceTargets as A, cloudflareApiTokenFromEnv as B, listEnvRows as C, mergedWorkerConfigForEnv as D, mergeWorkerConfigForResourcePick as E, isEphemeralEnv as F, getWorkers as H, deleteEnvSecretRows as I, ensureTamerSecretsDatabase as L, assertSafeWranglerOutFile as M, wranglerConfigCliArgs as N, resolveDeployedWorkerName as O, effectiveDispatchNamespaceName as P, CFApiClient as R, ensureTamerStateDatabase as S, buildIntraStackScriptNameMap as T, loadConfig as U, getConfigBaseDir as V, tenantDispatchScriptName as _, reconcileSecrets as a, createEmptyCfiState as b, vaultReaderFromMap as c, requiredSecretsForWorker as d, fetchStackImports as f, parseTenantShardRoles as g, StateManager as h, pushSecretsForDeploy as i, resolveReferencesInString as j, resolveWorkerConfig as k, createDeploySecretsResources as l, scanConfigForImports as m, parseSecretsArgs as n, secretsDrift as o, importedStackNames as p, runSecrets as r, secretsPlanItems as s, SECRETS_USAGE as t, namingFromConfig as u, tenantShardDatabaseName as v, stackNameForConfig as w, deleteEnvStateRows as x, tenantStateKey as y, cloudflareAccountIdFromEnv as z };
9162
9148
  //# sourceMappingURL=tamer.mjs.map