@voltro/cli 0.54.0 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/CHANGELOG.md +639 -2
  2. package/bin/voltro.mjs +24 -0
  3. package/dist/{apiBuild-DTWp0S_q.js → apiBuild-Bdaetr37.js} +119 -88
  4. package/dist/apiBuild-Vw1figjO.js +2 -0
  5. package/dist/bin.js +1 -1
  6. package/dist/{build-D4ygSbnV.js → build-CI36wL4R.js} +339 -314
  7. package/dist/buildReport-52gHKgfO.js +64 -0
  8. package/dist/{checkCommand-Dg1G7Gwd.js → checkCommand-CAwFXrxA.js} +6 -6
  9. package/dist/{checkCommand-L7DTlpIF.js → checkCommand-D0QV_zM_.js} +1 -1
  10. package/dist/{clusterCmd-DrVFCzSj.js → clusterCmd-CdLB1GkT.js} +1 -1
  11. package/dist/{codegen-DSLM8Su9.js → codegen-Bth5lUTU.js} +76 -64
  12. package/dist/codegen-DbH7NbCR.js +2 -0
  13. package/dist/{codegenCommand-CG_Vx4lc.js → codegenCommand-CidbQzbv.js} +15 -14
  14. package/dist/{codemodRunner-Cd4xkC6u.js → codemodRunner-BlQPfjzA.js} +277 -0
  15. package/dist/{commands-6Kzi92Np.js → commands-CWjfThXv.js} +35 -35
  16. package/dist/{dashboardCommand-Cq1PWvI1.js → dashboardCommand-BekcY5Ls.js} +3 -3
  17. package/dist/{dataCommand-DYzW8vkv.js → dataCommand-2pccgbIy.js} +267 -195
  18. package/dist/{dbCommand-B4NWZtGL.js → dbCommand-DpK_vQET.js} +457 -441
  19. package/dist/dbCommand-DrycGWWt.js +2 -0
  20. package/dist/{dev-cKUiZZsB.js → dev-B9Gz0k85.js} +1 -1
  21. package/dist/{dev-CmuvUKRq.js → dev-Dw263KPu.js} +2598 -2452
  22. package/dist/doctorCommand-BMWs6aVm.js +2 -0
  23. package/dist/{doctorCommand-DCiFVMtZ.js → doctorCommand-aR_bFmIi.js} +353 -251
  24. package/dist/{dormancyCommand-w1TrmgYP.js → dormancyCommand-eXTQMbHU.js} +1 -1
  25. package/dist/{embeddingsCommand-CMgPyRTr.js → embeddingsCommand-CTmiQvwa.js} +1 -1
  26. package/dist/{envCommand-Cyynmcfa.js → envCommand-BDUgV7EM.js} +12 -12
  27. package/dist/{evolveCommand-BwvQ8dVH.js → evolveCommand-YV8qW1LU.js} +2 -2
  28. package/dist/frameworkTableAssembly-CGNC0qr7.js +2 -0
  29. package/dist/{frameworkTableAssembly-D7LJuALW.js → frameworkTableAssembly-DNOFXfEQ.js} +102 -100
  30. package/dist/index.js +1 -1
  31. package/dist/{infoCommand-DlYlUPqs.js → infoCommand-BjVXpMlP.js} +1 -1
  32. package/dist/inspect-CNYvNXPU.js +1484 -0
  33. package/dist/inspect-S2rWy1Ys.js +2 -0
  34. package/dist/{inspectCmd-niF97fAq.js → inspectCmd-CP-G0sVK.js} +1 -1
  35. package/dist/{inspectFetch-EMuhTG_9.js → inspectFetch-BU1NyzxV.js} +36 -24
  36. package/dist/{inspectMetrics-CGF94puw.js → inspectMetrics-BY0Sjb2F.js} +19 -19
  37. package/dist/interruptedReplace-CwnkBb2X.js +41 -0
  38. package/dist/interruptedReplace-qzmFI020.js +2 -0
  39. package/dist/{logsCmd-B6oNsfaZ.js → logsCmd-BU8uCdys.js} +1 -1
  40. package/dist/{manifestBuild-Cqgsx2bM.js → manifestBuild-CEkjfpwc.js} +1 -1
  41. package/dist/manifestBuild-DIa_s6u0.js +2 -0
  42. package/dist/{migrate-BK_Bbx-_.js → migrate-SICulyz1.js} +2 -2
  43. package/dist/precompressAssets-YhTi1aWp.js +40 -0
  44. package/dist/{probeCommand-_C0YU207.js → probeCommand-6HxEkNDG.js} +2 -2
  45. package/dist/{runtimeTrace-CGWx1Q6l.js → runtimeTrace-DgYMc09E.js} +1 -1
  46. package/dist/{scheduleCmd-DQRu6BZC.js → scheduleCmd-DYBUfo_T.js} +1 -1
  47. package/dist/{sdkgen-CDGHQUFj.js → sdkgen-PY-umd6O.js} +1 -1
  48. package/dist/{seedRunner-Dgsiwk_e.js → seedRunner-DISBKow-.js} +16 -16
  49. package/dist/serveCommand-BITS8Hpj.js +2 -0
  50. package/dist/{serveCommand-Bje09q1v.js → serveCommand-DIJ3ma76.js} +951 -909
  51. package/dist/serveEntry.js +1 -1
  52. package/dist/{start-Clz-1BHB.js → start-B9NGB8gn.js} +627 -588
  53. package/dist/{start-B0bnJgxI.js → start-BFQQkL1i.js} +1 -1
  54. package/dist/startEntry.js +1 -1
  55. package/dist/staticCachePolicy-CIyj6DbS.js +15 -0
  56. package/dist/{test-D_kW4KMj.js → test-jipIQ5Mx.js} +1 -1
  57. package/dist/{tracesCmd-DgtgOUdi.js → tracesCmd-BWYDqMy6.js} +1 -1
  58. package/dist/{updateCommand-CRJlAOaM.js → updateCommand-C9n_Z_oG.js} +8 -2
  59. package/dist/updateCommand-DsXEAHbd.js +2 -0
  60. package/dist/webDev-C2dRz9s5.js +2 -0
  61. package/dist/{webDev-DSI9SOhs.js → webDev-C53hJdcL.js} +1265 -1288
  62. package/dist/{webhooksCommand-BvzXNHji.js → webhooksCommand-uuPu8qQX.js} +1 -1
  63. package/dist/{workflowsCmd-BGF-mRZ5.js → workflowsCmd-g-DNpaUc.js} +1 -1
  64. package/package.json +67 -19
  65. package/templates/AGENTS.core.md +20 -1
  66. package/templates/AGENTS.md +21 -2
  67. package/templates/agent-docs/_index.md +1 -1
  68. package/templates/agent-docs/_manifest.json +1 -1
  69. package/templates/agent-docs/authentication.md +49 -6
  70. package/templates/agent-docs/cli.md +216 -11
  71. package/templates/agent-docs/data.md +209 -18
  72. package/templates/agent-docs/database/scaling.md +40 -1
  73. package/templates/agent-docs/deployment.md +53 -1
  74. package/templates/agent-docs/internationalization.md +32 -0
  75. package/templates/agent-docs/local-first-mobile.md +9 -2
  76. package/templates/agent-docs/observability.md +227 -0
  77. package/templates/agent-docs/plugins/billing.md +15 -0
  78. package/templates/agent-docs/plugins/broadcast.md +2 -1
  79. package/templates/agent-docs/plugins/ratelimit.md +6 -1
  80. package/templates/agent-docs/plugins/row-history.md +11 -0
  81. package/templates/agent-docs/plugins.md +65 -8
  82. package/templates/agent-docs/reference.md +5 -3
  83. package/templates/agent-docs/routing.md +18 -0
  84. package/templates/agent-docs/schema-driven-ui.md +125 -0
  85. package/templates/agent-docs/templates/appshells.md +3 -3
  86. package/templates/agent-docs/whats-new.md +408 -106
  87. package/templates/apps/api-ai/package.json +6 -6
  88. package/templates/apps/api-auth/package.json +8 -8
  89. package/templates/apps/api-backend/package.json +7 -7
  90. package/templates/apps/api-backend-deactivation/package.json +7 -7
  91. package/templates/apps/api-backend-mail/package.json +8 -8
  92. package/templates/apps/api-backend-mariadb/package.json +9 -9
  93. package/templates/apps/api-backend-sqlite/package.json +8 -8
  94. package/templates/apps/api-backend-storage/package.json +8 -8
  95. package/templates/apps/api-cms/package.json +9 -9
  96. package/templates/apps/api-collab/package.json +8 -8
  97. package/templates/apps/api-data-advanced/package.json +8 -8
  98. package/templates/apps/api-durable/package.json +8 -8
  99. package/templates/apps/api-feature-flags/package.json +9 -9
  100. package/templates/apps/api-governance/package.json +8 -8
  101. package/templates/apps/api-kv/package.json +8 -8
  102. package/templates/apps/api-moderation/package.json +8 -8
  103. package/templates/apps/api-observability/package.json +8 -8
  104. package/templates/apps/api-ratelimit/package.json +8 -8
  105. package/templates/apps/api-rbac/package.json +8 -8
  106. package/templates/apps/api-rest/package.json +7 -7
  107. package/templates/apps/api-row-history/package.json +8 -8
  108. package/templates/apps/api-saas/package.json +11 -11
  109. package/templates/apps/api-saas-starter/package.json +10 -10
  110. package/templates/apps/api-search/package.json +8 -8
  111. package/templates/apps/api-status/package.json +8 -8
  112. package/templates/apps/api-webhooks/package.json +9 -9
  113. package/templates/apps/changelog/package.json +7 -7
  114. package/templates/apps/changelog/src/pages/[locale]/page.tsx +7 -1
  115. package/templates/apps/edge-functions/package.json +2 -2
  116. package/templates/apps/frontend-admin/package.json +7 -8
  117. package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +1 -2
  118. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +1 -2
  119. package/templates/apps/frontend-app/package.json +8 -9
  120. package/templates/apps/frontend-app/src/pages/layout.tsx +1 -2
  121. package/templates/apps/frontend-auth/package.json +7 -8
  122. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +1 -2
  123. package/templates/apps/frontend-blank/package.json +6 -7
  124. package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -2
  125. package/templates/apps/frontend-cms/package.json +8 -9
  126. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +1 -2
  127. package/templates/apps/frontend-collab/README.md +7 -2
  128. package/templates/apps/frontend-collab/package.json +9 -10
  129. package/templates/apps/frontend-collab/src/pages/layout.tsx +1 -2
  130. package/templates/apps/frontend-collab/src/pages/page.test.tsx +8 -4
  131. package/templates/apps/frontend-collab/src/pages/page.tsx +10 -5
  132. package/templates/apps/frontend-contact/package.json +7 -7
  133. package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +1 -1
  134. package/templates/apps/frontend-dashboard/package.json +6 -7
  135. package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +1 -2
  136. package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +1 -2
  137. package/templates/apps/frontend-docs/package.json +8 -8
  138. package/templates/apps/frontend-i18n/package.json +6 -6
  139. package/templates/apps/frontend-landing/package.json +7 -7
  140. package/templates/apps/frontend-portal/package.json +7 -8
  141. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +1 -2
  142. package/templates/apps/frontend-saas/package.json +7 -8
  143. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +1 -2
  144. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +1 -2
  145. package/templates/apps/frontend-spa/package.json +6 -7
  146. package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -2
  147. package/templates/apps/frontend-ssr/package.json +6 -7
  148. package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -2
  149. package/templates/apps/frontend-ssr-api/package.json +7 -8
  150. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -2
  151. package/templates/apps/frontend-static-blog/package.json +8 -8
  152. package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +1 -1
  153. package/templates/apps/frontend-static-blog/src/pages/[locale]/page.tsx +7 -1
  154. package/templates/apps/frontend-status/package.json +7 -8
  155. package/templates/apps/frontend-status/src/pages/layout.tsx +1 -2
  156. package/templates/apps/mobile-app/package.json +4 -4
  157. package/templates/baselines/compose/docker/api.Dockerfile +61 -5
  158. package/templates/baselines/compose/docker/web.Dockerfile +55 -10
  159. package/templates/baselines/compose-mariadb/docker/api.Dockerfile +61 -5
  160. package/templates/baselines/compose-mariadb/docker/web.Dockerfile +55 -10
  161. package/dist/apiBuild-CeUN55uk.js +0 -2
  162. package/dist/codegen-DjgxEOnD.js +0 -2
  163. package/dist/dbCommand-CSFWs9ev.js +0 -2
  164. package/dist/doctorCommand-J3qu4E0Y.js +0 -2
  165. package/dist/frameworkTableAssembly-IPD1pUnZ.js +0 -2
  166. package/dist/inspect-Bd8-9wsi.js +0 -1193
  167. package/dist/inspect-CuoDInfZ.js +0 -2
  168. package/dist/interruptedReplace-C3O3M1MM.js +0 -28
  169. package/dist/interruptedReplace-CvmiAM9K.js +0 -2
  170. package/dist/manifestBuild-C4-J1-m_.js +0 -2
  171. package/dist/serveCommand-BiPe8BJm.js +0 -2
  172. package/dist/updateCommand-CIoVDKnj.js +0 -2
  173. package/dist/webDev-DlvZO30c.js +0 -2
@@ -1,1193 +0,0 @@
1
- import { n as e } from "./inspectGateHint-4LxkNtrz.js";
2
- import { lastWriteProvenance as t } from "@voltro/runtime";
3
- import { timingSafeStringEqual as n } from "@voltro/protocol/session";
4
- //#region src/inspect.ts
5
- var r = "/_voltro/inspect", i = () => process.env.VOLTRO_INSPECT === "off", a = /* @__PURE__ */ new Set([
6
- "GET",
7
- "HEAD",
8
- "OPTIONS"
9
- ]), o = (t, r) => {
10
- let i = process.env.VOLTRO_INSPECT_TOKEN;
11
- if (!i || i.length === 0) return {
12
- ok: !1,
13
- reason: "inspect is closed: no VOLTRO_INSPECT_TOKEN configured. `voltro dev` mints one per project; for serve/start set it explicitly (it is never minted outside dev)."
14
- };
15
- let o = t.authorization ?? t.Authorization;
16
- if (!o) return {
17
- ok: !1,
18
- reason: "missing Authorization header"
19
- };
20
- if (!o.startsWith("Bearer ")) return {
21
- ok: !1,
22
- reason: "expected \"Bearer <token>\" auth scheme"
23
- };
24
- let s = o.slice(7).trim();
25
- if (!n(s, i)) return {
26
- ok: !1,
27
- reason: "token mismatch"
28
- };
29
- if (!a.has(r.toUpperCase())) {
30
- let i = process.env.VOLTRO_INSPECT_WRITE_TOKEN;
31
- if (!i || i.length === 0) return {
32
- ok: !1,
33
- reason: e("unset", r)
34
- };
35
- let a = (t["x-voltro-inspect-write"] ?? t["X-Voltro-Inspect-Write"] ?? "").trim();
36
- if (a.length === 0) return {
37
- ok: !1,
38
- reason: e("absent", r)
39
- };
40
- if (!n(a, i)) return {
41
- ok: !1,
42
- reason: e("mismatch", r)
43
- };
44
- }
45
- return { ok: !0 };
46
- }, s = (e) => {
47
- if (!Array.isArray(e) || e.length === 0) return;
48
- let t = [];
49
- for (let n of e) {
50
- if (typeof n != "object" || !n) continue;
51
- if (typeof n.open == "string") {
52
- t.push({
53
- kind: "open",
54
- reason: n.open
55
- });
56
- continue;
57
- }
58
- if (typeof n.action == "string" && typeof n.resourceType == "string") {
59
- t.push({
60
- kind: "policy",
61
- action: n.action,
62
- resourceType: n.resourceType
63
- });
64
- continue;
65
- }
66
- let e = n.scope;
67
- typeof e != "string" && !Array.isArray(e) || t.push({
68
- kind: "scope",
69
- scope: typeof e == "string" ? [e] : e.filter((e) => typeof e == "string"),
70
- mode: n.mode === "any" ? "any" : "all",
71
- resourceScoped: typeof n.resource == "function"
72
- });
73
- }
74
- return t.length > 0 ? t : void 0;
75
- }, c = (e, t, n = {}) => ({
76
- status: e,
77
- contentType: "application/json; charset=utf-8",
78
- body: JSON.stringify(t),
79
- headers: n
80
- }), l = (e) => {
81
- let t;
82
- try {
83
- t = new URL(e).hostname;
84
- } catch {
85
- return !1;
86
- }
87
- return t = t.replace(/^\[|\]$/g, ""), t === "localhost" || t.endsWith(".localhost") || t === "::1" ? !0 : /^127(?:\.\d{1,3}){3}$/.test(t);
88
- }, u = (e) => !e || e.length === 0 ? {} : l(e) ? {
89
- "access-control-allow-origin": e,
90
- "access-control-allow-credentials": "true",
91
- "access-control-allow-methods": "GET, POST, OPTIONS",
92
- "access-control-allow-headers": "authorization, content-type, accept",
93
- "access-control-expose-headers": "content-type, content-length",
94
- vary: "Origin"
95
- } : { vary: "Origin" }, d = (e, t = process.env.VOLTRO_DASHBOARD_APPS) => {
96
- if (l(e)) return !0;
97
- let n;
98
- try {
99
- n = new URL(e).origin;
100
- } catch {
101
- return !1;
102
- }
103
- if (!t || t.trim() === "") return !1;
104
- try {
105
- let e = JSON.parse(t);
106
- return Array.isArray(e) ? e.some((e) => {
107
- let t = e?.url;
108
- if (typeof t != "string") return !1;
109
- try {
110
- return new URL(t).origin === n;
111
- } catch {
112
- return !1;
113
- }
114
- }) : !1;
115
- } catch {
116
- return !1;
117
- }
118
- }, f = (e, t, n = {}) => {
119
- let r = (e ?? "GET").toUpperCase();
120
- if (r === "GET" || r === "HEAD" || r === "OPTIONS") return null;
121
- let i = t.origin ?? t.Origin;
122
- return i === void 0 || i === "" || l(i) ? null : c(403, {
123
- error: "cross-site write rejected",
124
- reason: `a state-changing inspect request may not come from origin "${i}" — only same-machine (loopback) origins may write`
125
- }, n);
126
- }, p = (e = process.env.VOLTRO_INSPECT_ALLOWED_HOSTS) => (e ?? "").split(/[,\s]+/).map((e) => e.trim().toLowerCase()).filter((e) => e.length > 0), m = (e) => {
127
- if (e === void 0) return "";
128
- let t = e.trim();
129
- if (t === "") return "";
130
- if (t.startsWith("[")) {
131
- let e = t.indexOf("]");
132
- return (e === -1 ? t.slice(1) : t.slice(1, e)).toLowerCase();
133
- }
134
- let n = t.indexOf(":");
135
- return (n === -1 ? t : t.slice(0, n)).toLowerCase();
136
- }, h = (e) => /^\d{1,3}(?:\.\d{1,3}){3}$/.test(e) || e.includes(":"), g = (e, t = p()) => {
137
- let n = m(e);
138
- return n === "" || n === "localhost" || n.endsWith(".localhost") || h(n) ? !0 : t.includes(n);
139
- }, _ = (e, t = {}, n) => g(e, n) ? null : c(403, {
140
- error: "forbidden host",
141
- reason: `the dev inspect surface refuses a request with Host "${e ?? ""}" — a DNS-rebinding guard. Only loopback names, IP literals, and hosts listed in VOLTRO_INSPECT_ALLOWED_HOSTS may reach it.`
142
- }, t), v = (e) => {
143
- let t = e.indexOf("?");
144
- return t === -1 ? e : e.slice(0, t);
145
- }, y = (e) => {
146
- let t = e.indexOf("?");
147
- return t === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
148
- }, b = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), x = [
149
- "text",
150
- "textarea",
151
- "number",
152
- "checkbox",
153
- "switch",
154
- "select",
155
- "radio",
156
- "async-select",
157
- "multi-select",
158
- "date",
159
- "datetime",
160
- "daterange",
161
- "file",
162
- "hidden",
163
- "custom"
164
- ], S = (e, t, n = [], r = []) => ({
165
- version: 2,
166
- scopes: [...new Set(r.flatMap((e) => e.declaredScopes ?? []))].sort(),
167
- procedures: [...e].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({
168
- tag: e.tag,
169
- kind: e.kind,
170
- ...e.inputSchema === void 0 ? {} : { input: e.inputSchema },
171
- ...e.outputSchema === void 0 ? {} : { output: e.outputSchema },
172
- ...e.source === void 0 ? {} : { source: e.source },
173
- ...e.targets === void 0 ? {} : { targets: e.targets },
174
- ...e.guards === void 0 ? {} : { guards: e.guards },
175
- ...e.internal === !0 ? { internal: !0 } : {},
176
- ...e.publicApi === void 0 ? {} : { publicApi: e.publicApi },
177
- ...e.exposeAsTool === void 0 ? {} : { exposeAsTool: e.exposeAsTool }
178
- })),
179
- workflows: [...t].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({ name: e.tag })),
180
- widgets: x,
181
- tables: [...n].filter((e) => !e.isFrameworkTable).sort((e, t) => e.name.localeCompare(t.name)).map((e) => ({
182
- name: e.name,
183
- reactive: e.isReactive,
184
- framework: e.isFrameworkTable,
185
- editable: e.editable ?? !0,
186
- ...e.pkColumn === void 0 ? {} : { pkColumn: e.pkColumn },
187
- columns: e.columns.map((e) => ({
188
- name: e.name,
189
- type: String(e.type),
190
- nullable: e.nullable,
191
- ...e.referencesTable === void 0 ? {} : { refersTo: e.referencesTable },
192
- ...e.oneOf === void 0 ? {} : { enum: e.oneOf },
193
- ...e.serverOnly === !0 ? { serverOnly: !0 } : {},
194
- ...e.encrypted === !0 ? { encrypted: !0 } : {},
195
- ...e.sensitive === void 0 ? {} : { sensitive: e.sensitive }
196
- }))
197
- }))
198
- }), C = (e, t, n = {}, r = {}) => {
199
- let a = v(e);
200
- if (!b(a)) return null;
201
- let s = u(n.origin ?? n.Origin), l = (r.method ?? "GET").toUpperCase();
202
- if (l === "OPTIONS") return {
203
- status: 204,
204
- contentType: "text/plain",
205
- body: "",
206
- headers: s
207
- };
208
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
209
- let d = (r.authResolver ?? o)(n, l);
210
- if (!d.ok) return c(401, {
211
- error: "unauthorized",
212
- reason: d.reason
213
- }, s);
214
- if (a === "/_voltro/inspect" || a === "/_voltro/inspect/" || a === "/_voltro/inspect/app") return c(200, {
215
- kind: t.kind,
216
- ...t.meta
217
- }, s);
218
- if (a === "/_voltro/inspect/routes") return t.kind === "web" ? c(200, {
219
- pages: t.routes,
220
- dirs: t.dirs
221
- }, s) : c(404, { error: "routes endpoint is web-only" }, s);
222
- if (a === "/_voltro/inspect/cache") return t.kind === "web" ? c(200, t.cache(), s) : c(404, { error: "cache endpoint is web-only" }, s);
223
- if (a === "/_voltro/inspect/rpc") return t.kind === "api" ? c(200, {
224
- procedures: t.rpc,
225
- workflows: t.workflows
226
- }, s) : c(404, { error: "rpc endpoint is api-only" }, s);
227
- if (a === "/_voltro/inspect/manifest") {
228
- if (t.kind !== "api") return c(404, { error: "manifest endpoint is api-only" }, s);
229
- let e = t.inspectTables?.().tables ?? [];
230
- return c(200, S(t.rpc, t.workflows, e, t.plugins?.().plugins ?? []), s);
231
- }
232
- return a === "/_voltro/inspect/metrics" ? t.metrics === void 0 ? c(200, [], s) : c(200, t.metrics(), s) : a === "/_voltro/inspect/subscriptions" ? t.kind === "api" ? t.subscriptions === void 0 ? c(200, {
233
- subscriptions: [],
234
- matcherStats: [],
235
- capturedAt: Date.now()
236
- }, s) : c(200, t.subscriptions(), s) : c(404, { error: "subscriptions endpoint is api-only" }, s) : a === "/_voltro/inspect/members" ? t.kind === "api" ? t.members === void 0 ? c(200, {
237
- members: [],
238
- capturedAt: Date.now()
239
- }, s) : c(200, t.members(), s) : c(404, { error: "members endpoint is api-only" }, s) : a === "/_voltro/inspect/events" ? t.kind === "api" ? t.events === void 0 ? c(200, {
240
- declared: [],
241
- routes: [],
242
- origin: "",
243
- capturedAt: Date.now(),
244
- totals: {
245
- routes: 0,
246
- subscribers: 0,
247
- buffered: 0
248
- }
249
- }, s) : c(200, t.events(), s) : c(404, { error: "events endpoint is api-only" }, s) : a === "/_voltro/inspect/data-cache" ? t.kind === "api" ? t.dataCache === void 0 ? c(200, {
250
- backend: "memory",
251
- engine: "memory",
252
- driver: "resp",
253
- hits: 0,
254
- misses: 0,
255
- hitRate: 0
256
- }, s) : c(200, t.dataCache(), s) : c(404, { error: "data-cache endpoint is api-only" }, s) : a === "/_voltro/inspect/database" ? t.kind === "api" ? t.database === void 0 ? c(200, {
257
- migrations: [],
258
- seeds: []
259
- }, s) : c(200, t.database(), s) : c(404, { error: "database endpoint is api-only" }, s) : a === "/_voltro/inspect/plugins" ? t.kind === "api" ? t.plugins === void 0 ? c(200, {
260
- plugins: [],
261
- capturedAt: Date.now()
262
- }, s) : c(200, t.plugins(), s) : c(404, { error: "plugins endpoint is api-only" }, s) : a === "/_voltro/inspect/env" ? t.env === void 0 ? c(200, {
263
- app: t.meta.name ?? "app",
264
- entries: [],
265
- summary: {
266
- total: 0,
267
- set: 0,
268
- missingRequired: 0
269
- }
270
- }, s) : c(200, t.env(), s) : a === "/_voltro/inspect/data/tables" ? t.kind === "api" ? t.inspectTables === void 0 ? c(200, { tables: [] }, s) : c(200, t.inspectTables(), s) : c(404, { error: "data viewer is api-only" }, s) : a === "/_voltro/inspect/invoke" ? c(404, { error: "invoke not enabled here — use POST handler" }, s) : w.has(a) ? c(404, {
271
- error: "endpoint not mounted on this instance",
272
- path: a,
273
- reason: "This inspect endpoint is served by `voltro dev`. A production `voltro serve` does not mount it — the data behind it (the in-memory log ring, the span buffer, the dev route table) is not collected there. This is not a missing token: the same request with no token would be 401."
274
- }, s) : c(404, {
275
- error: "unknown inspect endpoint",
276
- path: a
277
- }, s);
278
- }, w = /* @__PURE__ */ new Set([
279
- `${r}/logs`,
280
- `${r}/traces`,
281
- `${r}/workflows`,
282
- `${r}/storage`,
283
- `${r}/aggregates`,
284
- `${r}/flags`
285
- ]), T = async (e, t, n, r = {}) => {
286
- let a = u(t.origin ?? t.Origin);
287
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
288
- let s = (r.method ?? "POST").toUpperCase();
289
- if (s !== "POST") return c(405, {
290
- error: "method not allowed",
291
- expected: "POST"
292
- }, a);
293
- let l = (r.authResolver ?? o)(t, s);
294
- if (!l.ok) return c(401, {
295
- error: "unauthorized",
296
- reason: l.reason
297
- }, a);
298
- if (e.kind !== "api") return c(404, { error: "invoke endpoint is api-only" }, a);
299
- if (!e.invokers || e.invokers.size === 0) return c(404, { error: "invoke not configured" }, a);
300
- let d;
301
- try {
302
- d = JSON.parse(n || "{}");
303
- } catch {
304
- return c(400, { error: "body must be JSON" }, a);
305
- }
306
- let f = d;
307
- if (typeof f.tag != "string") return c(400, { error: "body.tag must be a string" }, a);
308
- let p = e.invokers.get(f.tag);
309
- if (!p) return c(404, {
310
- error: "unknown tag",
311
- tag: f.tag
312
- }, a);
313
- let m = typeof f.headers == "object" && f.headers !== null ? f.headers : {}, h = {};
314
- for (let [e, n] of Object.entries(t)) h[e.toLowerCase()] = n;
315
- for (let [e, t] of Object.entries(m)) {
316
- let n = e.toLowerCase();
317
- n !== "cookie" && (h[n] = t);
318
- }
319
- return c(200, await p(f.input, h), a);
320
- }, E = async (e, t, n, r = {}) => {
321
- let a = v(e);
322
- if (!b(a) || a !== "/_voltro/inspect/migrations" || (r.method ?? "GET").toUpperCase() !== "GET") return null;
323
- let s = u(n.origin ?? n.Origin);
324
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
325
- let l = (r.authResolver ?? o)(n, "GET");
326
- return l.ok ? t.kind === "api" ? t.migrations === void 0 ? c(200, {
327
- drift: {
328
- isDrifted: !1,
329
- liveFingerprint: "",
330
- liveSnapshot: { tables: [] }
331
- },
332
- pending: null,
333
- history: [],
334
- softDropSnapshots: []
335
- }, s) : c(200, await t.migrations(), s) : c(404, { error: "migrations endpoint is api-only" }, s) : c(401, {
336
- error: "unauthorized",
337
- reason: l.reason
338
- }, s);
339
- }, D = async (e, t, n, a, s = {}) => {
340
- let l = v(e);
341
- if (!b(l) || !l.startsWith("/_voltro/inspect/webhooks/")) return null;
342
- let d = u(n.origin ?? n.Origin);
343
- if ((s.method ?? "POST").toUpperCase() !== "POST") return null;
344
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, d);
345
- let p = (s.authResolver ?? o)(n, s.method ?? "POST");
346
- if (!p.ok) return c(401, {
347
- error: "unauthorized",
348
- reason: p.reason
349
- }, d);
350
- let m = f(s.method, n, d);
351
- if (m) return m;
352
- if (t.kind !== "api") return c(404, { error: "webhook actions are api-only" }, d);
353
- if (!t.webhookActions) return c(404, { error: "webhook actions not configured — is @voltro/plugin-webhooks active?" }, d);
354
- let h;
355
- try {
356
- h = JSON.parse(a || "{}");
357
- } catch {
358
- return c(400, { error: "body must be JSON" }, d);
359
- }
360
- let g = l.slice(`${r}/webhooks/`.length);
361
- try {
362
- switch (g) {
363
- case "subscribe": {
364
- let e = h;
365
- return typeof e.event != "string" || e.event.length === 0 ? c(400, { error: "event required" }, d) : typeof e.url != "string" || e.url.length === 0 ? c(400, { error: "url required" }, d) : c(200, await t.webhookActions.subscribe(e), d);
366
- }
367
- case "pause": {
368
- let e = h.targetId;
369
- return typeof e != "string" || e.length === 0 ? c(400, { error: "targetId required" }, d) : (await t.webhookActions.pause(e), c(200, { ok: !0 }, d));
370
- }
371
- case "resume": {
372
- let e = h.targetId;
373
- return typeof e != "string" || e.length === 0 ? c(400, { error: "targetId required" }, d) : (await t.webhookActions.resume(e), c(200, { ok: !0 }, d));
374
- }
375
- case "delete": {
376
- let e = h.targetId;
377
- return typeof e != "string" || e.length === 0 ? c(400, { error: "targetId required" }, d) : (await t.webhookActions.delete(e), c(200, { ok: !0 }, d));
378
- }
379
- case "rotateSecret": {
380
- let e = h.targetId;
381
- return typeof e != "string" || e.length === 0 ? c(400, { error: "targetId required" }, d) : c(200, await t.webhookActions.rotateSecret(e), d);
382
- }
383
- case "replay": {
384
- let e = h.deliveryId;
385
- return typeof e != "string" || e.length === 0 ? c(400, { error: "deliveryId required" }, d) : (await t.webhookActions.replay(e), c(200, { ok: !0 }, d));
386
- }
387
- case "repinVersion": {
388
- let e = h.targetId, n = h.version;
389
- return typeof e != "string" || e.length === 0 ? c(400, { error: "targetId required" }, d) : typeof n != "number" || !Number.isInteger(n) || n < 1 ? c(400, { error: "version must be a positive integer" }, d) : (await t.webhookActions.updateTargetPayloadVersion(e, n), c(200, { ok: !0 }, d));
390
- }
391
- default: return c(404, { error: `unknown webhook action: ${g}` }, d);
392
- }
393
- } catch (e) {
394
- return c(500, {
395
- error: "webhook action failed",
396
- message: e?.message ?? String(e)
397
- }, d);
398
- }
399
- }, O = async (e, t, n, a, s = {}) => {
400
- let l = v(e);
401
- if (!b(l)) return null;
402
- let d = u(n.origin ?? n.Origin), f = (s.method ?? "POST").toUpperCase();
403
- if (f !== "POST") return null;
404
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, d);
405
- let p = (s.authResolver ?? o)(n, f);
406
- if (!p.ok) return c(401, {
407
- error: "unauthorized",
408
- reason: p.reason
409
- }, d);
410
- if (t.kind !== "api") return c(404, { error: "framework-action endpoints are api-only" }, d);
411
- let m = `${r}/seeds/run`, h = `${r}/migrations/rollback`, g = `${r}/migrations/squash`, _ = `${r}/migrations/restore-snapshot`;
412
- if (l !== m && l !== h && l !== g && l !== _ && l !== "/_voltro/inspect/migrations/compare-env") return null;
413
- let y;
414
- try {
415
- y = JSON.parse(a || "{}");
416
- } catch {
417
- return c(400, { error: "body must be JSON" }, d);
418
- }
419
- try {
420
- if (l === m) return typeof y.id != "string" || y.id.length === 0 ? c(400, { error: "body.id must be a non-empty string" }, d) : t.runSeed ? c(200, await t.runSeed(y.id), d) : c(404, { error: "runSeed not configured" }, d);
421
- if (l === h) return typeof y.id != "string" || y.id.length === 0 ? c(400, { error: "body.id must be a non-empty string" }, d) : t.rollbackMigration ? c(200, await t.rollbackMigration(y.id), d) : c(404, { error: "rollbackMigration not configured" }, d);
422
- if (l === g) {
423
- if (typeof y.before != "string" || y.before.length === 0) return c(400, { error: "body.before must be a non-empty ISO date string" }, d);
424
- if (!t.squashMigrationHistory) return c(404, { error: "squashMigrationHistory not configured" }, d);
425
- let e = typeof y.note == "string" ? y.note : void 0;
426
- return c(200, await t.squashMigrationHistory({
427
- before: y.before,
428
- note: e
429
- }), d);
430
- }
431
- return l === _ ? typeof y.planId != "string" || y.planId.length === 0 ? c(400, { error: "body.planId must be a non-empty string" }, d) : t.restoreSnapshot ? c(200, await t.restoreSnapshot({ planId: y.planId }), d) : c(404, { error: "restoreSnapshot not configured" }, d) : typeof y.url != "string" || y.url.length === 0 ? c(400, { error: "body.url must be a non-empty URL string" }, d) : t.compareCrossEnv ? (await t.compareCrossEnv({
432
- url: y.url,
433
- label: typeof y.label == "string" ? y.label : void 0,
434
- token: typeof y.token == "string" ? y.token : void 0
435
- }), c(200, { ok: !0 }, d)) : c(404, { error: "compareCrossEnv not configured" }, d);
436
- } catch (e) {
437
- return c(500, {
438
- error: "framework action failed",
439
- message: e?.message ?? String(e)
440
- }, d);
441
- }
442
- }, k = async (e, t, n, r = {}) => {
443
- if (v(e) !== "/_voltro/inspect/data/rows") return null;
444
- let a = u(n.origin ?? n.Origin), s = (r.method ?? "GET").toUpperCase();
445
- if (s !== "GET") return c(405, {
446
- error: "method not allowed",
447
- expected: "GET"
448
- }, a);
449
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
450
- let l = (r.authResolver ?? o)(n, s);
451
- if (!l.ok) return c(401, {
452
- error: "unauthorized",
453
- reason: l.reason
454
- }, a);
455
- if (t.kind !== "api") return c(404, { error: "data viewer is api-only" }, a);
456
- if (t.inspectRows === void 0) return c(404, { error: "inspectRows not configured" }, a);
457
- let d = j(e), f = d.get("table");
458
- if (!f) return c(400, { error: "query.table is required" }, a);
459
- let p = M(d.get("offset")) ?? 0, m = M(d.get("limit")) ?? 50, h = {}, g = d.get("q");
460
- if (g) {
461
- if (g.length > 8192) return c(400, { error: "query.q too large" }, a);
462
- try {
463
- h = JSON.parse(Buffer.from(g, "base64url").toString("utf8"));
464
- } catch {
465
- return c(400, { error: "query.q is not valid base64url JSON" }, a);
466
- }
467
- }
468
- try {
469
- return c(200, await t.inspectRows({
470
- table: f,
471
- offset: p,
472
- limit: m,
473
- ...h
474
- }), a);
475
- } catch (e) {
476
- return e?.name === "InspectQueryError" ? c(400, {
477
- error: "invalid query",
478
- message: e.message
479
- }, a) : c(500, {
480
- error: "data-rows query failed",
481
- message: e?.message ?? String(e)
482
- }, a);
483
- }
484
- }, A = async (e, n, r, a = {}) => {
485
- if (v(e) !== "/_voltro/inspect/provenance") return null;
486
- let s = u(r.origin ?? r.Origin), l = (a.method ?? "GET").toUpperCase();
487
- if (l !== "GET") return c(405, {
488
- error: "method not allowed",
489
- expected: "GET"
490
- }, s);
491
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
492
- let d = (a.authResolver ?? o)(r, l);
493
- if (!d.ok) return c(401, {
494
- error: "unauthorized",
495
- reason: d.reason
496
- }, s);
497
- let p = f(a.method, r, s);
498
- if (p) return p;
499
- if (n.kind !== "api") return c(404, { error: "provenance is api-only" }, s);
500
- if (n.inspectRows === void 0) return c(404, { error: "inspectRows not configured" }, s);
501
- let m = j(e), h = m.get("table"), g = m.get("id"), _ = m.get("column") ?? void 0;
502
- if (!h || !g) return c(400, { error: "query.table and query.id are required" }, s);
503
- try {
504
- let e = (await n.inspectRows({
505
- table: h,
506
- limit: 1,
507
- filter: {
508
- kind: "leaf",
509
- column: "id",
510
- op: "eq",
511
- value: g
512
- }
513
- })).rows[0];
514
- return c(200, t(e, {
515
- table: h,
516
- id: g,
517
- ..._ === void 0 ? {} : { column: _ }
518
- }), s);
519
- } catch (e) {
520
- return e?.name === "InspectQueryError" ? c(400, {
521
- error: "invalid query",
522
- message: e.message
523
- }, s) : c(500, {
524
- error: "provenance query failed",
525
- message: e?.message ?? String(e)
526
- }, s);
527
- }
528
- }, j = (e) => {
529
- let t = e.indexOf("?");
530
- return t < 0 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
531
- }, M = (e) => {
532
- if (e === null || e === "") return;
533
- let t = Number(e);
534
- return Number.isFinite(t) && t >= 0 ? Math.floor(t) : void 0;
535
- }, N = async (e, t, n, r = {}) => {
536
- if (v(e) !== "/_voltro/inspect/workflows/runs") return null;
537
- let a = u(n.origin ?? n.Origin), s = (r.method ?? "GET").toUpperCase();
538
- if (s !== "GET") return c(405, {
539
- error: "method not allowed",
540
- expected: "GET"
541
- }, a);
542
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
543
- let l = (r.authResolver ?? o)(n, s);
544
- if (!l.ok) return c(401, {
545
- error: "unauthorized",
546
- reason: l.reason
547
- }, a);
548
- if (t.kind !== "api") return c(404, { error: "workflows endpoint is api-only" }, a);
549
- if (t.inspectWorkflowRuns === void 0) return c(200, {
550
- runs: [],
551
- total: 0,
552
- offset: 0,
553
- limit: 50
554
- }, a);
555
- let d = j(e);
556
- try {
557
- let e = d.get("deadLettered") === "1" || d.get("deadLettered") === "true", n = (d.get("statuses") ?? "").split(",").map((e) => e.trim()).filter((e) => e !== "");
558
- return c(200, await t.inspectWorkflowRuns({
559
- ...d.get("tag") === null ? {} : { tag: d.get("tag") },
560
- ...e ? { deadLettered: !0 } : d.get("status") === null ? n.length > 0 ? { statuses: n } : {} : { status: d.get("status") },
561
- ...d.get("q") === null ? {} : { tagContains: d.get("q") },
562
- ...d.get("source") === null ? {} : { source: d.get("source") },
563
- ...d.get("idPrefix") === null ? {} : { idPrefix: d.get("idPrefix") },
564
- ...d.get("from") === null ? {} : { startedAfter: d.get("from") },
565
- ...d.get("to") === null ? {} : { startedBefore: d.get("to") },
566
- offset: M(d.get("offset")) ?? 0,
567
- limit: M(d.get("limit")) ?? 50
568
- }), a);
569
- } catch (e) {
570
- return c(500, {
571
- error: "workflow-runs query failed",
572
- message: e?.message ?? String(e)
573
- }, a);
574
- }
575
- }, P = async (e, t, n, r = {}) => {
576
- if (v(e) !== "/_voltro/inspect/workflows/stats") return null;
577
- let a = u(n.origin ?? n.Origin), s = (r.method ?? "GET").toUpperCase();
578
- if (s !== "GET") return c(405, {
579
- error: "method not allowed",
580
- expected: "GET"
581
- }, a);
582
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
583
- let l = (r.authResolver ?? o)(n, s);
584
- if (!l.ok) return c(401, {
585
- error: "unauthorized",
586
- reason: l.reason
587
- }, a);
588
- if (t.kind !== "api") return c(404, { error: "workflows endpoint is api-only" }, a);
589
- if (t.inspectWorkflowRunStats === void 0) return c(200, {
590
- windowHours: 24,
591
- bucketMinutes: 30,
592
- buckets: [],
593
- byTag: [],
594
- total: 0,
595
- truncated: !1
596
- }, a);
597
- let d = j(e);
598
- try {
599
- return c(200, await t.inspectWorkflowRunStats({
600
- ...d.get("tag") === null ? {} : { tag: d.get("tag") },
601
- ...M(d.get("hours")) === void 0 ? {} : { hours: M(d.get("hours")) }
602
- }), a);
603
- } catch (e) {
604
- return c(500, {
605
- error: "workflow-stats query failed",
606
- message: e?.message ?? String(e)
607
- }, a);
608
- }
609
- }, F = async (e, t, n, r, a = {}) => {
610
- let s = v(e).match(/^\/_voltro\/inspect\/workflows\/start\/([^/]+)$/);
611
- if (!s) return null;
612
- let l = decodeURIComponent(s[1] ?? ""), d = u(n.origin ?? n.Origin), f = (a.method ?? "POST").toUpperCase();
613
- if (f !== "POST") return c(405, {
614
- error: "method not allowed",
615
- expected: "POST"
616
- }, d);
617
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, d);
618
- let p = (a.authResolver ?? o)(n, f);
619
- if (!p.ok) return c(401, {
620
- error: "unauthorized",
621
- reason: p.reason
622
- }, d);
623
- if (t.kind !== "api") return c(404, { error: "workflow start is api-only" }, d);
624
- if (t.inspectStartWorkflow === void 0) return c(404, { error: "inspectStartWorkflow not configured" }, d);
625
- let m = {};
626
- if (r.length > 0) try {
627
- m = JSON.parse(r).payload ?? {};
628
- } catch {
629
- return c(400, { error: "start requires JSON body `{ payload?: unknown }`" }, d);
630
- }
631
- try {
632
- return c(200, await t.inspectStartWorkflow({
633
- name: l,
634
- payload: m
635
- }), d);
636
- } catch (e) {
637
- return c(500, {
638
- error: "workflow start failed",
639
- message: e?.message ?? String(e)
640
- }, d);
641
- }
642
- }, I = async (e, t, n, r = {}) => {
643
- let a = v(e);
644
- if (!a.startsWith("/_voltro/inspect/schedules")) return null;
645
- let s = u(n.origin ?? n.Origin);
646
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
647
- let l = (r.authResolver ?? o)(n, r.method ?? "POST");
648
- if (!l.ok) return c(401, {
649
- error: "unauthorized",
650
- reason: l.reason
651
- }, s);
652
- let d = f(r.method, n, s);
653
- if (d) return d;
654
- if (t.kind !== "api") return c(404, { error: "schedules are api-only" }, s);
655
- let p = (r.method ?? "GET").toUpperCase(), m = a.match(/^\/_voltro\/inspect\/schedules\/([^/]+)\/backfill$/);
656
- if (m) {
657
- if (p !== "POST") return c(405, {
658
- error: "method not allowed",
659
- expected: "POST"
660
- }, s);
661
- if (!t.inspectBackfillSchedule) return c(404, { error: "inspectBackfillSchedule not configured" }, s);
662
- let e = decodeURIComponent(m[1] ?? ""), n;
663
- try {
664
- n = JSON.parse(r.body ?? "{}");
665
- } catch {
666
- return c(400, { error: "invalid JSON body — expected { from, to, confirm?, limit? }" }, s);
667
- }
668
- if (typeof n.from != "string" || typeof n.to != "string") return c(400, { error: "body must carry ISO 'from' and 'to' instants" }, s);
669
- try {
670
- let r = await t.inspectBackfillSchedule({
671
- name: e,
672
- from: n.from,
673
- to: n.to,
674
- confirm: n.confirm === !0,
675
- ...typeof n.limit == "number" ? { limit: n.limit } : {}
676
- });
677
- return c(r.kind === "refused" ? 409 : 200, r, s);
678
- } catch (e) {
679
- return c(500, {
680
- error: "backfill failed",
681
- message: e?.message ?? String(e)
682
- }, s);
683
- }
684
- }
685
- let h = a.match(/^\/_voltro\/inspect\/schedules\/([^/]+)\/fire$/);
686
- if (h) {
687
- if (p !== "POST") return c(405, {
688
- error: "method not allowed",
689
- expected: "POST"
690
- }, s);
691
- if (!t.inspectFireSchedule) return c(404, { error: "inspectFireSchedule not configured" }, s);
692
- let n = decodeURIComponent(h[1] ?? ""), r = j(e).get("trigger") === "external" ? "external" : "manual";
693
- try {
694
- return c(200, await t.inspectFireSchedule({
695
- name: n,
696
- trigger: r
697
- }), s);
698
- } catch (e) {
699
- return c(500, {
700
- error: "fire failed",
701
- message: e?.message ?? String(e)
702
- }, s);
703
- }
704
- }
705
- if (a === "/_voltro/inspect/schedules/runs") {
706
- if (p !== "GET") return c(405, {
707
- error: "method not allowed",
708
- expected: "GET"
709
- }, s);
710
- if (!t.inspectScheduleRuns) return c(200, {
711
- runs: [],
712
- total: 0,
713
- offset: 0,
714
- limit: 50
715
- }, s);
716
- let n = j(e);
717
- try {
718
- return c(200, await t.inspectScheduleRuns({
719
- ...n.get("name") === null ? {} : { name: n.get("name") },
720
- offset: M(n.get("offset")) ?? 0,
721
- limit: M(n.get("limit")) ?? 50
722
- }), s);
723
- } catch (e) {
724
- return c(500, {
725
- error: "schedule-runs query failed",
726
- message: e?.message ?? String(e)
727
- }, s);
728
- }
729
- }
730
- return a === "/_voltro/inspect/schedules" ? p === "GET" ? t.inspectSchedules ? c(200, t.inspectSchedules(), s) : c(200, {
731
- schedules: [],
732
- coordination: "single"
733
- }, s) : c(405, {
734
- error: "method not allowed",
735
- expected: "GET"
736
- }, s) : c(404, {
737
- error: "unknown schedules endpoint",
738
- path: a
739
- }, s);
740
- }, L = async (e, t, n, r = {}) => {
741
- if (v(e) !== "/_voltro/inspect/cluster") return null;
742
- let a = u(n.origin ?? n.Origin);
743
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
744
- let s = (r.authResolver ?? o)(n, r.method ?? "POST");
745
- if (!s.ok) return c(401, {
746
- error: "unauthorized",
747
- reason: s.reason
748
- }, a);
749
- let l = f(r.method, n, a);
750
- if (l) return l;
751
- if (t.kind !== "api") return c(404, { error: "cluster is api-only" }, a);
752
- if ((r.method ?? "GET").toUpperCase() !== "GET") return c(405, {
753
- error: "method not allowed",
754
- expected: "GET"
755
- }, a);
756
- if (!t.cluster) return c(200, {
757
- instance: {
758
- replicaId: process.env.POD_NAME ?? process.env.HOSTNAME ?? `dev-${process.pid}`,
759
- dialect: "memory",
760
- runnerHost: "localhost",
761
- runnerPort: 0,
762
- runnerStorage: "none",
763
- shardLock: "none",
764
- coordination: "single",
765
- cdc: {
766
- enabled: !1,
767
- flavor: "none (single-process)"
768
- },
769
- tier: "none",
770
- localhostRisk: !1
771
- },
772
- coordinationState: {
773
- recentReplicaIds: [],
774
- scheduleClaims: [],
775
- runningScheduleRuns: 0,
776
- runningWorkflowRuns: 0
777
- },
778
- capturedAt: Date.now()
779
- }, a);
780
- try {
781
- return c(200, await t.cluster(), a);
782
- } catch (e) {
783
- return c(500, {
784
- error: "cluster snapshot failed",
785
- message: e?.message ?? String(e)
786
- }, a);
787
- }
788
- }, R = async (e, t, n, r = {}) => {
789
- let a = v(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/steps$/);
790
- if (!a) return null;
791
- let s = decodeURIComponent(a[1] ?? ""), l = u(n.origin ?? n.Origin), d = (r.method ?? "GET").toUpperCase();
792
- if (d !== "GET") return c(405, {
793
- error: "method not allowed",
794
- expected: "GET"
795
- }, l);
796
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
797
- let f = (r.authResolver ?? o)(n, d);
798
- if (!f.ok) return c(401, {
799
- error: "unauthorized",
800
- reason: f.reason
801
- }, l);
802
- if (t.kind !== "api") return c(404, { error: "workflow steps are api-only" }, l);
803
- if (t.inspectWorkflowRunSteps === void 0) return c(200, { steps: [] }, l);
804
- try {
805
- return c(200, await t.inspectWorkflowRunSteps({ runId: s }), l);
806
- } catch (e) {
807
- return c(500, {
808
- error: "steps query failed",
809
- message: e?.message ?? String(e)
810
- }, l);
811
- }
812
- }, z = async (e, t, n, r = {}) => {
813
- let a = v(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/events$/);
814
- if (!a) return null;
815
- let s = decodeURIComponent(a[1] ?? ""), l = u(n.origin ?? n.Origin), d = (r.method ?? "GET").toUpperCase();
816
- if (d !== "GET") return c(405, {
817
- error: "method not allowed",
818
- expected: "GET"
819
- }, l);
820
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
821
- let f = (r.authResolver ?? o)(n, d);
822
- if (!f.ok) return c(401, {
823
- error: "unauthorized",
824
- reason: f.reason
825
- }, l);
826
- if (t.kind !== "api") return c(404, { error: "workflow events are api-only" }, l);
827
- if (t.inspectWorkflowRunEvents === void 0) return c(200, { events: [] }, l);
828
- try {
829
- return c(200, await t.inspectWorkflowRunEvents({ runId: s }), l);
830
- } catch (e) {
831
- return c(500, {
832
- error: "events query failed",
833
- message: e?.message ?? String(e)
834
- }, l);
835
- }
836
- }, B = async (e, t, n, r = {}) => {
837
- if (v(t) !== "/_voltro/inspect/workflows/events") return null;
838
- let a = u(n.origin ?? n.Origin), s = (r.method ?? "GET").toUpperCase();
839
- if (s !== "GET") return c(405, {
840
- error: "method not allowed",
841
- expected: "GET"
842
- }, a);
843
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
844
- let l = (r.authResolver ?? o)(n, s);
845
- if (!l.ok) return c(401, {
846
- error: "unauthorized",
847
- reason: l.reason
848
- }, a);
849
- if (e.kind !== "api") return c(404, { error: "workflow domain events are api-only" }, a);
850
- if (e.inspectWorkflowDomainEvents === void 0) return c(200, {
851
- events: [],
852
- total: 0,
853
- offset: 0,
854
- limit: 100
855
- }, a);
856
- let d = y(t), f = d.get("name") ?? void 0, p = Number(d.get("offset") ?? "0"), m = Number(d.get("limit") ?? "100");
857
- try {
858
- return c(200, await e.inspectWorkflowDomainEvents({
859
- ...f !== void 0 && f !== "" ? { name: f } : {},
860
- offset: Number.isFinite(p) ? p : 0,
861
- limit: Number.isFinite(m) ? m : 100
862
- }), a);
863
- } catch (e) {
864
- return c(500, {
865
- error: "workflow domain events query failed",
866
- message: e?.message ?? String(e)
867
- }, a);
868
- }
869
- }, V = async (e, t, n, r = {}) => {
870
- let a = v(t).match(/^\/_voltro\/inspect\/workflows\/events\/([^/]+)\/deliveries$/);
871
- if (!a) return null;
872
- let s = decodeURIComponent(a[1] ?? ""), l = u(n.origin ?? n.Origin), d = (r.method ?? "GET").toUpperCase();
873
- if (d !== "GET") return c(405, {
874
- error: "method not allowed",
875
- expected: "GET"
876
- }, l);
877
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
878
- let f = (r.authResolver ?? o)(n, d);
879
- if (!f.ok) return c(401, {
880
- error: "unauthorized",
881
- reason: f.reason
882
- }, l);
883
- if (e.kind !== "api") return c(404, { error: "workflow event deliveries are api-only" }, l);
884
- if (e.inspectWorkflowEventDeliveries === void 0) return c(200, { deliveries: [] }, l);
885
- try {
886
- return c(200, await e.inspectWorkflowEventDeliveries({ eventId: s }), l);
887
- } catch (e) {
888
- return c(500, {
889
- error: "workflow event deliveries query failed",
890
- message: e?.message ?? String(e)
891
- }, l);
892
- }
893
- }, H = async (e, t, n, r = {}) => {
894
- if (v(e) !== "/_voltro/inspect/workflows/children") return null;
895
- let a = u(n.origin ?? n.Origin), s = (r.method ?? "GET").toUpperCase();
896
- if (s !== "GET") return c(405, {
897
- error: "method not allowed",
898
- expected: "GET"
899
- }, a);
900
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
901
- let l = (r.authResolver ?? o)(n, s);
902
- if (!l.ok) return c(401, {
903
- error: "unauthorized",
904
- reason: l.reason
905
- }, a);
906
- if (t.kind !== "api") return c(404, { error: "workflow children are api-only" }, a);
907
- let d = j(e).get("parentExecutionId");
908
- if (d === null || d === "") return c(400, { error: "parentExecutionId query param required" }, a);
909
- if (t.inspectWorkflowChildren === void 0) return c(200, {
910
- runs: [],
911
- total: 0,
912
- offset: 0,
913
- limit: 200
914
- }, a);
915
- try {
916
- return c(200, await t.inspectWorkflowChildren({ parentExecutionId: d }), a);
917
- } catch (e) {
918
- return c(500, {
919
- error: "children query failed",
920
- message: e?.message ?? String(e)
921
- }, a);
922
- }
923
- }, U = async (e, t, n, r, a = {}) => {
924
- let s = v(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/(cancel|retry|suspend|resume-from-step|resume|signal|update|discard|redrive)$/);
925
- if (!s) return null;
926
- let l = decodeURIComponent(s[1] ?? ""), d = s[2], f = u(n.origin ?? n.Origin), p = (a.method ?? "POST").toUpperCase();
927
- if (p !== "POST") return c(405, {
928
- error: "method not allowed",
929
- expected: "POST"
930
- }, f);
931
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, f);
932
- let m = (a.authResolver ?? o)(n, p);
933
- if (!m.ok) return c(401, {
934
- error: "unauthorized",
935
- reason: m.reason
936
- }, f);
937
- if (t.kind !== "api") return c(404, { error: "workflow actions are api-only" }, f);
938
- let h = {
939
- cancel: t.inspectCancelWorkflowRun,
940
- retry: t.inspectRetryWorkflowRun,
941
- suspend: t.inspectSuspendWorkflowRun,
942
- resume: t.inspectResumeWorkflowRun,
943
- signal: t.inspectSignalWorkflowRun,
944
- update: t.inspectUpdateWorkflowRun,
945
- discard: t.inspectDiscardWorkflowRun,
946
- redrive: t.inspectRedriveWorkflowRun,
947
- "resume-from-step": t.inspectResumeWorkflowRunFromStep
948
- }[d];
949
- if (!h) return c(404, { error: d === "resume-from-step" ? "inspectResumeWorkflowRunFromStep not configured" : `inspect${d[0]?.toUpperCase() ?? ""}${d.slice(1)}WorkflowRun not configured` }, f);
950
- let g, _, y, b, x, S, C;
951
- if (r.length > 0) try {
952
- let e = JSON.parse(r);
953
- d === "retry" && (g = e.payloadOverride), d === "resume-from-step" && typeof e.step == "string" && e.step.length > 0 && (C = e.step), d === "signal" && (typeof e.signalName == "string" && e.signalName.length > 0 && (_ = e.signalName), y = e.payload), d === "update" && (typeof e.updateName == "string" && e.updateName.length > 0 && (b = e.updateName), x = e.payload, typeof e.timeoutMs == "number" && Number.isFinite(e.timeoutMs) && (S = e.timeoutMs));
954
- } catch {}
955
- if (d === "signal" && _ === void 0) return c(400, { error: "signal requires JSON body `{ signalName: string, payload?: unknown }`" }, f);
956
- if (d === "update" && b === void 0) return c(400, { error: "update requires JSON body `{ updateName: string, payload?: unknown, timeoutMs?: number }`" }, f);
957
- if (d === "resume-from-step" && C === void 0) return c(400, { error: "resume-from-step requires JSON body `{ step: string }` (the step name to rewind to)" }, f);
958
- try {
959
- return c(200, d === "retry" && g !== void 0 ? await h({
960
- runId: l,
961
- payloadOverride: g
962
- }) : d === "signal" ? await h({
963
- runId: l,
964
- signalName: _,
965
- payload: y
966
- }) : d === "update" ? await h({
967
- runId: l,
968
- updateName: b,
969
- payload: x,
970
- ...S === void 0 ? {} : { timeoutMs: S }
971
- }) : d === "resume-from-step" ? await h({
972
- runId: l,
973
- step: C
974
- }) : await h({ runId: l }), f);
975
- } catch (e) {
976
- return c(500, {
977
- error: `${d} failed`,
978
- message: e?.message ?? String(e)
979
- }, f);
980
- }
981
- }, W = async (e, t, n, r, a = {}) => {
982
- if (v(e) !== "/_voltro/inspect/data/import" || (a.method ?? "POST").toUpperCase() !== "POST") return null;
983
- let s = u(n.origin ?? n.Origin);
984
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
985
- let l = (a.authResolver ?? o)(n, "POST");
986
- if (!l.ok) return c(401, {
987
- error: "unauthorized",
988
- reason: l.reason
989
- }, s);
990
- let d = f(a.method, n, s);
991
- if (d) return d;
992
- if (t.kind !== "api") return c(404, { error: "data import is api-only" }, s);
993
- if (!t.inspectImport) return c(404, { error: "inspectImport not configured" }, s);
994
- let p;
995
- try {
996
- p = JSON.parse(r || "{}");
997
- } catch {
998
- return c(400, { error: "body must be JSON" }, s);
999
- }
1000
- if (typeof p.bundleDir != "string" || !p.bundleDir) return c(400, { error: "body.bundleDir (string) is required" }, s);
1001
- try {
1002
- return c(200, await t.inspectImport({
1003
- bundleDir: p.bundleDir,
1004
- ...p.mode === "upsert" || p.mode === "append" || p.mode === "replace" ? { mode: p.mode } : {},
1005
- ...p.onConflict === "skip" || p.onConflict === "fail" ? { onConflict: p.onConflict } : {},
1006
- ...typeof p.atomic == "boolean" ? { atomic: p.atomic } : {}
1007
- }), s);
1008
- } catch (e) {
1009
- return c(500, {
1010
- error: "import failed",
1011
- message: e?.message ?? String(e)
1012
- }, s);
1013
- }
1014
- }, G = async (e, t, n, r, a = {}) => {
1015
- let s = v(e);
1016
- if (!s.startsWith("/_voltro/inspect/data/rows")) return null;
1017
- let l = (a.method ?? "POST").toUpperCase();
1018
- if (l === "GET" && s === "/_voltro/inspect/data/rows") return null;
1019
- let d = u(n.origin ?? n.Origin);
1020
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, d);
1021
- let f = (a.authResolver ?? o)(n, l);
1022
- if (!f.ok) return c(401, {
1023
- error: "unauthorized",
1024
- reason: f.reason
1025
- }, d);
1026
- if (t.kind !== "api") return c(404, { error: "data viewer is api-only" }, d);
1027
- if (l === "POST" && s === "/_voltro/inspect/data/rows") {
1028
- if (!t.inspectInsertRow) return c(404, { error: "inspectInsertRow not configured" }, d);
1029
- let e;
1030
- try {
1031
- e = JSON.parse(r || "{}");
1032
- } catch {
1033
- return c(400, { error: "body must be JSON" }, d);
1034
- }
1035
- if (typeof e.table != "string" || !e.row || typeof e.row != "object") return c(400, { error: "body must be { table: string, row: object }" }, d);
1036
- try {
1037
- return c(200, await t.inspectInsertRow({
1038
- table: e.table,
1039
- row: e.row
1040
- }), d);
1041
- } catch (e) {
1042
- return c(500, {
1043
- error: "insert failed",
1044
- message: e?.message ?? String(e)
1045
- }, d);
1046
- }
1047
- }
1048
- let p = s.match(/^\/_voltro\/inspect\/data\/rows\/([^/]+)$/);
1049
- if (!p) return null;
1050
- let m = decodeURIComponent(p[1] ?? "");
1051
- if (!m) return c(400, { error: "row id is required in URL" }, d);
1052
- let h = j(e).get("table") ?? "";
1053
- if (!h) return c(400, { error: "query.table is required" }, d);
1054
- if (l === "PATCH") {
1055
- if (!t.inspectUpdateRow) return c(404, { error: "inspectUpdateRow not configured" }, d);
1056
- let e;
1057
- try {
1058
- e = JSON.parse(r || "{}");
1059
- } catch {
1060
- return c(400, { error: "body must be JSON" }, d);
1061
- }
1062
- if (!e.patch || typeof e.patch != "object") return c(400, { error: "body.patch must be an object" }, d);
1063
- try {
1064
- return c(200, await t.inspectUpdateRow({
1065
- table: h,
1066
- id: m,
1067
- patch: e.patch
1068
- }), d);
1069
- } catch (e) {
1070
- return c(500, {
1071
- error: "update failed",
1072
- message: e?.message ?? String(e)
1073
- }, d);
1074
- }
1075
- }
1076
- if (l === "DELETE") {
1077
- if (!t.inspectDeleteRow) return c(404, { error: "inspectDeleteRow not configured" }, d);
1078
- try {
1079
- return c(200, await t.inspectDeleteRow({
1080
- table: h,
1081
- id: m
1082
- }), d);
1083
- } catch (e) {
1084
- return c(500, {
1085
- error: "delete failed",
1086
- message: e?.message ?? String(e)
1087
- }, d);
1088
- }
1089
- }
1090
- return c(405, {
1091
- error: "method not allowed",
1092
- expected: "POST | PATCH | DELETE"
1093
- }, d);
1094
- }, K = async (e, t, n, a, s = {}) => {
1095
- let l = v(e), d = `${r}/workflows/flow-control`;
1096
- if (l !== d && !l.startsWith(`${d}/`)) return null;
1097
- let f = u(n.origin ?? n.Origin), p = (s.method ?? "GET").toUpperCase();
1098
- if (i()) return c(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, f);
1099
- let m = (s.authResolver ?? o)(n, p);
1100
- if (!m.ok) return c(401, {
1101
- error: "unauthorized",
1102
- reason: m.reason
1103
- }, f);
1104
- if (t.kind !== "api") return c(404, { error: "flow control is api-only" }, f);
1105
- if (l === `${d}/inferences`) {
1106
- if (p !== "GET") return c(405, {
1107
- error: "method not allowed",
1108
- expected: "GET"
1109
- }, f);
1110
- if (t.inspectInferences === void 0) return c(404, { error: "inspectInferences not configured" }, f);
1111
- let n = j(e).get("limit"), r = n === null ? void 0 : Number(n);
1112
- try {
1113
- return c(200, await t.inspectInferences(r !== void 0 && Number.isFinite(r) ? { limit: r } : {}), f);
1114
- } catch (e) {
1115
- return c(500, {
1116
- error: "inference queue read failed",
1117
- message: e?.message ?? String(e)
1118
- }, f);
1119
- }
1120
- }
1121
- if (l === d) {
1122
- if (p !== "GET") return c(405, {
1123
- error: "method not allowed",
1124
- expected: "GET"
1125
- }, f);
1126
- if (t.inspectFlowControl === void 0) return c(404, { error: "inspectFlowControl not configured" }, f);
1127
- let n = j(e).get("limit"), r = n === null ? void 0 : Number(n);
1128
- try {
1129
- return c(200, await t.inspectFlowControl(r !== void 0 && Number.isFinite(r) ? { limit: r } : {}), f);
1130
- } catch (e) {
1131
- return c(500, {
1132
- error: "flow control read failed",
1133
- message: e?.message ?? String(e)
1134
- }, f);
1135
- }
1136
- }
1137
- if (p !== "POST") return c(405, {
1138
- error: "method not allowed",
1139
- expected: "POST"
1140
- }, f);
1141
- let h = {};
1142
- if (a.length > 0) try {
1143
- h = JSON.parse(a);
1144
- } catch {
1145
- return c(400, { error: "expected a JSON body" }, f);
1146
- }
1147
- let g = l.slice(d.length + 1);
1148
- try {
1149
- if (g === "pause") return t.inspectPauseWorkflow === void 0 ? c(404, { error: "inspectPauseWorkflow not configured" }, f) : h.workflow ? c(200, await t.inspectPauseWorkflow({
1150
- workflow: h.workflow,
1151
- ...h.reason === void 0 ? {} : { reason: h.reason }
1152
- }), f) : c(400, { error: "body.workflow is required" }, f);
1153
- if (g === "resume") return t.inspectResumeWorkflow === void 0 ? c(404, { error: "inspectResumeWorkflow not configured" }, f) : h.workflow ? c(200, await t.inspectResumeWorkflow({ workflow: h.workflow }), f) : c(400, { error: "body.workflow is required" }, f);
1154
- if (g === "discard") return t.inspectDiscardIntent === void 0 ? c(404, { error: "inspectDiscardIntent not configured" }, f) : h.intentId ? c(200, await t.inspectDiscardIntent({ intentId: h.intentId }), f) : c(400, { error: "body.intentId is required" }, f);
1155
- if (g === "bulk") {
1156
- if (t.inspectBulkWorkflowRuns === void 0) return c(404, { error: "inspectBulkWorkflowRuns not configured" }, f);
1157
- if (h.op !== "cancel" && h.op !== "replay") return c(400, { error: "body.op must be 'cancel' or 'replay'" }, f);
1158
- if (typeof h.limit != "number") return c(400, { error: "body.limit is required — a bulk operation has no unbounded form, the cap IS the blast radius. The response reports `truncated` when more matched." }, f);
1159
- try {
1160
- return c(200, await t.inspectBulkWorkflowRuns({
1161
- op: h.op,
1162
- limit: h.limit,
1163
- ...h.reason === void 0 ? {} : { reason: h.reason },
1164
- ...h.mode === void 0 ? {} : { mode: h.mode },
1165
- ...h.dryRun === void 0 ? {} : { dryRun: h.dryRun },
1166
- ...h.workflow === void 0 ? {} : { workflow: h.workflow },
1167
- ...h.status === void 0 ? {} : { status: h.status },
1168
- ...h.startedAfter === void 0 ? {} : { startedAfter: h.startedAfter },
1169
- ...h.startedBefore === void 0 ? {} : { startedBefore: h.startedBefore }
1170
- }), f);
1171
- } catch (e) {
1172
- if (e?.name === "BulkRequestError") return c(400, { error: e.message }, f);
1173
- throw e;
1174
- }
1175
- }
1176
- } catch (e) {
1177
- return c(500, {
1178
- error: "flow control action failed",
1179
- message: e?.message ?? String(e)
1180
- }, f);
1181
- }
1182
- return c(404, {
1183
- error: `unknown flow-control action '${g}'`,
1184
- expected: [
1185
- "pause",
1186
- "resume",
1187
- "discard",
1188
- "bulk"
1189
- ]
1190
- }, f);
1191
- };
1192
- //#endregion
1193
- export { i as A, P as C, u as D, F as E, p as M, _ as N, g as O, s as P, z as S, N as T, D as _, o as a, B as b, W as c, K as d, O as f, I as g, C as h, f as i, l as j, d as k, k as l, A as m, x as n, E as o, T as p, S as r, L as s, r as t, G as u, U as v, R as w, V as x, H as y };