@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
@@ -3430,7 +3430,16 @@ var qc = rn({ scope: "voltro:replica-observations" }), Jc = (e) => {
3430
3430
  kind: "start",
3431
3431
  payload: u.payload,
3432
3432
  commit: async (n) => {
3433
- u.evict !== void 0 && (await e.cancelRun(a.workflowName, u.evict.executionId).catch((e) => {
3433
+ u.evict !== void 0 && (await e.cancelRun({
3434
+ workflowName: a.workflowName,
3435
+ runId: u.evict.runId,
3436
+ executionId: u.evict.executionId,
3437
+ reason: "cancelled to make room for a newer start (singleton mode 'cancel')",
3438
+ detail: {
3439
+ source: "flow-control",
3440
+ mode: "singleton"
3441
+ }
3442
+ }).catch((e) => {
3434
3443
  i?.warn?.("workflow flow control: could not cancel a singleton incumbent", {
3435
3444
  workflow: a.workflowName,
3436
3445
  executionId: u.evict?.executionId,
@@ -3528,22 +3537,29 @@ var qc = rn({ scope: "voltro:replica-observations" }), Jc = (e) => {
3528
3537
  runId: i.id
3529
3538
  };
3530
3539
  },
3531
- cancelRun: async (t, n) => {
3532
- let r = e.facade();
3533
- r !== void 0 && await r.cancel(t, n);
3540
+ cancelRun: async ({ runId: t, reason: n, detail: r }) => {
3541
+ let i = e.cancelRunWithReason();
3542
+ return i !== void 0 && i({
3543
+ runId: t,
3544
+ reason: n,
3545
+ ...r === void 0 ? {} : { detail: r }
3546
+ });
3534
3547
  },
3535
3548
  onAbandoned: e.onAbandoned ?? (async () => {}),
3536
3549
  listRunningRuns: async (t) => {
3537
3550
  let n = e.facade();
3538
3551
  return n === void 0 ? [] : (await n.listRuns({
3539
- workflow: t,
3552
+ workflowName: t,
3540
3553
  status: "running"
3541
3554
  })).flatMap((e) => {
3542
- if (e.executionId === null || e.executionId === void 0) return [];
3543
- let t = e.startedAt instanceof Date ? e.startedAt.getTime() : typeof e.startedAt == "number" ? e.startedAt : Date.parse(String(e.startedAt));
3544
- return Number.isFinite(t) ? [{
3555
+ if (e.workflowName !== t || e.status !== "running") return [];
3556
+ let n = e.startedAt instanceof Date ? e.startedAt.getTime() : typeof e.startedAt == "number" ? e.startedAt : Date.parse(String(e.startedAt));
3557
+ return Number.isFinite(n) ? [{
3558
+ runId: e.id,
3559
+ workflowName: e.workflowName,
3545
3560
  executionId: e.executionId,
3546
- startedAt: t
3561
+ payload: e.payload,
3562
+ startedAt: n
3547
3563
  }] : [];
3548
3564
  });
3549
3565
  },
@@ -3974,10 +3990,14 @@ var qc = rn({ scope: "voltro:replica-observations" }), Jc = (e) => {
3974
3990
  failedAt: (e.now ?? Date.now)()
3975
3991
  };
3976
3992
  try {
3977
- return await n.start(t, r), e.log?.info?.("workflow onFailure started", {
3993
+ let i = await n.start(t, r);
3994
+ return e.log?.info?.("workflow onFailure start resolved", {
3978
3995
  workflow: e.workflowName,
3979
3996
  onFailure: t,
3980
- reason: e.reason
3997
+ reason: e.reason,
3998
+ startStatus: i.status,
3999
+ handlerRunId: i.id,
4000
+ handlerExecutionId: i.executionId
3981
4001
  }), !0;
3982
4002
  } catch (n) {
3983
4003
  return e.log?.error?.("workflow onFailure could not be started", {
@@ -1,3 +1,3 @@
1
- import { a as e, d as t, f as n, l as r, m as i, p as a, u as o } from "./dev-dSH-Pkb2.js";
1
+ import { a as e, d as t, f as n, l as r, m as i, p as a, u as o } from "./dev-BfUG0jrD.js";
2
2
  import "./dialectDriver-czCHYpeH.js";
3
3
  export { e as buildStore, r as loadApiConfig, o as loadApiConfigDiagnosed, t as loadDiscovered, n as mergePluginRoutesInto, a as runDev, i as walk };
@@ -0,0 +1,2 @@
1
+ import { b as e, y as t } from "./doctorCommand-pxYq2bH5.js";
2
+ export { t as runDoctorCommand, e as runServePreflight };
@@ -1,6 +1,6 @@
1
- import { Xt as e, Yt as t, Zt as n } from "./dev-dSH-Pkb2.js";
1
+ import { Xt as e, Yt as t, Zt as n } from "./dev-BfUG0jrD.js";
2
2
  import { Bt as r, Ht as i, T as a, Ut as o, V as s, Vt as c, t as l, u } from "./webDev-CYjhmOTZ.js";
3
- import { r as d, u as f } from "./apiBuild-C5HhMAEm.js";
3
+ import { r as d, u as f } from "./apiBuild-DwhySM-6.js";
4
4
  import { S as p } from "./frameworkTableAssembly-vfkzuzEo.js";
5
5
  import { n as m } from "./pageConvention-CMpfDN6r.js";
6
6
  import { n as h, r as g, t as ee } from "./cliOutput-D1tSBoRM.js";
@@ -1856,7 +1856,7 @@ var le = {
1856
1856
  let t = xn.get(e);
1857
1857
  if (t !== void 0) return t;
1858
1858
  let n = (async () => {
1859
- let { walk: t, loadDiscovered: n } = await import("./dev-kn9-7RXZ.js"), r = await t(e);
1859
+ let { walk: t, loadDiscovered: n } = await import("./dev-BpMSAjMk.js"), r = await t(e);
1860
1860
  return {
1861
1861
  files: r,
1862
1862
  discovered: await n(r, { root: e })
@@ -1981,7 +1981,7 @@ var le = {
1981
1981
  }
1982
1982
  }, J = async (r) => {
1983
1983
  try {
1984
- let { loadApiConfig: i } = await import("./dev-kn9-7RXZ.js"), { discovered: a } = await U(r), o = e(await i(r)), s = {
1984
+ let { loadApiConfig: i } = await import("./dev-BpMSAjMk.js"), { discovered: a } = await U(r), o = e(await i(r)), s = {
1985
1985
  queries: a.queries,
1986
1986
  mutations: a.mutations,
1987
1987
  actions: a.actions,
@@ -2065,7 +2065,7 @@ var le = {
2065
2065
  }, Nn = async (e) => pt({
2066
2066
  hasWorkflows: async () => (await U(e)).discovered.workflows.length > 0,
2067
2067
  openStore: async () => {
2068
- let { loadApiConfig: t, buildStore: n } = await import("./dev-kn9-7RXZ.js"), r = await t(e);
2068
+ let { loadApiConfig: t, buildStore: n } = await import("./dev-BpMSAjMk.js"), r = await t(e);
2069
2069
  if (r === null) throw Error("no app.config.ts in this directory");
2070
2070
  let i = await n(r, void 0);
2071
2071
  return {
@@ -2145,7 +2145,7 @@ var le = {
2145
2145
  }
2146
2146
  }, zn = async (e) => {
2147
2147
  try {
2148
- let { loadApiConfig: t } = await import("./dev-kn9-7RXZ.js"), n = (await t(e))?.doctor?.scopeVocabulary;
2148
+ let { loadApiConfig: t } = await import("./dev-BpMSAjMk.js"), n = (await t(e))?.doctor?.scopeVocabulary;
2149
2149
  if (typeof n != "string") return [];
2150
2150
  let [r, i] = n.split("#");
2151
2151
  if (r === void 0 || i === void 0) return [];
@@ -2162,7 +2162,7 @@ var le = {
2162
2162
  findings: []
2163
2163
  });
2164
2164
  try {
2165
- let { offlineManifest: n, toInput: r } = await import("./checkCommand-ByaOhdc8.js"), { buildAppGraph: i, checkAppGraph: a } = await import("./appGraph-CFmFKHb2.js"), o = await n(e), s = r(o.manifest, o.tables), c = await zn(e), l = [.../* @__PURE__ */ new Set([...s.scopes ?? [], ...c])];
2165
+ let { offlineManifest: n, toInput: r } = await import("./checkCommand-nB68vIo_.js"), { buildAppGraph: i, checkAppGraph: a } = await import("./appGraph-CFmFKHb2.js"), o = await n(e), s = r(o.manifest, o.tables), c = await zn(e), l = [.../* @__PURE__ */ new Set([...s.scopes ?? [], ...c])];
2166
2166
  if (l.length === 0) {
2167
2167
  try {
2168
2168
  let { loadAppSchemaInputs: t } = await import("./frameworkTableAssembly-B96WCNJA.js");
@@ -2252,7 +2252,7 @@ var le = {
2252
2252
  if (n === void 0 || r.length === 0) return;
2253
2253
  let i = [];
2254
2254
  try {
2255
- let { loadApiConfig: t } = await import("./dev-kn9-7RXZ.js");
2255
+ let { loadApiConfig: t } = await import("./dev-BpMSAjMk.js");
2256
2256
  i = (await t(e))?.locales ?? [];
2257
2257
  } catch {
2258
2258
  return;
@@ -2314,7 +2314,7 @@ var le = {
2314
2314
  }, Kn = async (e) => {
2315
2315
  let { discovered: t } = await U(e), n = [];
2316
2316
  try {
2317
- let { loadApiConfig: t } = await import("./dev-kn9-7RXZ.js");
2317
+ let { loadApiConfig: t } = await import("./dev-BpMSAjMk.js");
2318
2318
  n = ((await t(e))?.plugins ?? []).map((e) => {
2319
2319
  let t = (e.extendSchema?.tables ?? []).map((e) => {
2320
2320
  let t = e;
@@ -2460,7 +2460,7 @@ var le = {
2460
2460
  return n.unchecked.length > $ && console.log(` … and ${n.unchecked.length - $} more — \`voltro doctor --json\` prints every one (\`authz.unchecked\`).`), i === void 0 ? (console.log(`\nNo ${X} yet, so this run is advisory. To start the ratchet:`), console.log("\n voltro doctor --write-authz-allowlist\n"), console.log("That records today's unchecked handlers as DEBT and fails every run after on"), console.log("anything NEW. Fix a handler and its line stops mattering — the scan reports it as"), console.log("guarded whether or not the line is still there."), !1) : (console.log(`\n${n.unchecked.length} executor(s) with no access check are not in ${X}.`), console.log("Add a guard, or add the tag to that file if it is genuinely open."), console.log("\nBefore hand-rolling another check: `guards: [{ action, resourceType, resource }]`"), console.log("answers \"may this subject act on THIS row\" declaratively, and an app whose"), console.log("relationships live in its own tables registers its own tuple source rather than"), console.log("copying data into a framework table. See the authorization docs."), !0);
2461
2461
  }, Qn = async (e) => {
2462
2462
  try {
2463
- let { loadApiConfig: t } = await import("./dev-kn9-7RXZ.js"), { decidedSchemaReport: n } = await import("./doctorDecidedSchema-BlbWgCD_.js"), r = await t(e);
2463
+ let { loadApiConfig: t } = await import("./dev-BpMSAjMk.js"), { decidedSchemaReport: n } = await import("./doctorDecidedSchema-BlbWgCD_.js"), r = await t(e);
2464
2464
  return r == null ? null : n({
2465
2465
  ...r.schema ? { declared: r.schema } : {},
2466
2466
  ...r.store === void 0 ? {} : { store: r.store },
@@ -1,4 +1,4 @@
1
- import { a as e, l as t } from "./dev-dSH-Pkb2.js";
1
+ import { a as e, l as t } from "./dev-BfUG0jrD.js";
2
2
  import { n, t as r } from "./cliArgs-D4p8n7EE.js";
3
3
  import { r as i } from "./appPort-B_HpJ_ck.js";
4
4
  import { resolve as a } from "node:path";
@@ -1,4 +1,4 @@
1
- import { a as e, l as t } from "./dev-dSH-Pkb2.js";
1
+ import { a as e, l as t } from "./dev-BfUG0jrD.js";
2
2
  import { Effect as n } from "effect";
3
3
  import { embedMany as r } from "@voltro/ai";
4
4
  //#region src/embeddingsBackfill.ts
@@ -1,4 +1,4 @@
1
- import { l as e } from "./dev-dSH-Pkb2.js";
1
+ import { l as e } from "./dev-BfUG0jrD.js";
2
2
  import { Jt as t, Xt as n, Zt as r, qt as i } from "./webDev-CYjhmOTZ.js";
3
3
  import { join as a } from "node:path";
4
4
  import { promises as o } from "node:fs";
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./cliOutput-D1tSBoRM.js";
2
- import { i as t } from "./checkCommand-CvSheSdb.js";
3
- import { i as n, n as r } from "./codemodRunner-Drb-H-jr.js";
2
+ import { i as t } from "./checkCommand-zGYZtIkJ.js";
3
+ import { i as n, n as r } from "./codemodRunner-D90bexh4.js";
4
4
  import { basename as i, join as a, resolve as o } from "node:path";
5
5
  import { branchNamespaceName as s, planBranchProvision as c } from "@voltro/database";
6
6
  import { readFile as l } from "node:fs/promises";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as e, i as t, n, o as r, r as i, t as a } from "./commands-pCItjdHG.js";
1
+ import { a as e, i as t, n, o as r, r as i, t as a } from "./commands-Dd6Cp7qs.js";
2
2
  import { r as o } from "./templates-BTWZkJJT.js";
3
3
  //#region src/index.ts
4
4
  var s = "framework";
@@ -1,5 +1,5 @@
1
1
  import { n as e, r as t, t as n } from "./cliOutput-D1tSBoRM.js";
2
- import { o as r } from "./updateCommand-B18ZQNFg.js";
2
+ import { o as r } from "./updateCommand-F6HFgz0i.js";
3
3
  import { join as i, resolve as a } from "node:path";
4
4
  import { readFileSync as o, readdirSync as s, statSync as c } from "node:fs";
5
5
  //#region src/infoCommand.ts
@@ -108,7 +108,7 @@ server and in this shell.`);
108
108
  }, m = async (e) => {
109
109
  let t = /* @__PURE__ */ new Map();
110
110
  try {
111
- let { walk: n, loadDiscovered: r } = await import("./dev-kn9-7RXZ.js"), i = await r(await n(e), { root: e }), a = [
111
+ let { walk: n, loadDiscovered: r } = await import("./dev-BpMSAjMk.js"), i = await r(await n(e), { root: e }), a = [
112
112
  ...i.queries,
113
113
  ...i.mutations,
114
114
  ...i.actions,
@@ -1,4 +1,4 @@
1
- import { n as e } from "./apiBuild-C5HhMAEm.js";
1
+ import { n as e } from "./apiBuild-DwhySM-6.js";
2
2
  import { join as t, resolve as n, sep as r } from "node:path";
3
3
  import { existsSync as i, promises as a } from "node:fs";
4
4
  import { createLogger as o } from "@voltro/logger";
@@ -422,7 +422,7 @@ let package = Package(
422
422
  await l.mkdir(o(e), { recursive: !0 }), await l.writeFile(e, n.content, "utf8");
423
423
  }
424
424
  }, X = async (e) => {
425
- let { offlineManifest: t } = await import("./checkCommand-ByaOhdc8.js"), { manifest: n } = await t(e);
425
+ let { offlineManifest: t } = await import("./checkCommand-nB68vIo_.js"), { manifest: n } = await t(e);
426
426
  return n;
427
427
  }, Z = async (e) => {
428
428
  let t = J(await (e.manifestProvider ?? X)(e.root), {
@@ -0,0 +1,2 @@
1
+ import { n as e } from "./serveCommand-CaLTTh68.js";
2
+ export { e as runServeDispatch };
@@ -4,12 +4,12 @@ import { r as n, t as r } from "./appModuleLoader-C9r9mxZt.js";
4
4
  import { t as i } from "./bootRefusal-pgvDxlrU.js";
5
5
  import { n as a, r as o } from "./startupRunner-CEqQq7ax.js";
6
6
  import { n as s, t as c } from "./interruptedReplace-CwnkBb2X.js";
7
- import { $ as l, $t as u, A as d, At as f, B as ee, Bn as te, Bt as p, C as ne, Cn as m, Ct as re, D as ie, Dn as h, Dt as ae, E as oe, En as se, Et as g, F as _, Fn as ce, Ft as le, G as ue, Gt as de, H as fe, Hn as pe, Ht as me, I as he, In as v, It as ge, Jt as y, K as _e, Kt as ve, L as ye, Lt as b, M as be, Mn as xe, Mt as Se, N as Ce, Nn as we, Nt as Te, O as Ee, On as De, Ot as Oe, P as ke, Pn as Ae, Pt as x, Q as S, Qt as je, R as Me, Rn as Ne, Rt as Pe, S as Fe, Sn as Ie, St as Le, T as Re, Tn as ze, Tt as Be, U as Ve, Un as He, Ut as Ue, Vn as We, Vt as Ge, W as Ke, Wt as qe, X as Je, Xt as Ye, Y as Xe, Z as Ze, _ as Qe, _n as $e, _t as et, a as tt, an as nt, at as C, b as rt, bn as it, bt as at, cn as ot, ct as w, d as st, dn as T, dt as E, en as ct, et as lt, f as ut, fn as dt, ft, g as pt, gn as D, gt as mt, h as ht, hn as gt, ht as _t, i as vt, in as yt, it as bt, j as xt, jn as St, jt as Ct, k as O, kn as k, kt as wt, l as Tt, ln as Et, lt as Dt, m as Ot, mn as kt, mt as At, nn as jt, nt as Mt, on as Nt, ot as Pt, pn as Ft, pt as It, qt as Lt, rn as Rt, rt as zt, s as A, sn as Bt, st as Vt, t as j, tn as Ht, tt as Ut, un as Wt, ut as Gt, v as Kt, vn as qt, vt as Jt, w as Yt, wn as Xt, wt as Zt, x as Qt, xn as $t, xt as M, y as en, yn as tn, yt as nn, z as rn, zn as an, zt as on } from "./dev-dSH-Pkb2.js";
7
+ import { $ as l, $t as u, A as d, At as f, B as ee, Bn as te, Bt as p, C as ne, Cn as m, Ct as re, D as ie, Dn as h, Dt as ae, E as oe, En as se, Et as g, F as _, Fn as ce, Ft as le, G as ue, Gt as de, H as fe, Hn as pe, Ht as me, I as he, In as v, It as ge, Jt as y, K as _e, Kt as ve, L as ye, Lt as b, M as be, Mn as xe, Mt as Se, N as Ce, Nn as we, Nt as Te, O as Ee, On as De, Ot as Oe, P as ke, Pn as Ae, Pt as x, Q as S, Qt as je, R as Me, Rn as Ne, Rt as Pe, S as Fe, Sn as Ie, St as Le, T as Re, Tn as ze, Tt as Be, U as Ve, Un as He, Ut as Ue, Vn as We, Vt as Ge, W as Ke, Wt as qe, X as Je, Xt as Ye, Y as Xe, Z as Ze, _ as Qe, _n as $e, _t as et, a as tt, an as nt, at as C, b as rt, bn as it, bt as at, cn as ot, ct as w, d as st, dn as T, dt as E, en as ct, et as lt, f as ut, fn as dt, ft, g as pt, gn as D, gt as mt, h as ht, hn as gt, ht as _t, i as vt, in as yt, it as bt, j as xt, jn as St, jt as Ct, k as O, kn as k, kt as wt, l as Tt, ln as Et, lt as Dt, m as Ot, mn as kt, mt as At, nn as jt, nt as Mt, on as Nt, ot as Pt, pn as Ft, pt as It, qt as Lt, rn as Rt, rt as zt, s as A, sn as Bt, st as Vt, t as j, tn as Ht, tt as Ut, un as Wt, ut as Gt, v as Kt, vn as qt, vt as Jt, w as Yt, wn as Xt, wt as Zt, x as Qt, xn as $t, xt as M, y as en, yn as tn, yt as nn, z as rn, zn as an, zt as on } from "./dev-BfUG0jrD.js";
8
8
  import { Yt as sn, en as cn, ft as ln, ht as un, lt as dn, mt as fn, pt as pn, qt as mn } from "./webDev-CYjhmOTZ.js";
9
9
  import { g as hn, s as gn } from "./inspect-PcC5J-Dl.js";
10
10
  import { n as _n } from "./cliArgs-D4p8n7EE.js";
11
11
  import { r as vn } from "./appPort-B_HpJ_ck.js";
12
- import { r as yn, u as bn } from "./apiBuild-C5HhMAEm.js";
12
+ import { r as yn, u as bn } from "./apiBuild-DwhySM-6.js";
13
13
  import { r as xn } from "./dialectDriver-czCHYpeH.js";
14
14
  import { i as Sn, n as Cn } from "./connectionConfig-Bk9IC7D0.js";
15
15
  import { c as wn, n as Tn, o as En } from "./seedRunner-DISBKow-.js";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./serveCommand-DnxqCQ16.js";
1
+ import { t as e } from "./serveCommand-CaLTTh68.js";
2
2
  import { t } from "./loadEnv-D9nEOClM.js";
3
3
  import { r as n } from "./appModuleLoader-C9r9mxZt.js";
4
4
  import { i as r } from "./dialectDriver-czCHYpeH.js";
@@ -0,0 +1,2 @@
1
+ import { m as e, p as t } from "./updateCommand-F6HFgz0i.js";
2
+ export { t as runApplyCodemods, e as runUpdateCommand };
@@ -1,4 +1,4 @@
1
- import { n as e, r as t, t as n } from "./codemodRunner-Drb-H-jr.js";
1
+ import { n as e, r as t, t as n } from "./codemodRunner-D90bexh4.js";
2
2
  import { basename as r, dirname as i, join as a, relative as o, resolve as s } from "node:path";
3
3
  import { existsSync as c, readFileSync as l, readdirSync as u, statSync as d, writeFileSync as f } from "node:fs";
4
4
  import { totalmem as p } from "node:os";
@@ -222,7 +222,7 @@ createVerifier({ secret: [process.env.WEBHOOK_SECRET, process.env.WEBHOOK_SECRET
222
222
  ...t === void 0 ? {} : { payload: t }
223
223
  };
224
224
  }, S = u({ scope: "voltro:webhooks" }), C = ["--out", "--name"], w = async (e) => {
225
- let { walk: t, loadDiscovered: n } = await import("./dev-kn9-7RXZ.js"), { outgoingFromEvents: r } = await import("./webhookDiscovery-il9ti-HE.js");
225
+ let { walk: t, loadDiscovered: n } = await import("./dev-BpMSAjMk.js"), { outgoingFromEvents: r } = await import("./webhookDiscovery-il9ti-HE.js");
226
226
  return r((await n(await t(e), { root: e })).events.map((e) => ({
227
227
  file: e.file,
228
228
  descriptor: e.descriptor
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/cli",
3
- "version": "0.61.0",
3
+ "version": "0.62.0",
4
4
  "description": "The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.",
5
5
  "keywords": [
6
6
  "voltro",
@@ -910,6 +910,12 @@
910
910
  "title": "Sentry rpc spans now join the active browser transaction",
911
911
  "kind": "manual"
912
912
  },
913
+ {
914
+ "version": "0.62.0",
915
+ "id": "0.62.0/01_finish_timeout_uses_durable_cancellation",
916
+ "title": "Finish timeouts use durable, once-only cancellation",
917
+ "kind": "manual"
918
+ },
913
919
  {
914
920
  "version": "0.7.0",
915
921
  "id": "0.7.0/01_row-filter-load-failure",
@@ -956,24 +962,24 @@
956
962
  "@effect/platform-node": "^0.108.0",
957
963
  "@effect/sql": "^0.52.0",
958
964
  "@effect/workflow": "^0.19.0",
959
- "@voltro/ai": "0.61.0",
960
- "@voltro/cache": "0.61.0",
961
- "@voltro/client": "0.61.0",
962
- "@voltro/content": "0.61.0",
963
- "@voltro/data-transfer": "0.61.0",
964
- "@voltro/database": "0.61.0",
965
- "@voltro/env": "0.61.0",
966
- "@voltro/kv": "0.61.0",
967
- "@voltro/logger": "0.61.0",
968
- "@voltro/plugin-auth": "0.61.0",
969
- "@voltro/plugin-broadcast": "0.61.0",
970
- "@voltro/plugin-mail": "0.61.0",
971
- "@voltro/plugin-storage": "0.61.0",
972
- "@voltro/plugin-webhooks": "0.61.0",
973
- "@voltro/protocol": "0.61.0",
974
- "@voltro/runtime": "0.61.0",
975
- "@voltro/serverless": "0.61.0",
976
- "@voltro/workflow": "0.61.0",
965
+ "@voltro/ai": "0.62.0",
966
+ "@voltro/cache": "0.62.0",
967
+ "@voltro/client": "0.62.0",
968
+ "@voltro/content": "0.62.0",
969
+ "@voltro/data-transfer": "0.62.0",
970
+ "@voltro/database": "0.62.0",
971
+ "@voltro/env": "0.62.0",
972
+ "@voltro/kv": "0.62.0",
973
+ "@voltro/logger": "0.62.0",
974
+ "@voltro/plugin-auth": "0.62.0",
975
+ "@voltro/plugin-broadcast": "0.62.0",
976
+ "@voltro/plugin-mail": "0.62.0",
977
+ "@voltro/plugin-storage": "0.62.0",
978
+ "@voltro/plugin-webhooks": "0.62.0",
979
+ "@voltro/protocol": "0.62.0",
980
+ "@voltro/runtime": "0.62.0",
981
+ "@voltro/serverless": "0.62.0",
982
+ "@voltro/workflow": "0.62.0",
977
983
  "chokidar": "^5.0.0",
978
984
  "ioredis": "^5.11.1",
979
985
  "tinyglobby": "^0.2.17",
@@ -749,7 +749,7 @@ each plugin's own README.
749
749
 
750
750
  | Topic | Open | Summary |
751
751
  |---|---|---|
752
- | **What's new in 0.61.0** | `node_modules/@voltro/cli/templates/agent-docs/whats-new.md` | Everything that changed in this version. Read it before hand-rolling something the framework may now ship. |
752
+ | **What's new in 0.62.0** | `node_modules/@voltro/cli/templates/agent-docs/whats-new.md` | Everything that changed in this version. Read it before hand-rolling something the framework may now ship. |
753
753
  | AI | `node_modules/@voltro/cli/templates/agent-docs/ai.md` | How Voltro treats AI — agents, tools, streaming, RAG — all primitives over the same WebSocket as the rest of the framework. |
754
754
  | Authentication | `node_modules/@voltro/cli/templates/agent-docs/authentication.md` | How @voltro/plugin-auth wires password + session-cookie auth across api + web, plus the pluggable identity-strategy protocol. |
755
755
  | Caching | `node_modules/@voltro/cli/templates/agent-docs/caching.md` | Voltro's caching layer (@voltro/cache) — an always-on memory default, swappable Redis-compatible backends, a low-level wrap primitive, and automatic query-result invalidation. |
@@ -9,7 +9,7 @@ each plugin's own README.
9
9
 
10
10
  | Topic | Open | Summary |
11
11
  |---|---|---|
12
- | **What's new in 0.61.0** | `node_modules/@voltro/cli/templates/agent-docs/whats-new.md` | Everything that changed in this version. Read it before hand-rolling something the framework may now ship. |
12
+ | **What's new in 0.62.0** | `node_modules/@voltro/cli/templates/agent-docs/whats-new.md` | Everything that changed in this version. Read it before hand-rolling something the framework may now ship. |
13
13
  | AI | `node_modules/@voltro/cli/templates/agent-docs/ai.md` | How Voltro treats AI — agents, tools, streaming, RAG — all primitives over the same WebSocket as the rest of the framework. |
14
14
  | Authentication | `node_modules/@voltro/cli/templates/agent-docs/authentication.md` | How @voltro/plugin-auth wires password + session-cookie auth across api + web, plus the pluggable identity-strategy protocol. |
15
15
  | Caching | `node_modules/@voltro/cli/templates/agent-docs/caching.md` | Voltro's caching layer (@voltro/cache) — an always-on memory default, swappable Redis-compatible backends, a low-level wrap primitive, and automatic query-result invalidation. |
@@ -1303,6 +1303,38 @@ export default (input: { message: string }) =>
1303
1303
 
1304
1304
  `streamText` emits `AgentEvent` elements. The `_tag`s are: `token` (text delta), `reasoning` (the model's thinking, separate from the answer), `toolCall`, `toolResult`, `source` (a cited RAG/web source — `url` or `document` variant), `file` (an inline file the model produced, usually an image: `mediaType` + base64 `data`), `message`, `error` (carries `retryable`), and `done`. The stream NEVER fails — an upstream error arrives as a terminal `error` event.
1305
1305
 
1306
+ ## Smooth Streaming
1307
+
1308
+ Provider chunks are transport artifacts: one provider may send a word at a time while another releases a whole paragraph in a burst. Opt into server-side semantic smoothing when the UI should receive predictable word or line chunks:
1309
+
1310
+ ```ts
1311
+ streamText({
1312
+ prompt: input.message,
1313
+ smooth: {
1314
+ chunking: 'word', // default; alternatively 'line'
1315
+ delayMs: 10, // default; null rechunks without adding delay
1316
+ },
1317
+ })
1318
+ ```
1319
+
1320
+ `smooth` is framework-owned and deliberately narrower than the AI SDK's experimental transform surface. It smooths both text and reasoning, flushes pending content before tool/source/file/error/done events, and shares the stream's abort signal. Omit it or set `smooth: false` to preserve provider-native chunks and latency.
1321
+
1322
+ With `resumableStreamText`, put `smooth` inside `options`. Smoothing happens before `AgentEvent` conversion and before the append-only journal, so a reconnect replays the exact same `SeqEvent` boundaries seen live:
1323
+
1324
+ ```ts
1325
+ resumableStreamText({
1326
+ streamId: input.streamId,
1327
+ store,
1328
+ options: {
1329
+ prompt: input.message,
1330
+ smooth: { chunking: 'word', delayMs: 10 },
1331
+ },
1332
+ fromSeq: input.fromSeq,
1333
+ })
1334
+ ```
1335
+
1336
+ Smoothing changes only text/reasoning boundaries and timing. Content, usage, finish reason, tool ids, and cost accounting stay unchanged. The client should still batch rendering (for example, at most once per animation frame); server smoothing normalizes semantics, it does not replace UI backpressure.
1337
+
1306
1338
  ## Cancel, retry
1307
1339
 
1308
1340
  A "Stop" button needs to end an in-flight run out of band. Pass a `streamId` and call `cancelStream(streamId)` from a separate action/mutation — it aborts the provider call (token spend stops) and the stream ends on a terminal, non-retryable `cancelled` error.
@@ -292,7 +292,9 @@ _Inspect traces and logs from the shell — flags, the --trace <id> end-to-end c
292
292
 
293
293
  ## `voltro logs`
294
294
 
295
- Every `voltro dev` / `voltro start` instance buffers the last **2000** server-side `@voltro/logger` records **and** every browser console line that the dev console bridge forwarded.
295
+ Every `voltro dev` / `voltro start` instance buffers the last **2000** server-side `@voltro/logger` records. During `voltro dev`, the browser console bridge also forwards browser console lines into that buffer.
296
+
297
+ The browser-to-inspect bridges are deliberately limited to development builds. Setting `localStorage.framework_debug = '1'` in a production bundle enables the local `[fw …]` connection timeline only; it never starts `clientLog` POSTs or an inspect `EventSource`. In development, both diagnostic transports are single-flight, rate-limited, and bounded: permanent `4xx` responses disable them for the page, while transient failures use exponential backoff and open a circuit after five consecutive failures. The SSE relay probes status and content type before creating an `EventSource`, then explicitly closes a failed source before a bounded retry.
296
298
 
297
299
  ```sh
298
300
  voltro logs # last 100 from every running process
@@ -630,6 +632,13 @@ proxy path, cleared the moment the stream opens; the proxy moves it into an
630
632
  `Authorization` header. Nothing about the token ever appears in a URL, and the
631
633
  app receives a header like any other caller.
632
634
 
635
+ That dashboard proxy is also why a production app page must not open the
636
+ inspect stream merely because `localStorage.framework_debug` is set. The app
637
+ page has no bearer-capable `EventSource` transport and no authority to mint the
638
+ dashboard cookie. Voltro therefore keeps its in-page console and SSE relays
639
+ development-only; the persisted production flag affects local framework
640
+ console output, not inspect traffic.
641
+
633
642
  ## In the dashboards
634
643
 
635
644
  Both dashboards unwrap `.data` in their fetch layer and keep the envelope. A
@@ -1,4 +1,4 @@
1
- # What's new in 0.61.0
1
+ # What's new in 0.62.0
2
2
 
3
3
  Read this FIRST when a task touches an area you have not worked in recently.
4
4
  It is the cheapest way to notice that the framework grew the thing you were
@@ -9,21 +9,14 @@ BREAKING entries name a codemod; run `voltro update` to apply it.
9
9
 
10
10
  ### ⚠ BREAKING
11
11
 
12
- - **@voltro/client, @voltro/web, @voltro/cli** — `RpcError.kind` now distinguishes transport, handler, client, and unknown failures; manually emitted events must add the field, while `useConnectionStatus` now degrades only for transport failures and clears on the next rpc success.
12
+ - **@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.
13
13
 
14
- **`voltro update` carries you across this** codemod `0.61.0/01_rpc_errors_have_kinds`. If you pin versions by hand and never run it, print the notes without changing anything: `voltro update --codemods-only --from <your current version> --dry-run` (this one ships in 0.61.0).
15
- - **@voltro/plugin-sentry, @voltro/cli** — Browser RPC spans now join the active page/navigation transaction and link to the Effect/server trace instead of creating one root transaction per call; `tracesSampleRate`, `browserTracing`, and the new `rpcSpans` switch control the resulting browser trace volume.
14
+ 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.
16
15
 
17
- **`voltro update` carries you across this** — codemod `0.61.0/02_sentry_rpc_spans_join_page`. If you pin versions by hand and never run it, print the notes without changing anything: `voltro update --codemods-only --from <your current version> --dry-run` (this one ships in 0.61.0).
16
+ ### Added
18
17
 
19
- ### Fixed
20
-
21
- - **@voltro/cli** — **Six SSR failure sites report to Sentry, not three.**
22
-
23
- 0.60.0 gave the web server its own Sentry and wired the three loud sites: the SSR shell throw, the SPA layout shell throw, and the general render error (which covers a loader throw). The docs said "shell throw, loader throw, PPR/SWR refresh" — and an enumeration in a claim is read as exhaustive.
18
+ - **@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.
24
19
 
25
- The other three were `warn`-level and reported to nobody: a failed PPR hole pass, a failed background SWR refresh, and a `not-found.tsx` that throws while rendering. They are quieter because the request still serves something — stale HTML, an unfilled hole, a plain 404 — which says something about the REQUEST and nothing about who else could find out. The answer to that is nobody: none of them reaches a browser boundary, so the pod's stdout was the only record.
26
-
27
- They carry their own `voltro.stage` (`not-found-render`, `ppr-holes`, `swr-refresh`), so a quota-conscious project can drop them by stage without losing the three that fail the request.
20
+ ### Fixed
28
21
 
29
- `webSentry.test.ts` now fails if a render-path `log.error`/`log.warn` gains no reporter beside it the property, rather than the six call sites.
22
+ - **@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.
@@ -1459,7 +1459,7 @@ timeouts: { start: '1 hour', finish: '10 minutes' }
1459
1459
  - **`start`** bounds how long a start may sit in the admission queue, measured from the **first** arrival in its group. A debounced run that never gets a quiet moment is a job that silently did not happen.
1460
1460
  - **`finish`** bounds the run itself once admitted, and also tightens the crash backstop on its concurrency slot.
1461
1461
 
1462
- Both expire into the same path as an exhausted retry: the run is recorded failed and `onFailure` fires. Declaring `timeouts.start` on a workflow that cannot defer is a boot error — it would never fire.
1462
+ Both reach the same `onFailure` signal as an exhausted retry. `timeouts.start` removes the queued intent before a run exists. `timeouts.finish` durably changes the running row to `cancelled`; only the sweep call that wins that terminal transition emits `onFailure`. Seeing the same old row again does not emit another report. Declaring `timeouts.start` on a workflow that cannot defer is a boot error — it would never fire.
1463
1463
 
1464
1464
  ## onFailure — the signal that replaces the sweep
1465
1465
 
@@ -1494,10 +1494,15 @@ export const narrationFailed = workflow({
1494
1494
  failedAt: Schema.Number,
1495
1495
  }),
1496
1496
  success: Schema.Void,
1497
- idempotencyKey: ({ runId, failedAt }) => `failed:${runId ?? 'none'}:${failedAt}`,
1497
+ idempotencyKey: ({ workflow, runId, failedAt }) =>
1498
+ runId === null ? `failed-before-run:${workflow}:${failedAt}` : `failed-run:${runId}`,
1498
1499
  })
1499
1500
  ```
1500
1501
 
1502
+ For failures of an existing run — including `timeouts.finish` — `runId`, `executionId`, and the original `payload` are populated. Use `runId` as the stable idempotency identity. Pre-run failures (`timeouts.start` and a queued start whose workflow was removed) have both IDs set to `null`; they are emitted once when their durable pending row is consumed.
1503
+
1504
+ The framework logs the result of starting the handler as `workflow onFailure start resolved`. Its metadata includes `startStatus`, `handlerRunId`, and `handlerExecutionId`, so a queued, dropped, or singleton-skipped start is not mislabeled as newly started.
1505
+
1501
1506
  There is no `onFailure` for an `onFailure` — a handler that fails is logged and not re-notified, because the alternative is one run per failure per level with no floor.
1502
1507
 
1503
1508
  ## encryptSteps
@@ -12,12 +12,12 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.97.0",
14
14
  "@effect/rpc": "^0.76.0",
15
- "@voltro/ai": "0.61.0",
16
- "@voltro/cli": "0.61.0",
17
- "@voltro/database": "0.61.0",
18
- "@voltro/env": "0.61.0",
19
- "@voltro/protocol": "0.61.0",
20
- "@voltro/runtime": "0.61.0",
15
+ "@voltro/ai": "0.62.0",
16
+ "@voltro/cli": "0.62.0",
17
+ "@voltro/database": "0.62.0",
18
+ "@voltro/env": "0.62.0",
19
+ "@voltro/protocol": "0.62.0",
20
+ "@voltro/runtime": "0.62.0",
21
21
  "effect": "^3.22.0"
22
22
  },
23
23
  "devDependencies": {
@@ -13,17 +13,17 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.61.0",
17
- "@voltro/database": "0.61.0",
18
- "@voltro/env": "0.61.0",
19
- "@voltro/plugin-auth": "0.61.0",
20
- "@voltro/protocol": "0.61.0",
21
- "@voltro/runtime": "0.61.0",
22
- "@voltro/sql-postgres": "0.61.0",
16
+ "@voltro/cli": "0.62.0",
17
+ "@voltro/database": "0.62.0",
18
+ "@voltro/env": "0.62.0",
19
+ "@voltro/plugin-auth": "0.62.0",
20
+ "@voltro/protocol": "0.62.0",
21
+ "@voltro/runtime": "0.62.0",
22
+ "@voltro/sql-postgres": "0.62.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.61.0",
26
+ "@voltro/testing": "0.62.0",
27
27
  "typescript": "^6.0.3",
28
28
  "@vitest/coverage-v8": "^4.1.10",
29
29
  "vitest": "^4.1.10"
@@ -16,16 +16,16 @@
16
16
  "dependencies": {
17
17
  "@effect/platform": "^0.97.0",
18
18
  "@effect/rpc": "^0.76.0",
19
- "@voltro/cli": "0.61.0",
20
- "@voltro/database": "0.61.0",
21
- "@voltro/env": "0.61.0",
22
- "@voltro/plugin-multitenancy": "0.61.0",
23
- "@voltro/protocol": "0.61.0",
24
- "@voltro/runtime": "0.61.0",
19
+ "@voltro/cli": "0.62.0",
20
+ "@voltro/database": "0.62.0",
21
+ "@voltro/env": "0.62.0",
22
+ "@voltro/plugin-multitenancy": "0.62.0",
23
+ "@voltro/protocol": "0.62.0",
24
+ "@voltro/runtime": "0.62.0",
25
25
  "effect": "^3.22.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@voltro/testing": "0.61.0",
28
+ "@voltro/testing": "0.62.0",
29
29
  "typescript": "^6.0.3",
30
30
  "@vitest/coverage-v8": "^4.1.10",
31
31
  "vitest": "^4.1.10"
@@ -13,16 +13,16 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.61.0",
17
- "@voltro/database": "0.61.0",
18
- "@voltro/env": "0.61.0",
19
- "@voltro/plugin-deactivation": "0.61.0",
20
- "@voltro/protocol": "0.61.0",
21
- "@voltro/runtime": "0.61.0",
16
+ "@voltro/cli": "0.62.0",
17
+ "@voltro/database": "0.62.0",
18
+ "@voltro/env": "0.62.0",
19
+ "@voltro/plugin-deactivation": "0.62.0",
20
+ "@voltro/protocol": "0.62.0",
21
+ "@voltro/runtime": "0.62.0",
22
22
  "effect": "^3.22.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.61.0",
25
+ "@voltro/testing": "0.62.0",
26
26
  "typescript": "^6.0.3",
27
27
  "@vitest/coverage-v8": "^4.1.10",
28
28
  "vitest": "^4.1.10"