@voltro/cli 0.54.0 → 0.56.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 (173) hide show
  1. package/CHANGELOG.md +639 -2
  2. package/bin/voltro.mjs +24 -0
  3. package/dist/{apiBuild-DTWp0S_q.js → apiBuild-Bdaetr37.js} +119 -88
  4. package/dist/apiBuild-Vw1figjO.js +2 -0
  5. package/dist/bin.js +1 -1
  6. package/dist/{build-D4ygSbnV.js → build-CI36wL4R.js} +339 -314
  7. package/dist/buildReport-52gHKgfO.js +64 -0
  8. package/dist/{checkCommand-Dg1G7Gwd.js → checkCommand-CAwFXrxA.js} +6 -6
  9. package/dist/{checkCommand-L7DTlpIF.js → checkCommand-D0QV_zM_.js} +1 -1
  10. package/dist/{clusterCmd-DrVFCzSj.js → clusterCmd-CdLB1GkT.js} +1 -1
  11. package/dist/{codegen-DSLM8Su9.js → codegen-Bth5lUTU.js} +76 -64
  12. package/dist/codegen-DbH7NbCR.js +2 -0
  13. package/dist/{codegenCommand-CG_Vx4lc.js → codegenCommand-CidbQzbv.js} +15 -14
  14. package/dist/{codemodRunner-Cd4xkC6u.js → codemodRunner-BlQPfjzA.js} +277 -0
  15. package/dist/{commands-6Kzi92Np.js → commands-CWjfThXv.js} +35 -35
  16. package/dist/{dashboardCommand-Cq1PWvI1.js → dashboardCommand-BekcY5Ls.js} +3 -3
  17. package/dist/{dataCommand-DYzW8vkv.js → dataCommand-2pccgbIy.js} +267 -195
  18. package/dist/{dbCommand-B4NWZtGL.js → dbCommand-DpK_vQET.js} +457 -441
  19. package/dist/dbCommand-DrycGWWt.js +2 -0
  20. package/dist/{dev-cKUiZZsB.js → dev-B9Gz0k85.js} +1 -1
  21. package/dist/{dev-CmuvUKRq.js → dev-Dw263KPu.js} +2598 -2452
  22. package/dist/doctorCommand-BMWs6aVm.js +2 -0
  23. package/dist/{doctorCommand-DCiFVMtZ.js → doctorCommand-aR_bFmIi.js} +353 -251
  24. package/dist/{dormancyCommand-w1TrmgYP.js → dormancyCommand-eXTQMbHU.js} +1 -1
  25. package/dist/{embeddingsCommand-CMgPyRTr.js → embeddingsCommand-CTmiQvwa.js} +1 -1
  26. package/dist/{envCommand-Cyynmcfa.js → envCommand-BDUgV7EM.js} +12 -12
  27. package/dist/{evolveCommand-BwvQ8dVH.js → evolveCommand-YV8qW1LU.js} +2 -2
  28. package/dist/frameworkTableAssembly-CGNC0qr7.js +2 -0
  29. package/dist/{frameworkTableAssembly-D7LJuALW.js → frameworkTableAssembly-DNOFXfEQ.js} +102 -100
  30. package/dist/index.js +1 -1
  31. package/dist/{infoCommand-DlYlUPqs.js → infoCommand-BjVXpMlP.js} +1 -1
  32. package/dist/inspect-CNYvNXPU.js +1484 -0
  33. package/dist/inspect-S2rWy1Ys.js +2 -0
  34. package/dist/{inspectCmd-niF97fAq.js → inspectCmd-CP-G0sVK.js} +1 -1
  35. package/dist/{inspectFetch-EMuhTG_9.js → inspectFetch-BU1NyzxV.js} +36 -24
  36. package/dist/{inspectMetrics-CGF94puw.js → inspectMetrics-BY0Sjb2F.js} +19 -19
  37. package/dist/interruptedReplace-CwnkBb2X.js +41 -0
  38. package/dist/interruptedReplace-qzmFI020.js +2 -0
  39. package/dist/{logsCmd-B6oNsfaZ.js → logsCmd-BU8uCdys.js} +1 -1
  40. package/dist/{manifestBuild-Cqgsx2bM.js → manifestBuild-CEkjfpwc.js} +1 -1
  41. package/dist/manifestBuild-DIa_s6u0.js +2 -0
  42. package/dist/{migrate-BK_Bbx-_.js → migrate-SICulyz1.js} +2 -2
  43. package/dist/precompressAssets-YhTi1aWp.js +40 -0
  44. package/dist/{probeCommand-_C0YU207.js → probeCommand-6HxEkNDG.js} +2 -2
  45. package/dist/{runtimeTrace-CGWx1Q6l.js → runtimeTrace-DgYMc09E.js} +1 -1
  46. package/dist/{scheduleCmd-DQRu6BZC.js → scheduleCmd-DYBUfo_T.js} +1 -1
  47. package/dist/{sdkgen-CDGHQUFj.js → sdkgen-PY-umd6O.js} +1 -1
  48. package/dist/{seedRunner-Dgsiwk_e.js → seedRunner-DISBKow-.js} +16 -16
  49. package/dist/serveCommand-BITS8Hpj.js +2 -0
  50. package/dist/{serveCommand-Bje09q1v.js → serveCommand-DIJ3ma76.js} +951 -909
  51. package/dist/serveEntry.js +1 -1
  52. package/dist/{start-Clz-1BHB.js → start-B9NGB8gn.js} +627 -588
  53. package/dist/{start-B0bnJgxI.js → start-BFQQkL1i.js} +1 -1
  54. package/dist/startEntry.js +1 -1
  55. package/dist/staticCachePolicy-CIyj6DbS.js +15 -0
  56. package/dist/{test-D_kW4KMj.js → test-jipIQ5Mx.js} +1 -1
  57. package/dist/{tracesCmd-DgtgOUdi.js → tracesCmd-BWYDqMy6.js} +1 -1
  58. package/dist/{updateCommand-CRJlAOaM.js → updateCommand-C9n_Z_oG.js} +8 -2
  59. package/dist/updateCommand-DsXEAHbd.js +2 -0
  60. package/dist/webDev-C2dRz9s5.js +2 -0
  61. package/dist/{webDev-DSI9SOhs.js → webDev-C53hJdcL.js} +1265 -1288
  62. package/dist/{webhooksCommand-BvzXNHji.js → webhooksCommand-uuPu8qQX.js} +1 -1
  63. package/dist/{workflowsCmd-BGF-mRZ5.js → workflowsCmd-g-DNpaUc.js} +1 -1
  64. package/package.json +67 -19
  65. package/templates/AGENTS.core.md +20 -1
  66. package/templates/AGENTS.md +21 -2
  67. package/templates/agent-docs/_index.md +1 -1
  68. package/templates/agent-docs/_manifest.json +1 -1
  69. package/templates/agent-docs/authentication.md +49 -6
  70. package/templates/agent-docs/cli.md +216 -11
  71. package/templates/agent-docs/data.md +209 -18
  72. package/templates/agent-docs/database/scaling.md +40 -1
  73. package/templates/agent-docs/deployment.md +53 -1
  74. package/templates/agent-docs/internationalization.md +32 -0
  75. package/templates/agent-docs/local-first-mobile.md +9 -2
  76. package/templates/agent-docs/observability.md +227 -0
  77. package/templates/agent-docs/plugins/billing.md +15 -0
  78. package/templates/agent-docs/plugins/broadcast.md +2 -1
  79. package/templates/agent-docs/plugins/ratelimit.md +6 -1
  80. package/templates/agent-docs/plugins/row-history.md +11 -0
  81. package/templates/agent-docs/plugins.md +65 -8
  82. package/templates/agent-docs/reference.md +5 -3
  83. package/templates/agent-docs/routing.md +18 -0
  84. package/templates/agent-docs/schema-driven-ui.md +125 -0
  85. package/templates/agent-docs/templates/appshells.md +3 -3
  86. package/templates/agent-docs/whats-new.md +408 -106
  87. package/templates/apps/api-ai/package.json +6 -6
  88. package/templates/apps/api-auth/package.json +8 -8
  89. package/templates/apps/api-backend/package.json +7 -7
  90. package/templates/apps/api-backend-deactivation/package.json +7 -7
  91. package/templates/apps/api-backend-mail/package.json +8 -8
  92. package/templates/apps/api-backend-mariadb/package.json +9 -9
  93. package/templates/apps/api-backend-sqlite/package.json +8 -8
  94. package/templates/apps/api-backend-storage/package.json +8 -8
  95. package/templates/apps/api-cms/package.json +9 -9
  96. package/templates/apps/api-collab/package.json +8 -8
  97. package/templates/apps/api-data-advanced/package.json +8 -8
  98. package/templates/apps/api-durable/package.json +8 -8
  99. package/templates/apps/api-feature-flags/package.json +9 -9
  100. package/templates/apps/api-governance/package.json +8 -8
  101. package/templates/apps/api-kv/package.json +8 -8
  102. package/templates/apps/api-moderation/package.json +8 -8
  103. package/templates/apps/api-observability/package.json +8 -8
  104. package/templates/apps/api-ratelimit/package.json +8 -8
  105. package/templates/apps/api-rbac/package.json +8 -8
  106. package/templates/apps/api-rest/package.json +7 -7
  107. package/templates/apps/api-row-history/package.json +8 -8
  108. package/templates/apps/api-saas/package.json +11 -11
  109. package/templates/apps/api-saas-starter/package.json +10 -10
  110. package/templates/apps/api-search/package.json +8 -8
  111. package/templates/apps/api-status/package.json +8 -8
  112. package/templates/apps/api-webhooks/package.json +9 -9
  113. package/templates/apps/changelog/package.json +7 -7
  114. package/templates/apps/changelog/src/pages/[locale]/page.tsx +7 -1
  115. package/templates/apps/edge-functions/package.json +2 -2
  116. package/templates/apps/frontend-admin/package.json +7 -8
  117. package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +1 -2
  118. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +1 -2
  119. package/templates/apps/frontend-app/package.json +8 -9
  120. package/templates/apps/frontend-app/src/pages/layout.tsx +1 -2
  121. package/templates/apps/frontend-auth/package.json +7 -8
  122. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +1 -2
  123. package/templates/apps/frontend-blank/package.json +6 -7
  124. package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -2
  125. package/templates/apps/frontend-cms/package.json +8 -9
  126. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +1 -2
  127. package/templates/apps/frontend-collab/README.md +7 -2
  128. package/templates/apps/frontend-collab/package.json +9 -10
  129. package/templates/apps/frontend-collab/src/pages/layout.tsx +1 -2
  130. package/templates/apps/frontend-collab/src/pages/page.test.tsx +8 -4
  131. package/templates/apps/frontend-collab/src/pages/page.tsx +10 -5
  132. package/templates/apps/frontend-contact/package.json +7 -7
  133. package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +1 -1
  134. package/templates/apps/frontend-dashboard/package.json +6 -7
  135. package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +1 -2
  136. package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +1 -2
  137. package/templates/apps/frontend-docs/package.json +8 -8
  138. package/templates/apps/frontend-i18n/package.json +6 -6
  139. package/templates/apps/frontend-landing/package.json +7 -7
  140. package/templates/apps/frontend-portal/package.json +7 -8
  141. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +1 -2
  142. package/templates/apps/frontend-saas/package.json +7 -8
  143. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +1 -2
  144. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +1 -2
  145. package/templates/apps/frontend-spa/package.json +6 -7
  146. package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -2
  147. package/templates/apps/frontend-ssr/package.json +6 -7
  148. package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -2
  149. package/templates/apps/frontend-ssr-api/package.json +7 -8
  150. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -2
  151. package/templates/apps/frontend-static-blog/package.json +8 -8
  152. package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +1 -1
  153. package/templates/apps/frontend-static-blog/src/pages/[locale]/page.tsx +7 -1
  154. package/templates/apps/frontend-status/package.json +7 -8
  155. package/templates/apps/frontend-status/src/pages/layout.tsx +1 -2
  156. package/templates/apps/mobile-app/package.json +4 -4
  157. package/templates/baselines/compose/docker/api.Dockerfile +61 -5
  158. package/templates/baselines/compose/docker/web.Dockerfile +55 -10
  159. package/templates/baselines/compose-mariadb/docker/api.Dockerfile +61 -5
  160. package/templates/baselines/compose-mariadb/docker/web.Dockerfile +55 -10
  161. package/dist/apiBuild-CeUN55uk.js +0 -2
  162. package/dist/codegen-DjgxEOnD.js +0 -2
  163. package/dist/dbCommand-CSFWs9ev.js +0 -2
  164. package/dist/doctorCommand-J3qu4E0Y.js +0 -2
  165. package/dist/frameworkTableAssembly-IPD1pUnZ.js +0 -2
  166. package/dist/inspect-Bd8-9wsi.js +0 -1193
  167. package/dist/inspect-CuoDInfZ.js +0 -2
  168. package/dist/interruptedReplace-C3O3M1MM.js +0 -28
  169. package/dist/interruptedReplace-CvmiAM9K.js +0 -2
  170. package/dist/manifestBuild-C4-J1-m_.js +0 -2
  171. package/dist/serveCommand-BiPe8BJm.js +0 -2
  172. package/dist/updateCommand-CIoVDKnj.js +0 -2
  173. package/dist/webDev-DlvZO30c.js +0 -2
@@ -6130,6 +6130,283 @@ var S = (e, t, n) => {
6130
6130
  "Partial registries (`Partial<Record<WidgetKind, …>>` or per-kind lookups)",
6131
6131
  "need nothing."
6132
6132
  ].join("\n")
6133
+ }),
6134
+ w({
6135
+ version: "0.55.0",
6136
+ id: "0.55.0/01_target-relations-declare-columns",
6137
+ title: "A target's `relations:` names the junction's two columns now, not just the table",
6138
+ kind: "manual",
6139
+ appliesTo: ({ project: e }) => e.getSourceFiles().some((e) => {
6140
+ let t = e.getFullText();
6141
+ return /relations:\s*\{[^}{]*:\s*['"`]/.test(t);
6142
+ }),
6143
+ note: [
6144
+ "A write target declares its many-to-many relations as objects now:",
6145
+ "",
6146
+ " // before",
6147
+ " target: { table: 'employees', op: 'update',",
6148
+ " relations: { assignedStores: 'employee_assigned_stores' } }",
6149
+ "",
6150
+ " // after",
6151
+ " target: { table: 'employees', op: 'update',",
6152
+ " relations: { assignedStores: {",
6153
+ " junction: 'employee_assigned_stores',",
6154
+ " anchorColumn: 'employeeId', // the junction reference() pointing at `employees`",
6155
+ " targetColumn: 'storeId', // the junction's other reference()",
6156
+ " } } }",
6157
+ "",
6158
+ "Take both column names from the junction table's own `reference()`",
6159
+ "columns in your `db/` schema — `anchorColumn` is the one pointing at the",
6160
+ "target's table, `targetColumn` is the other one.",
6161
+ "",
6162
+ "Why: the SAME declaration now drives the optimistic update in the browser,",
6163
+ "so a multi-reference field flips as instantly as a scalar one instead of",
6164
+ "waiting for the server delta. The browser cannot import your schema, so the",
6165
+ "columns have to be stated. They are not taken on trust: before it writes,",
6166
+ "the server compares them against the junction's real reference columns and",
6167
+ "refuses — naming the correct pair — if they disagree."
6168
+ ].join("\n")
6169
+ }),
6170
+ w({
6171
+ version: "0.55.0",
6172
+ id: "0.55.0/02_widget-kind-gained-rich-text",
6173
+ title: "WidgetKind gained 'rich-text' — total widget registries need one new entry",
6174
+ kind: "manual",
6175
+ appliesTo: ({ project: e }) => e.getSourceFiles().some((e) => /Record<WidgetKind/.test(e.getFullText())),
6176
+ note: [
6177
+ "This repository types a widget registry as `Record<WidgetKind, …>`.",
6178
+ "`WidgetKind` gained `'rich-text'`, so the total map needs one new entry.",
6179
+ "The framework ships a default you can point at:",
6180
+ "",
6181
+ " import { RichTextWidget } from '@voltro/web'",
6182
+ " // …",
6183
+ " 'rich-text': RichTextWidget,",
6184
+ "",
6185
+ "Partial registries (`Partial<Record<WidgetKind, …>>` or per-kind lookups)",
6186
+ "need nothing."
6187
+ ].join("\n")
6188
+ }),
6189
+ w({
6190
+ version: "0.56.0",
6191
+ id: "0.56.0/01_inspect_answers_are_observations",
6192
+ title: "inspect answers are `Observation`s — the payload is `.data`",
6193
+ kind: "manual",
6194
+ reach: "beyond-source",
6195
+ appliesTo: ({ text: e }) => e.find("/_voltro/inspect").length > 0,
6196
+ note: [
6197
+ "Every 2xx `/_voltro/inspect/*` response is now an envelope:",
6198
+ "",
6199
+ " { data, scope, origin, completeness, capturedAt }",
6200
+ "",
6201
+ "What you read before is `.data`. So:",
6202
+ "",
6203
+ " curl …/_voltro/inspect/subscriptions | jq .resume",
6204
+ " curl …/_voltro/inspect/subscriptions | jq .data.resume # now",
6205
+ "",
6206
+ "The other four fields are the point of the change, not decoration:",
6207
+ "",
6208
+ " • `scope.kind` — `process` (this replica only), `shared-store` (every",
6209
+ " replica would answer the same), `fleet` (assembled), `declaration`",
6210
+ " (from the source tree). A `process` answer on a multi-replica",
6211
+ " deployment is a SAMPLE, and it used to look identical to a fleet-wide",
6212
+ " one.",
6213
+ " • `origin.replicaId` / `origin.instanceId` — which process answered, and",
6214
+ " which generation of it. Query twice and you can now tell whether you",
6215
+ " reached the same one.",
6216
+ " • `completeness.fleetSize` — how many replicas exist. ABSENT when it",
6217
+ " could not be determined; never `1` as a guess.",
6218
+ " • `capturedAt` — the ORIGIN’s clock. Do not compare it with another",
6219
+ " replica’s.",
6220
+ "",
6221
+ "Check anything that reads these endpoints outside your TypeScript sources:",
6222
+ "dashboards, `jq` filters in alerts, runbook commands, CI health checks,",
6223
+ "scrape configs. A reader that pulls a field straight off the top level now",
6224
+ "reads `undefined` — which in a health check is the failure mode worth",
6225
+ "looking for first, because `undefined` and \"zero\" render the same in most",
6226
+ "alerting rules."
6227
+ ].join("\n")
6228
+ }),
6229
+ w({
6230
+ version: "0.56.0",
6231
+ id: "0.56.0/02_broadcast_gap_is_one_object",
6232
+ title: "attachBroadcastBus's onGap now receives a single BroadcastGap object",
6233
+ kind: "manual",
6234
+ appliesTo: ({ project: e }) => e.getSourceFiles().some((e) => e.getFullText().includes("attachBroadcastBus")),
6235
+ note: [
6236
+ "`attachBroadcastBus({ onGap })` now receives ONE argument — a `BroadcastGap`",
6237
+ "— instead of `(origin, missed)`.",
6238
+ "",
6239
+ " before: onGap: (origin, missed) => refreshAll(`missed ${missed} from ${origin}`)",
6240
+ " after: onGap: (gap) => refreshAll(gap.reason)",
6241
+ "",
6242
+ "`gap.reason` is a ready-made sentence for your log line. `gap.origin` and",
6243
+ "`gap.missed` are still there and still EXACT — but they are optional now,",
6244
+ "because the bus reports two kinds of hole and only one of them has a peer",
6245
+ "to blame:",
6246
+ "",
6247
+ " • a peer's serial jumped → `{ reason, origin, missed }`",
6248
+ " • this replica was not subscribed for a while, or the transport re-dialled",
6249
+ " → `{ reason }` alone",
6250
+ "",
6251
+ "The recovery is the same for both: re-run every live query. If your handler",
6252
+ "reads `origin`/`missed`, guard them — a hole with no peer is now reachable.",
6253
+ "",
6254
+ "Related, and needing no change from you: `attachBroadcastBus` no longer",
6255
+ "rejects when the broker is unreachable at attach time. It warns, keeps the",
6256
+ "local path working, retries in the background, and reports the time it spent",
6257
+ "unsubscribed as a gap. If you wrapped the call in a try/catch to survive a",
6258
+ "restarting broker, that catch is now dead code."
6259
+ ].join("\n")
6260
+ }),
6261
+ w({
6262
+ version: "0.56.0",
6263
+ id: "0.56.0/03_outbox_drain_needs_an_identity",
6264
+ title: "drainOutbox now requires claimedBy — the fleet-wide exactly-once gate",
6265
+ kind: "manual",
6266
+ appliesTo: ({ project: e }) => e.getSourceFiles().some((e) => e.getFullText().includes("drainOutbox")),
6267
+ note: [
6268
+ "`drainOutbox({ … })` now requires a `claimedBy: string`.",
6269
+ "",
6270
+ "Why: the drain used to read every `pending` row and run its handler. Every",
6271
+ "replica runs the drain, so every effect was dispatched once PER REPLICA — on",
6272
+ "the happy path, every time. Rows are now claimed atomically",
6273
+ "(`pending → delivering`) and a racing replica loses the row instead of",
6274
+ "duplicating the side effect.",
6275
+ "",
6276
+ "What to pass: an id for this PROCESS, not for the replica. A replica name",
6277
+ "survives a restart (`POD_NAME` on a StatefulSet, `VOLTRO_REPLICA_ID` by",
6278
+ "definition) while the work does not, so a pod that died mid-delivery would",
6279
+ "look like it still held its own claim:",
6280
+ "",
6281
+ " import { instanceId } from '@voltro/protocol/identity'",
6282
+ " await drainOutbox({ store, handlers, claimedBy: instanceId() })",
6283
+ "",
6284
+ "Also new and optional: `claimLeaseMs` (default 5 minutes) — how long a claim",
6285
+ "stands before another replica may take the row. Set it ABOVE your slowest",
6286
+ "handler. A lease shorter than a real delivery hands the same row to a second",
6287
+ "replica while the first is still working, which is the duplicate this",
6288
+ "mechanism removes, reintroduced by a number.",
6289
+ "",
6290
+ "If you do NOT call `drainOutbox` yourself, there is nothing to do: `voltro",
6291
+ "dev` and `voltro serve` pass the identity for you."
6292
+ ].join("\n")
6293
+ }),
6294
+ w({
6295
+ version: "0.56.0",
6296
+ id: "0.56.0/04_reaction_dedupe_is_one_claim",
6297
+ title: "runReaction's dedupe is a single atomic claim",
6298
+ kind: "manual",
6299
+ appliesTo: ({ project: e }) => e.getSourceFiles().some((e) => {
6300
+ let t = e.getFullText();
6301
+ return t.includes("runReaction") || t.includes("ReactionRunDeps");
6302
+ }),
6303
+ note: [
6304
+ "`ReactionRunDeps.dedupe` changed from `{ has, add }` to `{ claim }`:",
6305
+ "",
6306
+ " // before",
6307
+ " dedupe: { has: (k) => seen.has(k), add: (k) => { seen.add(k) } }",
6308
+ " // after",
6309
+ " dedupe: { claim: (k) => (seen.has(k) ? false : (seen.add(k), true)) }",
6310
+ "",
6311
+ "Why it is not a rename. `has` then `add` is a read followed by a write, and",
6312
+ "two callers both read \"not seen\" before either writes — so `dedupeKey`, the",
6313
+ "field `defineReaction` refuses to boot without, let the same change act once",
6314
+ "per replica. Every single-instance run confirmed it worked, which is why it",
6315
+ "survived: the gate was real in exactly the configuration that cannot observe",
6316
+ "it.",
6317
+ "",
6318
+ "The claim is also taken BEFORE the act now, not after. That is what makes it",
6319
+ "a gate rather than a report, and it has a cost worth knowing: an act that",
6320
+ "THROWS has already consumed its key and is not re-run by a later duplicate.",
6321
+ "Durability belongs to the workflow the act starts, not to the trigger.",
6322
+ "",
6323
+ "If you do NOT call `runReaction` yourself, there is nothing to do. `voltro",
6324
+ "dev` and `voltro serve` now pass a durable, fleet-wide claimer",
6325
+ "(`_voltro_change_claims`), so a reaction acts once across the whole fleet",
6326
+ "instead of once per replica — no code change on your side."
6327
+ ].join("\n")
6328
+ }),
6329
+ w({
6330
+ version: "0.56.0",
6331
+ id: "0.56.0/05_plugin_bind_context_claims_a_change",
6332
+ title: "PluginBindContext requires claimChange; change identity moved to @voltro/database",
6333
+ kind: "manual",
6334
+ appliesTo: ({ project: e }) => e.getSourceFiles().some((e) => {
6335
+ let t = e.getFullText();
6336
+ return t.includes("PluginBindContext") || t.includes("changeDigest") || t.includes("OccurrenceCounter") || t.includes("composeChangeKey") || t.includes("parseChangeKey");
6337
+ }),
6338
+ note: [
6339
+ "Two changes, both narrow.",
6340
+ "",
6341
+ "1. `PluginBindContext` now has a REQUIRED `claimChange(scope, key) =>",
6342
+ " Promise<boolean>`. The framework supplies it on both boot paths, so a",
6343
+ " plugin only READS it — nothing to do unless you construct a",
6344
+ " `PluginBindContext` yourself, which in practice means a unit-test",
6345
+ " harness:",
6346
+ "",
6347
+ " const ctx: PluginBindContext = {",
6348
+ " scheduleCoordinated: …,",
6349
+ " claimChange: () => Promise.resolve(true), // add this",
6350
+ " }",
6351
+ "",
6352
+ " In a real harness, decide what the case is testing before reaching for",
6353
+ " `true`: a stub that always claims asserts the SINGLE-replica behaviour.",
6354
+ " To exercise a fleet, share one claim ledger across the stubs — a `Set`",
6355
+ " of `${scope}/${key}` is enough.",
6356
+ "",
6357
+ " Why it is required rather than optional: an absent gate reads exactly",
6358
+ " like a gate that passed, and every consumer of this field is counting or",
6359
+ " sending something. `plugin-billing` accrued a usage unit per metered row",
6360
+ " change on EVERY replica, so a tenant on two pods was invoiced twice.",
6361
+ "",
6362
+ "2. The change-identity helpers moved from `@voltro/plugin-cdc-out` to",
6363
+ " `@voltro/database`, beside `ChangeEvent` itself:",
6364
+ "",
6365
+ " -import { changeDigest, composeChangeKey, OccurrenceCounter } from '@voltro/plugin-cdc-out'",
6366
+ " +import { changeDigest, composeChangeKey, OccurrenceCounter } from '@voltro/database'",
6367
+ "",
6368
+ " `parseChangeKey` moved with them. `canonicalJson` did NOT become public:",
6369
+ " it is internal to the digest, and `@voltro/runtime` already exports a",
6370
+ " different function of that name."
6371
+ ].join("\n")
6372
+ }),
6373
+ w({
6374
+ version: "0.56.0",
6375
+ id: "0.56.0/06_serve_is_api_only",
6376
+ title: "`voltro serve` on a WEB app now refuses — use `voltro start`",
6377
+ kind: "manual",
6378
+ reach: "beyond-source",
6379
+ appliesTo: (e) => e.text.scanned === 0 || e.text.find("voltro serve").length > 0,
6380
+ note: [
6381
+ "`voltro serve` is the production server for an API app. On a WEB app it now",
6382
+ "refuses with a one-line message instead of what it used to do.",
6383
+ "",
6384
+ " web app, production voltro start . (unchanged)",
6385
+ " web app, development voltro dev . (unchanged)",
6386
+ " api app voltro serve . (unchanged)",
6387
+ "",
6388
+ "Nothing changes for an api. For a web app the old behaviour was not a working",
6389
+ "alternative that is being taken away:",
6390
+ "",
6391
+ " • In production it already failed — the serve fast path requires an api",
6392
+ " serve bundle, which a web build never produces, so it exited 1 pointing",
6393
+ " at an artefact that cannot exist.",
6394
+ " • Below production it ran a SECOND vite build without Tailwind, without the",
6395
+ " image pipeline and without the islands entries, then served it through",
6396
+ " `vite preview`. With Tailwind that build aborts. Without it, it succeeds",
6397
+ " and DELETES `dist/server`, the island shells and every pre-rendered page —",
6398
+ " after which `voltro start` cannot boot at all.",
6399
+ "",
6400
+ "Search your Dockerfiles, compose files, CI jobs, Procfiles and runbooks:",
6401
+ "",
6402
+ " grep -rn \"voltro serve\" .",
6403
+ "",
6404
+ "and change the ones that point at a WEB app to `voltro start`. An api entry",
6405
+ "stays as it is. (The shipped Dockerfiles already run the precompiled bundle",
6406
+ "directly — `node .framework/dist-web/startBundle/startEntry.js` for web,",
6407
+ "`node .framework/dist-api/serveBundle/serveEntry.js` for an api — which is",
6408
+ "faster still and needs no CLI in the runtime image.)"
6409
+ ].join("\n")
6133
6410
  })
6134
6411
  ], J = /* @__PURE__ */ new Set([
6135
6412
  "node_modules",
@@ -91,7 +91,7 @@ var u = () => {
91
91
  name: "dev",
92
92
  summary: "Start the local development server (auto-discovers routes / mutations).",
93
93
  status: "wired",
94
- run: (e) => import("./dev-cKUiZZsB.js").then((t) => t.runDev(e)),
94
+ run: (e) => import("./dev-B9Gz0k85.js").then((t) => t.runDev(e)),
95
95
  help: {
96
96
  usage: "[app]",
97
97
  examples: [["voltro dev", "boot the app in the current directory"], ["voltro dev apps/acme/api", "boot a specific app"]],
@@ -109,7 +109,7 @@ var u = () => {
109
109
  name: "dashboard",
110
110
  summary: "Serve the DevTools dashboard standalone (from @voltro/dashboard). Targets via VOLTRO_DASHBOARD_APPS; --port to override.",
111
111
  status: "wired",
112
- run: (e) => import("./dashboardCommand-Cq1PWvI1.js").then((t) => t.runDashboardCommand(e)),
112
+ run: (e) => import("./dashboardCommand-BekcY5Ls.js").then((t) => t.runDashboardCommand(e)),
113
113
  help: {
114
114
  usage: "[--port <n>]",
115
115
  flags: [["--port <n>", "port to serve the dashboard on"]],
@@ -121,7 +121,7 @@ var u = () => {
121
121
  name: "check",
122
122
  summary: "Verify the app graph (blast-radius checks) against a running api; LLM-shaped --json diagnostics. Flags: --json, --process <p>, --diff removeTable:<name>.",
123
123
  status: "wired",
124
- run: (e) => import("./checkCommand-L7DTlpIF.js").then((t) => t.runCheckCommand(e)),
124
+ run: (e) => import("./checkCommand-D0QV_zM_.js").then((t) => t.runCheckCommand(e)),
125
125
  help: {
126
126
  usage: "[--json] [--offline] [--process <name>] [--diff removeTable:<name>]",
127
127
  flags: [
@@ -155,7 +155,7 @@ var u = () => {
155
155
  name: "webhooks",
156
156
  summary: "Outbound-webhook artefacts. `consumer` generates the ZERO-DEPENDENCY Standard-Webhooks verification package a subscriber installs, from this app's own declared events; `events` lists the events a subscriber can register for. Usage: voltro webhooks <consumer|events> [path] [--out <dir>] [--name <pkg>] [--json].",
157
157
  status: "wired",
158
- run: (e) => import("./webhooksCommand-BvzXNHji.js").then((t) => t.runWebhooksCommand(e)),
158
+ run: (e) => import("./webhooksCommand-uuPu8qQX.js").then((t) => t.runWebhooksCommand(e)),
159
159
  help: {
160
160
  usage: "<consumer|events> [path] [--out <dir>] [--name <pkg>] [--json]",
161
161
  flags: [
@@ -171,7 +171,7 @@ var u = () => {
171
171
  name: "evolve",
172
172
  summary: "Schema-evolution copilot: propose an observed-graph-driven codemod + a branch-verified backfill for a schema change (rename/retype/split/drop a column, rename a table). Dry-run by default; --write applies. Usage: voltro evolve rename-column <table>.<col> --to <newName> [--write] [--json].",
173
173
  status: "wired",
174
- run: (e) => import("./evolveCommand-BwvQ8dVH.js").then((t) => t.runEvolveCommand(e)),
174
+ run: (e) => import("./evolveCommand-YV8qW1LU.js").then((t) => t.runEvolveCommand(e)),
175
175
  help: {
176
176
  usage: "<rename-column|rename-table|retype-column|split-column|drop-column> <target> [--to <new>] [--write]",
177
177
  flags: [
@@ -188,7 +188,7 @@ var u = () => {
188
188
  name: "codegen",
189
189
  summary: "Emit rpcGroup.generated.ts from discovered route / mutation descriptors.",
190
190
  status: "wired",
191
- run: (e) => import("./codegenCommand-CG_Vx4lc.js").then((t) => t.runCodegenCommand(e)),
191
+ run: (e) => import("./codegenCommand-CidbQzbv.js").then((t) => t.runCodegenCommand(e)),
192
192
  help: {
193
193
  usage: "[app]",
194
194
  examples: [["voltro codegen", "regenerate rpcGroup.generated.ts for the app in the cwd"]],
@@ -221,7 +221,7 @@ var u = () => {
221
221
  name: "migrate",
222
222
  summary: "Apply the declared schema to the database (alias of `db apply` — diffs declared vs live and emits the ALTERs). `--create-only` for the bootstrap-only CREATE TABLE IF NOT EXISTS path.",
223
223
  status: "wired",
224
- run: (e) => import("./migrate-BK_Bbx-_.js").then((t) => t.runMigrateCommand(e)),
224
+ run: (e) => import("./migrate-SICulyz1.js").then((t) => t.runMigrateCommand(e)),
225
225
  help: {
226
226
  usage: "[app] [--create-only]",
227
227
  flags: [["--create-only", "only CREATE TABLE IF NOT EXISTS — never ALTER (bootstrap)"]],
@@ -233,7 +233,7 @@ var u = () => {
233
233
  name: "test",
234
234
  summary: "Run vitest against the app at the cwd (auto-discovers *.test.ts/tsx).",
235
235
  status: "wired",
236
- run: (e) => import("./test-D_kW4KMj.js").then((t) => t.runTestCommand(e)),
236
+ run: (e) => import("./test-jipIQ5Mx.js").then((t) => t.runTestCommand(e)),
237
237
  help: {
238
238
  usage: "[dir] [filter…] [--watch] [-t <pattern>]",
239
239
  flags: [
@@ -281,7 +281,7 @@ var u = () => {
281
281
  name: "info",
282
282
  summary: "Report versions (CLI, node, every installed @voltro/* — flags lockstep skew), package manager, and dialect. --json for CI. Exits 1 on version skew.",
283
283
  status: "wired",
284
- run: (e) => import("./infoCommand-DlYlUPqs.js").then((t) => t.runInfoCommand(e)),
284
+ run: (e) => import("./infoCommand-BjVXpMlP.js").then((t) => t.runInfoCommand(e)),
285
285
  help: {
286
286
  usage: "[--json]",
287
287
  flags: [["--json", "machine-readable report"]],
@@ -302,7 +302,7 @@ var u = () => {
302
302
  name: "env",
303
303
  summary: "Inspect/sync the typed-env manifest. Subcommands: check (default), sync (.env.example), types (env.generated.d.ts for CI tsc), turbo.",
304
304
  status: "wired",
305
- run: (e) => import("./envCommand-Cyynmcfa.js").then((t) => t.runEnvCommand(e)),
305
+ run: (e) => import("./envCommand-BDUgV7EM.js").then((t) => t.runEnvCommand(e)),
306
306
  help: {
307
307
  usage: "[check|sync|types|turbo] [--force]",
308
308
  flags: [["--force", "overwrite the generated file instead of refusing on a conflict"]],
@@ -326,17 +326,17 @@ var u = () => {
326
326
  },
327
327
  {
328
328
  name: "serve",
329
- summary: "Production server: web app (vite preview) OR API (rpc + tenant scope + audit atomicity), auto-detected.",
329
+ summary: "Production server for an API app (rpc + tenant scope + audit atomicity). A WEB app is served by `voltro start`.",
330
330
  status: "wired",
331
331
  run: async (e) => {
332
332
  let t = e.find((e) => !e.startsWith("-")) ?? process.cwd();
333
333
  if (e.includes("--preflight")) {
334
- let { runServePreflight: e } = await import("./doctorCommand-J3qu4E0Y.js");
334
+ let { runServePreflight: e } = await import("./doctorCommand-BMWs6aVm.js");
335
335
  return e(s(t), !0);
336
336
  }
337
- let { tryRunWebServe: n } = await import("./webDev-DlvZO30c.js"), r = await n(s(t));
337
+ let { tryRunWebServe: n } = await import("./webDev-C2dRz9s5.js"), r = await n(s(t));
338
338
  if (!r.ran) {
339
- let { runServeDispatch: t } = await import("./serveCommand-BiPe8BJm.js");
339
+ let { runServeDispatch: t } = await import("./serveCommand-BITS8Hpj.js");
340
340
  return t(e);
341
341
  }
342
342
  return r.exitCode;
@@ -344,8 +344,8 @@ var u = () => {
344
344
  help: {
345
345
  usage: "[app] [--preflight]",
346
346
  flags: [["--preflight", "check serve-bundle readiness and exit 1 if it is missing — never boots"]],
347
- examples: [["voltro serve", "production server for the app in the cwd (api or web, auto-detected)"], ["voltro serve . --preflight", "a Dockerfile/CI gate that catches \"prod serve, no build\""]],
348
- notes: ["In production a precompiled bundle is MANDATORY — run `voltro build` first."]
347
+ examples: [["voltro serve", "production API server for the app in the cwd"], ["voltro serve . --preflight", "a Dockerfile/CI gate that catches \"prod serve, no build\""]],
348
+ notes: ["In production a precompiled bundle is MANDATORY — run `voltro build` first.", "A WEB app is refused here and pointed at `voltro start` (production) / `voltro dev`."]
349
349
  }
350
350
  },
351
351
  {
@@ -364,17 +364,17 @@ var u = () => {
364
364
  handlesHelp: !0,
365
365
  summary: "Preflight an app for production: the precompiled serve bundle, hand-rolled primitives (naming the shipped one), @voltro/* version skew, executors with no access check, `.serverOnly()` leaks, and junction-FK gaps.",
366
366
  status: "wired",
367
- run: (e) => import("./doctorCommand-J3qu4E0Y.js").then((t) => t.runDoctorCommand(e))
367
+ run: (e) => import("./doctorCommand-BMWs6aVm.js").then((t) => t.runDoctorCommand(e))
368
368
  },
369
369
  {
370
370
  name: "build",
371
371
  summary: "Production build for a web app (vite build + per-page SSG pre-render).",
372
372
  status: "wired",
373
- run: (e) => import("./build-D4ygSbnV.js").then((t) => t.runBuildCommand(e)),
373
+ run: (e) => import("./build-CI36wL4R.js").then((t) => t.runBuildCommand(e)),
374
374
  help: {
375
375
  usage: "[app] [--target <t>]",
376
- flags: [["--target <t>", "build target"]],
377
- examples: [["voltro build", "production build for the app in the cwd"]],
376
+ flags: [["--target <t>", "build target"], ["--report", "print what a visitor downloads: first load, chunks, server artefacts"]],
377
+ examples: [["voltro build", "production build for the app in the cwd"], ["voltro build --report", "the same build, then its first-load size in bytes"]],
378
378
  notes: [
379
379
  "A web app gets the vite build + per-page SSG prerender + the start bundle; an api gets",
380
380
  "the precompiled serve bundle. Both regenerate their generated files first, so a clean",
@@ -386,7 +386,7 @@ var u = () => {
386
386
  name: "prune-runtime",
387
387
  summary: "Trim a deployed web tree’s node_modules to the reachable runtime set (standalone image slimming).",
388
388
  status: "wired",
389
- run: (e) => import("./runtimeTrace-CGWx1Q6l.js").then((t) => t.runPruneRuntimeCommand(e)),
389
+ run: (e) => import("./runtimeTrace-DgYMc09E.js").then((t) => t.runPruneRuntimeCommand(e)),
390
390
  hidden: !0
391
391
  },
392
392
  {
@@ -404,7 +404,7 @@ var u = () => {
404
404
  name: "dormancy",
405
405
  summary: "Single-node scale-to-zero: front the API with a wake-orchestrator that stops the app when idle and brings it back on a request or a due wakeup (cron/workflow). Needs a SQL store. Flags: --port, --app-port, --idle-grace-ms, --tick-ms.",
406
406
  status: "wired",
407
- run: (e) => import("./dormancyCommand-w1TrmgYP.js").then((t) => t.runDormancyCommand(e)),
407
+ run: (e) => import("./dormancyCommand-eXTQMbHU.js").then((t) => t.runDormancyCommand(e)),
408
408
  help: {
409
409
  usage: "[app] [--port <n>] [--app-port <n>] [--idle-grace-ms <n>] [--tick-ms <n>]",
410
410
  flags: [
@@ -421,7 +421,7 @@ var u = () => {
421
421
  name: "start",
422
422
  summary: "Production runtime: serves dist + SSR-on-demand for ssr/isr pages.",
423
423
  status: "wired",
424
- run: (e) => import("./start-B0bnJgxI.js").then((t) => t.runStartCommand(e)),
424
+ run: (e) => import("./start-BFQQkL1i.js").then((t) => t.runStartCommand(e)),
425
425
  help: {
426
426
  usage: "[app]",
427
427
  examples: [["voltro start", "serve a built web app (dist + SSR-on-demand)"]],
@@ -475,7 +475,7 @@ var u = () => {
475
475
  name: "db",
476
476
  summary: "Database subcommands. Declarative flow: plan, apply, branch, plans, drift [--accept], squash, restore-snapshot. File migrations: generate [name], migrate, rollback, status, files, rollback-file. Data + housekeeping: seed, gc-snapshots, adopt. Credentials at rest: scan-credentials (find plaintext), encrypt-column (migrate a populated column onto .encrypted()).",
477
477
  status: "wired",
478
- run: (e) => import("./dbCommand-CSFWs9ev.js").then((t) => t.runDbCommand(e)),
478
+ run: (e) => import("./dbCommand-DrycGWWt.js").then((t) => t.runDbCommand(e)),
479
479
  help: {
480
480
  usage: e(n),
481
481
  examples: [
@@ -491,7 +491,7 @@ var u = () => {
491
491
  name: "data",
492
492
  summary: "Export/import + backup/restore of app data. Logical (rows + optional assets): export <dir> [--tenant <id>|--tables a,b|--exclude a,b] [--assets] [--compression zstd|gzip|none] [--consistency live|snapshot]; import <dir> [--assets] [--no-verify]; transfers — the history in all four directions, including a run in flight; inspect <file|dir>; unpack <file> <dir>. Native (vendor dump, no resume): backup <dir> [--assets] / restore <dir> [--assets] (pg_dump/mariadb-dump/…) — a restore marks the database in-progress until it finishes. Recovery: clear-replace-marker, clear-staging. Resumable + typed-NDJSON on the logical path; content-addressed assets on both.",
493
493
  status: "wired",
494
- run: (e) => import("./dataCommand-DYzW8vkv.js").then((t) => t.runDataCommand(e)),
494
+ run: (e) => import("./dataCommand-2pccgbIy.js").then((t) => t.runDataCommand(e)),
495
495
  help: {
496
496
  usage: e(i),
497
497
  flags: [
@@ -555,20 +555,20 @@ var u = () => {
555
555
  handlesHelp: !0,
556
556
  summary: "Upgrade the app to the latest framework: bump every @voltro/* dependency (across ALL workspace members, install once at the workspace root), then run the codemods shipped with the target version. Flags: --to <version>, --from <version>, --codemods-only, --dry-run, --force, --exact, --help. After: run `voltro db apply`.",
557
557
  status: "wired",
558
- run: (e) => import("./updateCommand-CIoVDKnj.js").then((t) => t.runUpdateCommand(e))
558
+ run: (e) => import("./updateCommand-DsXEAHbd.js").then((t) => t.runUpdateCommand(e))
559
559
  },
560
560
  {
561
561
  name: "_apply-codemods",
562
562
  summary: "Internal: apply shipped codemods for a framework version jump (re-exec target of `voltro update`).",
563
563
  status: "wired",
564
564
  hidden: !0,
565
- run: (e) => import("./updateCommand-CIoVDKnj.js").then((t) => t.runApplyCodemods(e))
565
+ run: (e) => import("./updateCommand-DsXEAHbd.js").then((t) => t.runApplyCodemods(e))
566
566
  },
567
567
  {
568
568
  name: "embeddings",
569
569
  summary: "Embeddings tooling. Subcommand: backfill <table> --text <field> --vector <field> [--model <m>] [--model-field <f>] [--batch <n>] [--dry-run] — (re)embed rows the vectorEmbedding() mixin missed.",
570
570
  status: "wired",
571
- run: (e) => import("./embeddingsCommand-CMgPyRTr.js").then((t) => t.runEmbeddingsCommand(e)),
571
+ run: (e) => import("./embeddingsCommand-CTmiQvwa.js").then((t) => t.runEmbeddingsCommand(e)),
572
572
  help: {
573
573
  usage: "backfill <table> --text <field> --vector <field> [--model <m>] [--batch <n>] [--dry-run]",
574
574
  flags: [
@@ -614,14 +614,14 @@ var u = () => {
614
614
  summary: "Ask a RUNNING app whether its declared access is enforced. `access` calls every guarded procedure with NO credentials and reports any that answer (--process, --url, --strict, --format).",
615
615
  status: "wired",
616
616
  handlesHelp: !0,
617
- run: (e) => import("./probeCommand-_C0YU207.js").then((t) => t.runProbeCommand(e))
617
+ run: (e) => import("./probeCommand-6HxEkNDG.js").then((t) => t.runProbeCommand(e))
618
618
  },
619
619
  {
620
620
  name: "schedule",
621
621
  summary: "Operate on registered schedules. `run <name>` fires one on demand (--process, --trigger manual|external, --url).",
622
622
  status: "wired",
623
623
  handlesHelp: !0,
624
- run: (e) => import("./scheduleCmd-DQRu6BZC.js").then((t) => t.runScheduleCommand(e))
624
+ run: (e) => import("./scheduleCmd-DYBUfo_T.js").then((t) => t.runScheduleCommand(e))
625
625
  },
626
626
  {
627
627
  name: "schedule-manifest",
@@ -643,35 +643,35 @@ var u = () => {
643
643
  handlesHelp: !0,
644
644
  summary: "Tail recent log records from every running voltro process. --tail N --since 30s --level error --filter PAT --format json|pretty|text.",
645
645
  status: "wired",
646
- run: (e) => import("./logsCmd-B6oNsfaZ.js").then((t) => t.runLogsCommand(e))
646
+ run: (e) => import("./logsCmd-BU8uCdys.js").then((t) => t.runLogsCommand(e))
647
647
  },
648
648
  {
649
649
  name: "traces",
650
650
  handlesHelp: !0,
651
651
  summary: "Distributed traces from every running api. --tail N --errors --since 30s --process NAME --format json|pretty. Use --id <traceId> for the waterfall of one trace.",
652
652
  status: "wired",
653
- run: (e) => import("./tracesCmd-DgtgOUdi.js").then((t) => t.runTracesCommand(e))
653
+ run: (e) => import("./tracesCmd-BWYDqMy6.js").then((t) => t.runTracesCommand(e))
654
654
  },
655
655
  {
656
656
  name: "inspect",
657
657
  handlesHelp: !0,
658
658
  summary: "Query the live /_voltro/inspect/* surface. Subcommands: app, routes, rpc, metrics, cache, schedules, aggregates, invoke. --process NAME --format json|pretty. `schedules --failing` reports only broken crons and exits 1 if any (usable as a post-deploy gate).",
659
659
  status: "wired",
660
- run: (e) => import("./inspectCmd-niF97fAq.js").then((t) => t.runInspectCommand(e))
660
+ run: (e) => import("./inspectCmd-CP-G0sVK.js").then((t) => t.runInspectCommand(e))
661
661
  },
662
662
  {
663
663
  name: "workflows",
664
664
  handlesHelp: !0,
665
665
  summary: "Inspect + operate workflow runs. Subcommands: list, show <runId>, start <name>, retry|cancel|suspend|resume <runId>, signal|update <runId> --name, children <parentExecutionId>, flow (declarative flow-control queue + ledger), pause|unpause <workflowName>.",
666
666
  status: "wired",
667
- run: (e) => import("./workflowsCmd-BGF-mRZ5.js").then((t) => t.runWorkflowsCommand(e))
667
+ run: (e) => import("./workflowsCmd-g-DNpaUc.js").then((t) => t.runWorkflowsCommand(e))
668
668
  },
669
669
  {
670
670
  name: "cluster",
671
671
  handlesHelp: !0,
672
672
  summary: "Clustering snapshot of every running api. Subcommand: status — per-instance replicaId, runner address, dialect, CDC flavor, coordination, server_id, + a flag for SQL runners stuck on localhost. --process NAME --format json|pretty.",
673
673
  status: "wired",
674
- run: (e) => import("./clusterCmd-DrVFCzSj.js").then((t) => t.runClusterCommand(e))
674
+ run: (e) => import("./clusterCmd-CdLB1GkT.js").then((t) => t.runClusterCommand(e))
675
675
  },
676
676
  {
677
677
  name: "login",
@@ -1,6 +1,6 @@
1
- import { f as e } from "./dev-CmuvUKRq.js";
2
- import { Z as t, et as n } from "./webDev-DSI9SOhs.js";
3
- import { t as r } from "./start-Clz-1BHB.js";
1
+ import { f as e } from "./dev-Dw263KPu.js";
2
+ import { Q as t, tt as n } from "./webDev-C53hJdcL.js";
3
+ import { t as r } from "./start-B9NGB8gn.js";
4
4
  import { join as i } from "node:path";
5
5
  import { existsSync as a } from "node:fs";
6
6
  import { createLogger as o } from "@voltro/logger";