@vibes.diy/api-svc 2.0.0-dev-cli-d → 2.0.0-dev-cli-i

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 (96) hide show
  1. package/cf-serve.d.ts +1 -4
  2. package/cf-serve.js +10 -15
  3. package/cf-serve.js.map +1 -1
  4. package/check-auth.js +13 -3
  5. package/check-auth.js.map +1 -1
  6. package/create-handler.d.ts +5 -6
  7. package/create-handler.js +6 -32
  8. package/create-handler.js.map +1 -1
  9. package/index.d.ts +0 -1
  10. package/index.js +0 -1
  11. package/index.js.map +1 -1
  12. package/intern/ensure-application-chat-id.js +5 -5
  13. package/intern/ensure-application-chat-id.js.map +1 -1
  14. package/intern/ensure-chat-id.js +45 -33
  15. package/intern/ensure-chat-id.js.map +1 -1
  16. package/intern/ensure-slug-binding.d.ts +12 -26
  17. package/intern/ensure-slug-binding.js +125 -29
  18. package/intern/ensure-slug-binding.js.map +1 -1
  19. package/intern/get-model-defaults.d.ts +12 -0
  20. package/intern/get-model-defaults.js +90 -0
  21. package/intern/get-model-defaults.js.map +1 -0
  22. package/intern/get-slug-binding.d.ts +2 -3
  23. package/intern/get-slug-binding.js +13 -4
  24. package/intern/get-slug-binding.js.map +1 -1
  25. package/intern/grouped-vibe-import-map.d.ts +2 -0
  26. package/intern/grouped-vibe-import-map.js +2 -0
  27. package/intern/grouped-vibe-import-map.js.map +1 -1
  28. package/intern/render-vibe.d.ts +2 -2
  29. package/intern/render-vibe.js.map +1 -1
  30. package/intern/resend-prev-msg.js +5 -13
  31. package/intern/resend-prev-msg.js.map +1 -1
  32. package/intern/write-apps.d.ts +4 -5
  33. package/intern/write-apps.js +27 -18
  34. package/intern/write-apps.js.map +1 -1
  35. package/models.json +179 -0
  36. package/package.json +19 -16
  37. package/peers/s3.d.ts +1 -1
  38. package/public/ensure-app-settings.js +39 -12
  39. package/public/ensure-app-settings.js.map +1 -1
  40. package/public/ensure-app-slug-item.js +23 -47
  41. package/public/ensure-app-slug-item.js.map +1 -1
  42. package/public/ensure-user-settings.js +9 -8
  43. package/public/ensure-user-settings.js.map +1 -1
  44. package/public/get-chat-details.js +7 -5
  45. package/public/get-chat-details.js.map +1 -1
  46. package/public/invite-flow.js +59 -36
  47. package/public/invite-flow.js.map +1 -1
  48. package/public/list-models.d.ts +14 -0
  49. package/public/list-models.js +41 -0
  50. package/public/list-models.js.map +1 -0
  51. package/public/open-chat.js +2 -2
  52. package/public/open-chat.js.map +1 -1
  53. package/public/prompt-chat-section.d.ts +1 -1
  54. package/public/prompt-chat-section.js +40 -15
  55. package/public/prompt-chat-section.js.map +1 -1
  56. package/public/request-flow.js +65 -53
  57. package/public/request-flow.js.map +1 -1
  58. package/public/user-slug-bindings.d.ts +5 -0
  59. package/public/user-slug-bindings.js +144 -0
  60. package/public/user-slug-bindings.js.map +1 -0
  61. package/types.d.ts +37 -18
  62. package/types.js +27 -1
  63. package/types.js.map +1 -1
  64. package/usage-report/README.md +27 -0
  65. package/usage-report/inspect-db-report-template.d.ts +29 -0
  66. package/usage-report/inspect-db-report-template.js +379 -0
  67. package/usage-report/inspect-db-report-template.js.map +1 -0
  68. package/usage-report/inspect-db-report.d.ts +1 -0
  69. package/usage-report/inspect-db-report.js +264 -0
  70. package/usage-report/inspect-db-report.js.map +1 -0
  71. package/usage-report/inspect-db.d.ts +1 -0
  72. package/usage-report/inspect-db.js +226 -0
  73. package/usage-report/inspect-db.js.map +1 -0
  74. package/vibes-msg-evento.js +3 -1
  75. package/vibes-msg-evento.js.map +1 -1
  76. package/intern/ensure-storage.d.ts +0 -26
  77. package/intern/ensure-storage.js +0 -86
  78. package/intern/ensure-storage.js.map +0 -1
  79. package/intern/send-email.d.ts +0 -4
  80. package/intern/send-email.js +0 -55
  81. package/intern/send-email.js.map +0 -1
  82. package/intern/store-screenshot.d.ts +0 -17
  83. package/intern/store-screenshot.js +0 -36
  84. package/intern/store-screenshot.js.map +0 -1
  85. package/peers/sql.d.ts +0 -22
  86. package/peers/sql.js +0 -102
  87. package/peers/sql.js.map +0 -1
  88. package/sql/tables.d.ts +0 -1536
  89. package/sql/tables.js +0 -38
  90. package/sql/tables.js.map +0 -1
  91. package/sql/vibes-diy-api-schema-pg.d.ts +0 -1418
  92. package/sql/vibes-diy-api-schema-pg.js +0 -141
  93. package/sql/vibes-diy-api-schema-pg.js.map +0 -1
  94. package/sql/vibes-diy-api-schema-sqlite.d.ts +0 -1536
  95. package/sql/vibes-diy-api-schema-sqlite.js +0 -131
  96. package/sql/vibes-diy-api-schema-sqlite.js.map +0 -1
@@ -0,0 +1,379 @@
1
+ import React from "react";
2
+ import { renderToStaticMarkup } from "react-dom/server";
3
+ function flattenValue(value) {
4
+ if (value === null || value === undefined)
5
+ return "";
6
+ if (typeof value === "string")
7
+ return value;
8
+ if (typeof value === "number" || typeof value === "boolean")
9
+ return String(value);
10
+ return JSON.stringify(value);
11
+ }
12
+ function collectKeys(rows) {
13
+ return Array.from(rows.reduce((set, row) => {
14
+ Object.keys(row).forEach((key) => set.add(key));
15
+ return set;
16
+ }, new Set()));
17
+ }
18
+ function DataTable({ rows }) {
19
+ if (rows.length === 0) {
20
+ return React.createElement("p", { className: "empty" }, "No rows");
21
+ }
22
+ const keys = collectKeys(rows);
23
+ return (React.createElement("div", { className: "table-wrap" },
24
+ React.createElement("table", null,
25
+ React.createElement("thead", null,
26
+ React.createElement("tr", null, keys.map((key) => (React.createElement("th", { key: key }, key))))),
27
+ React.createElement("tbody", null, rows.map((row, rowIdx) => (React.createElement("tr", { key: rowIdx }, keys.map((key) => (React.createElement("td", { key: key },
28
+ React.createElement("pre", null, flattenValue(row[key]))))))))))));
29
+ }
30
+ function TrendChart({ rows, valueKey, }) {
31
+ if (rows.length === 0) {
32
+ return null;
33
+ }
34
+ const values = rows.map((row) => Number(row[valueKey] ?? 0));
35
+ const max = Math.max(...values, 1);
36
+ const width = 720;
37
+ const height = 220;
38
+ const padding = 18;
39
+ const pointCoords = values.map((value, index) => {
40
+ const x = rows.length === 1 ? width / 2 : padding + (index * (width - padding * 2)) / (rows.length - 1);
41
+ const y = height - padding - (value / max) * (height - padding * 2);
42
+ return { x, y };
43
+ });
44
+ const pointsStr = pointCoords.map(({ x, y }) => `${x},${y}`).join(" ");
45
+ const lastValue = values[values.length - 1] ?? 0;
46
+ const firstDay = rows[0]?.["day"] ?? "";
47
+ const lastDay = rows[rows.length - 1]?.["day"] ?? "";
48
+ return (React.createElement("div", { className: "trend-card" },
49
+ React.createElement("div", { className: "trend-meta" },
50
+ React.createElement("div", null,
51
+ React.createElement("div", { className: "label" }, "Current Total"),
52
+ React.createElement("div", { className: "trend-value" }, lastValue)),
53
+ React.createElement("div", { className: "trend-range" },
54
+ firstDay,
55
+ " to ",
56
+ lastDay)),
57
+ React.createElement("svg", { viewBox: `0 0 ${width} ${height}`, className: "trend-chart", role: "img", "aria-label": "30 day trend" },
58
+ React.createElement("rect", { x: "0", y: "0", width: width, height: height, fill: "transparent" }),
59
+ React.createElement("g", { stroke: "rgba(15, 23, 42, 0.18)", strokeWidth: "1" },
60
+ React.createElement("line", { x1: padding, y1: padding, x2: padding, y2: height - padding }),
61
+ React.createElement("line", { x1: padding, y1: height - padding, x2: width - padding, y2: height - padding }),
62
+ React.createElement("line", { x1: padding, y1: height / 2, x2: width - padding, y2: height / 2 })),
63
+ React.createElement("polyline", { fill: "none", stroke: "var(--ink)", strokeWidth: "5", points: pointsStr }),
64
+ pointCoords.map(({ x, y }, i) => (React.createElement("circle", { key: i, cx: x, cy: y, r: "4", fill: "var(--plate)", stroke: "var(--ink)", strokeWidth: "3" }))))));
65
+ }
66
+ function TrendSection({ title, description, rows, valueKey, }) {
67
+ return (React.createElement("section", null,
68
+ React.createElement("h2", null, title),
69
+ React.createElement("p", null, description),
70
+ React.createElement(TrendChart, { rows: rows, valueKey: valueKey })));
71
+ }
72
+ function MetricCard({ label, value }) {
73
+ return (React.createElement("div", { className: "card" },
74
+ React.createElement("div", { className: "label" }, label),
75
+ React.createElement("div", { className: "value" }, String(value))));
76
+ }
77
+ const reportCss = `
78
+ :root {
79
+ color-scheme: light;
80
+ --paper: #f1f5f9;
81
+ --grid-soft: #cbd5e1;
82
+ --grid-strong: #94a3b8;
83
+ --slate: #64748b;
84
+ --ink: #0f172a;
85
+ --plate: #ffffff;
86
+ --panel: #e2e8f0;
87
+ --shadow: #242424;
88
+ --accent: #94a3b8;
89
+ --accent-strong: #64748b;
90
+ --grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 120 120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.2' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)' opacity='0.35'/%3E%3C/svg%3E");
91
+ }
92
+ * { box-sizing: border-box; }
93
+ html {
94
+ background:
95
+ repeating-linear-gradient(0deg, transparent 0 19px, var(--grid-soft) 19px 20px),
96
+ repeating-linear-gradient(90deg, transparent 0 19px, var(--grid-soft) 19px 20px),
97
+ linear-gradient(180deg, #f8fbff 0%, var(--paper) 100%);
98
+ background-attachment: fixed;
99
+ }
100
+ body {
101
+ margin: 0;
102
+ font-family: "Arial Black", "Helvetica Neue", Helvetica, Arial, sans-serif;
103
+ background: transparent;
104
+ color: var(--ink);
105
+ min-height: 100vh;
106
+ position: relative;
107
+ }
108
+ body::before {
109
+ content: "";
110
+ position: fixed;
111
+ inset: 0;
112
+ background-image: var(--grain);
113
+ opacity: 0.05;
114
+ mix-blend-mode: multiply;
115
+ pointer-events: none;
116
+ filter: blur(0.6px) contrast(102%) brightness(101%);
117
+ }
118
+ main {
119
+ max-width: 1200px;
120
+ margin: 0 auto;
121
+ padding: 32px 20px 72px;
122
+ position: relative;
123
+ }
124
+ h1, h2, h3 { margin: 0; }
125
+ h1 {
126
+ font-size: clamp(40px, 7vw, 72px);
127
+ line-height: 0.95;
128
+ letter-spacing: -0.04em;
129
+ text-transform: uppercase;
130
+ }
131
+ h2 {
132
+ font-size: 28px;
133
+ margin-bottom: 12px;
134
+ text-transform: uppercase;
135
+ letter-spacing: 0.04em;
136
+ }
137
+ p {
138
+ color: var(--slate);
139
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
140
+ font-size: 15px;
141
+ line-height: 1.5;
142
+ }
143
+ .hero {
144
+ display: grid;
145
+ gap: 20px;
146
+ margin-bottom: 32px;
147
+ }
148
+ .meta {
149
+ display: grid;
150
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
151
+ gap: 16px;
152
+ }
153
+ .card {
154
+ background: var(--plate);
155
+ border: 4px solid var(--ink);
156
+ border-radius: 0;
157
+ padding: 16px;
158
+ box-shadow: 8px 8px 0 var(--shadow);
159
+ }
160
+ .label {
161
+ font-size: 12px;
162
+ text-transform: uppercase;
163
+ letter-spacing: 0.08em;
164
+ color: var(--slate);
165
+ margin-bottom: 8px;
166
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
167
+ font-weight: 700;
168
+ }
169
+ .value {
170
+ font-size: 30px;
171
+ color: var(--ink);
172
+ }
173
+ section {
174
+ margin-top: 32px;
175
+ }
176
+ section > h2,
177
+ section > p {
178
+ position: relative;
179
+ z-index: 1;
180
+ }
181
+ section > h2 {
182
+ display: inline-block;
183
+ background: var(--panel);
184
+ border: 4px solid var(--ink);
185
+ padding: 10px 14px 8px;
186
+ box-shadow: 6px 6px 0 var(--shadow);
187
+ }
188
+ section > p {
189
+ margin: 14px 0 0;
190
+ max-width: 860px;
191
+ }
192
+ .table-wrap {
193
+ overflow: auto;
194
+ border: 4px solid var(--ink);
195
+ border-radius: 0;
196
+ background: var(--plate);
197
+ box-shadow: 10px 10px 0 var(--shadow);
198
+ margin-top: 16px;
199
+ }
200
+ table {
201
+ width: 100%;
202
+ border-collapse: collapse;
203
+ }
204
+ th, td {
205
+ text-align: left;
206
+ vertical-align: top;
207
+ padding: 12px 14px;
208
+ border-bottom: 3px solid var(--ink);
209
+ border-right: 3px solid var(--ink);
210
+ }
211
+ th:last-child,
212
+ td:last-child {
213
+ border-right: 0;
214
+ }
215
+ tbody tr:last-child td {
216
+ border-bottom: 0;
217
+ }
218
+ th {
219
+ position: sticky;
220
+ top: 0;
221
+ background:
222
+ radial-gradient(circle at 1px 1px, rgba(15, 23, 42, 0.16) 1px, transparent 0) 0 0 / 12px 12px,
223
+ linear-gradient(180deg, var(--panel) 0%, #dbe4ef 100%);
224
+ font-size: 13px;
225
+ text-transform: uppercase;
226
+ letter-spacing: 0.06em;
227
+ z-index: 1;
228
+ }
229
+ td pre {
230
+ margin: 0;
231
+ white-space: pre-wrap;
232
+ word-break: break-word;
233
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
234
+ font-size: 12px;
235
+ }
236
+ .empty {
237
+ margin-top: 16px;
238
+ padding: 18px;
239
+ background: var(--plate);
240
+ border: 4px dashed var(--ink);
241
+ border-radius: 0;
242
+ box-shadow: 8px 8px 0 var(--shadow);
243
+ }
244
+ .hero-panel {
245
+ background: var(--plate);
246
+ border: 6px solid var(--ink);
247
+ box-shadow: 12px 12px 0 var(--shadow);
248
+ padding: 20px;
249
+ }
250
+ .hero-kicker {
251
+ display: inline-block;
252
+ margin-bottom: 14px;
253
+ padding: 8px 12px;
254
+ background: linear-gradient(180deg, #dbe4ef 0%, var(--accent) 100%);
255
+ color: var(--ink);
256
+ border: 3px solid var(--ink);
257
+ font-size: 12px;
258
+ line-height: 1;
259
+ letter-spacing: 0.1em;
260
+ text-transform: uppercase;
261
+ }
262
+ .hero-panel p {
263
+ margin: 14px 0 0;
264
+ max-width: 760px;
265
+ }
266
+ .trend-card {
267
+ margin-top: 16px;
268
+ background: var(--plate);
269
+ border: 4px solid var(--ink);
270
+ box-shadow: 10px 10px 0 var(--shadow);
271
+ padding: 16px;
272
+ }
273
+ .trend-meta {
274
+ display: flex;
275
+ justify-content: space-between;
276
+ gap: 12px;
277
+ align-items: end;
278
+ margin-bottom: 12px;
279
+ }
280
+ .trend-value {
281
+ font-size: 40px;
282
+ line-height: 1;
283
+ }
284
+ .trend-range {
285
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
286
+ color: var(--slate);
287
+ font-size: 13px;
288
+ text-transform: uppercase;
289
+ letter-spacing: 0.08em;
290
+ }
291
+ .trend-chart {
292
+ width: 100%;
293
+ height: auto;
294
+ display: block;
295
+ background:
296
+ repeating-linear-gradient(0deg, transparent 0 19px, rgba(148, 163, 184, 0.2) 19px 20px);
297
+ }
298
+ @media (max-width: 640px) {
299
+ main {
300
+ padding: 20px 12px 56px;
301
+ }
302
+ .card,
303
+ .empty,
304
+ .hero-panel,
305
+ .trend-card,
306
+ .table-wrap,
307
+ section > h2 {
308
+ box-shadow: 6px 6px 0 var(--shadow);
309
+ }
310
+ th, td {
311
+ padding: 10px;
312
+ }
313
+ .trend-meta {
314
+ flex-direction: column;
315
+ align-items: start;
316
+ }
317
+ }
318
+ `;
319
+ function ReportPage(data) {
320
+ const { generatedAt, info, tableCounts, membershipSummary, membershipTimeseries, userSlugBindingsTimeseries, membershipsByApp, userModelRows, appModelRows, userSettingsSample, appSettingsSample, } = data;
321
+ const totalRows = tableCounts.reduce((sum, row) => sum + Number(row.rowCount || 0), 0);
322
+ const lastBindingsCount = userSlugBindingsTimeseries[userSlugBindingsTimeseries.length - 1]?.["user_slug_bindings_count"] ?? 0;
323
+ return (React.createElement("html", { lang: "en" },
324
+ React.createElement("head", null,
325
+ React.createElement("meta", { charSet: "utf-8" }),
326
+ React.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
327
+ React.createElement("title", null, "Inspect DB Report"),
328
+ React.createElement("style", { dangerouslySetInnerHTML: { __html: reportCss } })),
329
+ React.createElement("body", null,
330
+ React.createElement("main", null,
331
+ React.createElement("div", { className: "hero" },
332
+ React.createElement("div", { className: "hero-panel" },
333
+ React.createElement("div", { className: "hero-kicker" }, "Team Snapshot"),
334
+ React.createElement("h1", null, "Inspect DB Report"),
335
+ React.createElement("p", null,
336
+ "Generated ",
337
+ generatedAt,
338
+ " for ",
339
+ info.database,
340
+ " / ",
341
+ info.current_schema,
342
+ ".")),
343
+ React.createElement("div", { className: "meta" },
344
+ React.createElement(MetricCard, { label: "Memberships", value: membershipSummary.membership_count ?? 0 }),
345
+ React.createElement(MetricCard, { label: "User Slug Bindings", value: lastBindingsCount }),
346
+ React.createElement(MetricCard, { label: "Shared Apps", value: membershipSummary.shared_app_count ?? 0 }),
347
+ React.createElement(MetricCard, { label: "Distinct Members", value: membershipSummary.distinct_member_count ?? 0 }),
348
+ React.createElement(MetricCard, { label: "Database", value: info.database }),
349
+ React.createElement(MetricCard, { label: "Schema", value: info.current_schema }),
350
+ React.createElement(MetricCard, { label: "User", value: info.current_user }),
351
+ React.createElement(MetricCard, { label: "Tables", value: tableCounts.length }),
352
+ React.createElement(MetricCard, { label: "Rows Counted", value: totalRows }),
353
+ React.createElement(MetricCard, { label: "Model Rows", value: userModelRows.length + appModelRows.length }))),
354
+ React.createElement(TrendSection, { title: "Memberships Over 30 Days", description: "Daily cumulative total of currently active memberships, where one membership is one non-owner user with durable access to one specific vibe by approved request or accepted invite.", rows: membershipTimeseries, valueKey: "membership_count" }),
355
+ React.createElement(TrendSection, { title: "User Slug Bindings Over 30 Days", description: "Daily cumulative total of rows in UserSlugBindings over the last 30 days.", rows: userSlugBindingsTimeseries, valueKey: "user_slug_bindings_count" }),
356
+ React.createElement("section", null,
357
+ React.createElement("h2", null, "Memberships By App"),
358
+ React.createElement("p", null, "A membership is one non-owner user with durable access to one specific vibe, whether that access came from an accepted invite or an approved request including auto-approval."),
359
+ React.createElement(DataTable, { rows: membershipsByApp })),
360
+ React.createElement("section", null,
361
+ React.createElement("h2", null, "Table Counts"),
362
+ React.createElement(DataTable, { rows: tableCounts })),
363
+ React.createElement("section", null,
364
+ React.createElement("h2", null, "User Model Settings"),
365
+ React.createElement(DataTable, { rows: userModelRows })),
366
+ React.createElement("section", null,
367
+ React.createElement("h2", null, "App Model Settings"),
368
+ React.createElement(DataTable, { rows: appModelRows })),
369
+ React.createElement("section", null,
370
+ React.createElement("h2", null, "User Settings Sample"),
371
+ React.createElement(DataTable, { rows: userSettingsSample })),
372
+ React.createElement("section", null,
373
+ React.createElement("h2", null, "App Settings Sample"),
374
+ React.createElement(DataTable, { rows: appSettingsSample }))))));
375
+ }
376
+ export function renderHtmlReport(data) {
377
+ return "<!doctype html>" + renderToStaticMarkup(ReportPage(data));
378
+ }
379
+ //# sourceMappingURL=inspect-db-report-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-db-report-template.js","sourceRoot":"","sources":["../../jsr/usage-report/inspect-db-report-template.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,264 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { spawnSync } from "node:child_process";
5
+ import { Result, exception2Result } from "@adviser/cement";
6
+ import { renderHtmlReport } from "./inspect-db-report-template.jsx";
7
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
8
+ const inspectScriptPath = path.join(scriptDir, "inspect-db.ts");
9
+ const outDir = path.join(scriptDir, "../dist/inspect-db-report");
10
+ function runInspect(args) {
11
+ const tsxBin = path.join(scriptDir, "../node_modules/.bin/tsx");
12
+ const result = spawnSync(tsxBin, [inspectScriptPath, ...args], {
13
+ cwd: path.join(scriptDir, ".."),
14
+ encoding: "utf8",
15
+ env: process.env,
16
+ });
17
+ if (result.status !== 0) {
18
+ return Result.Err((result.stderr || result.stdout || `inspect-db failed for ${args.join(" ")}`).trim());
19
+ }
20
+ const stdout = result.stdout.trim();
21
+ if (stdout === "") {
22
+ return Result.Err(`inspect-db returned no output for ${args.join(" ")}`);
23
+ }
24
+ return exception2Result(() => JSON.parse(stdout));
25
+ }
26
+ function flattenValue(value) {
27
+ if (value === null || value === undefined)
28
+ return "";
29
+ if (typeof value === "string")
30
+ return value;
31
+ if (typeof value === "number" || typeof value === "boolean")
32
+ return String(value);
33
+ return JSON.stringify(value);
34
+ }
35
+ function toCsv(rows) {
36
+ const keys = Array.from(rows.reduce((set, row) => {
37
+ Object.keys(row).forEach((key) => set.add(key));
38
+ return set;
39
+ }, new Set()));
40
+ const escapeCell = (value) => {
41
+ const text = flattenValue(value);
42
+ if (/[",\n]/.test(text)) {
43
+ return `"${text.replaceAll('"', '""')}"`;
44
+ }
45
+ return text;
46
+ };
47
+ const lines = [keys.join(",")];
48
+ for (const row of rows) {
49
+ lines.push(keys.map((key) => escapeCell(row[key])).join(","));
50
+ }
51
+ return `${lines.join("\n")}\n`;
52
+ }
53
+ function writeCsv(name, rows) {
54
+ const outPath = path.join(outDir, name);
55
+ fs.writeFileSync(outPath, toCsv(rows), "utf8");
56
+ return outPath;
57
+ }
58
+ function unwrapInspect(args) {
59
+ const r = runInspect(args);
60
+ if (r.isErr()) {
61
+ console.error(`inspect-db failed for: ${args.join(" ")}: ${r.Err().message}`);
62
+ process.exitCode = 1;
63
+ return {};
64
+ }
65
+ return r.Ok();
66
+ }
67
+ async function main() {
68
+ fs.mkdirSync(outDir, { recursive: true });
69
+ const tablesPayload = unwrapInspect(["tables"]);
70
+ const info = {
71
+ database: tablesPayload["database"],
72
+ current_schema: tablesPayload["current_schema"],
73
+ current_user: tablesPayload["current_user"],
74
+ server_addr: tablesPayload["server_addr"],
75
+ server_port: tablesPayload["server_port"],
76
+ schemas: tablesPayload["schemas"],
77
+ };
78
+ const tables = tablesPayload["tables"] ?? [];
79
+ const tableCounts = tables.map((table) => {
80
+ const payload = unwrapInspect(["sql", `select count(*)::int as "rowCount" from "${table.table_schema}"."${table.table_name}"`]);
81
+ return {
82
+ table: `${table.table_schema}.${table.table_name}`,
83
+ rowCount: payload["rows"]?.[0]?.["rowCount"] ?? 0,
84
+ };
85
+ });
86
+ const membershipSummaryPayload = unwrapInspect([
87
+ "sql",
88
+ `with memberships as (
89
+ select
90
+ a."userId" as owner_user_id,
91
+ a."userSlug",
92
+ a."appSlug",
93
+ elem->>'state' as state,
94
+ elem->'request'->>'userId' as member_user_id
95
+ from public."AppSettings" a
96
+ cross join lateral jsonb_array_elements(a.settings) as elem
97
+ where elem->>'type' = 'app.acl.active.request'
98
+ and elem->>'state' = 'approved'
99
+ ),
100
+ deduped as (
101
+ select distinct owner_user_id, "userSlug", "appSlug", member_user_id
102
+ from memberships
103
+ )
104
+ select
105
+ count(*)::int as membership_count,
106
+ count(distinct ("userSlug", "appSlug"))::int as shared_app_count,
107
+ count(distinct member_user_id)::int as distinct_member_count
108
+ from deduped`,
109
+ ]);
110
+ const membershipSummary = (membershipSummaryPayload["rows"] ?? [])[0] ?? {
111
+ membership_count: 0,
112
+ shared_app_count: 0,
113
+ distinct_member_count: 0,
114
+ };
115
+ const membershipsByAppPayload = unwrapInspect([
116
+ "sql",
117
+ `with memberships as (
118
+ select
119
+ a."userId" as owner_user_id,
120
+ a."userSlug",
121
+ a."appSlug",
122
+ elem->'request'->>'userId' as member_user_id
123
+ from public."AppSettings" a
124
+ cross join lateral jsonb_array_elements(a.settings) as elem
125
+ where elem->>'type' = 'app.acl.active.request'
126
+ and elem->>'state' = 'approved'
127
+ )
128
+ select
129
+ owner_user_id,
130
+ "userSlug",
131
+ "appSlug",
132
+ count(distinct member_user_id)::int as memberships
133
+ from memberships
134
+ group by 1, 2, 3
135
+ order by memberships desc, "userSlug", "appSlug"
136
+ limit 200`,
137
+ ]);
138
+ const membershipsByApp = membershipsByAppPayload["rows"] ?? [];
139
+ const membershipTimeseriesPayload = unwrapInspect([
140
+ "sql",
141
+ `with days as (
142
+ select generate_series(current_date - interval '29 days', current_date, interval '1 day')::date as day
143
+ ),
144
+ memberships as (
145
+ select
146
+ a."userId" as owner_user_id,
147
+ a."userSlug",
148
+ a."appSlug",
149
+ elem->'request'->>'userId' as member_user_id,
150
+ (elem->'grant'->>'on')::timestamptz as created_at
151
+ from public."AppSettings" a
152
+ cross join lateral jsonb_array_elements(a.settings) as elem
153
+ where elem->>'type' = 'app.acl.active.request'
154
+ and elem->>'state' = 'approved'
155
+ and elem->'grant'->>'on' is not null
156
+ ),
157
+ first_memberships as (
158
+ select
159
+ owner_user_id,
160
+ "userSlug",
161
+ "appSlug",
162
+ member_user_id,
163
+ min(created_at)::date as first_day
164
+ from memberships
165
+ group by 1, 2, 3, 4
166
+ )
167
+ select
168
+ to_char(day, 'YYYY-MM-DD') as day,
169
+ (
170
+ select count(*)::int
171
+ from first_memberships fm
172
+ where fm.first_day <= day
173
+ ) as membership_count
174
+ from days
175
+ order by day`,
176
+ ]);
177
+ const membershipTimeseries = membershipTimeseriesPayload["rows"] ?? [];
178
+ const userSlugBindingsTimeseriesPayload = unwrapInspect([
179
+ "sql",
180
+ `with days as (
181
+ select generate_series(current_date - interval '29 days', current_date, interval '1 day')::date as day
182
+ ),
183
+ bindings as (
184
+ select created::timestamptz::date as created_day
185
+ from public."UserSlugBindings"
186
+ )
187
+ select
188
+ to_char(day, 'YYYY-MM-DD') as day,
189
+ (
190
+ select count(*)::int
191
+ from bindings b
192
+ where b.created_day <= day
193
+ ) as user_slug_bindings_count
194
+ from days
195
+ order by day`,
196
+ ]);
197
+ const userSlugBindingsTimeseries = userSlugBindingsTimeseriesPayload["rows"] ?? [];
198
+ const userModelPayload = unwrapInspect([
199
+ "sql",
200
+ `select "userId", elem as setting, updated from public."UserSettings" cross join lateral jsonb_array_elements(settings) as elem where elem->>'type' = 'model' order by updated desc limit 200`,
201
+ ]);
202
+ const userModelRows = userModelPayload["rows"] ?? [];
203
+ const appModelPayload = unwrapInspect([
204
+ "sql",
205
+ `select "userId", "userSlug", "appSlug", elem as setting, updated from public."AppSettings" cross join lateral jsonb_array_elements(settings) as elem where elem->>'type' = 'active.model' order by updated desc limit 200`,
206
+ ]);
207
+ const appModelRows = appModelPayload["rows"] ?? [];
208
+ const userSettingsPayload = unwrapInspect(["table", "public.UserSettings", "--limit", "20"]);
209
+ const userSettingsSample = (userSettingsPayload["rows"] ?? []).map((row) => ({
210
+ userId: row["userId"],
211
+ updated: row["updated"],
212
+ created: row["created"],
213
+ settings: row["settings"],
214
+ }));
215
+ const appSettingsPayload = unwrapInspect(["table", "public.AppSettings", "--limit", "20"]);
216
+ const appSettingsSample = (appSettingsPayload["rows"] ?? []).map((row) => ({
217
+ userId: row["userId"],
218
+ userSlug: row["userSlug"],
219
+ appSlug: row["appSlug"],
220
+ updated: row["updated"],
221
+ created: row["created"],
222
+ settings: row["settings"],
223
+ }));
224
+ const generatedAt = new Date().toISOString();
225
+ const files = {
226
+ membershipsTimeseriesCsv: writeCsv("memberships-timeseries.csv", membershipTimeseries),
227
+ userSlugBindingsTimeseriesCsv: writeCsv("user-slug-bindings-timeseries.csv", userSlugBindingsTimeseries),
228
+ membershipsByAppCsv: writeCsv("memberships-by-app.csv", membershipsByApp),
229
+ tableCountsCsv: writeCsv("table-counts.csv", tableCounts),
230
+ userModelCsv: writeCsv("user-model-settings.csv", userModelRows),
231
+ appModelCsv: writeCsv("app-model-settings.csv", appModelRows),
232
+ userSettingsCsv: writeCsv("user-settings-sample.csv", userSettingsSample),
233
+ appSettingsCsv: writeCsv("app-settings-sample.csv", appSettingsSample),
234
+ };
235
+ const html = renderHtmlReport({
236
+ generatedAt,
237
+ info,
238
+ tableCounts,
239
+ membershipSummary: membershipSummary,
240
+ membershipTimeseries,
241
+ userSlugBindingsTimeseries,
242
+ membershipsByApp,
243
+ userModelRows,
244
+ appModelRows,
245
+ userSettingsSample,
246
+ appSettingsSample,
247
+ });
248
+ const htmlPath = path.join(outDir, "index.html");
249
+ fs.writeFileSync(htmlPath, html, "utf8");
250
+ console.log(JSON.stringify({
251
+ generatedAt,
252
+ outputDir: outDir,
253
+ htmlPath,
254
+ ...files,
255
+ }, null, 2));
256
+ return Result.Ok(undefined);
257
+ }
258
+ main().then((result) => {
259
+ if (result.isErr()) {
260
+ console.error(result.Err().message);
261
+ process.exitCode = 1;
262
+ }
263
+ });
264
+ //# sourceMappingURL=inspect-db-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-db-report.js","sourceRoot":"","sources":["../../jsr/usage-report/inspect-db-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAChE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;AAEjE,SAAS,UAAU,CAAC,IAAuB;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,EAAE;QAC7D,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;QAC/B,QAAQ,EAAE,MAAe;QACzB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,yBAAyB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,KAAK,CAAC,IAAwC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CACtB,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAU,EAAE;QAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAwC;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,IAAuB;IAC5C,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAW;QAC7C,cAAc,EAAE,aAAa,CAAC,gBAAgB,CAAW;QACzD,YAAY,EAAE,aAAa,CAAC,cAAc,CAAW;QACrD,WAAW,EAAE,aAAa,CAAC,aAAa,CAAW;QACnD,WAAW,EAAE,aAAa,CAAC,aAAa,CAAW;QACnD,OAAO,EAAE,aAAa,CAAC,SAAS,CAAa;KAC9C,CAAC;IACF,MAAM,MAAM,GAAI,aAAa,CAAC,QAAQ,CAAoD,IAAI,EAAE,CAAC;IAEjG,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,KAAK,EAAE,4CAA4C,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAChI,OAAO;YACL,KAAK,EAAE,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,UAAU,EAAE;YAClD,QAAQ,EAAI,OAAO,CAAC,MAAM,CAA+B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAY,IAAI,CAAC;SAC7F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,wBAAwB,GAAG,aAAa,CAAC;QAC7C,KAAK;QACL;;;;;;;;;;;;;;;;;;;;mBAoBe;KAChB,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,CAAE,wBAAwB,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QACtG,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;QACnB,qBAAqB,EAAE,CAAC;KACzB,CAAC;IAEF,MAAM,uBAAuB,GAAG,aAAa,CAAC;QAC5C,KAAK;QACL;;;;;;;;;;;;;;;;;;;gBAmBY;KACb,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAI,uBAAuB,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC;IAE9F,MAAM,2BAA2B,GAAG,aAAa,CAAC;QAChD,KAAK;QACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAkCe;KAChB,CAAC,CAAC;IACH,MAAM,oBAAoB,GAAI,2BAA2B,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC;IAEtG,MAAM,iCAAiC,GAAG,aAAa,CAAC;QACtD,KAAK;QACL;;;;;;;;;;;;;;;mBAee;KAChB,CAAC,CAAC;IACH,MAAM,0BAA0B,GAAI,iCAAiC,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC;IAElH,MAAM,gBAAgB,GAAG,aAAa,CAAC;QACrC,KAAK;QACL,8LAA8L;KAC/L,CAAC,CAAC;IACH,MAAM,aAAa,GAAI,gBAAgB,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC;IAEpF,MAAM,eAAe,GAAG,aAAa,CAAC;QACpC,KAAK;QACL,2NAA2N;KAC5N,CAAC,CAAC;IACH,MAAM,YAAY,GAAI,eAAe,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC;IAElF,MAAM,mBAAmB,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7F,MAAM,kBAAkB,GAAG,CAAE,mBAAmB,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1G,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;QACvB,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;QACvB,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC,CAAC;IAEJ,MAAM,kBAAkB,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3F,MAAM,iBAAiB,GAAG,CAAE,kBAAkB,CAAC,MAAM,CAA+B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;QACrB,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC;QACzB,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;QACvB,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;QACvB,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;QACvB,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE7C,MAAM,KAAK,GAAG;QACZ,wBAAwB,EAAE,QAAQ,CAAC,4BAA4B,EAAE,oBAAoB,CAAC;QACtF,6BAA6B,EAAE,QAAQ,CAAC,mCAAmC,EAAE,0BAA0B,CAAC;QACxG,mBAAmB,EAAE,QAAQ,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;QACzE,cAAc,EAAE,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC;QACzD,YAAY,EAAE,QAAQ,CAAC,yBAAyB,EAAE,aAAa,CAAC;QAChE,WAAW,EAAE,QAAQ,CAAC,wBAAwB,EAAE,YAAY,CAAC;QAC7D,eAAe,EAAE,QAAQ,CAAC,0BAA0B,EAAE,kBAAkB,CAAC;QACzE,cAAc,EAAE,QAAQ,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;KACvE,CAAC;IAEF,MAAM,IAAI,GAAG,gBAAgB,CAAC;QAC5B,WAAW;QACX,IAAI;QACJ,WAAW;QACX,iBAAiB,EAAE,iBAIlB;QACD,oBAAoB;QACpB,0BAA0B;QAC1B,gBAAgB;QAChB,aAAa;QACb,YAAY;QACZ,kBAAkB;QAClB,iBAAiB;KAClB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;QACE,WAAW;QACX,SAAS,EAAE,MAAM;QACjB,QAAQ;QACR,GAAG,KAAK;KACT,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IAEF,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;IACrB,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};