@voltro/cli 0.21.0 → 0.22.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 (69) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/dist/apiBuild-COyPDf3R.js +2 -0
  3. package/dist/{apiBuild-BHOtsQkp.js → apiBuild-DiWxVz-M.js} +2 -2
  4. package/dist/bin.js +3 -3
  5. package/dist/{commands-BZoimvvS.js → commands-BxRaIOBG.js} +1548 -1246
  6. package/dist/dbCommand-CO3eSAZR.js +2 -0
  7. package/dist/{dbCommand-CDBbZ-Ac.js → dbCommand-DVASmZj2.js} +295 -253
  8. package/dist/{dev-DKb92NYX.js → dev-BRiPgbKw.js} +1738 -1702
  9. package/dist/{dev-CZQ73Yoh.js → dev-Dd3EZzj5.js} +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/inspect-BA67TF6v.js +2 -0
  12. package/dist/inspect-_ldwsAwH.js +945 -0
  13. package/dist/{inspectMetrics-DMjWBQif.js → inspectMetrics-9ZSuDeqD.js} +148 -115
  14. package/dist/{manifestBuild-P9yuCY2d.js → manifestBuild-Bs1Uw22_.js} +1 -1
  15. package/dist/manifestBuild-i-fRHg_H.js +2 -0
  16. package/dist/{serveCommand-qHJCs0cX.js → serveCommand-DXJOARkO.js} +305 -306
  17. package/dist/serveEntry.js +2 -2
  18. package/dist/{start-B1x6Z60h.js → start-CsIjcOi-.js} +3 -3
  19. package/dist/startEntry.js +2 -2
  20. package/package.json +17 -17
  21. package/templates/AGENTS.md +1 -1
  22. package/templates/agent-docs/_index.md +1 -1
  23. package/templates/agent-docs/cli.md +118 -5
  24. package/templates/agent-docs/data.md +58 -0
  25. package/templates/agent-docs/database/migrations.md +142 -20
  26. package/templates/agent-docs/plugins.md +1 -1
  27. package/templates/agent-docs/schema-driven-ui.md +2 -2
  28. package/templates/agent-docs/templates/apibackends.md +1 -1
  29. package/templates/agent-docs/whats-new.md +32 -114
  30. package/templates/apps/api-ai/package.json +7 -7
  31. package/templates/apps/api-auth/package.json +8 -8
  32. package/templates/apps/api-backend/package.json +7 -7
  33. package/templates/apps/api-backend-deactivation/package.json +7 -7
  34. package/templates/apps/api-backend-mail/package.json +8 -8
  35. package/templates/apps/api-backend-mariadb/package.json +9 -9
  36. package/templates/apps/api-backend-storage/package.json +8 -8
  37. package/templates/apps/api-data-advanced/package.json +8 -8
  38. package/templates/apps/api-durable/package.json +8 -8
  39. package/templates/apps/api-feature-flags/package.json +9 -9
  40. package/templates/apps/api-governance/package.json +8 -8
  41. package/templates/apps/api-kv/package.json +8 -8
  42. package/templates/apps/api-moderation/package.json +8 -8
  43. package/templates/apps/api-observability/package.json +8 -8
  44. package/templates/apps/api-ratelimit/package.json +8 -8
  45. package/templates/apps/api-rbac/package.json +8 -8
  46. package/templates/apps/api-rest/package.json +7 -7
  47. package/templates/apps/api-saas/package.json +11 -11
  48. package/templates/apps/api-search/package.json +8 -8
  49. package/templates/apps/api-versioning/package.json +8 -8
  50. package/templates/apps/api-webhooks/package.json +9 -9
  51. package/templates/apps/changelog/package.json +6 -6
  52. package/templates/apps/edge-functions/package.json +2 -2
  53. package/templates/apps/frontend-admin/package.json +8 -8
  54. package/templates/apps/frontend-app/package.json +8 -8
  55. package/templates/apps/frontend-blank/package.json +7 -7
  56. package/templates/apps/frontend-contact/package.json +7 -7
  57. package/templates/apps/frontend-dashboard/package.json +7 -7
  58. package/templates/apps/frontend-docs/package.json +7 -7
  59. package/templates/apps/frontend-i18n/package.json +6 -6
  60. package/templates/apps/frontend-landing/package.json +7 -7
  61. package/templates/apps/frontend-spa/package.json +7 -7
  62. package/templates/apps/frontend-ssr/package.json +7 -7
  63. package/templates/apps/frontend-ssr-api/package.json +8 -8
  64. package/templates/apps/frontend-static-blog/package.json +6 -6
  65. package/dist/apiBuild-K7M6Rt0U.js +0 -2
  66. package/dist/dbCommand-oADAj6ez.js +0 -2
  67. package/dist/inspect-DcZ04OME.js +0 -2
  68. package/dist/inspect-Dwx0_tUj.js +0 -921
  69. package/dist/manifestBuild-D1MzJAiQ.js +0 -2
@@ -1,921 +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 = (e) => {
5
- let n = process.env.VOLTRO_INSPECT_TOKEN;
6
- if (!n || n.length === 0) return {
7
- ok: !1,
8
- 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)."
9
- };
10
- let r = e.authorization ?? e.Authorization;
11
- return r ? r.startsWith("Bearer ") ? t(r.slice(7).trim(), n) ? { ok: !0 } : {
12
- ok: !1,
13
- reason: "token mismatch"
14
- } : {
15
- ok: !1,
16
- reason: "expected \"Bearer <token>\" auth scheme"
17
- } : {
18
- ok: !1,
19
- reason: "missing Authorization header"
20
- };
21
- }, a = (e) => {
22
- if (!Array.isArray(e) || e.length === 0) return;
23
- let t = [];
24
- for (let n of e) {
25
- if (typeof n != "object" || !n) continue;
26
- if (typeof n.action == "string" && typeof n.resourceType == "string") {
27
- t.push({
28
- kind: "policy",
29
- action: n.action,
30
- resourceType: n.resourceType
31
- });
32
- continue;
33
- }
34
- let e = n.scope;
35
- typeof e != "string" && !Array.isArray(e) || t.push({
36
- kind: "scope",
37
- scope: typeof e == "string" ? [e] : e.filter((e) => typeof e == "string"),
38
- mode: n.mode === "any" ? "any" : "all",
39
- resourceScoped: typeof n.resource == "function"
40
- });
41
- }
42
- return t.length > 0 ? t : void 0;
43
- }, o = (e, t, n = {}) => ({
44
- status: e,
45
- contentType: "application/json; charset=utf-8",
46
- body: JSON.stringify(t),
47
- headers: n
48
- }), s = (e) => {
49
- let t;
50
- try {
51
- t = new URL(e).hostname;
52
- } catch {
53
- return !1;
54
- }
55
- return t = t.replace(/^\[|\]$/g, ""), t === "localhost" || t.endsWith(".localhost") || t === "::1" ? !0 : /^127(?:\.\d{1,3}){3}$/.test(t);
56
- }, c = (e) => !e || e.length === 0 ? {} : s(e) ? {
57
- "access-control-allow-origin": e,
58
- "access-control-allow-credentials": "true",
59
- "access-control-allow-methods": "GET, POST, OPTIONS",
60
- "access-control-allow-headers": "authorization, content-type, accept",
61
- "access-control-expose-headers": "content-type, content-length",
62
- vary: "Origin"
63
- } : { vary: "Origin" }, l = (e, t = process.env.VOLTRO_DASHBOARD_APPS) => {
64
- if (s(e)) return !0;
65
- let n;
66
- try {
67
- n = new URL(e).origin;
68
- } catch {
69
- return !1;
70
- }
71
- if (!t || t.trim() === "") return !1;
72
- try {
73
- let e = JSON.parse(t);
74
- return Array.isArray(e) ? e.some((e) => {
75
- let t = e?.url;
76
- if (typeof t != "string") return !1;
77
- try {
78
- return new URL(t).origin === n;
79
- } catch {
80
- return !1;
81
- }
82
- }) : !1;
83
- } catch {
84
- return !1;
85
- }
86
- }, u = (e, t, n = {}) => {
87
- let r = (e ?? "GET").toUpperCase();
88
- if (r === "GET" || r === "HEAD" || r === "OPTIONS") return null;
89
- let i = t.origin ?? t.Origin;
90
- return i === void 0 || i === "" || s(i) ? null : o(403, {
91
- error: "cross-site write rejected",
92
- reason: `a state-changing inspect request may not come from origin "${i}" — only same-machine (loopback) origins may write`
93
- }, n);
94
- }, d = (e) => {
95
- let t = e.indexOf("?");
96
- return t === -1 ? e : e.slice(0, t);
97
- }, f = (e) => {
98
- let t = e.indexOf("?");
99
- return t === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
100
- }, p = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), m = [
101
- "text",
102
- "textarea",
103
- "number",
104
- "checkbox",
105
- "switch",
106
- "select",
107
- "radio",
108
- "async-select",
109
- "multi-select",
110
- "date",
111
- "datetime",
112
- "daterange",
113
- "file",
114
- "hidden",
115
- "custom"
116
- ], h = (e, t, n = [], r = []) => ({
117
- version: 2,
118
- scopes: [...new Set(r.flatMap((e) => e.declaredScopes ?? []))].sort(),
119
- procedures: [...e].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({
120
- tag: e.tag,
121
- kind: e.kind,
122
- ...e.inputSchema === void 0 ? {} : { input: e.inputSchema },
123
- ...e.outputSchema === void 0 ? {} : { output: e.outputSchema },
124
- ...e.source === void 0 ? {} : { source: e.source },
125
- ...e.targets === void 0 ? {} : { targets: e.targets },
126
- ...e.guards === void 0 ? {} : { guards: e.guards },
127
- ...e.publicApi === void 0 ? {} : { publicApi: e.publicApi },
128
- ...e.exposeAsTool === void 0 ? {} : { exposeAsTool: e.exposeAsTool }
129
- })),
130
- workflows: [...t].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({ name: e.tag })),
131
- widgets: m,
132
- tables: [...n].filter((e) => !e.isFrameworkTable).sort((e, t) => e.name.localeCompare(t.name)).map((e) => ({
133
- name: e.name,
134
- reactive: e.isReactive,
135
- framework: e.isFrameworkTable,
136
- columns: e.columns.map((e) => ({
137
- name: e.name,
138
- type: String(e.type),
139
- nullable: e.nullable,
140
- ...e.referencesTable === void 0 ? {} : { refersTo: e.referencesTable },
141
- ...e.oneOf === void 0 ? {} : { enum: e.oneOf }
142
- }))
143
- }))
144
- }), g = (e, t, n = {}, a = {}) => {
145
- let s = d(e);
146
- if (!p(s)) return null;
147
- let l = c(n.origin ?? n.Origin);
148
- if ((a.method ?? "GET").toUpperCase() === "OPTIONS") return {
149
- status: 204,
150
- contentType: "text/plain",
151
- body: "",
152
- headers: l
153
- };
154
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
155
- let u = (a.authResolver ?? i)(n);
156
- if (!u.ok) return o(401, {
157
- error: "unauthorized",
158
- reason: u.reason
159
- }, l);
160
- if (s === "/_voltro/inspect" || s === "/_voltro/inspect/" || s === "/_voltro/inspect/app") return o(200, {
161
- kind: t.kind,
162
- ...t.meta
163
- }, l);
164
- if (s === "/_voltro/inspect/routes") return t.kind === "web" ? o(200, {
165
- pages: t.routes,
166
- dirs: t.dirs
167
- }, l) : o(404, { error: "routes endpoint is web-only" }, l);
168
- if (s === "/_voltro/inspect/cache") return t.kind === "web" ? o(200, t.cache(), l) : o(404, { error: "cache endpoint is web-only" }, l);
169
- if (s === "/_voltro/inspect/rpc") return t.kind === "api" ? o(200, {
170
- procedures: t.rpc,
171
- workflows: t.workflows
172
- }, l) : o(404, { error: "rpc endpoint is api-only" }, l);
173
- if (s === "/_voltro/inspect/manifest") {
174
- if (t.kind !== "api") return o(404, { error: "manifest endpoint is api-only" }, l);
175
- let e = t.inspectTables?.().tables ?? [];
176
- return o(200, h(t.rpc, t.workflows, e, t.plugins?.().plugins ?? []), l);
177
- }
178
- return s === "/_voltro/inspect/metrics" ? t.metrics === void 0 ? o(200, [], l) : o(200, t.metrics(), l) : s === "/_voltro/inspect/subscriptions" ? t.kind === "api" ? t.subscriptions === void 0 ? o(200, {
179
- subscriptions: [],
180
- matcherStats: [],
181
- capturedAt: Date.now()
182
- }, l) : o(200, t.subscriptions(), l) : o(404, { error: "subscriptions endpoint is api-only" }, l) : s === "/_voltro/inspect/data-cache" ? t.kind === "api" ? t.dataCache === void 0 ? o(200, {
183
- backend: "memory",
184
- engine: "memory",
185
- driver: "resp",
186
- hits: 0,
187
- misses: 0,
188
- hitRate: 0
189
- }, l) : o(200, t.dataCache(), l) : o(404, { error: "data-cache endpoint is api-only" }, l) : s === "/_voltro/inspect/database" ? t.kind === "api" ? t.database === void 0 ? o(200, {
190
- migrations: [],
191
- seeds: []
192
- }, l) : o(200, t.database(), l) : o(404, { error: "database endpoint is api-only" }, l) : s === "/_voltro/inspect/plugins" ? t.kind === "api" ? t.plugins === void 0 ? o(200, {
193
- plugins: [],
194
- capturedAt: Date.now()
195
- }, l) : o(200, t.plugins(), l) : o(404, { error: "plugins endpoint is api-only" }, l) : s === "/_voltro/inspect/env" ? t.env === void 0 ? o(200, {
196
- app: t.meta.name ?? "app",
197
- entries: [],
198
- summary: {
199
- total: 0,
200
- set: 0,
201
- missingRequired: 0
202
- }
203
- }, l) : o(200, t.env(), l) : s === "/_voltro/inspect/data/tables" ? t.kind === "api" ? t.inspectTables === void 0 ? o(200, { tables: [] }, l) : o(200, t.inspectTables(), l) : o(404, { error: "data viewer is api-only" }, l) : s === "/_voltro/inspect/invoke" ? o(404, { error: "invoke not enabled here — use POST handler" }, l) : o(404, {
204
- error: "unknown inspect endpoint",
205
- path: s
206
- }, l);
207
- }, _ = async (e, t, n, a = {}) => {
208
- let s = c(t.origin ?? t.Origin);
209
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
210
- if ((a.method ?? "POST").toUpperCase() !== "POST") return o(405, {
211
- error: "method not allowed",
212
- expected: "POST"
213
- }, s);
214
- let l = (a.authResolver ?? i)(t);
215
- if (!l.ok) return o(401, {
216
- error: "unauthorized",
217
- reason: l.reason
218
- }, s);
219
- if (e.kind !== "api") return o(404, { error: "invoke endpoint is api-only" }, s);
220
- if (!e.invokers || e.invokers.size === 0) return o(404, { error: "invoke not configured" }, s);
221
- let u;
222
- try {
223
- u = JSON.parse(n || "{}");
224
- } catch {
225
- return o(400, { error: "body must be JSON" }, s);
226
- }
227
- let d = u;
228
- if (typeof d.tag != "string") return o(400, { error: "body.tag must be a string" }, s);
229
- let f = e.invokers.get(d.tag);
230
- if (!f) return o(404, {
231
- error: "unknown tag",
232
- tag: d.tag
233
- }, s);
234
- let p = typeof d.headers == "object" && d.headers !== null ? d.headers : {}, m = {};
235
- for (let [e, n] of Object.entries(t)) m[e.toLowerCase()] = n;
236
- for (let [e, t] of Object.entries(p)) {
237
- let n = e.toLowerCase();
238
- n !== "cookie" && (m[n] = t);
239
- }
240
- return o(200, await f(d.input, m), s);
241
- }, v = async (e, t, a, s, l = {}) => {
242
- let f = d(e);
243
- if (!p(f) || !f.startsWith("/_voltro/inspect/webhooks/")) return null;
244
- let m = c(a.origin ?? a.Origin);
245
- if ((l.method ?? "POST").toUpperCase() !== "POST") return null;
246
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, m);
247
- let h = (l.authResolver ?? i)(a);
248
- if (!h.ok) return o(401, {
249
- error: "unauthorized",
250
- reason: h.reason
251
- }, m);
252
- let g = u(l.method, a, m);
253
- if (g) return g;
254
- if (t.kind !== "api") return o(404, { error: "webhook actions are api-only" }, m);
255
- if (!t.webhookActions) return o(404, { error: "webhook actions not configured — is @voltro/plugin-webhooks active?" }, m);
256
- let _;
257
- try {
258
- _ = JSON.parse(s || "{}");
259
- } catch {
260
- return o(400, { error: "body must be JSON" }, m);
261
- }
262
- let v = f.slice(`${n}/webhooks/`.length);
263
- try {
264
- switch (v) {
265
- case "subscribe": {
266
- let e = _;
267
- return typeof e.event != "string" || e.event.length === 0 ? o(400, { error: "event required" }, m) : typeof e.url != "string" || e.url.length === 0 ? o(400, { error: "url required" }, m) : o(200, await t.webhookActions.subscribe(e), m);
268
- }
269
- case "pause": {
270
- let e = _.targetId;
271
- return typeof e != "string" || e.length === 0 ? o(400, { error: "targetId required" }, m) : (await t.webhookActions.pause(e), o(200, { ok: !0 }, m));
272
- }
273
- case "resume": {
274
- let e = _.targetId;
275
- return typeof e != "string" || e.length === 0 ? o(400, { error: "targetId required" }, m) : (await t.webhookActions.resume(e), o(200, { ok: !0 }, m));
276
- }
277
- case "delete": {
278
- let e = _.targetId;
279
- return typeof e != "string" || e.length === 0 ? o(400, { error: "targetId required" }, m) : (await t.webhookActions.delete(e), o(200, { ok: !0 }, m));
280
- }
281
- case "rotateSecret": {
282
- let e = _.targetId;
283
- return typeof e != "string" || e.length === 0 ? o(400, { error: "targetId required" }, m) : o(200, await t.webhookActions.rotateSecret(e), m);
284
- }
285
- case "replay": {
286
- let e = _.deliveryId;
287
- return typeof e != "string" || e.length === 0 ? o(400, { error: "deliveryId required" }, m) : (await t.webhookActions.replay(e), o(200, { ok: !0 }, m));
288
- }
289
- case "repinVersion": {
290
- let e = _.targetId, n = _.version;
291
- return typeof e != "string" || e.length === 0 ? o(400, { error: "targetId required" }, m) : typeof n != "number" || !Number.isInteger(n) || n < 1 ? o(400, { error: "version must be a positive integer" }, m) : (await t.webhookActions.updateTargetPayloadVersion(e, n), o(200, { ok: !0 }, m));
292
- }
293
- default: return o(404, { error: `unknown webhook action: ${v}` }, m);
294
- }
295
- } catch (e) {
296
- return o(500, {
297
- error: "webhook action failed",
298
- message: e?.message ?? String(e)
299
- }, m);
300
- }
301
- }, y = async (e, t, a, s, l = {}) => {
302
- let u = d(e);
303
- if (!p(u)) return null;
304
- let f = c(a.origin ?? a.Origin);
305
- if ((l.method ?? "POST").toUpperCase() !== "POST") return null;
306
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, f);
307
- let m = (l.authResolver ?? i)(a);
308
- if (!m.ok) return o(401, {
309
- error: "unauthorized",
310
- reason: m.reason
311
- }, f);
312
- if (t.kind !== "api") return o(404, { error: "framework-action endpoints are api-only" }, f);
313
- let h = `${n}/seeds/run`, g = `${n}/migrations/rollback`, _ = `${n}/migrations/squash`, v = `${n}/migrations/restore-snapshot`;
314
- if (u !== h && u !== g && u !== _ && u !== v && u !== "/_voltro/inspect/migrations/compare-env") return null;
315
- let y;
316
- try {
317
- y = JSON.parse(s || "{}");
318
- } catch {
319
- return o(400, { error: "body must be JSON" }, f);
320
- }
321
- try {
322
- if (u === h) return typeof y.id != "string" || y.id.length === 0 ? o(400, { error: "body.id must be a non-empty string" }, f) : t.runSeed ? o(200, await t.runSeed(y.id), f) : o(404, { error: "runSeed not configured" }, f);
323
- if (u === g) return typeof y.id != "string" || y.id.length === 0 ? o(400, { error: "body.id must be a non-empty string" }, f) : t.rollbackMigration ? o(200, await t.rollbackMigration(y.id), f) : o(404, { error: "rollbackMigration not configured" }, f);
324
- if (u === _) {
325
- if (typeof y.before != "string" || y.before.length === 0) return o(400, { error: "body.before must be a non-empty ISO date string" }, f);
326
- if (!t.squashMigrationHistory) return o(404, { error: "squashMigrationHistory not configured" }, f);
327
- let e = typeof y.note == "string" ? y.note : void 0;
328
- return o(200, await t.squashMigrationHistory({
329
- before: y.before,
330
- note: e
331
- }), f);
332
- }
333
- return u === v ? typeof y.planId != "string" || y.planId.length === 0 ? o(400, { error: "body.planId must be a non-empty string" }, f) : t.restoreSnapshot ? o(200, await t.restoreSnapshot({ planId: y.planId }), f) : o(404, { error: "restoreSnapshot not configured" }, f) : typeof y.url != "string" || y.url.length === 0 ? o(400, { error: "body.url must be a non-empty URL string" }, f) : t.compareCrossEnv ? (await t.compareCrossEnv({
334
- url: y.url,
335
- label: typeof y.label == "string" ? y.label : void 0,
336
- token: typeof y.token == "string" ? y.token : void 0
337
- }), o(200, { ok: !0 }, f)) : o(404, { error: "compareCrossEnv not configured" }, f);
338
- } catch (e) {
339
- return o(500, {
340
- error: "framework action failed",
341
- message: e?.message ?? String(e)
342
- }, f);
343
- }
344
- }, b = async (e, t, n, a = {}) => {
345
- if (d(e) !== "/_voltro/inspect/data/rows") return null;
346
- let s = c(n.origin ?? n.Origin);
347
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
348
- error: "method not allowed",
349
- expected: "GET"
350
- }, s);
351
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
352
- let l = (a.authResolver ?? i)(n);
353
- if (!l.ok) return o(401, {
354
- error: "unauthorized",
355
- reason: l.reason
356
- }, s);
357
- if (t.kind !== "api") return o(404, { error: "data viewer is api-only" }, s);
358
- if (t.inspectRows === void 0) return o(404, { error: "inspectRows not configured" }, s);
359
- let u = S(e), f = u.get("table");
360
- if (!f) return o(400, { error: "query.table is required" }, s);
361
- let p = C(u.get("offset")) ?? 0, m = C(u.get("limit")) ?? 50, h = {}, g = u.get("q");
362
- if (g) {
363
- if (g.length > 8192) return o(400, { error: "query.q too large" }, s);
364
- try {
365
- h = JSON.parse(Buffer.from(g, "base64url").toString("utf8"));
366
- } catch {
367
- return o(400, { error: "query.q is not valid base64url JSON" }, s);
368
- }
369
- }
370
- try {
371
- return o(200, await t.inspectRows({
372
- table: f,
373
- offset: p,
374
- limit: m,
375
- ...h
376
- }), s);
377
- } catch (e) {
378
- return e?.name === "InspectQueryError" ? o(400, {
379
- error: "invalid query",
380
- message: e.message
381
- }, s) : o(500, {
382
- error: "data-rows query failed",
383
- message: e?.message ?? String(e)
384
- }, s);
385
- }
386
- }, x = async (t, n, a, s = {}) => {
387
- if (d(t) !== "/_voltro/inspect/provenance") return null;
388
- let l = c(a.origin ?? a.Origin);
389
- if ((s.method ?? "GET").toUpperCase() !== "GET") return o(405, {
390
- error: "method not allowed",
391
- expected: "GET"
392
- }, l);
393
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
394
- let f = (s.authResolver ?? i)(a);
395
- if (!f.ok) return o(401, {
396
- error: "unauthorized",
397
- reason: f.reason
398
- }, l);
399
- let p = u(s.method, a, l);
400
- if (p) return p;
401
- if (n.kind !== "api") return o(404, { error: "provenance is api-only" }, l);
402
- if (n.inspectRows === void 0) return o(404, { error: "inspectRows not configured" }, l);
403
- let m = S(t), h = m.get("table"), g = m.get("id"), _ = m.get("column") ?? void 0;
404
- if (!h || !g) return o(400, { error: "query.table and query.id are required" }, l);
405
- try {
406
- let t = (await n.inspectRows({
407
- table: h,
408
- limit: 1,
409
- filter: {
410
- kind: "leaf",
411
- column: "id",
412
- op: "eq",
413
- value: g
414
- }
415
- })).rows[0];
416
- return o(200, e(t, {
417
- table: h,
418
- id: g,
419
- ..._ === void 0 ? {} : { column: _ }
420
- }), l);
421
- } catch (e) {
422
- return e?.name === "InspectQueryError" ? o(400, {
423
- error: "invalid query",
424
- message: e.message
425
- }, l) : o(500, {
426
- error: "provenance query failed",
427
- message: e?.message ?? String(e)
428
- }, l);
429
- }
430
- }, S = (e) => {
431
- let t = e.indexOf("?");
432
- return t < 0 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
433
- }, C = (e) => {
434
- if (e === null || e === "") return;
435
- let t = Number(e);
436
- return Number.isFinite(t) && t >= 0 ? Math.floor(t) : void 0;
437
- }, w = async (e, t, n, a = {}) => {
438
- if (d(e) !== "/_voltro/inspect/workflows/runs") return null;
439
- let s = c(n.origin ?? n.Origin);
440
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
441
- error: "method not allowed",
442
- expected: "GET"
443
- }, s);
444
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
445
- let l = (a.authResolver ?? i)(n);
446
- if (!l.ok) return o(401, {
447
- error: "unauthorized",
448
- reason: l.reason
449
- }, s);
450
- if (t.kind !== "api") return o(404, { error: "workflows endpoint is api-only" }, s);
451
- if (t.inspectWorkflowRuns === void 0) return o(200, {
452
- runs: [],
453
- total: 0,
454
- offset: 0,
455
- limit: 50
456
- }, s);
457
- let u = S(e);
458
- try {
459
- return o(200, await t.inspectWorkflowRuns({
460
- ...u.get("tag") === null ? {} : { tag: u.get("tag") },
461
- ...u.get("status") === null ? {} : { status: u.get("status") },
462
- offset: C(u.get("offset")) ?? 0,
463
- limit: C(u.get("limit")) ?? 50
464
- }), s);
465
- } catch (e) {
466
- return o(500, {
467
- error: "workflow-runs query failed",
468
- message: e?.message ?? String(e)
469
- }, s);
470
- }
471
- }, T = async (e, t, n, a, s = {}) => {
472
- let l = d(e).match(/^\/_voltro\/inspect\/workflows\/start\/([^/]+)$/);
473
- if (!l) return null;
474
- let u = decodeURIComponent(l[1] ?? ""), f = c(n.origin ?? n.Origin);
475
- if ((s.method ?? "POST").toUpperCase() !== "POST") return o(405, {
476
- error: "method not allowed",
477
- expected: "POST"
478
- }, f);
479
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, f);
480
- let p = (s.authResolver ?? i)(n);
481
- if (!p.ok) return o(401, {
482
- error: "unauthorized",
483
- reason: p.reason
484
- }, f);
485
- if (t.kind !== "api") return o(404, { error: "workflow start is api-only" }, f);
486
- if (t.inspectStartWorkflow === void 0) return o(404, { error: "inspectStartWorkflow not configured" }, f);
487
- let m = {};
488
- if (a.length > 0) try {
489
- m = JSON.parse(a).payload ?? {};
490
- } catch {
491
- return o(400, { error: "start requires JSON body `{ payload?: unknown }`" }, f);
492
- }
493
- try {
494
- return o(200, await t.inspectStartWorkflow({
495
- name: u,
496
- payload: m
497
- }), f);
498
- } catch (e) {
499
- return o(500, {
500
- error: "workflow start failed",
501
- message: e?.message ?? String(e)
502
- }, f);
503
- }
504
- }, E = async (e, t, n, a = {}) => {
505
- let s = d(e);
506
- if (!s.startsWith("/_voltro/inspect/schedules")) return null;
507
- let l = c(n.origin ?? n.Origin);
508
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
509
- let f = (a.authResolver ?? i)(n);
510
- if (!f.ok) return o(401, {
511
- error: "unauthorized",
512
- reason: f.reason
513
- }, l);
514
- let p = u(a.method, n, l);
515
- if (p) return p;
516
- if (t.kind !== "api") return o(404, { error: "schedules are api-only" }, l);
517
- let m = (a.method ?? "GET").toUpperCase(), h = s.match(/^\/_voltro\/inspect\/schedules\/([^/]+)\/fire$/);
518
- if (h) {
519
- if (m !== "POST") return o(405, {
520
- error: "method not allowed",
521
- expected: "POST"
522
- }, l);
523
- if (!t.inspectFireSchedule) return o(404, { error: "inspectFireSchedule not configured" }, l);
524
- let n = decodeURIComponent(h[1] ?? ""), r = S(e).get("trigger") === "external" ? "external" : "manual";
525
- try {
526
- return o(200, await t.inspectFireSchedule({
527
- name: n,
528
- trigger: r
529
- }), l);
530
- } catch (e) {
531
- return o(500, {
532
- error: "fire failed",
533
- message: e?.message ?? String(e)
534
- }, l);
535
- }
536
- }
537
- if (s === "/_voltro/inspect/schedules/runs") {
538
- if (m !== "GET") return o(405, {
539
- error: "method not allowed",
540
- expected: "GET"
541
- }, l);
542
- if (!t.inspectScheduleRuns) return o(200, {
543
- runs: [],
544
- total: 0,
545
- offset: 0,
546
- limit: 50
547
- }, l);
548
- let n = S(e);
549
- try {
550
- return o(200, await t.inspectScheduleRuns({
551
- ...n.get("name") === null ? {} : { name: n.get("name") },
552
- offset: C(n.get("offset")) ?? 0,
553
- limit: C(n.get("limit")) ?? 50
554
- }), l);
555
- } catch (e) {
556
- return o(500, {
557
- error: "schedule-runs query failed",
558
- message: e?.message ?? String(e)
559
- }, l);
560
- }
561
- }
562
- return s === "/_voltro/inspect/schedules" ? m === "GET" ? t.inspectSchedules ? o(200, t.inspectSchedules(), l) : o(200, {
563
- schedules: [],
564
- coordination: "single"
565
- }, l) : o(405, {
566
- error: "method not allowed",
567
- expected: "GET"
568
- }, l) : o(404, {
569
- error: "unknown schedules endpoint",
570
- path: s
571
- }, l);
572
- }, D = async (e, t, n, a = {}) => {
573
- if (d(e) !== "/_voltro/inspect/cluster") return null;
574
- let s = c(n.origin ?? n.Origin);
575
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
576
- let l = (a.authResolver ?? i)(n);
577
- if (!l.ok) return o(401, {
578
- error: "unauthorized",
579
- reason: l.reason
580
- }, s);
581
- let f = u(a.method, n, s);
582
- if (f) return f;
583
- if (t.kind !== "api") return o(404, { error: "cluster is api-only" }, s);
584
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
585
- error: "method not allowed",
586
- expected: "GET"
587
- }, s);
588
- if (!t.cluster) return o(200, {
589
- instance: {
590
- replicaId: process.env.POD_NAME ?? process.env.HOSTNAME ?? `dev-${process.pid}`,
591
- dialect: "memory",
592
- runnerHost: "localhost",
593
- runnerPort: 0,
594
- runnerStorage: "none",
595
- shardLock: "none",
596
- coordination: "single",
597
- cdc: {
598
- enabled: !1,
599
- flavor: "none (single-process)"
600
- },
601
- tier: "none",
602
- localhostRisk: !1
603
- },
604
- coordinationState: {
605
- recentReplicaIds: [],
606
- scheduleClaims: [],
607
- runningScheduleRuns: 0,
608
- runningWorkflowRuns: 0
609
- },
610
- capturedAt: Date.now()
611
- }, s);
612
- try {
613
- return o(200, await t.cluster(), s);
614
- } catch (e) {
615
- return o(500, {
616
- error: "cluster snapshot failed",
617
- message: e?.message ?? String(e)
618
- }, s);
619
- }
620
- }, O = async (e, t, n, a = {}) => {
621
- let s = d(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/steps$/);
622
- if (!s) return null;
623
- let l = decodeURIComponent(s[1] ?? ""), u = c(n.origin ?? n.Origin);
624
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
625
- error: "method not allowed",
626
- expected: "GET"
627
- }, u);
628
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, u);
629
- let f = (a.authResolver ?? i)(n);
630
- if (!f.ok) return o(401, {
631
- error: "unauthorized",
632
- reason: f.reason
633
- }, u);
634
- if (t.kind !== "api") return o(404, { error: "workflow steps are api-only" }, u);
635
- if (t.inspectWorkflowRunSteps === void 0) return o(200, { steps: [] }, u);
636
- try {
637
- return o(200, await t.inspectWorkflowRunSteps({ runId: l }), u);
638
- } catch (e) {
639
- return o(500, {
640
- error: "steps query failed",
641
- message: e?.message ?? String(e)
642
- }, u);
643
- }
644
- }, k = async (e, t, n, a = {}) => {
645
- let s = d(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/events$/);
646
- if (!s) return null;
647
- let l = decodeURIComponent(s[1] ?? ""), u = c(n.origin ?? n.Origin);
648
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
649
- error: "method not allowed",
650
- expected: "GET"
651
- }, u);
652
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, u);
653
- let f = (a.authResolver ?? i)(n);
654
- if (!f.ok) return o(401, {
655
- error: "unauthorized",
656
- reason: f.reason
657
- }, u);
658
- if (t.kind !== "api") return o(404, { error: "workflow events are api-only" }, u);
659
- if (t.inspectWorkflowRunEvents === void 0) return o(200, { events: [] }, u);
660
- try {
661
- return o(200, await t.inspectWorkflowRunEvents({ runId: l }), u);
662
- } catch (e) {
663
- return o(500, {
664
- error: "events query failed",
665
- message: e?.message ?? String(e)
666
- }, u);
667
- }
668
- }, A = async (e, t, n, a = {}) => {
669
- if (d(t) !== "/_voltro/inspect/workflows/events") return null;
670
- let s = c(n.origin ?? n.Origin);
671
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
672
- error: "method not allowed",
673
- expected: "GET"
674
- }, s);
675
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
676
- let l = (a.authResolver ?? i)(n);
677
- if (!l.ok) return o(401, {
678
- error: "unauthorized",
679
- reason: l.reason
680
- }, s);
681
- if (e.kind !== "api") return o(404, { error: "workflow domain events are api-only" }, s);
682
- if (e.inspectWorkflowDomainEvents === void 0) return o(200, {
683
- events: [],
684
- total: 0,
685
- offset: 0,
686
- limit: 100
687
- }, s);
688
- let u = f(t), p = u.get("name") ?? void 0, m = Number(u.get("offset") ?? "0"), h = Number(u.get("limit") ?? "100");
689
- try {
690
- return o(200, await e.inspectWorkflowDomainEvents({
691
- ...p !== void 0 && p !== "" ? { name: p } : {},
692
- offset: Number.isFinite(m) ? m : 0,
693
- limit: Number.isFinite(h) ? h : 100
694
- }), s);
695
- } catch (e) {
696
- return o(500, {
697
- error: "workflow domain events query failed",
698
- message: e?.message ?? String(e)
699
- }, s);
700
- }
701
- }, j = async (e, t, n, a = {}) => {
702
- let s = d(t).match(/^\/_voltro\/inspect\/workflows\/events\/([^/]+)\/deliveries$/);
703
- if (!s) return null;
704
- let l = decodeURIComponent(s[1] ?? ""), u = c(n.origin ?? n.Origin);
705
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
706
- error: "method not allowed",
707
- expected: "GET"
708
- }, u);
709
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, u);
710
- let f = (a.authResolver ?? i)(n);
711
- if (!f.ok) return o(401, {
712
- error: "unauthorized",
713
- reason: f.reason
714
- }, u);
715
- if (e.kind !== "api") return o(404, { error: "workflow event deliveries are api-only" }, u);
716
- if (e.inspectWorkflowEventDeliveries === void 0) return o(200, { deliveries: [] }, u);
717
- try {
718
- return o(200, await e.inspectWorkflowEventDeliveries({ eventId: l }), u);
719
- } catch (e) {
720
- return o(500, {
721
- error: "workflow event deliveries query failed",
722
- message: e?.message ?? String(e)
723
- }, u);
724
- }
725
- }, M = async (e, t, n, a = {}) => {
726
- if (d(e) !== "/_voltro/inspect/workflows/children") return null;
727
- let s = c(n.origin ?? n.Origin);
728
- if ((a.method ?? "GET").toUpperCase() !== "GET") return o(405, {
729
- error: "method not allowed",
730
- expected: "GET"
731
- }, s);
732
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
733
- let l = (a.authResolver ?? i)(n);
734
- if (!l.ok) return o(401, {
735
- error: "unauthorized",
736
- reason: l.reason
737
- }, s);
738
- if (t.kind !== "api") return o(404, { error: "workflow children are api-only" }, s);
739
- let u = S(e).get("parentExecutionId");
740
- if (u === null || u === "") return o(400, { error: "parentExecutionId query param required" }, s);
741
- if (t.inspectWorkflowChildren === void 0) return o(200, {
742
- runs: [],
743
- total: 0,
744
- offset: 0,
745
- limit: 200
746
- }, s);
747
- try {
748
- return o(200, await t.inspectWorkflowChildren({ parentExecutionId: u }), s);
749
- } catch (e) {
750
- return o(500, {
751
- error: "children query failed",
752
- message: e?.message ?? String(e)
753
- }, s);
754
- }
755
- }, N = async (e, t, n, a, s = {}) => {
756
- let l = d(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/(cancel|retry|suspend|resume|signal|update)$/);
757
- if (!l) return null;
758
- let u = decodeURIComponent(l[1] ?? ""), f = l[2], p = c(n.origin ?? n.Origin);
759
- if ((s.method ?? "POST").toUpperCase() !== "POST") return o(405, {
760
- error: "method not allowed",
761
- expected: "POST"
762
- }, p);
763
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, p);
764
- let m = (s.authResolver ?? i)(n);
765
- if (!m.ok) return o(401, {
766
- error: "unauthorized",
767
- reason: m.reason
768
- }, p);
769
- if (t.kind !== "api") return o(404, { error: "workflow actions are api-only" }, p);
770
- let h = {
771
- cancel: t.inspectCancelWorkflowRun,
772
- retry: t.inspectRetryWorkflowRun,
773
- suspend: t.inspectSuspendWorkflowRun,
774
- resume: t.inspectResumeWorkflowRun,
775
- signal: t.inspectSignalWorkflowRun,
776
- update: t.inspectUpdateWorkflowRun
777
- }[f];
778
- if (!h) return o(404, { error: `inspect${f[0]?.toUpperCase() ?? ""}${f.slice(1)}WorkflowRun not configured` }, p);
779
- let g, _, v, y, b, x;
780
- if (a.length > 0) try {
781
- let e = JSON.parse(a);
782
- f === "retry" && (g = e.payloadOverride), f === "signal" && (typeof e.signalName == "string" && e.signalName.length > 0 && (_ = e.signalName), v = e.payload), f === "update" && (typeof e.updateName == "string" && e.updateName.length > 0 && (y = e.updateName), b = e.payload, typeof e.timeoutMs == "number" && Number.isFinite(e.timeoutMs) && (x = e.timeoutMs));
783
- } catch {}
784
- if (f === "signal" && _ === void 0) return o(400, { error: "signal requires JSON body `{ signalName: string, payload?: unknown }`" }, p);
785
- if (f === "update" && y === void 0) return o(400, { error: "update requires JSON body `{ updateName: string, payload?: unknown, timeoutMs?: number }`" }, p);
786
- try {
787
- return o(200, f === "retry" && g !== void 0 ? await h({
788
- runId: u,
789
- payloadOverride: g
790
- }) : f === "signal" ? await h({
791
- runId: u,
792
- signalName: _,
793
- payload: v
794
- }) : f === "update" ? await h({
795
- runId: u,
796
- updateName: y,
797
- payload: b,
798
- ...x === void 0 ? {} : { timeoutMs: x }
799
- }) : await h({ runId: u }), p);
800
- } catch (e) {
801
- return o(500, {
802
- error: `${f} failed`,
803
- message: e?.message ?? String(e)
804
- }, p);
805
- }
806
- }, P = async (e, t, n, a, s = {}) => {
807
- if (d(e) !== "/_voltro/inspect/data/import" || (s.method ?? "POST").toUpperCase() !== "POST") return null;
808
- let l = c(n.origin ?? n.Origin);
809
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, l);
810
- let f = (s.authResolver ?? i)(n);
811
- if (!f.ok) return o(401, {
812
- error: "unauthorized",
813
- reason: f.reason
814
- }, l);
815
- let p = u(s.method, n, l);
816
- if (p) return p;
817
- if (t.kind !== "api") return o(404, { error: "data import is api-only" }, l);
818
- if (!t.inspectImport) return o(404, { error: "inspectImport not configured" }, l);
819
- let m;
820
- try {
821
- m = JSON.parse(a || "{}");
822
- } catch {
823
- return o(400, { error: "body must be JSON" }, l);
824
- }
825
- if (typeof m.bundleDir != "string" || !m.bundleDir) return o(400, { error: "body.bundleDir (string) is required" }, l);
826
- try {
827
- return o(200, await t.inspectImport({
828
- bundleDir: m.bundleDir,
829
- ...m.mode === "upsert" || m.mode === "append" || m.mode === "replace" ? { mode: m.mode } : {},
830
- ...m.onConflict === "skip" || m.onConflict === "fail" ? { onConflict: m.onConflict } : {},
831
- ...typeof m.atomic == "boolean" ? { atomic: m.atomic } : {}
832
- }), l);
833
- } catch (e) {
834
- return o(500, {
835
- error: "import failed",
836
- message: e?.message ?? String(e)
837
- }, l);
838
- }
839
- }, F = async (e, t, n, a, s = {}) => {
840
- let l = d(e);
841
- if (!l.startsWith("/_voltro/inspect/data/rows")) return null;
842
- let u = (s.method ?? "POST").toUpperCase();
843
- if (u === "GET" && l === "/_voltro/inspect/data/rows") return null;
844
- let f = c(n.origin ?? n.Origin);
845
- if (r()) return o(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, f);
846
- let p = (s.authResolver ?? i)(n);
847
- if (!p.ok) return o(401, {
848
- error: "unauthorized",
849
- reason: p.reason
850
- }, f);
851
- if (t.kind !== "api") return o(404, { error: "data viewer is api-only" }, f);
852
- if (u === "POST" && l === "/_voltro/inspect/data/rows") {
853
- if (!t.inspectInsertRow) return o(404, { error: "inspectInsertRow not configured" }, f);
854
- let e;
855
- try {
856
- e = JSON.parse(a || "{}");
857
- } catch {
858
- return o(400, { error: "body must be JSON" }, f);
859
- }
860
- if (typeof e.table != "string" || !e.row || typeof e.row != "object") return o(400, { error: "body must be { table: string, row: object }" }, f);
861
- try {
862
- return o(200, await t.inspectInsertRow({
863
- table: e.table,
864
- row: e.row
865
- }), f);
866
- } catch (e) {
867
- return o(500, {
868
- error: "insert failed",
869
- message: e?.message ?? String(e)
870
- }, f);
871
- }
872
- }
873
- let m = l.match(/^\/_voltro\/inspect\/data\/rows\/([^/]+)$/);
874
- if (!m) return null;
875
- let h = decodeURIComponent(m[1] ?? "");
876
- if (!h) return o(400, { error: "row id is required in URL" }, f);
877
- let g = S(e).get("table") ?? "";
878
- if (!g) return o(400, { error: "query.table is required" }, f);
879
- if (u === "PATCH") {
880
- if (!t.inspectUpdateRow) return o(404, { error: "inspectUpdateRow not configured" }, f);
881
- let e;
882
- try {
883
- e = JSON.parse(a || "{}");
884
- } catch {
885
- return o(400, { error: "body must be JSON" }, f);
886
- }
887
- if (!e.patch || typeof e.patch != "object") return o(400, { error: "body.patch must be an object" }, f);
888
- try {
889
- return o(200, await t.inspectUpdateRow({
890
- table: g,
891
- id: h,
892
- patch: e.patch
893
- }), f);
894
- } catch (e) {
895
- return o(500, {
896
- error: "update failed",
897
- message: e?.message ?? String(e)
898
- }, f);
899
- }
900
- }
901
- if (u === "DELETE") {
902
- if (!t.inspectDeleteRow) return o(404, { error: "inspectDeleteRow not configured" }, f);
903
- try {
904
- return o(200, await t.inspectDeleteRow({
905
- table: g,
906
- id: h
907
- }), f);
908
- } catch (e) {
909
- return o(500, {
910
- error: "delete failed",
911
- message: e?.message ?? String(e)
912
- }, f);
913
- }
914
- }
915
- return o(405, {
916
- error: "method not allowed",
917
- expected: "POST | PATCH | DELETE"
918
- }, f);
919
- };
920
- //#endregion
921
- export { T as C, s as D, r as E, a as O, w as S, l as T, M as _, i as a, k as b, b as c, _ as d, x as f, N as g, v as h, u as i, F as l, E as m, m as n, D as o, g as p, h as r, P as s, n as t, y as u, A as v, c as w, O as x, j as y };