@voltro/cli 0.54.0 → 0.55.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 (119) hide show
  1. package/CHANGELOG.md +142 -2
  2. package/dist/{apiBuild-DTWp0S_q.js → apiBuild-CMvLJM_K.js} +2 -2
  3. package/dist/apiBuild-Cl0IDx8c.js +2 -0
  4. package/dist/bin.js +1 -1
  5. package/dist/{build-D4ygSbnV.js → build-S0QOzqPT.js} +10 -10
  6. package/dist/{checkCommand-L7DTlpIF.js → checkCommand-DNkY5kwF.js} +1 -1
  7. package/dist/{checkCommand-Dg1G7Gwd.js → checkCommand-fbj9GDjN.js} +5 -5
  8. package/dist/codegen-CN6vMM4J.js +2 -0
  9. package/dist/{codegen-DSLM8Su9.js → codegen-SIepQtUl.js} +74 -63
  10. package/dist/{codegenCommand-CG_Vx4lc.js → codegenCommand-3TDJezom.js} +10 -9
  11. package/dist/{codemodRunner-Cd4xkC6u.js → codemodRunner-C2zxZUIw.js} +55 -0
  12. package/dist/{commands-6Kzi92Np.js → commands-BBYJ7Q3B.js} +24 -24
  13. package/dist/{dashboardCommand-Cq1PWvI1.js → dashboardCommand-D2kmyCLL.js} +3 -3
  14. package/dist/{dataCommand-DYzW8vkv.js → dataCommand-BEPPQiTl.js} +266 -194
  15. package/dist/dbCommand-BTyBGhIA.js +2 -0
  16. package/dist/{dbCommand-B4NWZtGL.js → dbCommand-DZTmOFT4.js} +1 -1
  17. package/dist/{dev-CmuvUKRq.js → dev-Ca_A_S9v.js} +2182 -2157
  18. package/dist/{dev-cKUiZZsB.js → dev-DfVZaoys.js} +1 -1
  19. package/dist/{doctorCommand-DCiFVMtZ.js → doctorCommand-CGZJK_4o.js} +15 -15
  20. package/dist/doctorCommand-djmqEcDC.js +2 -0
  21. package/dist/{dormancyCommand-w1TrmgYP.js → dormancyCommand-DY2rYpTa.js} +1 -1
  22. package/dist/{embeddingsCommand-CMgPyRTr.js → embeddingsCommand-BoCqZsgp.js} +1 -1
  23. package/dist/{envCommand-Cyynmcfa.js → envCommand-Bxy2fOjc.js} +2 -2
  24. package/dist/{evolveCommand-BwvQ8dVH.js → evolveCommand-BsbZ-XDg.js} +2 -2
  25. package/dist/frameworkTableAssembly-Df2Ymp2f.js +2 -0
  26. package/dist/{frameworkTableAssembly-D7LJuALW.js → frameworkTableAssembly-Do-cf6RJ.js} +92 -98
  27. package/dist/index.js +1 -1
  28. package/dist/{infoCommand-DlYlUPqs.js → infoCommand-EmM3jPKD.js} +1 -1
  29. package/dist/{inspect-Bd8-9wsi.js → inspect-DCqILJ1G.js} +4 -0
  30. package/dist/inspect-DGJwpOAb.js +2 -0
  31. package/dist/interruptedReplace-CwnkBb2X.js +41 -0
  32. package/dist/interruptedReplace-qzmFI020.js +2 -0
  33. package/dist/manifestBuild-CJ2zvPvT.js +2 -0
  34. package/dist/{manifestBuild-Cqgsx2bM.js → manifestBuild-DjX5MoXy.js} +1 -1
  35. package/dist/{migrate-BK_Bbx-_.js → migrate-CGFZS-1a.js} +2 -2
  36. package/dist/{probeCommand-_C0YU207.js → probeCommand-Bs3iVBSL.js} +1 -1
  37. package/dist/{runtimeTrace-CGWx1Q6l.js → runtimeTrace-C1BTpHGQ.js} +1 -1
  38. package/dist/{sdkgen-CDGHQUFj.js → sdkgen-CXMwLg9n.js} +1 -1
  39. package/dist/{serveCommand-Bje09q1v.js → serveCommand-C7IrCD58.js} +840 -838
  40. package/dist/serveCommand-Cjt5S9hD.js +2 -0
  41. package/dist/serveEntry.js +1 -1
  42. package/dist/{start-B0bnJgxI.js → start-DH7cat4-.js} +1 -1
  43. package/dist/{start-Clz-1BHB.js → start-EOV7s1NZ.js} +486 -476
  44. package/dist/startEntry.js +1 -1
  45. package/dist/{test-D_kW4KMj.js → test-DO27-x2P.js} +1 -1
  46. package/dist/{updateCommand-CRJlAOaM.js → updateCommand-C_jN1w18.js} +1 -1
  47. package/dist/updateCommand-nnFjDbl4.js +2 -0
  48. package/dist/{webDev-DlvZO30c.js → webDev-1XpVnYkW.js} +1 -1
  49. package/dist/{webDev-DSI9SOhs.js → webDev-B7vNj4Bq.js} +502 -494
  50. package/dist/{webhooksCommand-BvzXNHji.js → webhooksCommand-B1LVcyO3.js} +1 -1
  51. package/package.json +31 -19
  52. package/templates/AGENTS.md +1 -1
  53. package/templates/agent-docs/_index.md +1 -1
  54. package/templates/agent-docs/authentication.md +49 -6
  55. package/templates/agent-docs/cli.md +94 -11
  56. package/templates/agent-docs/data.md +64 -13
  57. package/templates/agent-docs/plugins.md +46 -8
  58. package/templates/agent-docs/reference.md +5 -3
  59. package/templates/agent-docs/routing.md +18 -0
  60. package/templates/agent-docs/schema-driven-ui.md +125 -0
  61. package/templates/agent-docs/whats-new.md +76 -133
  62. package/templates/apps/api-ai/package.json +6 -6
  63. package/templates/apps/api-auth/package.json +8 -8
  64. package/templates/apps/api-backend/package.json +7 -7
  65. package/templates/apps/api-backend-deactivation/package.json +7 -7
  66. package/templates/apps/api-backend-mail/package.json +8 -8
  67. package/templates/apps/api-backend-mariadb/package.json +9 -9
  68. package/templates/apps/api-backend-sqlite/package.json +8 -8
  69. package/templates/apps/api-backend-storage/package.json +8 -8
  70. package/templates/apps/api-cms/package.json +9 -9
  71. package/templates/apps/api-collab/package.json +8 -8
  72. package/templates/apps/api-data-advanced/package.json +8 -8
  73. package/templates/apps/api-durable/package.json +8 -8
  74. package/templates/apps/api-feature-flags/package.json +9 -9
  75. package/templates/apps/api-governance/package.json +8 -8
  76. package/templates/apps/api-kv/package.json +8 -8
  77. package/templates/apps/api-moderation/package.json +8 -8
  78. package/templates/apps/api-observability/package.json +8 -8
  79. package/templates/apps/api-ratelimit/package.json +8 -8
  80. package/templates/apps/api-rbac/package.json +8 -8
  81. package/templates/apps/api-rest/package.json +7 -7
  82. package/templates/apps/api-row-history/package.json +8 -8
  83. package/templates/apps/api-saas/package.json +11 -11
  84. package/templates/apps/api-saas-starter/package.json +10 -10
  85. package/templates/apps/api-search/package.json +8 -8
  86. package/templates/apps/api-status/package.json +8 -8
  87. package/templates/apps/api-webhooks/package.json +9 -9
  88. package/templates/apps/changelog/package.json +7 -7
  89. package/templates/apps/edge-functions/package.json +2 -2
  90. package/templates/apps/frontend-admin/package.json +8 -8
  91. package/templates/apps/frontend-app/package.json +9 -9
  92. package/templates/apps/frontend-auth/package.json +8 -8
  93. package/templates/apps/frontend-blank/package.json +7 -7
  94. package/templates/apps/frontend-cms/package.json +9 -9
  95. package/templates/apps/frontend-collab/package.json +10 -10
  96. package/templates/apps/frontend-contact/package.json +7 -7
  97. package/templates/apps/frontend-dashboard/package.json +7 -7
  98. package/templates/apps/frontend-docs/package.json +8 -8
  99. package/templates/apps/frontend-i18n/package.json +6 -6
  100. package/templates/apps/frontend-landing/package.json +7 -7
  101. package/templates/apps/frontend-portal/package.json +8 -8
  102. package/templates/apps/frontend-saas/package.json +8 -8
  103. package/templates/apps/frontend-spa/package.json +7 -7
  104. package/templates/apps/frontend-ssr/package.json +7 -7
  105. package/templates/apps/frontend-ssr-api/package.json +8 -8
  106. package/templates/apps/frontend-static-blog/package.json +8 -8
  107. package/templates/apps/frontend-status/package.json +8 -8
  108. package/templates/apps/mobile-app/package.json +4 -4
  109. package/dist/apiBuild-CeUN55uk.js +0 -2
  110. package/dist/codegen-DjgxEOnD.js +0 -2
  111. package/dist/dbCommand-CSFWs9ev.js +0 -2
  112. package/dist/doctorCommand-J3qu4E0Y.js +0 -2
  113. package/dist/frameworkTableAssembly-IPD1pUnZ.js +0 -2
  114. package/dist/inspect-CuoDInfZ.js +0 -2
  115. package/dist/interruptedReplace-C3O3M1MM.js +0 -28
  116. package/dist/interruptedReplace-CvmiAM9K.js +0 -2
  117. package/dist/manifestBuild-C4-J1-m_.js +0 -2
  118. package/dist/serveCommand-BiPe8BJm.js +0 -2
  119. package/dist/updateCommand-CIoVDKnj.js +0 -2
@@ -304,8 +304,8 @@ ${o.join("\n\n")}\n`);
304
304
  file: t,
305
305
  reason: "a descriptor changed since the group was generated"
306
306
  };
307
- }, Q = (e, t, n, i = [], o = [], s = !1, l = !1, u = [], d = "") => {
308
- let f = o.length > 0, m = o.flatMap((e) => [{
307
+ }, Q = (e, t, n, i = [], o = [], s = !1, l = !1, u = [], d = {}, f = "") => {
308
+ let m = o.length > 0, h = o.flatMap((e) => [{
309
309
  file: e.file,
310
310
  exportName: e.exportName,
311
311
  rpcTag: `${e.name}.send`,
@@ -315,7 +315,7 @@ ${o.join("\n\n")}\n`);
315
315
  exportName: e.exportName,
316
316
  rpcTag: `${e.name}.messages`,
317
317
  kind: "query"
318
- }]), h = [...new Map(u.map((e) => [e.tag, e])).values()].sort((e, t) => e.tag < t.tag ? -1 : 1), g = h.map((e) => ({
318
+ }]), g = [...new Map(u.map((e) => [e.tag, e])).values()].sort((e, t) => e.tag < t.tag ? -1 : 1), _ = g.map((e) => ({
319
319
  file: `plugin:${e.module}`,
320
320
  exportName: e.name,
321
321
  rpcTag: e.tag,
@@ -323,26 +323,26 @@ ${o.join("\n\n")}\n`);
323
323
  }));
324
324
  ee([
325
325
  ...n,
326
- ...m,
327
- ...g
326
+ ...h,
327
+ ..._
328
328
  ], e), q([
329
329
  ...n,
330
- ...m,
331
- ...g
330
+ ...h,
331
+ ..._
332
332
  ], e);
333
- let _ = (e) => e.replace(/[^a-zA-Z0-9_$]/g, "_"), v = (e) => `__src_agent_${_(e.name)}`, y = (e) => `__agentRoutes_${_(e.name)}`, b = i.length > 0, x = i.map((e, t) => `import { ${e.name} as __pe${t} } from '${e.module}'`), S = b ? ", __voltroPluginErrors" : "", C = h.length > 0, w = h.map((e, t) => `import { ${e.name} as __prpc${t} } from '${e.module}'`), T = (e) => e === "query" ? "queryToRpc" : e === "mutation" ? "mutationToRpc" : "actionToRpc", E = h.map((e, t) => `export const ${G(e.tag)} = ${T(e.kind)}(__prpc${t}${S})`), D = h.map((e) => ` ${G(e.tag)},`), O = [...n].sort((e, t) => e.kind === t.kind ? e.rpcTag < t.rpcTag ? -1 : 1 : J(e.kind) - J(t.kind)), k = r(t), A = (e) => `__src_${G(e.rpcTag)}`, j = (e) => {
334
- let t = `./${a(k, e.file).replace(/\\/g, "/").replace(/\.tsx?$/, "")}`;
335
- return `import { ${e.exportName} as ${A(e)} } from '${t}'`;
336
- }, M = (e) => {
337
- let t = G(e.rpcTag), n = A(e);
338
- return e.kind === "query" ? `export const ${t} = queryToRpc(${n}${S})` : e.kind === "mutation" ? `export const ${t} = mutationToRpc(${n}${S})` : e.kind === "action" ? `export const ${t} = actionToRpc(${n}${S})` : e.kind === "stream" ? `export const ${t} = streamToRpc(${n}${S})` : e.kind === "event" ? `export const ${t} = eventToRpc(${n}${S})` : [
333
+ let v = (e) => e.replace(/[^a-zA-Z0-9_$]/g, "_"), y = (e) => `__src_agent_${v(e.name)}`, b = (e) => `__agentRoutes_${v(e.name)}`, x = i.length > 0, S = i.map((e, t) => `import { ${e.name} as __pe${t} } from '${e.module}'`), C = x ? ", __voltroPluginErrors" : "", w = g.length > 0, T = g.map((e, t) => `import { ${e.name} as __prpc${t} } from '${e.module}'`), E = (e) => e === "query" ? "queryToRpc" : e === "mutation" ? "mutationToRpc" : "actionToRpc", D = g.map((e, t) => `export const ${G(e.tag)} = ${E(e.kind)}(withRpcTag(__prpc${t}, ${JSON.stringify(e.tag)})${C})`), O = g.map((e) => ` ${G(e.tag)},`), k = [...n].sort((e, t) => e.kind === t.kind ? e.rpcTag < t.rpcTag ? -1 : 1 : J(e.kind) - J(t.kind)), A = r(t), j = (e) => `__src_${G(e.rpcTag)}`, M = (e) => {
334
+ let t = `./${a(A, e.file).replace(/\\/g, "/").replace(/\.tsx?$/, "")}`;
335
+ return `import { ${e.exportName} as ${j(e)} } from '${t}'`;
336
+ }, N = (e) => {
337
+ let t = G(e.rpcTag), n = j(e);
338
+ return e.kind === "query" ? `export const ${t} = queryToRpc(${n}${C})` : e.kind === "mutation" ? `export const ${t} = mutationToRpc(${n}${C})` : e.kind === "action" ? `export const ${t} = actionToRpc(${n}${C})` : e.kind === "stream" ? `export const ${t} = streamToRpc(${n}${C})` : e.kind === "event" ? `export const ${t} = eventToRpc(${n}${C})` : [
339
339
  `export const ${t} = Rpc.make('${e.rpcTag}', {`,
340
340
  ` payload: strictInput(${n}.payloadSchema),`,
341
341
  " success: WorkflowRunHandleSchema,",
342
342
  ` error: ${n}.errorSchema,`,
343
343
  "})"
344
344
  ].join("\n");
345
- }, N = [...O.filter((e) => e.kind === "query" || e.kind === "mutation" || e.kind === "action" || e.kind === "stream").map((e) => ` | __AppErrorOf<typeof ${A(e)}>`), ...b ? [" | Schema.Schema.Type<(typeof __voltroPluginErrors)[number]>"] : []], P = N.length > 0, F = O.some((e) => e.kind === "workflow"), I = F ? [
345
+ }, P = [...k.filter((e) => e.kind === "query" || e.kind === "mutation" || e.kind === "action" || e.kind === "stream").map((e) => ` | __AppErrorOf<typeof ${j(e)}>`), ...x ? [" | Schema.Schema.Type<(typeof __voltroPluginErrors)[number]>"] : []], F = P.length > 0, I = k.some((e) => e.kind === "workflow"), L = I ? [
346
346
  "__voltroWorkflowRun",
347
347
  "__voltroWorkflowRuns",
348
348
  "__voltroWorkflowRunSteps",
@@ -353,27 +353,29 @@ ${o.join("\n\n")}\n`);
353
353
  "__voltroWorkflowResume",
354
354
  "__voltroWorkflowSignal",
355
355
  "__voltroWorkflowUpdate"
356
- ] : [], L = s ? [
356
+ ] : [], R = s ? [
357
357
  "__voltroUndoLog",
358
358
  "__voltroUndoApply",
359
359
  "__voltroUndoRedo"
360
- ] : [], R = O.some((e) => e.requiresApproval === !0), z = R ? ["__voltroApprovalsPending", "__voltroApprovalsDecide"] : [], B = l ? [
360
+ ] : [], z = k.some((e) => e.requiresApproval === !0), B = z ? ["__voltroApprovalsPending", "__voltroApprovalsDecide"] : [], V = l ? [
361
361
  "__voltroConnectionsList",
362
362
  "__voltroConnectionStart",
363
363
  "__voltroConnectionSubmitToken",
364
364
  "__voltroConnectionDisconnect"
365
- ] : [], V = [
366
- ...O.map((e) => ` ${G(e.rpcTag)},`),
365
+ ] : [], H = [
366
+ ...k.map((e) => ` ${G(e.rpcTag)},`),
367
367
  ...o.flatMap((e) => [` ${G(`${e.name}.send`)},`, ` ${G(`${e.name}.messages`)},`]),
368
- ...I.map((e) => ` ${e},`),
369
368
  ...L.map((e) => ` ${e},`),
370
- ...z.map((e) => ` ${e},`),
369
+ ...R.map((e) => ` ${e},`),
371
370
  ...B.map((e) => ` ${e},`),
372
- ...D
373
- ].join("\n"), H = ["queryToRpc"];
374
- (O.some((e) => e.kind === "mutation") || h.some((e) => e.kind === "mutation")) && H.push("mutationToRpc"), (O.some((e) => e.kind === "action") || F || f || h.some((e) => e.kind === "action")) && H.push("actionToRpc"), O.some((e) => e.kind === "stream") && H.push("streamToRpc"), O.some((e) => e.kind === "event") && H.push("eventToRpc"), F && H.push("strictInput", "WorkflowRunHandleSchema", "workflowCancelDescriptor", "workflowDomainEventsQueryDescriptor", "workflowEventDeliveriesQueryDescriptor", "workflowResumeDescriptor", "workflowRunEventsQueryDescriptor", "workflowRunQueryDescriptor", "workflowRunsQueryDescriptor", "workflowRunStepsQueryDescriptor", "workflowSignalDescriptor", "workflowUpdateDescriptor"), s && H.push("mutationToRpc", "undoLogQueryDescriptor", "undoApplyDescriptor", "undoRedoDescriptor"), R && H.push("mutationToRpc", "approvalsPendingQueryDescriptor", "approvalsDecideDescriptor"), l && H.push("mutationToRpc", "actionToRpc", "connectionsListQueryDescriptor", "connectionStartDescriptor", "connectionSubmitTokenDescriptor", "connectionDisconnectDescriptor"), (O.some((e) => e.kind === "query" || e.kind === "mutation" || e.kind === "action" || e.kind === "stream") || f || F || s || R || l || C) && H.push("normalizeDescriptor");
375
- let U = [...new Set(H)].sort(), W = [...O.filter((e) => e.kind === "query" || e.kind === "mutation" || e.kind === "action" || e.kind === "stream").map((e) => [e.rpcTag, A(e)]), ...o.flatMap((e) => [[`${e.name}.send`, `${y(e)}.send`], [`${e.name}.messages`, `${y(e)}.messages`]])], K = [
376
- ...F ? [
371
+ ...V.map((e) => ` ${e},`),
372
+ ...O
373
+ ].join("\n"), U = ["queryToRpc"];
374
+ w && U.push("withRpcTag");
375
+ let W = Object.entries(d).sort(([e], [t]) => e < t ? -1 : 1), K = W.length > 0;
376
+ K && U.push("registerPluginAliases"), (k.some((e) => e.kind === "mutation") || g.some((e) => e.kind === "mutation")) && U.push("mutationToRpc"), (k.some((e) => e.kind === "action") || I || m || g.some((e) => e.kind === "action")) && U.push("actionToRpc"), k.some((e) => e.kind === "stream") && U.push("streamToRpc"), k.some((e) => e.kind === "event") && U.push("eventToRpc"), I && U.push("strictInput", "WorkflowRunHandleSchema", "workflowCancelDescriptor", "workflowDomainEventsQueryDescriptor", "workflowEventDeliveriesQueryDescriptor", "workflowResumeDescriptor", "workflowRunEventsQueryDescriptor", "workflowRunQueryDescriptor", "workflowRunsQueryDescriptor", "workflowRunStepsQueryDescriptor", "workflowSignalDescriptor", "workflowUpdateDescriptor"), s && U.push("mutationToRpc", "undoLogQueryDescriptor", "undoApplyDescriptor", "undoRedoDescriptor"), z && U.push("mutationToRpc", "approvalsPendingQueryDescriptor", "approvalsDecideDescriptor"), l && U.push("mutationToRpc", "actionToRpc", "connectionsListQueryDescriptor", "connectionStartDescriptor", "connectionSubmitTokenDescriptor", "connectionDisconnectDescriptor"), (k.some((e) => e.kind === "query" || e.kind === "mutation" || e.kind === "action" || e.kind === "stream") || m || I || s || z || l || w) && U.push("normalizeDescriptor");
377
+ let Y = [...new Set(U)].sort(), X = [...k.filter((e) => e.kind === "query" || e.kind === "mutation" || e.kind === "action" || e.kind === "stream").map((e) => [e.rpcTag, j(e)]), ...o.flatMap((e) => [[`${e.name}.send`, `${b(e)}.send`], [`${e.name}.messages`, `${b(e)}.messages`]])], Z = [
378
+ ...I ? [
377
379
  ["__voltro.workflow.run", "workflowRunQueryDescriptor"],
378
380
  ["__voltro.workflow.runs", "workflowRunsQueryDescriptor"],
379
381
  ["__voltro.workflow.run.steps", "workflowRunStepsQueryDescriptor"],
@@ -390,20 +392,20 @@ ${o.join("\n\n")}\n`);
390
392
  ["__voltro.undo.apply", "undoApplyDescriptor"],
391
393
  ["__voltro.undo.redo", "undoRedoDescriptor"]
392
394
  ] : [],
393
- ...R ? [["__voltro.approvals.pending", "approvalsPendingQueryDescriptor"], ["__voltro.approvals.decide", "approvalsDecideDescriptor"]] : [],
395
+ ...z ? [["__voltro.approvals.pending", "approvalsPendingQueryDescriptor"], ["__voltro.approvals.decide", "approvalsDecideDescriptor"]] : [],
394
396
  ...l ? [
395
397
  ["__voltro.connections.list", "connectionsListQueryDescriptor"],
396
398
  ["__voltro.connections.start", "connectionStartDescriptor"],
397
399
  ["__voltro.connections.submitToken", "connectionSubmitTokenDescriptor"],
398
400
  ["__voltro.connections.disconnect", "connectionDisconnectDescriptor"]
399
401
  ] : [],
400
- ...h.map((e, t) => [e.tag, `__prpc${t}`])
401
- ], Y = ([e, t]) => ` ${JSON.stringify(e)}: normalizeDescriptor(${t}),`, X = ([e, t]) => ` readonly ${JSON.stringify(e)}: typeof ${t}`, Z = W.map(Y), Q = K.map(Y), $ = O.filter((e) => e.kind === "workflow").map((e) => ` ${JSON.stringify(e.rpcTag)}: { kind: 'workflow' },`), ne = O.filter((e) => e.kind === "workflow").map((e) => ` readonly ${JSON.stringify(e.rpcTag)}: { readonly kind: 'workflow' }`), re = [
402
- ...W.map(X),
403
- ...ne,
404
- ...K.map(X)
405
- ], ie = O.filter((e) => e.kind === "workflow").map((e) => {
406
- let t = A(e);
402
+ ...g.map((e, t) => [e.tag, `__prpc${t}`])
403
+ ], Q = ([e, t]) => ` ${JSON.stringify(e)}: normalizeDescriptor(${t}),`, $ = ([e, t]) => ` readonly ${JSON.stringify(e)}: typeof ${t}`, ne = X.map(Q), re = Z.map(Q), ie = k.filter((e) => e.kind === "workflow").map((e) => ` ${JSON.stringify(e.rpcTag)}: { kind: 'workflow' },`), ae = k.filter((e) => e.kind === "workflow").map((e) => ` readonly ${JSON.stringify(e.rpcTag)}: { readonly kind: 'workflow' }`), oe = [
404
+ ...X.map($),
405
+ ...ae,
406
+ ...Z.map($)
407
+ ], se = k.filter((e) => e.kind === "workflow").map((e) => {
408
+ let t = j(e);
407
409
  return [
408
410
  ` ${JSON.stringify(e.rpcTag)}: {`,
409
411
  " kind: 'workflow',",
@@ -414,44 +416,53 @@ ${o.join("\n\n")}\n`);
414
416
  ` updates: __voltroWorkflowMessages(${t}).updates,`,
415
417
  " },"
416
418
  ].join("\n");
417
- }), ae = [...O, ...o.map((e) => ({
419
+ }), ce = [...k, ...o.map((e) => ({
418
420
  rpcTag: `agent:${e.name}`,
419
421
  file: e.file
420
422
  }))];
421
423
  return [
422
424
  "// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
423
425
  "// Re-emitted by `voltro dev` whenever query/mutation/action/stream/workflow files change.",
424
- `// descriptor-fingerprint: ${p("sha1").update(ae.map((e) => {
426
+ `// descriptor-fingerprint: ${p("sha1").update(ce.map((e) => {
425
427
  let t = "";
426
428
  try {
427
429
  t = c(e.file, "utf8");
428
430
  } catch {}
429
431
  return `${e.rpcTag}\u0000${t}`;
430
432
  }).join("")).digest("hex").slice(0, 16)}`,
431
- `${te}${d}`,
433
+ `${te}${f}`,
432
434
  "// Source files:",
433
- ...O.map((t) => `// - ${a(e, t.file).replace(/\\/g, "/")}`),
435
+ ...k.map((t) => `// - ${a(e, t.file).replace(/\\/g, "/")}`),
434
436
  ...o.map((t) => `// - ${a(e, t.file).replace(/\\/g, "/")} (agent)`),
435
437
  "",
436
- F ? "import { Rpc, RpcGroup } from '@effect/rpc'" : "import { RpcGroup } from '@effect/rpc'",
437
- ...F || P ? ["import { Schema } from 'effect'"] : [],
438
- `import { ${U.join(", ")} } from '@voltro/protocol'`,
439
- ...f ? ["import { agentRouteDescriptors as __voltroAgentRoutes } from '@voltro/ai/agent'"] : [],
438
+ I ? "import { Rpc, RpcGroup } from '@effect/rpc'" : "import { RpcGroup } from '@effect/rpc'",
439
+ ...I || F ? ["import { Schema } from 'effect'"] : [],
440
+ `import { ${Y.join(", ")} } from '@voltro/protocol'`,
441
+ ...m ? ["import { agentRouteDescriptors as __voltroAgentRoutes } from '@voltro/ai/agent'"] : [],
440
442
  "",
441
- ...O.map(j),
442
- ...o.map((e) => `import { ${e.exportName} as ${v(e)} } from './${a(k, e.file).replace(/\\/g, "/").replace(/\.tsx?$/, "")}'`),
443
- ...b ? ["", ...x] : [],
444
- ...C ? ["", ...w] : [],
443
+ ...k.map(M),
444
+ ...o.map((e) => `import { ${e.exportName} as ${y(e)} } from './${a(A, e.file).replace(/\\/g, "/").replace(/\.tsx?$/, "")}'`),
445
+ ...x ? ["", ...S] : [],
446
+ ...w ? ["", ...T] : [],
447
+ ...K ? [
448
+ "",
449
+ "/** Which namespace each installed plugin answers to in THIS app. Read by",
450
+ " * the plugins' own client hooks via `pluginTag()` so an `alias` in",
451
+ " * app.config.ts moves them too, not just the server's routes. */",
452
+ "registerPluginAliases({",
453
+ ...W.map(([e, t]) => ` ${JSON.stringify(e)}: ${JSON.stringify(t)},`),
454
+ "})"
455
+ ] : [],
445
456
  "",
446
- ...o.map((e) => `const ${y(e)} = __voltroAgentRoutes(${v(e)})`),
447
- ...f ? [""] : [],
448
- ...b ? [
457
+ ...o.map((e) => `const ${b(e)} = __voltroAgentRoutes(${y(e)})`),
458
+ ...m ? [""] : [],
459
+ ...x ? [
449
460
  "/** Cross-cutting plugin error schemas, unioned into every rpc's",
450
461
  " * wire error so interceptor failures decode typed on the client. */",
451
462
  `const __voltroPluginErrors = [${i.map((e, t) => `__pe${t}`).join(", ")}] as const`,
452
463
  ""
453
464
  ] : [],
454
- ...F ? [
465
+ ...I ? [
455
466
  "const __voltroEmptyWorkflowMessages = { signals: {}, updates: {} } as const",
456
467
  "const __voltroWorkflowMessages = <const M extends {",
457
468
  " readonly signals: Readonly<Record<string, Schema.Schema.Any>>",
@@ -460,7 +471,7 @@ ${o.join("\n\n")}\n`);
460
471
  " definition.__voltroWorkflowMessages ?? __voltroEmptyWorkflowMessages",
461
472
  "",
462
473
  "export const workflowDescriptors = {",
463
- ...ie,
474
+ ...se,
464
475
  "} as const",
465
476
  "",
466
477
  "export type WorkflowDescriptors = typeof workflowDescriptors",
@@ -479,9 +490,9 @@ ${o.join("\n\n")}\n`);
479
490
  "} }",
480
491
  ""
481
492
  ] : [],
482
- ...O.map(M),
483
- ...o.flatMap((e) => [`export const ${G(`${e.name}.send`)} = actionToRpc(${y(e)}.send${S})`, `export const ${G(`${e.name}.messages`)} = queryToRpc(${y(e)}.messages${S})`]),
484
- ...F ? [
493
+ ...k.map(N),
494
+ ...o.flatMap((e) => [`export const ${G(`${e.name}.send`)} = actionToRpc(${b(e)}.send${C})`, `export const ${G(`${e.name}.messages`)} = queryToRpc(${b(e)}.messages${C})`]),
495
+ ...I ? [
485
496
  "export const __voltroWorkflowRun = queryToRpc(workflowRunQueryDescriptor)",
486
497
  "export const __voltroWorkflowRuns = queryToRpc(workflowRunsQueryDescriptor)",
487
498
  "export const __voltroWorkflowRunSteps = queryToRpc(workflowRunStepsQueryDescriptor)",
@@ -498,26 +509,26 @@ ${o.join("\n\n")}\n`);
498
509
  "export const __voltroUndoApply = mutationToRpc(undoApplyDescriptor)",
499
510
  "export const __voltroUndoRedo = mutationToRpc(undoRedoDescriptor)"
500
511
  ] : [],
501
- ...R ? ["export const __voltroApprovalsPending = queryToRpc(approvalsPendingQueryDescriptor)", "export const __voltroApprovalsDecide = mutationToRpc(approvalsDecideDescriptor)"] : [],
512
+ ...z ? ["export const __voltroApprovalsPending = queryToRpc(approvalsPendingQueryDescriptor)", "export const __voltroApprovalsDecide = mutationToRpc(approvalsDecideDescriptor)"] : [],
502
513
  ...l ? [
503
514
  "export const __voltroConnectionsList = queryToRpc(connectionsListQueryDescriptor)",
504
515
  "export const __voltroConnectionStart = actionToRpc(connectionStartDescriptor)",
505
516
  "export const __voltroConnectionSubmitToken = mutationToRpc(connectionSubmitTokenDescriptor)",
506
517
  "export const __voltroConnectionDisconnect = mutationToRpc(connectionDisconnectDescriptor)"
507
518
  ] : [],
508
- ...E,
519
+ ...D,
509
520
  "",
510
521
  "export const appGroup = RpcGroup.make(",
511
- V,
522
+ H,
512
523
  ")",
513
524
  "",
514
525
  "/** Per-rpc-tag metadata for the client. Drives auto-optimistic etc.",
515
526
  " * Function fields (target.shape, target.identify) survive because",
516
527
  " * the descriptors themselves are imported by reference. */",
517
528
  "export const appDescriptors = {",
518
- ...Z,
519
- ...$,
520
- ...Q,
529
+ ...ne,
530
+ ...ie,
531
+ ...re,
521
532
  "} as const",
522
533
  "",
523
534
  "export type AppDescriptors = typeof appDescriptors",
@@ -541,16 +552,16 @@ ${o.join("\n\n")}\n`);
541
552
  " * Types only — erased at build time, so importing it costs the bundle",
542
553
  " * nothing. */",
543
554
  "export type AppProcedures = {",
544
- ...re,
555
+ ...oe,
545
556
  "}",
546
557
  "",
547
- ...P ? [
558
+ ...F ? [
548
559
  "type __AppErrorOf<D> = D extends { readonly error: infer E extends Schema.Schema.Any } ? Schema.Schema.Type<E> : never",
549
560
  "/** Union of every typed error the app's rpcs can fail with — the declared",
550
561
  " * `error:` schemas + cross-cutting plugin errors. Generated by reference,",
551
562
  " * so it can never drift out of date. (Workflows: see `WorkflowErrors`.) */",
552
563
  "export type AppError =",
553
- ...N,
564
+ ...P,
554
565
  "/** The `_tag` literal of every AppError — the exhaustive key set for `matchError`. */",
555
566
  "export type AppErrorTag = AppError extends { readonly _tag: infer T extends string } ? T : never",
556
567
  "",
@@ -594,7 +605,7 @@ ${o.join("\n\n")}\n`);
594
605
  "workflows"
595
606
  ]), p = (e) => e.slice(e.lastIndexOf("/") + 1), m = u;
596
607
  for (; m !== t && d.has(p(m));) m = m.slice(0, m.lastIndexOf("/")) || "/";
597
- let h = o(e.outputFile ?? i(m, "rpcGroup.generated.ts")), g = [...new Map((e.pluginErrorImports ?? []).map((e) => [`${e.module}#${e.name}`, e])).values()], _ = [...new Map((e.pluginRpcImports ?? []).map((e) => [e.tag, e])).values()], v = await Y(r(h)), y = Q(t, h, a, g, c, f(), l, _, v), b = [];
608
+ let h = o(e.outputFile ?? i(m, "rpcGroup.generated.ts")), g = [...new Map((e.pluginErrorImports ?? []).map((e) => [`${e.module}#${e.name}`, e])).values()], _ = [...new Map((e.pluginRpcImports ?? []).map((e) => [e.tag, e])).values()], v = await Y(r(h)), y = Q(t, h, a, g, c, f(), l, _, e.pluginAliases ?? {}, v), b = [];
598
609
  for (let t of e.pluginContributions ?? []) {
599
610
  let e = null;
600
611
  try {
@@ -1,6 +1,6 @@
1
- import { Dn as e, En as t, V as n, l as r, u as i } from "./dev-CmuvUKRq.js";
2
- import { n as a } from "./frameworkTableAssembly-D7LJuALW.js";
3
- import { i as o, r as s } from "./codegen-DSLM8Su9.js";
1
+ import { Dn as e, En as t, V as n, l as r, u as i } from "./dev-Ca_A_S9v.js";
2
+ import { n as a } from "./frameworkTableAssembly-Do-cf6RJ.js";
3
+ import { i as o, r as s } from "./codegen-SIepQtUl.js";
4
4
  import { n as c, r as l } from "./mobileCommand-D9O6iq3D.js";
5
5
  import { basename as u, relative as d, resolve as f } from "node:path";
6
6
  //#region src/codegenCommand.ts
@@ -10,23 +10,24 @@ var p = async (t) => {
10
10
  kind: "refused",
11
11
  reason: "app.config.ts exists but could not be loaded" + (o === void 0 ? "" : ` — ${o instanceof Error ? o.message : String(o)}`)
12
12
  };
13
- let c = i?.plugins ?? [], { pluginContributions: l, pluginErrorImports: d, pluginRpcImports: f } = await n(c, i?.name ?? u(t), t), p = await s({
13
+ let c = i?.plugins ?? [], { pluginContributions: l, pluginErrorImports: d, pluginRpcImports: f, pluginAliases: p } = await n(c, i?.name ?? u(t), t), h = await s({
14
14
  root: t,
15
15
  ...l.length > 0 ? { pluginContributions: l } : {},
16
16
  ...d.length > 0 ? { pluginErrorImports: d } : {},
17
17
  ...f.length > 0 ? { pluginRpcImports: f } : {},
18
+ ...Object.keys(p).length > 0 ? { pluginAliases: p } : {},
18
19
  ...i?.name === void 0 ? {} : { apiName: i.name }
19
20
  });
20
- if (!p) return { kind: "nothing-to-write" };
21
- let h = await m(t, i), g = await e(p, h);
21
+ if (!h) return { kind: "nothing-to-write" };
22
+ let g = await m(t, i), _ = await e(h, g);
22
23
  return {
23
24
  kind: "wrote",
24
- file: p,
25
+ file: h,
25
26
  plugins: c.length,
26
27
  errorSchemas: d.length,
27
28
  routes: f.length,
28
- tables: h.size,
29
- dts: g
29
+ tables: g.size,
30
+ dts: _
30
31
  };
31
32
  }, m = async (e, n) => {
32
33
  let r = await o(e), { tables: s } = await i(r), c = await a({ root: e });
@@ -6130,6 +6130,61 @@ 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")
6133
6188
  })
6134
6189
  ], J = /* @__PURE__ */ new Set([
6135
6190
  "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-DfVZaoys.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-D2kmyCLL.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-DNkY5kwF.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-B1LVcyO3.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-BsbZ-XDg.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-3TDJezom.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-CGFZS-1a.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-DO27-x2P.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-EmM3jPKD.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-Bxy2fOjc.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-J3qu4E0Y.js");
334
+ let { runServePreflight: e } = await import("./doctorCommand-djmqEcDC.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-1XpVnYkW.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-Cjt5S9hD.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-J3qu4E0Y.js").then((t) => t.runDoctorCommand(e))
367
+ run: (e) => import("./doctorCommand-djmqEcDC.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-S0QOzqPT.js").then((t) => t.runBuildCommand(e)),
374
374
  help: {
375
375
  usage: "[app] [--target <t>]",
376
376
  flags: [["--target <t>", "build target"]],
@@ -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-C1BTpHGQ.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-DY2rYpTa.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-DH7cat4-.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-BTyBGhIA.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-BEPPQiTl.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-nnFjDbl4.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-nnFjDbl4.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-BoCqZsgp.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-_C0YU207.js").then((t) => t.runProbeCommand(e))
617
+ run: (e) => import("./probeCommand-Bs3iVBSL.js").then((t) => t.runProbeCommand(e))
618
618
  },
619
619
  {
620
620
  name: "schedule",
@@ -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-Ca_A_S9v.js";
2
+ import { Z as t, et as n } from "./webDev-B7vNj4Bq.js";
3
+ import { t as r } from "./start-EOV7s1NZ.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";