@voltro/cli 0.61.0 → 0.62.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 (89) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/apiBuild-Dl-djDc_.js +2 -0
  3. package/dist/{apiBuild-C5HhMAEm.js → apiBuild-DwhySM-6.js} +1 -1
  4. package/dist/bin.js +1 -1
  5. package/dist/{build-DQr7SsKK.js → build-B43mm2g2.js} +6 -6
  6. package/dist/{checkCommand-ByaOhdc8.js → checkCommand-nB68vIo_.js} +1 -1
  7. package/dist/{checkCommand-CvSheSdb.js → checkCommand-zGYZtIkJ.js} +3 -3
  8. package/dist/{codegenCommand-CI0mpjxo.js → codegenCommand-YvqhgQBj.js} +1 -1
  9. package/dist/{codemodRunner-Drb-H-jr.js → codemodRunner-D90bexh4.js} +77 -53
  10. package/dist/{commands-pCItjdHG.js → commands-Dd6Cp7qs.js} +19 -19
  11. package/dist/{dashboardCommand-O-ToEgiH.js → dashboardCommand-BsDfQa-g.js} +1 -1
  12. package/dist/{dataCommand-mn1Zc88W.js → dataCommand-Cgdcl5M0.js} +1 -1
  13. package/dist/{dev-dSH-Pkb2.js → dev-BfUG0jrD.js} +31 -11
  14. package/dist/{dev-kn9-7RXZ.js → dev-BpMSAjMk.js} +1 -1
  15. package/dist/doctorCommand-PHcqxpnx.js +2 -0
  16. package/dist/{doctorCommand-ClB7Ucz5.js → doctorCommand-pxYq2bH5.js} +10 -10
  17. package/dist/{dormancyCommand-DZupfuq-.js → dormancyCommand-DZpSCWy9.js} +1 -1
  18. package/dist/{embeddingsCommand-D8_GquVX.js → embeddingsCommand-YR5Eif0k.js} +1 -1
  19. package/dist/{envCommand-DRjVSXRp.js → envCommand-Yl4TGM4h.js} +1 -1
  20. package/dist/{evolveCommand-Cb0C2b3V.js → evolveCommand-B2iYAC9t.js} +2 -2
  21. package/dist/index.js +1 -1
  22. package/dist/{infoCommand-BlKnoY2D.js → infoCommand-DjtMWLZl.js} +1 -1
  23. package/dist/{probeCommand-DYsOFm62.js → probeCommand-Dsu5if_4.js} +1 -1
  24. package/dist/{runtimeTrace-BI3kdicc.js → runtimeTrace-CQcn26bI.js} +1 -1
  25. package/dist/{sdkgen-DZ4zCtV4.js → sdkgen-DJvyVw7B.js} +1 -1
  26. package/dist/serveCommand-CZ0kgfIX.js +2 -0
  27. package/dist/{serveCommand-DnxqCQ16.js → serveCommand-CaLTTh68.js} +2 -2
  28. package/dist/serveEntry.js +1 -1
  29. package/dist/updateCommand-DA4OMF7u.js +2 -0
  30. package/dist/{updateCommand-B18ZQNFg.js → updateCommand-F6HFgz0i.js} +1 -1
  31. package/dist/{webhooksCommand-Bs-HZ4wY.js → webhooksCommand-Bgdli8dI.js} +1 -1
  32. package/package.json +25 -19
  33. package/templates/AGENTS.md +1 -1
  34. package/templates/agent-docs/_index.md +1 -1
  35. package/templates/agent-docs/ai.md +32 -0
  36. package/templates/agent-docs/observability.md +10 -1
  37. package/templates/agent-docs/whats-new.md +7 -14
  38. package/templates/agent-docs/workflows.md +7 -2
  39. package/templates/apps/api-ai/package.json +6 -6
  40. package/templates/apps/api-auth/package.json +8 -8
  41. package/templates/apps/api-backend/package.json +7 -7
  42. package/templates/apps/api-backend-deactivation/package.json +7 -7
  43. package/templates/apps/api-backend-mail/package.json +8 -8
  44. package/templates/apps/api-backend-mariadb/package.json +9 -9
  45. package/templates/apps/api-backend-sqlite/package.json +8 -8
  46. package/templates/apps/api-backend-storage/package.json +8 -8
  47. package/templates/apps/api-cms/package.json +9 -9
  48. package/templates/apps/api-collab/package.json +8 -8
  49. package/templates/apps/api-data-advanced/package.json +8 -8
  50. package/templates/apps/api-durable/package.json +8 -8
  51. package/templates/apps/api-feature-flags/package.json +9 -9
  52. package/templates/apps/api-governance/package.json +8 -8
  53. package/templates/apps/api-kv/package.json +8 -8
  54. package/templates/apps/api-moderation/package.json +8 -8
  55. package/templates/apps/api-observability/package.json +8 -8
  56. package/templates/apps/api-ratelimit/package.json +8 -8
  57. package/templates/apps/api-rbac/package.json +8 -8
  58. package/templates/apps/api-rest/package.json +7 -7
  59. package/templates/apps/api-row-history/package.json +8 -8
  60. package/templates/apps/api-saas/package.json +11 -11
  61. package/templates/apps/api-saas-starter/package.json +10 -10
  62. package/templates/apps/api-search/package.json +8 -8
  63. package/templates/apps/api-status/package.json +8 -8
  64. package/templates/apps/api-webhooks/package.json +9 -9
  65. package/templates/apps/changelog/package.json +7 -7
  66. package/templates/apps/edge-functions/package.json +2 -2
  67. package/templates/apps/frontend-admin/package.json +7 -7
  68. package/templates/apps/frontend-app/package.json +8 -8
  69. package/templates/apps/frontend-auth/package.json +7 -7
  70. package/templates/apps/frontend-blank/package.json +6 -6
  71. package/templates/apps/frontend-cms/package.json +8 -8
  72. package/templates/apps/frontend-collab/package.json +9 -9
  73. package/templates/apps/frontend-contact/package.json +7 -7
  74. package/templates/apps/frontend-dashboard/package.json +6 -6
  75. package/templates/apps/frontend-docs/package.json +8 -8
  76. package/templates/apps/frontend-i18n/package.json +6 -6
  77. package/templates/apps/frontend-landing/package.json +7 -7
  78. package/templates/apps/frontend-portal/package.json +7 -7
  79. package/templates/apps/frontend-saas/package.json +7 -7
  80. package/templates/apps/frontend-spa/package.json +6 -6
  81. package/templates/apps/frontend-ssr/package.json +6 -6
  82. package/templates/apps/frontend-ssr-api/package.json +7 -7
  83. package/templates/apps/frontend-static-blog/package.json +8 -8
  84. package/templates/apps/frontend-status/package.json +7 -7
  85. package/templates/apps/mobile-app/package.json +4 -4
  86. package/dist/apiBuild-5U7PxjLa.js +0 -2
  87. package/dist/doctorCommand-BVat2ejT.js +0 -2
  88. package/dist/serveCommand-CwK_6Wxt.js +0 -2
  89. package/dist/updateCommand-B4EgDD-m.js +0 -2
package/CHANGELOG.md CHANGED
@@ -39,6 +39,24 @@ _Changes staged for the next release accumulate here (rolled up from
39
39
 
40
40
  ---
41
41
 
42
+ ## [0.62.0] — 2026-09-01
43
+
44
+ ### ⚠ BREAKING
45
+
46
+ - **@voltro/workflow, @voltro/cli, @voltro/voltro** — `timeouts.finish` now filters running rows by the declared workflow, durably cancels each run before notification, and emits `onFailure` only for the successful terminal transition. Finish-timeout reports carry the run's stable `runId`, `executionId`, and original payload; handler-start logs expose the returned status instead of unconditionally claiming a new start.
47
+
48
+ Low-level adapters that construct `AdmissionDrainDeps` must update `cancelRun` to accept the run object and return whether it made the terminal transition, and return the run identity, workflow name, and payload from `listRunningRuns`. Ordinary workflow declarations need no source change; `voltro update` prints the adapter migration only when the project references this low-level surface.
49
+
50
+ ### Added
51
+
52
+ - **@voltro/ai** — `streamText` and `resumableStreamText` now accept an opt-in `smooth` configuration for word- or line-based text and reasoning chunks. Smoothing runs before resumable journaling, preserves provider-native behavior when omitted, and shares the stream abort signal so cancellation also stops a pending smoothing delay.
53
+
54
+ ### Fixed
55
+
56
+ - **@voltro/web** — Production `framework_debug` now enables local framework diagnostics without opening browser-to-inspect HTTP or SSE transports. Development log relays are single-flight and rate-limited, classify permanent response failures, back off transient failures, expose dropped-log counts, and open a page-scoped circuit after repeated failure; the SSE relay also probes the endpoint before creating an `EventSource` and closes failed sources before retrying.
57
+
58
+ ---
59
+
42
60
  ## [0.61.0] — 2026-08-31
43
61
 
44
62
  ### ⚠ BREAKING
@@ -0,0 +1,2 @@
1
+ import { c as e, l as t } from "./apiBuild-DwhySM-6.js";
2
+ export { e as runApiBuild, t as runServeBundleBuild };
@@ -1,4 +1,4 @@
1
- import { m as e } from "./dev-dSH-Pkb2.js";
1
+ import { m as e } from "./dev-BfUG0jrD.js";
2
2
  import { Qt as t } from "./webDev-CYjhmOTZ.js";
3
3
  import { t as n } from "./dialectDriver-czCHYpeH.js";
4
4
  import { dirname as r, isAbsolute as i, join as a, relative as o, resolve as s } from "node:path";
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { r as e } from "./commands-pCItjdHG.js";
2
+ import { r as e } from "./commands-Dd6Cp7qs.js";
3
3
  import { a as t } from "./nodeEnvironment-cGFAj1J8.js";
4
4
  import { t as n } from "./loadEnv-D9nEOClM.js";
5
5
  import { n as r } from "./cliError-BmdYnghb.js";
@@ -1,6 +1,6 @@
1
- import { An as e } from "./dev-dSH-Pkb2.js";
1
+ import { An as e } from "./dev-BfUG0jrD.js";
2
2
  import { At as t, Ct as n, D as r, Dt as i, Et as a, J as o, K as s, Mt as c, Nt as l, Ot as u, Qt as d, St as f, T as p, Tt as m, Yt as h, _t as g, c as _, et as v, gt as y, h as b, kt as x, m as S, nt as C, o as w, q as T, tt as E, u as D, vt as ee, w as te, wt as O, zt as k } from "./webDev-CYjhmOTZ.js";
3
- import { d as A, i as j, o as M, s as N } from "./apiBuild-C5HhMAEm.js";
3
+ import { d as A, i as j, o as M, s as N } from "./apiBuild-DwhySM-6.js";
4
4
  import { t as P } from "./cliRuntime-Dh7UDinH.js";
5
5
  import { a as F } from "./renderModeScan-43yQ2opo.js";
6
6
  import { o as I } from "./imagePipeline-CBZmjT4i.js";
@@ -659,7 +659,7 @@ var X = W({ scope: "voltro:build" }), ie = async (e, t = {}) => {
659
659
  file: n.file,
660
660
  reason: n.reason
661
661
  });
662
- let { regenerateRpcGroup: r } = await import("./codegenCommand-CI0mpjxo.js"), i = await r(e);
662
+ let { regenerateRpcGroup: r } = await import("./codegenCommand-YvqhgQBj.js"), i = await r(e);
663
663
  if (i.kind === "refused") {
664
664
  $.warn("could not regenerate the rpc group — building against what is on disk", { reason: i.reason });
665
665
  return;
@@ -671,7 +671,7 @@ var X = W({ scope: "voltro:build" }), ie = async (e, t = {}) => {
671
671
  }, Te = async (e) => {
672
672
  let n = await S(e, { preferSource: !0 });
673
673
  if (!n) {
674
- let { loadApiConfigDiagnosed: t } = await import("./dev-kn9-7RXZ.js"), n = await t(e), r = n.config;
674
+ let { loadApiConfigDiagnosed: t } = await import("./dev-BpMSAjMk.js"), n = await t(e), r = n.config;
675
675
  if (!r && n.present) return $.error("app.config.ts is present but could not be loaded — this is NOT a statement about the app's type", { path: z(e, "app.config.ts") }, n.error), {
676
676
  ran: !0,
677
677
  exitCode: 1
@@ -688,7 +688,7 @@ var X = W({ scope: "voltro:build" }), ie = async (e, t = {}) => {
688
688
  ran: !0,
689
689
  exitCode: 1
690
690
  };
691
- let { runApiBuild: i, runServeBundleBuild: a } = await import("./apiBuild-5U7PxjLa.js");
691
+ let { runApiBuild: i, runServeBundleBuild: a } = await import("./apiBuild-Dl-djDc_.js");
692
692
  await i(e, { sourcemaps: n.emit });
693
693
  try {
694
694
  await a(e, { sourcemaps: n.emit });
@@ -1055,7 +1055,7 @@ var X = W({ scope: "voltro:build" }), ie = async (e, t = {}) => {
1055
1055
  return t.ran ? t.exitCode : (yield* K.logError("no voltro app found at this path", { hint: "looked for an app.config.ts with `type: 'web'` or `type: 'api'` — a web app gets the vite build + prerender + start bundle, an api gets the precompiled serve bundle" }), 1);
1056
1056
  }), De = async (t) => {
1057
1057
  if (G("build"), t.includes("--target")) {
1058
- let { runSdkBuildCommand: e } = await import("./sdkgen-DZ4zCtV4.js");
1058
+ let { runSdkBuildCommand: e } = await import("./sdkgen-DJvyVw7B.js");
1059
1059
  return e(t);
1060
1060
  }
1061
1061
  let n = t.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await P(Ee(n), { scope: "voltro:build" });
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, o as n } from "./checkCommand-CvSheSdb.js";
1
+ import { a as e, i as t, o as n } from "./checkCommand-zGYZtIkJ.js";
2
2
  export { t as offlineManifest, e as runCheckCommand, n as toInput };
@@ -4,7 +4,7 @@ import { r } from "./appGraph-yRuKjOba.js";
4
4
  import { n as i } from "./cliOutput-D1tSBoRM.js";
5
5
  import { n as a, o, r as s, t as c } from "./inspectFetch-BU1NyzxV.js";
6
6
  import { r as l } from "./fileTaxonomy-CbyMQYx_.js";
7
- import { S as u } from "./doctorCommand-ClB7Ucz5.js";
7
+ import { S as u } from "./doctorCommand-pxYq2bH5.js";
8
8
  import { resolve as d } from "node:path";
9
9
  import { readdirSync as f, statSync as p } from "node:fs";
10
10
  import { isReactivityChannelKey as m } from "@voltro/protocol";
@@ -170,9 +170,9 @@ var h = (e) => (e === void 0 ? [] : typeof e == "string" ? [e] : e).filter((e) =
170
170
  let t = e.severity === "error" ? "✗ error" : "⚠ warn", n = e.file ? ` (${e.file})` : "";
171
171
  return `${t} ${e.rule} ${e.node}${n}\n ${e.breaks.join("; ")}\n fix: ${e.fix}`;
172
172
  }).join("\n"), O = async (e) => {
173
- let { walk: t, loadDiscovered: n, loadApiConfig: r } = await import("./dev-kn9-7RXZ.js"), { buildRpcEntry: i } = await import("./manifestBuild-AUh31bFU.js"), { buildCapabilityManifest: a } = await import("./inspect-CZvsmp8t.js"), { relative: o } = await import("node:path"), s = await n(await t(e), { root: e }), c = await r(e).then((e) => e?.plugins ?? []).catch(() => []);
173
+ let { walk: t, loadDiscovered: n, loadApiConfig: r } = await import("./dev-BpMSAjMk.js"), { buildRpcEntry: i } = await import("./manifestBuild-AUh31bFU.js"), { buildCapabilityManifest: a } = await import("./inspect-CZvsmp8t.js"), { relative: o } = await import("node:path"), s = await n(await t(e), { root: e }), c = await r(e).then((e) => e?.plugins ?? []).catch(() => []);
174
174
  try {
175
- let { mergePluginRoutesInto: e } = await import("./dev-kn9-7RXZ.js");
175
+ let { mergePluginRoutesInto: e } = await import("./dev-BpMSAjMk.js");
176
176
  e({
177
177
  plugins: c,
178
178
  queries: s.queries,
@@ -1,4 +1,4 @@
1
- import { In as e, J as t, Ln as n, d as r, u as i } from "./dev-dSH-Pkb2.js";
1
+ import { In as e, J as t, Ln as n, d as r, u as i } from "./dev-BfUG0jrD.js";
2
2
  import { n as a } from "./frameworkTableAssembly-vfkzuzEo.js";
3
3
  import { i as o, r as s } from "./codegen-Bth5lUTU.js";
4
4
  import { n as c, r as l } from "./mobileCommand-D9O6iq3D.js";
@@ -6653,7 +6653,29 @@ var C = (e, t, n) => {
6653
6653
  "`traceId` identifies the client call span. It joins to server logs only",
6654
6654
  "when the server accepted the request; its presence is not delivery proof."
6655
6655
  ].join("\n")
6656
- }), ya = (e) => /@voltro\/plugin-sentry(?:\/web)?|\bsentry\s*:/.test(e.getFullText()), J = [
6656
+ }), ya = (e) => /@voltro\/plugin-sentry(?:\/web)?|\bsentry\s*:/.test(e.getFullText()), ba = T({
6657
+ version: "0.61.0",
6658
+ id: "0.61.0/02_sentry_rpc_spans_join_page",
6659
+ title: "Sentry rpc spans now join the active browser transaction",
6660
+ kind: "manual",
6661
+ appliesTo: ({ project: e }) => e.getSourceFiles().some(ya),
6662
+ note: [
6663
+ "Browser rpc markers are now children of the active page/navigation",
6664
+ "transaction, with a span link to the Effect/server trace. They no longer",
6665
+ "create one root Sentry transaction and envelope per rpc call.",
6666
+ "",
6667
+ "`tracesSampleRate` now controls the page transaction and its rpc children.",
6668
+ "`browserTracing: false` also defaults the rpc bridge to off while browser",
6669
+ "error capture stays active. Set `rpcSpans: true` only if your app creates",
6670
+ "its own active Sentry transactions, or set `rpcSpans: false` to keep page",
6671
+ "performance traces without rpc child spans.",
6672
+ "",
6673
+ "`sentryTraceHeader` was removed. Delete direct imports and use the normal",
6674
+ "`initSentryBrowser` bridge. Custom instrumentation should create a",
6675
+ "parent-only child of Sentry's active transaction and attach the Effect",
6676
+ "trace context as a span link."
6677
+ ].join("\n")
6678
+ }), xa = (e) => /\b(?:AdmissionDrainDeps|makeFlowControlGate)\b/.test(e.getFullText()), J = [
6657
6679
  he,
6658
6680
  ge,
6659
6681
  ve,
@@ -6800,27 +6822,29 @@ var C = (e, t, n) => {
6800
6822
  ga,
6801
6823
  ma,
6802
6824
  va,
6825
+ ba,
6803
6826
  T({
6804
- version: "0.61.0",
6805
- id: "0.61.0/02_sentry_rpc_spans_join_page",
6806
- title: "Sentry rpc spans now join the active browser transaction",
6827
+ version: "0.62.0",
6828
+ id: "0.62.0/01_finish_timeout_uses_durable_cancellation",
6829
+ title: "Finish timeouts use durable, once-only cancellation",
6807
6830
  kind: "manual",
6808
- appliesTo: ({ project: e }) => e.getSourceFiles().some(ya),
6831
+ appliesTo: ({ project: e }) => e.getSourceFiles().some(xa),
6809
6832
  note: [
6810
- "Browser rpc markers are now children of the active page/navigation",
6811
- "transaction, with a span link to the Effect/server trace. They no longer",
6812
- "create one root Sentry transaction and envelope per rpc call.",
6833
+ "`AdmissionDrainDeps.cancelRun` NOW RECEIVES one object:",
6834
+ "",
6835
+ " { workflowName, runId, executionId, reason, detail? }",
6836
+ "",
6837
+ "Return `true` only when this call changed the durable run from running to",
6838
+ "terminal; return `false` when it was already terminal or absent. The true",
6839
+ "result is the once-only claim that owns the `onFailure` signal.",
6813
6840
  "",
6814
- "`tracesSampleRate` now controls the page transaction and its rpc children.",
6815
- "`browserTracing: false` also defaults the rpc bridge to off while browser",
6816
- "error capture stays active. Set `rpcSpans: true` only if your app creates",
6817
- "its own active Sentry transactions, or set `rpcSpans: false` to keep page",
6818
- "performance traces without rpc child spans.",
6841
+ "`listRunningRuns(workflowName)` rows now include `runId`, `workflowName`,",
6842
+ "`executionId`, `payload`, and epoch-ms `startedAt`. Filter by the exact",
6843
+ "workflow and `running` status before returning them.",
6819
6844
  "",
6820
- "`sentryTraceHeader` was removed. Delete direct imports and use the normal",
6821
- "`initSentryBrowser` bridge. Custom instrumentation should create a",
6822
- "parent-only child of Sentry's active transaction and attach the Effect",
6823
- "trace context as a span link."
6845
+ "`onAbandoned` may receive `runId` and `executionId`; forward them to the",
6846
+ "failure report. They are populated for `timeouts.finish` and remain absent",
6847
+ "for failures that happen before a run exists."
6824
6848
  ].join("\n")
6825
6849
  })
6826
6850
  ], Y = /* @__PURE__ */ new Set([
@@ -6835,12 +6859,12 @@ var C = (e, t, n) => {
6835
6859
  ".turbo",
6836
6860
  ".cache",
6837
6861
  ".output"
6838
- ]), ba = () => [...[...Y].map((e) => `**/${e}/**`), "**/.voltro-*/**"], X = /(?:from|import)\s*\(?\s*['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\)/g, xa = /\.(?:tsx?|jsx?|mjs|cjs)$/, Sa = (e) => g(e).replace(xa, ""), Ca = (e) => {
6862
+ ]), Sa = () => [...[...Y].map((e) => `**/${e}/**`), "**/.voltro-*/**"], X = /(?:from|import)\s*\(?\s*['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\)/g, Ca = /\.(?:tsx?|jsx?|mjs|cjs)$/, wa = (e) => g(e).replace(Ca, ""), Ta = (e) => {
6839
6863
  let t = e.split("/").filter((e) => e.length > 0).pop();
6840
6864
  if (t === void 0 || t === "." || t === "..") return;
6841
- let n = t.replace(xa, "");
6865
+ let n = t.replace(Ca, "");
6842
6866
  return n.length > 0 ? n : void 0;
6843
- }, wa = (e) => {
6867
+ }, Ea = (e) => {
6844
6868
  let t = /* @__PURE__ */ new Map();
6845
6869
  for (let n of e) {
6846
6870
  let e;
@@ -6851,24 +6875,24 @@ var C = (e, t, n) => {
6851
6875
  }
6852
6876
  X.lastIndex = 0;
6853
6877
  for (let r = X.exec(e); r !== null; r = X.exec(e)) {
6854
- let e = Ca(r[1] ?? r[2] ?? "");
6878
+ let e = Ta(r[1] ?? r[2] ?? "");
6855
6879
  if (e === void 0) continue;
6856
6880
  let i = t.get(e);
6857
6881
  i === void 0 ? t.set(e, /* @__PURE__ */ new Set([n])) : i.add(n);
6858
6882
  }
6859
6883
  }
6860
6884
  return t;
6861
- }, Ta = (e, t) => {
6885
+ }, Da = (e, t) => {
6862
6886
  let n = new Set(e);
6863
- for (let r of e) for (let e of [Sa(r), g(_(r))]) {
6887
+ for (let r of e) for (let e of [wa(r), g(_(r))]) {
6864
6888
  let r = t.get(e);
6865
6889
  if (r !== void 0) for (let e of r) n.add(e);
6866
6890
  }
6867
6891
  return n;
6868
- }, Ea = /* @__PURE__ */ ".ts,.tsx,.mts,.cts,.js,.jsx,.mjs,.cjs,.yml,.yaml,.toml,.json,.jsonc,.ini,.cfg,.conf,.sh,.bash,.zsh,.fish,.ps1,.bat,.cmd,.md,.mdx,.rst,.txt,.adoc,Makefile,makefile,GNUmakefile,Justfile,justfile,Dockerfile,Containerfile,Procfile,Jenkinsfile,Rakefile,Taskfile".split(","), Da = 2097152, Oa = 4e4, ka = (e) => {
6892
+ }, Oa = /* @__PURE__ */ ".ts,.tsx,.mts,.cts,.js,.jsx,.mjs,.cjs,.yml,.yaml,.toml,.json,.jsonc,.ini,.cfg,.conf,.sh,.bash,.zsh,.fish,.ps1,.bat,.cmd,.md,.mdx,.rst,.txt,.adoc,Makefile,makefile,GNUmakefile,Justfile,justfile,Dockerfile,Containerfile,Procfile,Jenkinsfile,Rakefile,Taskfile".split(","), ka = 2097152, Aa = 4e4, ja = (e) => {
6869
6893
  let t = e.slice(e.lastIndexOf("/") + 1);
6870
- return Ea.some((e) => e.startsWith(".") ? t.endsWith(e) : t === e);
6871
- }, Aa = (e) => {
6894
+ return Oa.some((e) => e.startsWith(".") ? t.endsWith(e) : t === e);
6895
+ }, Ma = (e) => {
6872
6896
  try {
6873
6897
  let t = ne("git", [
6874
6898
  "ls-files",
@@ -6889,19 +6913,19 @@ var C = (e, t, n) => {
6889
6913
  } catch {
6890
6914
  return;
6891
6915
  }
6892
- }, Z = (e, t = Aa) => {
6916
+ }, Z = (e, t = Ma) => {
6893
6917
  let n = t(e);
6894
- if (n === void 0) return ja;
6918
+ if (n === void 0) return Na;
6895
6919
  let r = /* @__PURE__ */ new Map(), i = [];
6896
6920
  for (let t of n) {
6897
- if (t.split("/").some((e) => Y.has(e)) || !ka(t)) continue;
6898
- if (r.size >= Oa) {
6921
+ if (t.split("/").some((e) => Y.has(e)) || !ja(t)) continue;
6922
+ if (r.size >= Aa) {
6899
6923
  i.push(t);
6900
6924
  continue;
6901
6925
  }
6902
6926
  let n = v(e, t);
6903
6927
  try {
6904
- if (te(n).size > Da) {
6928
+ if (te(n).size > ka) {
6905
6929
  i.push(t);
6906
6930
  continue;
6907
6931
  }
@@ -6925,45 +6949,45 @@ var C = (e, t, n) => {
6925
6949
  scanned: r.size,
6926
6950
  skipped: i
6927
6951
  };
6928
- }, ja = {
6952
+ }, Na = {
6929
6953
  find: () => [],
6930
6954
  scanned: 0,
6931
6955
  skipped: []
6932
- }, Ma = [
6956
+ }, Pa = [
6933
6957
  "**/*.ts",
6934
6958
  "**/*.tsx",
6935
6959
  "!**/node_modules/**",
6936
6960
  "!**/dist/**",
6937
6961
  "!**/.framework/**",
6938
6962
  "!**/*.d.ts"
6939
- ], Q = (e, t, n = Fa) => {
6963
+ ], Q = (e, t, n = La) => {
6940
6964
  let r = /* @__PURE__ */ new Set();
6941
- for (let e of t) for (let t of e.scope ?? Ma) r.add(t);
6965
+ for (let e of t) for (let t of e.scope ?? Pa) r.add(t);
6942
6966
  let i = n(e);
6943
6967
  if (i !== void 0) {
6944
- let t = [...r].filter((e) => !e.startsWith("!")).map((e) => Pa(e)), n = [...r].filter((e) => e.startsWith("!")).map((e) => Pa(e.slice(1))), a = [...Y], o = [];
6968
+ let t = [...r].filter((e) => !e.startsWith("!")).map((e) => Ia(e)), n = [...r].filter((e) => e.startsWith("!")).map((e) => Ia(e.slice(1))), a = [...Y], o = [];
6945
6969
  for (let r of i) {
6946
6970
  if (a.some((e) => r === e || r.startsWith(`${e}/`) || r.includes(`/${e}/`)) || !t.some((e) => e(r)) || n.some((e) => e(r))) continue;
6947
6971
  let i = v(e, r);
6948
6972
  y(i) && o.push(i);
6949
6973
  }
6950
- return Na(o.length, e), o;
6974
+ return Fa(o.length, e), o;
6951
6975
  }
6952
6976
  let a = ae([...r], {
6953
6977
  cwd: e,
6954
6978
  absolute: !0,
6955
6979
  expandDirectories: !1,
6956
6980
  followSymbolicLinks: !1,
6957
- ignore: [...ba()]
6981
+ ignore: [...Sa()]
6958
6982
  });
6959
- return Na(a.length, e), a;
6960
- }, Na = (e, t) => {
6961
- let n = Ia();
6983
+ return Fa(a.length, e), a;
6984
+ }, Fa = (e, t) => {
6985
+ let n = Ra();
6962
6986
  if (!(e <= n)) throw Error(`voltro update: the codemod scan matched ${e} files under ${t}, past the ${n} ceiling.\n Every matched file is parsed into one ts-morph project, so the heap needed grows with\n this number — past the ceiling it runs out of memory, and V8 aborts without naming a\n limit, which is why this stops here instead. Three ways out, in order:\n • put non-source directories in .gitignore (inside a git repo the scan then never\n sees them at all — a build cache, a data dump, a virtualenv),\n • run \`voltro update\` from the app directory rather than the workspace root, or\n • take one codemod at a time: \`voltro update --dry-run\` lists the ids, then\n \`voltro update --codemods-only --only <id>\` runs a single one.\n If every one of those files really is source this pass must rewrite, raise the ceiling\n with VOLTRO_CODEMOD_MAX_FILES and give node room: NODE_OPTIONS=--max-old-space-size=8192.`);
6963
- }, Pa = (e) => {
6987
+ }, Ia = (e) => {
6964
6988
  let t = e.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*\//g, "\0").replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*").replace(/\u0000/g, "(?:.*/)?").replace(/\\\{([^}]*)\\\}/g, (e, t) => `(?:${t.split(",").join("|")})`);
6965
6989
  return (e) => RegExp(`^${t}$`).test(e);
6966
- }, Fa = (e) => {
6990
+ }, La = (e) => {
6967
6991
  try {
6968
6992
  let t = ne("git", [
6969
6993
  "ls-files",
@@ -6984,7 +7008,7 @@ var C = (e, t, n) => {
6984
7008
  } catch {
6985
7009
  return;
6986
7010
  }
6987
- }, Ia = () => {
7011
+ }, Ra = () => {
6988
7012
  let e = Number(process.env.VOLTRO_CODEMOD_MAX_FILES);
6989
7013
  return Number.isInteger(e) && e > 0 ? e : 2e4;
6990
7014
  }, $ = (e, t) => {
@@ -6994,7 +7018,7 @@ var C = (e, t, n) => {
6994
7018
  if (t !== 0) return t;
6995
7019
  }
6996
7020
  return 0;
6997
- }, La = (e, t, n = J) => n.filter((n) => $(e, n.version) < 0 && $(n.version, t) <= 0).slice().sort(me), Ra = (e, t, n = () => {}, r = ja) => {
7021
+ }, za = (e, t, n = J) => n.filter((n) => $(e, n.version) < 0 && $(n.version, t) <= 0).slice().sort(me), Ba = (e, t, n = () => {}, r = Na) => {
6998
7022
  let i = [], a = [], o = [];
6999
7023
  for (let s of t) {
7000
7024
  let t = !s.appliesTo || s.appliesTo({
@@ -7045,8 +7069,8 @@ var C = (e, t, n) => {
7045
7069
  manual: a,
7046
7070
  skipped: o
7047
7071
  };
7048
- }, za = async (e) => {
7049
- let t = e.log ?? (() => {}), n = La(e.from, e.to, e.codemods ?? J), r = e.only === void 0 || e.only.length === 0 ? n : (() => {
7072
+ }, Va = async (e) => {
7073
+ let t = e.log ?? (() => {}), n = za(e.from, e.to, e.codemods ?? J), r = e.only === void 0 || e.only.length === 0 ? n : (() => {
7050
7074
  let t = n.filter((t) => e.only.includes(t.id)), r = e.only.filter((e) => !n.some((t) => t.id === e));
7051
7075
  if (r.length > 0) throw Error(`voltro update --only: no codemod in ${e.from} → ${e.to} has id ${r.map((e) => `"${e}"`).join(", ")}.\n Available for this jump:\n${n.map((e) => ` ${e.id}`).join("\n")}`);
7052
7076
  return t;
@@ -7073,15 +7097,15 @@ var C = (e, t, n) => {
7073
7097
  get skipped() {
7074
7098
  return (p ??= Z(e.root)).skipped;
7075
7099
  }
7076
- }, h = c.length > 0 ? wa(Q(e.root, [{
7100
+ }, h = c.length > 0 ? Ea(Q(e.root, [{
7077
7101
  ...c[0],
7078
- scope: Ma
7102
+ scope: Pa
7079
7103
  }])) : void 0;
7080
7104
  for (let n of r) {
7081
7105
  if (c.includes(n)) {
7082
7106
  let r = a(), i = Q(e.root, [n]);
7083
- for (let e of Ta(i, h)) y(e) && r.addSourceFileAtPath(e);
7084
- let s = Ra(r, [n], t, m);
7107
+ for (let e of Da(i, h)) y(e) && r.addSourceFileAtPath(e);
7108
+ let s = Ba(r, [n], t, m);
7085
7109
  e.dryRun || await r.save(), l.push(...s.applied), u.push(...s.manual), d.push(...s.skipped), o = void 0;
7086
7110
  continue;
7087
7111
  }
@@ -7090,7 +7114,7 @@ var C = (e, t, n) => {
7090
7114
  for (let t of s) y(t) && e.addSourceFileAtPath(t);
7091
7115
  return e;
7092
7116
  })();
7093
- let r = Ra(o, [n], t, m);
7117
+ let r = Ba(o, [n], t, m);
7094
7118
  e.dryRun || await o.save(), l.push(...r.applied), u.push(...r.manual), d.push(...r.skipped);
7095
7119
  }
7096
7120
  return {
@@ -7100,4 +7124,4 @@ var C = (e, t, n) => {
7100
7124
  };
7101
7125
  };
7102
7126
  //#endregion
7103
- export { T as i, za as n, Y as r, $ as t };
7127
+ export { T as i, Va as n, Y as r, $ as t };
@@ -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-kn9-7RXZ.js").then((t) => t.runDev(e)),
94
+ run: (e) => import("./dev-BpMSAjMk.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-O-ToEgiH.js").then((t) => t.runDashboardCommand(e)),
112
+ run: (e) => import("./dashboardCommand-BsDfQa-g.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-ByaOhdc8.js").then((t) => t.runCheckCommand(e)),
124
+ run: (e) => import("./checkCommand-nB68vIo_.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-Bs-HZ4wY.js").then((t) => t.runWebhooksCommand(e)),
158
+ run: (e) => import("./webhooksCommand-Bgdli8dI.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-Cb0C2b3V.js").then((t) => t.runEvolveCommand(e)),
174
+ run: (e) => import("./evolveCommand-B2iYAC9t.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-CI0mpjxo.js").then((t) => t.runCodegenCommand(e)),
191
+ run: (e) => import("./codegenCommand-YvqhgQBj.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"]],
@@ -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-BlKnoY2D.js").then((t) => t.runInfoCommand(e)),
284
+ run: (e) => import("./infoCommand-DjtMWLZl.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-DRjVSXRp.js").then((t) => t.runEnvCommand(e)),
305
+ run: (e) => import("./envCommand-Yl4TGM4h.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"]],
@@ -331,12 +331,12 @@ var u = () => {
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-BVat2ejT.js");
334
+ let { runServePreflight: e } = await import("./doctorCommand-PHcqxpnx.js");
335
335
  return e(s(t), !0);
336
336
  }
337
337
  let { tryRunWebServe: n } = await import("./webDev-CuG3Ged-.js"), r = await n(s(t));
338
338
  if (!r.ran) {
339
- let { runServeDispatch: t } = await import("./serveCommand-CwK_6Wxt.js");
339
+ let { runServeDispatch: t } = await import("./serveCommand-CZ0kgfIX.js");
340
340
  return t(e);
341
341
  }
342
342
  return r.exitCode;
@@ -364,13 +364,13 @@ 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-BVat2ejT.js").then((t) => t.runDoctorCommand(e))
367
+ run: (e) => import("./doctorCommand-PHcqxpnx.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-DQr7SsKK.js").then((t) => t.runBuildCommand(e)),
373
+ run: (e) => import("./build-B43mm2g2.js").then((t) => t.runBuildCommand(e)),
374
374
  help: {
375
375
  usage: "[app] [--target <t>]",
376
376
  flags: [["--target <t>", "build target"], ["--report", "print what a visitor downloads: first load, chunks, server artefacts"]],
@@ -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-BI3kdicc.js").then((t) => t.runPruneRuntimeCommand(e)),
389
+ run: (e) => import("./runtimeTrace-CQcn26bI.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-DZupfuq-.js").then((t) => t.runDormancyCommand(e)),
407
+ run: (e) => import("./dormancyCommand-DZpSCWy9.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: [
@@ -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-mn1Zc88W.js").then((t) => t.runDataCommand(e)),
494
+ run: (e) => import("./dataCommand-Cgdcl5M0.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-B4EgDD-m.js").then((t) => t.runUpdateCommand(e))
558
+ run: (e) => import("./updateCommand-DA4OMF7u.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-B4EgDD-m.js").then((t) => t.runApplyCodemods(e))
565
+ run: (e) => import("./updateCommand-DA4OMF7u.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-D8_GquVX.js").then((t) => t.runEmbeddingsCommand(e)),
571
+ run: (e) => import("./embeddingsCommand-YR5Eif0k.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,7 +614,7 @@ 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-DYsOFm62.js").then((t) => t.runProbeCommand(e))
617
+ run: (e) => import("./probeCommand-Dsu5if_4.js").then((t) => t.runProbeCommand(e))
618
618
  },
619
619
  {
620
620
  name: "schedule",
@@ -1,4 +1,4 @@
1
- import { p as e } from "./dev-dSH-Pkb2.js";
1
+ import { p as e } from "./dev-BfUG0jrD.js";
2
2
  import { it as t, st as n } from "./webDev-CYjhmOTZ.js";
3
3
  import { t as r } from "./start-bqT4GRH0.js";
4
4
  import { join as i } from "node:path";
@@ -1,6 +1,6 @@
1
1
  import { a as e, t } from "./subcommandNames-CDzfEtKV.js";
2
2
  import { t as n } from "./cliError-BmdYnghb.js";
3
- import { a as r, l as i, q as a, s as o } from "./dev-dSH-Pkb2.js";
3
+ import { a as r, l as i, q as a, s as o } from "./dev-BfUG0jrD.js";
4
4
  import { n as s, t as c } from "./cliArgs-D4p8n7EE.js";
5
5
  import { r as l } from "./dialectDriver-czCHYpeH.js";
6
6
  import { i as u, n as d, r as f, t as p } from "./dataProfile-Du3ztYxv.js";