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