@voltro/cli 0.39.0 → 0.39.1

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 (84) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/apiBuild-BmR_bIxN.js +2 -0
  3. package/dist/{apiBuild-DGalUk9v.js → apiBuild-D9FB13_2.js} +1 -1
  4. package/dist/bin.js +1 -1
  5. package/dist/{build-CfF6t0UM.js → build-DORV5mLM.js} +6 -6
  6. package/dist/{checkCommand-CBtynBKW.js → checkCommand-Bf6oMao4.js} +3 -3
  7. package/dist/{checkCommand-BV56Pcc1.js → checkCommand-D9qK_gtA.js} +1 -1
  8. package/dist/{codegenCommand-W7SDdiAQ.js → codegenCommand-CxOyKmc1.js} +1 -1
  9. package/dist/{commands-BD9eBRY3.js → commands-D6aW_6AR.js} +15 -15
  10. package/dist/{dashboardCommand-7qGylm0F.js → dashboardCommand-CwTZh-XZ.js} +1 -1
  11. package/dist/{dataCommand-C_F2DYxe.js → dataCommand-Cc9RiLQZ.js} +1 -1
  12. package/dist/{dev-gqpnzVhI.js → dev-3mgc8c-H.js} +26 -26
  13. package/dist/{dev-alhkKoEX.js → dev-CjJAasDs.js} +1 -1
  14. package/dist/doctorCommand-Cghssndo.js +2 -0
  15. package/dist/{doctorCommand-Bvs-BQrM.js → doctorCommand-oLuzc-aC.js} +28 -15
  16. package/dist/{dormancyCommand-B-PPHc9Q.js → dormancyCommand-Bxe4WtHU.js} +1 -1
  17. package/dist/{embeddingsCommand-OKY6XjUf.js → embeddingsCommand-CyNQkFIc.js} +1 -1
  18. package/dist/{envCommand-B1-Zm85H.js → envCommand-CAkSgBbh.js} +1 -1
  19. package/dist/{evolveCommand-C4-NlFbd.js → evolveCommand-CWhBoe_P.js} +1 -1
  20. package/dist/frameworkTableAssembly-DgylYh9_.js +2 -0
  21. package/dist/index.js +1 -1
  22. package/dist/{runtimeTrace-DzZOCd94.js → runtimeTrace-gNXeLf6H.js} +1 -1
  23. package/dist/{sdkgen-C4roLErM.js → sdkgen-C8zz10-X.js} +1 -1
  24. package/dist/{serveCommand-B6TATyCj.js → serveCommand-BpK8-m1N.js} +11 -11
  25. package/dist/serveCommand-CW-goXvh.js +2 -0
  26. package/dist/serveEntry.js +1 -1
  27. package/dist/{webhooksCommand-BVvOtZ1B.js → webhooksCommand-EccPZQZ4.js} +1 -1
  28. package/package.json +17 -17
  29. package/templates/AGENTS.md +1 -1
  30. package/templates/agent-docs/_index.md +1 -1
  31. package/templates/agent-docs/authentication.md +13 -4
  32. package/templates/agent-docs/whats-new.md +26 -198
  33. package/templates/apps/api-ai/package.json +7 -7
  34. package/templates/apps/api-auth/package.json +8 -8
  35. package/templates/apps/api-backend/package.json +7 -7
  36. package/templates/apps/api-backend-deactivation/package.json +7 -7
  37. package/templates/apps/api-backend-mail/package.json +8 -8
  38. package/templates/apps/api-backend-mariadb/package.json +9 -9
  39. package/templates/apps/api-backend-sqlite/package.json +8 -8
  40. package/templates/apps/api-backend-storage/package.json +8 -8
  41. package/templates/apps/api-cms/package.json +10 -10
  42. package/templates/apps/api-collab/package.json +8 -8
  43. package/templates/apps/api-data-advanced/package.json +8 -8
  44. package/templates/apps/api-durable/package.json +8 -8
  45. package/templates/apps/api-durable/startup/warm.startup.tsx +16 -2
  46. package/templates/apps/api-feature-flags/package.json +9 -9
  47. package/templates/apps/api-governance/package.json +8 -8
  48. package/templates/apps/api-kv/package.json +8 -8
  49. package/templates/apps/api-moderation/package.json +8 -8
  50. package/templates/apps/api-observability/package.json +8 -8
  51. package/templates/apps/api-ratelimit/package.json +8 -8
  52. package/templates/apps/api-rbac/package.json +8 -8
  53. package/templates/apps/api-rest/package.json +7 -7
  54. package/templates/apps/api-saas/package.json +11 -11
  55. package/templates/apps/api-saas-starter/package.json +10 -10
  56. package/templates/apps/api-search/package.json +8 -8
  57. package/templates/apps/api-status/package.json +8 -8
  58. package/templates/apps/api-versioning/package.json +8 -8
  59. package/templates/apps/api-webhooks/package.json +9 -9
  60. package/templates/apps/changelog/package.json +6 -6
  61. package/templates/apps/edge-functions/package.json +2 -2
  62. package/templates/apps/frontend-admin/package.json +8 -8
  63. package/templates/apps/frontend-app/package.json +9 -9
  64. package/templates/apps/frontend-auth/package.json +8 -8
  65. package/templates/apps/frontend-blank/package.json +7 -7
  66. package/templates/apps/frontend-cms/package.json +9 -9
  67. package/templates/apps/frontend-collab/package.json +10 -10
  68. package/templates/apps/frontend-contact/package.json +7 -7
  69. package/templates/apps/frontend-dashboard/package.json +7 -7
  70. package/templates/apps/frontend-docs/package.json +7 -7
  71. package/templates/apps/frontend-i18n/package.json +6 -6
  72. package/templates/apps/frontend-landing/package.json +7 -7
  73. package/templates/apps/frontend-portal/package.json +8 -8
  74. package/templates/apps/frontend-saas/package.json +8 -8
  75. package/templates/apps/frontend-spa/package.json +7 -7
  76. package/templates/apps/frontend-ssr/package.json +7 -7
  77. package/templates/apps/frontend-ssr-api/package.json +8 -8
  78. package/templates/apps/frontend-static-blog/package.json +6 -6
  79. package/templates/apps/frontend-status/package.json +8 -8
  80. package/templates/apps/mobile-app/package.json +4 -4
  81. package/dist/apiBuild-2GvK8CUB.js +0 -2
  82. package/dist/doctorCommand-CVXfRrng.js +0 -2
  83. package/dist/frameworkTableAssembly-YyVe32Cb.js +0 -2
  84. package/dist/serveCommand-CNR0gI9V.js +0 -2
@@ -1,8 +1,8 @@
1
- import { Bt as e, Ht as t, Vt as n } from "./dev-gqpnzVhI.js";
1
+ import { Bt as e, Ht as t, Vt as n } from "./dev-3mgc8c-H.js";
2
2
  import { $ as r, Q as i, X as a, Z as o, s, t as c, y as l } from "./webDev-CTpSY-e_.js";
3
3
  import { w as u } from "./frameworkTableAssembly-oMPBKqlE.js";
4
4
  import { n as d } from "./pageConvention-cEiRxdab.js";
5
- import { r as f, u as p } from "./apiBuild-DGalUk9v.js";
5
+ import { r as f, u as p } from "./apiBuild-D9FB13_2.js";
6
6
  import { n as m, r as h, t as g } from "./cliOutput-D1tSBoRM.js";
7
7
  import { n as _, t as ee } from "./tsconfigPaths-BWXBWgcl.js";
8
8
  import { n as te, r as ne } from "./fileTaxonomy-CJfgOllU.js";
@@ -1249,7 +1249,7 @@ var ce = /* @__PURE__ */ new Set([
1249
1249
  let t = zt.get(e);
1250
1250
  if (t !== void 0) return t;
1251
1251
  let n = (async () => {
1252
- let { walk: t, loadDiscovered: n } = await import("./dev-alhkKoEX.js"), r = await t(e);
1252
+ let { walk: t, loadDiscovered: n } = await import("./dev-CjJAasDs.js"), r = await t(e);
1253
1253
  return {
1254
1254
  files: r,
1255
1255
  discovered: await n(r)
@@ -1337,7 +1337,7 @@ var ce = /* @__PURE__ */ new Set([
1337
1337
  }
1338
1338
  }, J = async (r) => {
1339
1339
  try {
1340
- let { loadApiConfig: i } = await import("./dev-alhkKoEX.js"), { discovered: a } = await U(r), o = n(await i(r)), s = {
1340
+ let { loadApiConfig: i } = await import("./dev-CjJAasDs.js"), { discovered: a } = await U(r), o = n(await i(r)), s = {
1341
1341
  queries: a.queries,
1342
1342
  mutations: a.mutations,
1343
1343
  actions: a.actions,
@@ -1421,7 +1421,7 @@ var ce = /* @__PURE__ */ new Set([
1421
1421
  }, Jt = async (e) => Ye({
1422
1422
  hasWorkflows: async () => (await U(e)).discovered.workflows.length > 0,
1423
1423
  openStore: async () => {
1424
- let { loadApiConfig: t, buildStore: n } = await import("./dev-alhkKoEX.js"), r = await t(e);
1424
+ let { loadApiConfig: t, buildStore: n } = await import("./dev-CjJAasDs.js"), r = await t(e);
1425
1425
  if (r === null) throw Error("no app.config.ts in this directory");
1426
1426
  let i = await n(r, void 0);
1427
1427
  return {
@@ -1501,7 +1501,7 @@ var ce = /* @__PURE__ */ new Set([
1501
1501
  }
1502
1502
  }, en = async (e) => {
1503
1503
  try {
1504
- let { loadApiConfig: t } = await import("./dev-alhkKoEX.js"), n = (await t(e))?.doctor?.scopeVocabulary;
1504
+ let { loadApiConfig: t } = await import("./dev-CjJAasDs.js"), n = (await t(e))?.doctor?.scopeVocabulary;
1505
1505
  if (typeof n != "string") return [];
1506
1506
  let [r, i] = n.split("#");
1507
1507
  if (r === void 0 || i === void 0) return [];
@@ -1511,14 +1511,23 @@ var ce = /* @__PURE__ */ new Set([
1511
1511
  return [];
1512
1512
  }
1513
1513
  }, Q = async (e) => {
1514
- let t = {
1514
+ let t = (e) => ({
1515
1515
  evaluated: !1,
1516
+ notEvaluated: e,
1516
1517
  vocabularySize: 0,
1517
1518
  findings: []
1518
- };
1519
+ });
1519
1520
  try {
1520
- let { offlineManifest: n, toInput: r } = await import("./checkCommand-BV56Pcc1.js"), { buildAppGraph: i, checkAppGraph: a } = await import("./appGraph-zuMGKVYX.js"), o = await n(e), s = r(o.manifest, o.tables), c = await en(e), l = [.../* @__PURE__ */ new Set([...s.scopes ?? [], ...c])];
1521
- if (l.length === 0) return t;
1521
+ let { offlineManifest: n, toInput: r } = await import("./checkCommand-D9qK_gtA.js"), { buildAppGraph: i, checkAppGraph: a } = await import("./appGraph-zuMGKVYX.js"), o = await n(e), s = r(o.manifest, o.tables), c = await en(e), l = [.../* @__PURE__ */ new Set([...s.scopes ?? [], ...c])];
1522
+ if (l.length === 0) {
1523
+ try {
1524
+ let { loadAppSchemaInputs: t } = await import("./frameworkTableAssembly-DgylYh9_.js");
1525
+ await t(e);
1526
+ } catch {
1527
+ return t("app-not-importable");
1528
+ }
1529
+ return t("no-vocabulary");
1530
+ }
1522
1531
  let u = i({
1523
1532
  ...s,
1524
1533
  scopes: l
@@ -1534,12 +1543,16 @@ var ce = /* @__PURE__ */ new Set([
1534
1543
  }))
1535
1544
  };
1536
1545
  } catch {
1537
- return t;
1546
+ return t("app-not-importable");
1538
1547
  }
1539
1548
  }, tn = async (e) => {
1540
- let { findings: t, evaluated: n } = await Q(e);
1549
+ let { findings: t, evaluated: n, notEvaluated: r } = await Q(e);
1541
1550
  if (!n) {
1542
- console.log(""), console.log("• scope vocabulary: none found — the unknown-scope rule did NOT run."), console.log(" It compares each procedure's required scopes against the scopes your"), console.log(" roles actually grant, and needs somewhere to read that set from."), console.log(" `@voltro/plugin-rbac` publishes it from its `roles` map; an app doing"), console.log(" RBAC without the plugin can point at its own:"), console.log(""), console.log(" // app.config.ts"), console.log(" doctor: { scopeVocabulary: './lib/teamRoles.ts#ALL_TEAM_SCOPES' }"), console.log(""), console.log(" Until then this section is NOT a clean bill of health — a procedure"), console.log(" requiring a scope no role grants is uncallable by everyone, and"), console.log(" nothing here would have told you.");
1551
+ if (console.log(""), r === "app-not-importable") {
1552
+ console.log("• scope vocabulary: NOT EVALUATED — `app.config.ts` could not be imported."), console.log(" This is not a statement about your scopes: the rule never got to read"), console.log(" them. The commonest cause is a config that demands its environment while"), console.log(" it is evaluated — an auth strategy reading a secret, say — so it imports"), console.log(" inside the container and not on a workstation."), console.log(""), console.log(" Run doctor where that environment exists, or make the config importable"), console.log(" without it. The same import failure is reported above for plugin tables;"), console.log(" both sections have this one cause.");
1553
+ return;
1554
+ }
1555
+ console.log("• scope vocabulary: none found — the unknown-scope rule did NOT run."), console.log(" It compares each procedure's required scopes against the scopes your"), console.log(" roles actually grant, and needs somewhere to read that set from."), console.log(" `@voltro/plugin-rbac` publishes it from its `roles` map; an app doing"), console.log(" RBAC without the plugin can point at its own:"), console.log(""), console.log(" // app.config.ts"), console.log(" doctor: { scopeVocabulary: './lib/teamRoles.ts#ALL_TEAM_SCOPES' }"), console.log(""), console.log(" Until then this section is NOT a clean bill of health — a procedure"), console.log(" requiring a scope no role grants is uncallable by everyone, and"), console.log(" nothing here would have told you.");
1543
1556
  return;
1544
1557
  }
1545
1558
  if (t.length !== 0) {
@@ -1559,7 +1572,7 @@ var ce = /* @__PURE__ */ new Set([
1559
1572
  if (n === void 0 || r.length === 0) return;
1560
1573
  let i = [];
1561
1574
  try {
1562
- let { loadApiConfig: t } = await import("./dev-alhkKoEX.js");
1575
+ let { loadApiConfig: t } = await import("./dev-CjJAasDs.js");
1563
1576
  i = (await t(e))?.locales ?? [];
1564
1577
  } catch {
1565
1578
  return;
@@ -1575,7 +1588,7 @@ var ce = /* @__PURE__ */ new Set([
1575
1588
  }, rn = async (e) => {
1576
1589
  let { discovered: t } = await U(e), n = [];
1577
1590
  try {
1578
- let { loadApiConfig: t } = await import("./dev-alhkKoEX.js");
1591
+ let { loadApiConfig: t } = await import("./dev-CjJAasDs.js");
1579
1592
  n = ((await t(e))?.plugins ?? []).map((e) => {
1580
1593
  let t = (e.extendSchema?.tables ?? []).map((e) => {
1581
1594
  let t = e;
@@ -1,4 +1,4 @@
1
- import { c as e, i as t } from "./dev-gqpnzVhI.js";
1
+ import { c as e, i as t } from "./dev-3mgc8c-H.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 { c as e, i as t } from "./dev-gqpnzVhI.js";
1
+ import { c as e, i as t } from "./dev-3mgc8c-H.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 { c as e } from "./dev-gqpnzVhI.js";
1
+ import { c as e } from "./dev-3mgc8c-H.js";
2
2
  import { at as t, ct as n, lt as r, ot as i } from "./webDev-CTpSY-e_.js";
3
3
  import { join as a } from "node:path";
4
4
  import { promises as o } from "node:fs";
@@ -1,5 +1,5 @@
1
1
  import { n as e } from "./cliOutput-D1tSBoRM.js";
2
- import { t } from "./checkCommand-CBtynBKW.js";
2
+ import { t } from "./checkCommand-Bf6oMao4.js";
3
3
  import { i as n, n as r } from "./codemodRunner-D-jTyvWo.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";
@@ -0,0 +1,2 @@
1
+ import { c as e, n as t } from "./frameworkTableAssembly-oMPBKqlE.js";
2
+ export { t as assembleFrameworkTables, e as loadAppSchemaInputs };
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-BD9eBRY3.js";
1
+ import { a as e, i as t, n, o as r, r as i, t as a } from "./commands-D6aW_6AR.js";
2
2
  import { r as o } from "./templates-BR-fb4SP.js";
3
3
  //#region src/index.ts
4
4
  var s = "framework";
@@ -1,4 +1,4 @@
1
- import { n as e } from "./apiBuild-DGalUk9v.js";
1
+ import { n as e } from "./apiBuild-D9FB13_2.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-BV56Pcc1.js"), { manifest: n } = await t(e);
425
+ let { offlineManifest: t } = await import("./checkCommand-D9qK_gtA.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), {
@@ -3,7 +3,7 @@ import { t } from "./frameworkInspectState-CX2250XB.js";
3
3
  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
- import { $ as s, $t as c, A as l, At as u, B as d, C as f, Ct as p, D as ee, Dt as te, E as ne, Et as m, F as re, Ft as h, G as g, Gt as ie, H as ae, I as oe, It as se, J as ce, Jt as _, K as le, Kt as v, L as ue, Lt as de, M as fe, Mt as y, N as pe, Nt as me, O as he, Ot as ge, P as _e, Pt as ve, Q as ye, Qt as be, R as xe, Rt as b, S as Se, Sn as Ce, St as we, T as Te, Tt as Ee, U as De, Ut as x, V as Oe, Vt as ke, W as Ae, Wt as je, X as Me, Xt as Ne, Y as Pe, Yt as Fe, Z as Ie, Zt as S, _ as Le, _n as Re, _t as C, an as ze, at as Be, b as Ve, bn as He, bt as Ue, c as We, cn as w, ct as Ge, dn as Ke, dt as qe, en as Je, et as Ye, f as Xe, fn as Ze, ft as Qe, g as $e, gn as et, gt as tt, h as nt, ht as rt, i as it, in as at, it as ot, j as st, jt as ct, k as lt, kt as ut, ln as T, lt as dt, m as ft, mn as pt, mt as E, nn as D, nt as mt, o as O, on as ht, ot as gt, p as _t, pn as vt, pt as yt, q as bt, qt as xt, r as St, rn as Ct, rt as wt, sn as Tt, st as Et, t as Dt, tn as Ot, tt as kt, u as At, un as jt, ut as Mt, v as Nt, vn as k, vt as A, w as j, wt as Pt, x as Ft, xn as It, xt as Lt, y as Rt, yn as zt, yt as Bt, zt as Vt } from "./dev-gqpnzVhI.js";
6
+ import { $ as s, $t as c, A as l, At as u, B as d, C as f, Ct as p, D as ee, Dt as te, E as ne, Et as m, F as re, Ft as h, G as g, Gt as ie, H as ae, I as oe, It as se, J as ce, Jt as _, K as le, Kt as v, L as ue, Lt as de, M as fe, Mt as y, N as pe, Nt as me, O as he, Ot as ge, P as _e, Pt as ve, Q as ye, Qt as be, R as xe, Rt as b, S as Se, Sn as Ce, St as we, T as Te, Tt as Ee, U as De, Ut as x, V as Oe, Vt as ke, W as Ae, Wt as je, X as Me, Xt as Ne, Y as Pe, Yt as Fe, Z as Ie, Zt as S, _ as Le, _n as Re, _t as C, an as ze, at as Be, b as Ve, bn as He, bt as Ue, c as We, cn as w, ct as Ge, dn as Ke, dt as qe, en as Je, et as Ye, f as Xe, fn as Ze, ft as Qe, g as $e, gn as et, gt as tt, h as nt, ht as rt, i as it, in as at, it as ot, j as st, jt as ct, k as lt, kt as ut, ln as T, lt as dt, m as ft, mn as pt, mt as E, nn as D, nt as mt, o as O, on as ht, ot as gt, p as _t, pn as vt, pt as yt, q as bt, qt as xt, r as St, rn as Ct, rt as wt, sn as Tt, st as Et, t as Dt, tn as Ot, tt as kt, u as At, un as jt, ut as Mt, v as Nt, vn as k, vt as A, w as j, wt as Pt, x as Ft, xn as It, xt as Lt, y as Rt, yn as zt, yt as Bt, zt as Vt } from "./dev-3mgc8c-H.js";
7
7
  import { n as Ht } from "./cliArgs-D4p8n7EE.js";
8
8
  import { r as Ut } from "./appPort-B_HpJ_ck.js";
9
9
  import { at as Wt, st as M } from "./webDev-CTpSY-e_.js";
@@ -16,7 +16,7 @@ import { h as fn, o as pn } from "./inspect-B7U7Cl_Z.js";
16
16
  import { n as mn } from "./mssqlClusterPatch-_4cE_nun.js";
17
17
  import { i as hn, n as gn, r as _n, t as vn } from "./webhookDiscovery-CphsQe59.js";
18
18
  import { t as yn } from "./inspectMetrics-CfdKLh6t.js";
19
- import { r as bn, u as xn } from "./apiBuild-DGalUk9v.js";
19
+ import { r as bn, u as xn } from "./apiBuild-D9FB13_2.js";
20
20
  import { t as Sn } from "./bootTiming-BdyP9nYw.js";
21
21
  import { t as Cn } from "./dataProfile-dW-PsfLB.js";
22
22
  import { basename as wn, join as Tn } from "node:path";
@@ -29,7 +29,7 @@ import { SqlClient as Vn } from "@effect/sql";
29
29
  import { declaredSnapshot as Hn, describeOutcome as Un, pendingFileMigrationIds as Wn, runPlannedMigrations as Gn } from "@voltro/database/sql";
30
30
  import { RpcGroup as Kn } from "@effect/rpc";
31
31
  import { allRegisteredTables as qn, and as Jn, connectionIdentity as Yn, ensureTableRegistered as Xn, eq as G, or as K } from "@voltro/database";
32
- import { AggregateRegistry as Zn, CostRegistry as Qn, DORMANCY_WAKEUP_TENANT as $n, Dispatcher as er, ExpectationRegistry as tr, ExperimentRegistry as q, apiKeyManagementRoutes as nr, attachAnalyticsMirror as rr, attachExpectations as ir, attachExperiments as ar, attachFinops as or, awaitServerListening as sr, bindMutation as J, bindStream as cr, bindSubscription as Y, buildTracingLayer as lr, cancelWakeup as ur, compileCron as dr, dataStoreApiKeyStore as fr, formatServerOnlyLeaks as pr, formatUnresolvedSources as mr, frameworkApiKeyStrategy as hr, getResourcePolicy as gr, installPolicyGuardResolver as _r, loadResourceTuples as vr, makeActionRunner as yr, makeAdvisoryLockCoordinator as br, makeApiKeyService as xr, makeApiKeyUsageBuffer as Sr, makeApiKeyUsageFlusher as Cr, makeAsyncKv as wr, makeAuthMiddlewareLayers as Tr, makeCoordinatedScheduler as Er, makeEffectStoreLayer as Dr, makeLazyWorkflowFacade as Or, makeMutationOutputCodec as kr, makeMutationRunner as Ar, makeOneShotQueryRunner as jr, makeQueryDescriptorProducer as Mr, makeQueryFinalizer as Nr, makeQueryReauthorizer as Pr, makeQuerySubscriber as Fr, makeSchemaRegistry as Ir, makeWorkflowFacade as Lr, makeWorkflowFacadeWithCallerContext as Rr, makeWorkflowLayers as X, noopKv as zr, onProcessShutdown as Br, recordSubscriptionDelivery as Vr, recordWorkflowRun as Hr, registerWakeup as Ur, resolveSecretsBackend as Wr, runProvidedEffect as Gr, setSecretsBackend as Kr, setSystemStoreHandle as qr, setTupleSource as Jr, shutdownGraceMsFromEnv as Z, singleCoordinator as Yr, startRpcServer as Xr, startScheduler as Zr, stripForbiddenForWire as Qr, undoCaptureEnabled as $r, unresolvedSources as ei, withScopedRequest as ti, workflowToRpc as ni, wrapStoreWithBootCodec as ri } from "@voltro/runtime";
32
+ import { AggregateRegistry as Zn, CostRegistry as Qn, DORMANCY_WAKEUP_TENANT as $n, Dispatcher as er, ExpectationRegistry as tr, ExperimentRegistry as q, apiKeyManagementRoutes as nr, attachAnalyticsMirror as rr, attachExpectations as ir, attachExperiments as ar, attachFinops as or, awaitServerListening as sr, bindMutation as J, bindStream as cr, bindSubscription as Y, buildTracingLayer as lr, cancelWakeup as ur, compileCron as dr, dataStoreApiKeyStore as fr, formatServerOnlyLeaks as pr, formatUnresolvedSources as mr, frameworkApiKeyStrategy as hr, getResourcePolicy as gr, installPolicyGuardResolver as _r, loadResourceTuples as vr, makeActionRunner as yr, makeAdvisoryLockCoordinator as br, makeApiKeyService as xr, makeApiKeyUsageBuffer as Sr, makeApiKeyUsageFlusher as Cr, makeAsyncKv as wr, makeAuthMiddlewareLayers as Tr, makeCoordinatedScheduler as Er, makeEffectStoreLayer as Dr, makeLazyWorkflowFacade as Or, makeMutationOutputCodec as kr, makeMutationRunner as Ar, makeOneShotQueryRunner as jr, makeQueryDescriptorProducer as Mr, makeQueryFinalizer as Nr, makeQueryReauthorizer as Pr, makeQuerySubscriber as Fr, makeSchemaRegistry as Ir, makeWorkflowFacade as Lr, makeWorkflowFacadeWithCallerContext as Rr, makeWorkflowLayers as X, noopKv as zr, onProcessShutdown as Br, recordSubscriptionDelivery as Vr, recordWorkflowRun as Hr, registerDefaultTupleSource as Ur, registerWakeup as Wr, resolveSecretsBackend as Gr, runProvidedEffect as Kr, setSecretsBackend as qr, setSystemStoreHandle as Jr, shutdownGraceMsFromEnv as Z, singleCoordinator as Yr, startRpcServer as Xr, startScheduler as Zr, stripForbiddenForWire as Qr, undoCaptureEnabled as $r, unresolvedSources as ei, withScopedRequest as ti, workflowToRpc as ni, wrapStoreWithBootCodec as ri } from "@voltro/runtime";
33
33
  import { appStorageProvider as ii, fromNodeReadable as ai, getObjectStream as oi, putObjectStream as si, toNodeReadable as ci } from "@voltro/plugin-storage";
34
34
  import { isEnvContract as li } from "@voltro/env";
35
35
  import { assertProductionSessionSecret as ui } from "@voltro/protocol/session";
@@ -301,7 +301,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
301
301
  Vt(e.appProcedures ?? e.discovered, {
302
302
  defaultDeny: e.security?.defaultDeny ?? !0,
303
303
  commandHint: "`voltro serve`"
304
- }), qr({
304
+ }), Jr({
305
305
  dataStore: e.store,
306
306
  schemaRegistry: e.schemaRegistry
307
307
  });
@@ -371,7 +371,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
371
371
  });
372
372
  Se.set(t, { handle: r });
373
373
  }
374
- _r(), Jr((t) => vr(e.store, t.subjectId, t.resourceType, t.resourceId));
374
+ _r(), Ur((t) => vr(e.store, t.subjectId, t.resourceType, t.resourceId)) || F({ scope: "voltro:serve" }).info("policy guards: using the app-registered tuple source");
375
375
  let Ce = [], we = [...e.discovered.outboxHandlers ?? [], ...gn((b?.outgoing.length ?? 0) + (b?.incoming.length ?? 0) + (b?.providers.length ?? 0), []) ? [{
376
376
  file: "<framework>/webhooks",
377
377
  id: "voltro-webhook-emit",
@@ -430,7 +430,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
430
430
  return (e.baseLayer ? r.pipe(U.provide(e.baseLayer)) : r).pipe(U.provide(Ve)).pipe(U.provide(He)).pipe(U.provide(We)).pipe(U.provide(Ke));
431
431
  }, Ye = (e, t) => {
432
432
  let n = Je(e, t);
433
- return Gr(n);
433
+ return Kr(n);
434
434
  }, Xe = yn(), Ze = bt(e.plugins ?? [], Xe), Qe = d({
435
435
  plugins: e.plugins ?? [],
436
436
  metrics: Xe,
@@ -728,7 +728,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
728
728
  I(Rn)
729
729
  ] : []
730
730
  ], Dt = Kn.make(...wt).middleware(On).middleware(kn), kt = Tr({ resolveSubject: ({ headers: t, clientId: n }) => e.resolveSubject(t, n) }), At = e.dormancyTenantId ?? $n, jt = e.dormancy === "sleep" ? {
731
- register: (t, n, r) => Ur(e.store, {
731
+ register: (t, n, r) => Wr(e.store, {
732
732
  tenantId: r ?? At,
733
733
  kind: "workflow",
734
734
  refId: t,
@@ -1180,7 +1180,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
1180
1180
  });
1181
1181
  for (let e of re.warnings) $.warn(e);
1182
1182
  let h = re.port;
1183
- Kr(Wr(m?.secrets)), await M({
1183
+ qr(Gr(m?.secrets)), await M({
1184
1184
  rawEnv: m?.env,
1185
1185
  appType: "api",
1186
1186
  root: d,
@@ -1608,7 +1608,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
1608
1608
  }),
1609
1609
  inspectRedriveWorkflowRun: (e) => Z.redriveWorkflowRun(e),
1610
1610
  inspectResumeWorkflowRunFromStep: (e) => Z.resumeWorkflowRunFromStep(e)
1611
- }, Gr = (process.env.VOLTRO_TENANT_ISOLATION ?? m?.tenancy?.isolation) === "namespace", qr = Gr && g !== "memory" ? await (async () => {
1611
+ }, Wr = (process.env.VOLTRO_TENANT_ISOLATION ?? m?.tenancy?.isolation) === "namespace", Kr = Wr && g !== "memory" ? await (async () => {
1612
1612
  let e = await N(g);
1613
1613
  return T({
1614
1614
  tables: S,
@@ -1622,7 +1622,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
1622
1622
  });
1623
1623
  })() : void 0, Jr = await ft({
1624
1624
  input: m?.tenancy?.residency,
1625
- namespaceIsolationOn: Gr,
1625
+ namespaceIsolationOn: Wr,
1626
1626
  makeStoreForUrl: (e, t) => it(m, void 0, Gt(O(), t)),
1627
1627
  log: {
1628
1628
  info: (e, t) => $.info(e, t),
@@ -1698,7 +1698,7 @@ var Ai = () => Math.max(500, Math.floor(Z() * .6)), ji = (e) => new Promise((t)
1698
1698
  softDeleteScopedTables: v.softDeleteScopedTables,
1699
1699
  dataTransferSnapshot: Hn(S),
1700
1700
  dataTransferDialect: g,
1701
- ...qr === void 0 ? {} : { ensureTenantProvisioned: qr.ensure },
1701
+ ...Kr === void 0 ? {} : { ensureTenantProvisioned: Kr.ensure },
1702
1702
  ...Jr === void 0 ? {} : { resolveResidentStore: Jr.resolveStore },
1703
1703
  tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? m?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
1704
1704
  resolveSubject: (e, t) => Ln({
@@ -0,0 +1,2 @@
1
+ import { n as e } from "./serveCommand-BpK8-m1N.js";
2
+ export { e as runServeDispatch };
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./loadEnv-D9nEOClM.js";
2
2
  import { r as t } from "./appModuleLoader-C9r9mxZt.js";
3
3
  import { i as n } from "./dialectDriver-czCHYpeH.js";
4
- import { t as r } from "./serveCommand-B6TATyCj.js";
4
+ import { t as r } from "./serveCommand-BpK8-m1N.js";
5
5
  export { e as loadDotEnv, t as registerAppModules, n as registerDriver, r as runServe };
@@ -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-alhkKoEX.js"), { outgoingFromEvents: r } = await import("./webhookDiscovery-il9ti-HE.js");
225
+ let { walk: t, loadDiscovered: n } = await import("./dev-CjJAasDs.js"), { outgoingFromEvents: r } = await import("./webhookDiscovery-il9ti-HE.js");
226
226
  return r((await n(await t(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.39.0",
3
+ "version": "0.39.1",
4
4
  "description": "The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.",
5
5
  "keywords": [
6
6
  "voltro",
@@ -697,22 +697,22 @@
697
697
  "@effect/platform-node": "^0.108.0",
698
698
  "@effect/sql": "^0.52.0",
699
699
  "@effect/workflow": "^0.19.0",
700
- "@voltro/ai": "0.39.0",
701
- "@voltro/cache": "0.39.0",
702
- "@voltro/data-transfer": "0.39.0",
703
- "@voltro/database": "0.39.0",
704
- "@voltro/env": "0.39.0",
705
- "@voltro/kv": "0.39.0",
706
- "@voltro/logger": "0.39.0",
707
- "@voltro/plugin-auth": "0.39.0",
708
- "@voltro/plugin-broadcast": "0.39.0",
709
- "@voltro/plugin-mail": "0.39.0",
710
- "@voltro/plugin-storage": "0.39.0",
711
- "@voltro/plugin-webhooks": "0.39.0",
712
- "@voltro/protocol": "0.39.0",
713
- "@voltro/runtime": "0.39.0",
714
- "@voltro/serverless": "0.39.0",
715
- "@voltro/workflow": "0.39.0",
700
+ "@voltro/ai": "0.39.1",
701
+ "@voltro/cache": "0.39.1",
702
+ "@voltro/data-transfer": "0.39.1",
703
+ "@voltro/database": "0.39.1",
704
+ "@voltro/env": "0.39.1",
705
+ "@voltro/kv": "0.39.1",
706
+ "@voltro/logger": "0.39.1",
707
+ "@voltro/plugin-auth": "0.39.1",
708
+ "@voltro/plugin-broadcast": "0.39.1",
709
+ "@voltro/plugin-mail": "0.39.1",
710
+ "@voltro/plugin-storage": "0.39.1",
711
+ "@voltro/plugin-webhooks": "0.39.1",
712
+ "@voltro/protocol": "0.39.1",
713
+ "@voltro/runtime": "0.39.1",
714
+ "@voltro/serverless": "0.39.1",
715
+ "@voltro/workflow": "0.39.1",
716
716
  "chokidar": "^5.0.0",
717
717
  "ioredis": "^5.11.1",
718
718
  "tinyglobby": "^0.2.17",
@@ -707,7 +707,7 @@ each plugin's own README.
707
707
 
708
708
  | Topic | Open | Summary |
709
709
  |---|---|---|
710
- | **What's new in 0.39.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. |
710
+ | **What's new in 0.39.1** | `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. |
711
711
  | 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. |
712
712
  | 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. |
713
713
  | 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.39.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.39.1** | `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. |
@@ -2143,10 +2143,19 @@ setTupleSource((req) =>
2143
2143
  loadResourceTuples(store, req.subjectId, req.resourceType, req.resourceId))
2144
2144
  ```
2145
2145
 
2146
- `voltro dev` / `voltro serve` register exactly this default for you, reading
2147
- `_voltro_rebac_tuples`. Register your own when your relationships already live
2148
- in your own tables a `teamMembers` row is a relation; you should not have to
2149
- copy it into a framework table to authorize against it.
2146
+ `voltro dev` / `voltro serve` register this default for you, reading
2147
+ `_voltro_rebac_tuples` **but only if you registered nothing**. Register your
2148
+ own when your relationships already live in your own tables: a `teamMembers` row
2149
+ is a relation; you should not have to copy it into a framework table to authorize
2150
+ against it. Yours wins, wherever you register it (`app.config.ts` or a
2151
+ `*.startup.tsx`), and the boot says so:
2152
+
2153
+ ```
2154
+ policy guards: using the app-registered tuple source
2155
+ ```
2156
+
2157
+ That line is worth knowing, because its absence is the diagnosis when your own
2158
+ source is not being consulted.
2150
2159
 
2151
2160
  **Every unanswerable case denies.** No tuple source registered, no policy for
2152
2161
  that `resourceType`, an input that doesn't identify a resource, a tuple source