@auersperg/flare 0.3.8 → 0.3.10
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.
- package/README.md +3 -1
- package/dist/cli/{chunk-5s6zv1h9.js → chunk-jrptpjmm.js} +1 -1
- package/dist/cli/{chunk-y6e2h40n.js → chunk-m0698kap.js} +37 -12
- package/dist/cli/{chunk-5yg1zj5n.js → chunk-znktbexz.js} +6 -6
- package/dist/cli/{chunk-vx7kmczm.js → chunk-zt96ghm7.js} +12 -6
- package/dist/cli/flare.js +5 -5
- package/dist/platform/admin.js +31 -23
- package/dist/platform/dashboard/_astro/{auth-view.EASEF9BN.js → auth-view.BhUFPmNv.js} +1 -1
- package/dist/platform/dashboard/_astro/{cli-approval.DwZVHdyo.js → cli-approval.emPTVRqn.js} +1 -1
- package/dist/platform/dashboard/_astro/client.4z54xJ_z.js +1 -0
- package/dist/platform/dashboard/_astro/{common.TAClb6G9.js → common.9pujiaSZ.js} +1 -1
- package/dist/platform/dashboard/_astro/{data-view.BaHEU4Xa.js → data-view.C-VU8Oxm.js} +1 -1
- package/dist/platform/dashboard/_astro/{functions-view.BGOYuDwu.js → functions-view.3yLrtS0h.js} +1 -1
- package/dist/platform/dashboard/_astro/{index.astro_astro_type_script_index_0_lang.Blg5hU9g.js → index.astro_astro_type_script_index_0_lang.Dsfj1oeZ.js} +2 -2
- package/dist/platform/dashboard/_astro/{input-group.DUp-h0xx.js → input-group.BZ1TZT7L.js} +1 -1
- package/dist/platform/dashboard/_astro/{sdk-view.2ErPn4cO.js → sdk-view.BAiQKNm8.js} +1 -1
- package/dist/platform/dashboard/_astro/{services-view.iZujitxl.js → services-view.BSrqpyr5.js} +1 -1
- package/dist/platform/dashboard/_astro/{settings-view.CqK-mrlB.js → settings-view.C_eYjlIE.js} +1 -1
- package/dist/platform/dashboard/bootstrap/facet.js +64 -46
- package/dist/platform/dashboard/bootstrap/openapi.json +1 -1
- package/dist/platform/dashboard/bootstrap/release.json +2 -2
- package/dist/platform/dashboard/index.html +1 -1
- package/dist/platform/manifest.json +36 -36
- package/dist/platform/runtime.js +99 -66
- package/dist/sdk/backup.js +4 -4
- package/dist/sdk/client.js +22 -41
- package/dist/sdk/cloudflare.js +10 -11
- package/dist/sdk/database.js +45 -27
- package/dist/sdk/http.d.ts +2 -0
- package/dist/sdk/http.js +27 -0
- package/dist/sdk/schema.d.ts +2 -2
- package/dist/sdk/schema.js +7 -6
- package/package.json +2 -2
- package/dist/platform/dashboard/_astro/client.BUUZgEFj.js +0 -1
|
@@ -146,7 +146,7 @@ function documentSchema(table) {
|
|
|
146
146
|
}
|
|
147
147
|
return doc;
|
|
148
148
|
}
|
|
149
|
-
async function
|
|
149
|
+
async function documentJson(table, input) {
|
|
150
150
|
boundedJson(input, 65536);
|
|
151
151
|
const properties = documentSchema(table).properties ?? {};
|
|
152
152
|
if (!input || Array.isArray(input) || typeof input !== "object" || Object.keys(input).some((k) => !Object.hasOwn(properties, k)))
|
|
@@ -154,7 +154,7 @@ async function documentValue(table, input) {
|
|
|
154
154
|
const result = await table.validator["~standard"].validate(input);
|
|
155
155
|
if (result.issues || !result.value || Array.isArray(result.value) || typeof result.value !== "object" || Object.keys(result.value).some((k) => !Object.hasOwn(properties, k)))
|
|
156
156
|
throw new FlareError("INVALID_INPUT", "Document failed schema validation");
|
|
157
|
-
return
|
|
157
|
+
return boundedJson(result.value, 65536);
|
|
158
158
|
}
|
|
159
159
|
async function applySchema(storage, schema) {
|
|
160
160
|
const contract = schemaContract(schema), encoded = stableJson(contract);
|
|
@@ -172,13 +172,14 @@ async function applySchema(storage, schema) {
|
|
|
172
172
|
}
|
|
173
173
|
for (const [name, definition] of Object.entries(contract)) {
|
|
174
174
|
storage.sql.exec(`CREATE TABLE IF NOT EXISTS ${quote(name)} (_id TEXT PRIMARY KEY, _creationTime REAL NOT NULL, _data TEXT NOT NULL CHECK(json_valid(_data)))`);
|
|
175
|
+
const changed = !old[name] || stableJson(old[name].document) !== stableJson(definition.document);
|
|
175
176
|
let cursor = "";
|
|
176
|
-
while (
|
|
177
|
+
while (changed) {
|
|
177
178
|
const rows = storage.sql.exec(`SELECT _id,_data FROM ${quote(name)} WHERE _id > ? ORDER BY _id LIMIT 100`, cursor).toArray();
|
|
178
179
|
for (const row of rows) {
|
|
179
|
-
const value = await
|
|
180
|
-
if (
|
|
181
|
-
storage.sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`,
|
|
180
|
+
const value = await documentJson(schema[name], JSON.parse(String(row._data)));
|
|
181
|
+
if (value !== stableJson(JSON.parse(String(row._data))))
|
|
182
|
+
storage.sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`, value, row._id);
|
|
182
183
|
}
|
|
183
184
|
if (rows.length < 100)
|
|
184
185
|
break;
|
|
@@ -313,10 +314,10 @@ async function restoreData(storage, schema, id, snapshot) {
|
|
|
313
314
|
for (const doc of docs) {
|
|
314
315
|
if (++count > SNAPSHOT_ROWS || !doc || !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(doc._id) || !Number.isFinite(doc._creationTime) || doc._creationTime < 0)
|
|
315
316
|
reject("INVALID_BACKUP");
|
|
316
|
-
const value = await
|
|
317
|
-
if (
|
|
317
|
+
const value = await documentJson(schema[name], doc.value);
|
|
318
|
+
if (value !== stableJson(doc.value))
|
|
318
319
|
reject("INVALID_BACKUP");
|
|
319
|
-
storage.sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, doc._id, doc._creationTime,
|
|
320
|
+
storage.sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, doc._id, doc._creationTime, value);
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
storage.sql.exec("UPDATE _flared_revision SET value=? WHERE id=1", snapshot.revision);
|
|
@@ -390,7 +391,7 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
390
391
|
function query(name) {
|
|
391
392
|
const definition = table(name);
|
|
392
393
|
function make(index, filters, direction) {
|
|
393
|
-
const page = (options) => task(async () => {
|
|
394
|
+
const page = (options, withCursor = true) => task(async () => {
|
|
394
395
|
table(name);
|
|
395
396
|
size(options.limit);
|
|
396
397
|
const fields = [
|
|
@@ -399,9 +400,18 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
399
400
|
"_id"
|
|
400
401
|
];
|
|
401
402
|
const expressions = fields.map(fieldSql);
|
|
402
|
-
const signature = stableJson({ name, index, filters, direction });
|
|
403
|
+
const signature = withCursor ? stableJson({ name, index, filters, direction }) : "";
|
|
404
|
+
const fixed = filters.filter((f) => f.operator === "=");
|
|
403
405
|
const where = filters.map((f) => `${fieldSql(f.field)} ${f.operator === "=" ? "IS" : f.operator} ?`);
|
|
404
406
|
const bindings = filters.map((f) => bind(f.value));
|
|
407
|
+
const rowLimit = options.limit + (withCursor ? 1 : 0);
|
|
408
|
+
const rows = [];
|
|
409
|
+
const read = (terms = [], values = [], orderStart = fixed.length) => {
|
|
410
|
+
if (rows.length >= rowLimit)
|
|
411
|
+
return;
|
|
412
|
+
const conditions = [...terms, ...where];
|
|
413
|
+
rows.push(...sql.exec(`SELECT *${withCursor ? "," + expressions.map((e, i) => `${e} AS __k${i}`).join(",") : ""} FROM ${quote(name)} ${conditions.length ? "WHERE " + conditions.join(" AND ") : ""} ORDER BY ${expressions.slice(orderStart).map((e) => `${e} ${direction}`).join(",")} LIMIT ?`, ...values, ...bindings, rowLimit - rows.length).toArray());
|
|
414
|
+
};
|
|
405
415
|
if (options.cursor != null) {
|
|
406
416
|
let token;
|
|
407
417
|
try {
|
|
@@ -411,23 +421,32 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
411
421
|
} catch {
|
|
412
422
|
throw new FlareError("INVALID_CURSOR", "Invalid cursor");
|
|
413
423
|
}
|
|
414
|
-
if (token.signature !== signature || !Array.isArray(token.values) || token.values.length !== fields.length || !token.values.every(scalar))
|
|
424
|
+
if (!token || token.signature !== signature || !Array.isArray(token.values) || token.values.length !== fields.length || !token.values.every(scalar) || typeof token.values.at(-2) !== "number" || typeof token.values.at(-1) !== "string")
|
|
415
425
|
throw new FlareError("INVALID_CURSOR", "Cursor belongs to a different query");
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
426
|
+
if (fixed.some((f, i) => bind(f.value) !== bind(token.values[i])))
|
|
427
|
+
throw new FlareError("INVALID_CURSOR", "Cursor violates index range");
|
|
428
|
+
const first = fixed.length;
|
|
429
|
+
for (let i = expressions.length - 2;i >= first && rows.length < rowLimit; i--) {
|
|
430
|
+
const prefix = expressions.slice(first, i).map((e) => `${e} IS ?`);
|
|
431
|
+
const values = token.values.slice(first, i).map(bind);
|
|
432
|
+
const expr = expressions[i], value = token.values[i];
|
|
433
|
+
if (i === expressions.length - 2) {
|
|
434
|
+
read([
|
|
435
|
+
...prefix,
|
|
436
|
+
`(${expressions.slice(i).join(",")}) ${direction === "asc" ? ">" : "<"} (?,?)`
|
|
437
|
+
], [...values, ...token.values.slice(i).map(bind)], i);
|
|
438
|
+
} else if (direction === "asc") {
|
|
439
|
+
read([
|
|
440
|
+
...prefix,
|
|
441
|
+
value === null ? `${expr} IS NOT NULL` : `${expr} > ?`
|
|
442
|
+
], value === null ? values : [...values, bind(value)], i);
|
|
443
|
+
} else if (value !== null) {
|
|
444
|
+
read([...prefix, `${expr} < ?`], [...values, bind(value)], i);
|
|
445
|
+
read([...prefix, `${expr} IS NULL`], values, i + 1);
|
|
425
446
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
}
|
|
430
|
-
const rows = sql.exec(`SELECT *,${expressions.map((e, i) => `${e} AS __k${i}`).join(",")} FROM ${quote(name)} ${where.length ? "WHERE " + where.join(" AND ") : ""} ORDER BY ${expressions.map((e) => `${e} ${direction}`).join(",")} LIMIT ?`, ...bindings, options.limit + 1).toArray();
|
|
447
|
+
}
|
|
448
|
+
} else
|
|
449
|
+
read();
|
|
431
450
|
let more = rows.length > options.limit;
|
|
432
451
|
if (more)
|
|
433
452
|
rows.pop();
|
|
@@ -443,7 +462,7 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
443
462
|
bytes += length;
|
|
444
463
|
}
|
|
445
464
|
const last = rows[docs.length - 1];
|
|
446
|
-
const continueCursor = more && last ? btoa(String.fromCharCode(...new TextEncoder().encode(boundedJson({
|
|
465
|
+
const continueCursor = withCursor && more && last ? btoa(String.fromCharCode(...new TextEncoder().encode(boundedJson({
|
|
447
466
|
signature,
|
|
448
467
|
values: expressions.map((_, i) => last[`__k${i}`])
|
|
449
468
|
}, 6144)))) : null;
|
|
@@ -500,14 +519,14 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
500
519
|
paginate: page,
|
|
501
520
|
take(limit) {
|
|
502
521
|
return task(async () => {
|
|
503
|
-
const result = await page({ limit });
|
|
522
|
+
const result = await page({ limit }, false);
|
|
504
523
|
if (!result.isDone && result.page.length < limit)
|
|
505
524
|
throw new FlareError("TOO_LARGE", "Use paginate for large documents");
|
|
506
525
|
return result.page;
|
|
507
526
|
}, false);
|
|
508
527
|
},
|
|
509
528
|
first() {
|
|
510
|
-
return task(async () => (await page({ limit: 1 })).page[0] ?? null, false);
|
|
529
|
+
return task(async () => (await page({ limit: 1 }, false)).page[0] ?? null, false);
|
|
511
530
|
}
|
|
512
531
|
});
|
|
513
532
|
}
|
|
@@ -518,10 +537,10 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
518
537
|
insert(name, input) {
|
|
519
538
|
return task(async () => {
|
|
520
539
|
writing();
|
|
521
|
-
const definition = table(name), value = await
|
|
540
|
+
const definition = table(name), value = await documentJson(definition, input);
|
|
522
541
|
writing();
|
|
523
542
|
const id = crypto.randomUUID();
|
|
524
|
-
sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, id, Date.now(),
|
|
543
|
+
sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, id, Date.now(), value);
|
|
525
544
|
changed.add(name);
|
|
526
545
|
return id;
|
|
527
546
|
});
|
|
@@ -537,12 +556,12 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
537
556
|
const row = sql.exec(`SELECT _data FROM ${quote(name)} WHERE _id=?`, id).toArray()[0];
|
|
538
557
|
if (!row)
|
|
539
558
|
throw new FlareError("NOT_FOUND", "Document not found");
|
|
540
|
-
const value = await
|
|
559
|
+
const value = await documentJson(definition, {
|
|
541
560
|
...JSON.parse(String(row._data)),
|
|
542
561
|
...patch
|
|
543
562
|
});
|
|
544
563
|
writing();
|
|
545
|
-
sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`,
|
|
564
|
+
sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`, value, id);
|
|
546
565
|
changed.add(name);
|
|
547
566
|
});
|
|
548
567
|
},
|
|
@@ -551,9 +570,9 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
|
|
|
551
570
|
writing();
|
|
552
571
|
const definition = table(name);
|
|
553
572
|
checkedId(id);
|
|
554
|
-
const value = await
|
|
573
|
+
const value = await documentJson(definition, input);
|
|
555
574
|
writing();
|
|
556
|
-
const rows = sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=? RETURNING _id`,
|
|
575
|
+
const rows = sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=? RETURNING _id`, value, id).toArray();
|
|
557
576
|
if (!rows.length)
|
|
558
577
|
throw new FlareError("NOT_FOUND", "Document not found");
|
|
559
578
|
changed.add(name);
|
|
@@ -682,7 +701,7 @@ function createFacet(app) {
|
|
|
682
701
|
}
|
|
683
702
|
let result = null;
|
|
684
703
|
const changed = new Set;
|
|
685
|
-
await this.ctx.storage.transaction(async () => {
|
|
704
|
+
const revision = await this.ctx.storage.transaction(async () => {
|
|
686
705
|
let active = true;
|
|
687
706
|
const scheduled = [];
|
|
688
707
|
const jobs = Object.freeze({
|
|
@@ -716,9 +735,7 @@ function createFacet(app) {
|
|
|
716
735
|
if (!active)
|
|
717
736
|
throw new FlareError("CAPABILITY_EXPIRED", "Mutation invocation ended");
|
|
718
737
|
const id = crypto.randomUUID();
|
|
719
|
-
this.ctx.storage.sql.exec("INSERT INTO _flared_outbox (id,release,path,args,auth,dueAt) VALUES (
|
|
720
|
-
if (target.auth === "internal")
|
|
721
|
-
this.ctx.storage.sql.exec("UPDATE _flared_outbox SET internal=1,auth='null' WHERE id=?", id);
|
|
738
|
+
this.ctx.storage.sql.exec("INSERT INTO _flared_outbox (id,release,path,args,auth,dueAt,internal) VALUES (?,?,?,?,?,?,?)", id, this.env.RELEASE_ID, path, JSON.stringify(input), JSON.stringify(target.auth === "internal" ? null : call.auth), Date.now() + Math.ceil(delay * 1000), Number(target.auth === "internal"));
|
|
722
739
|
return id;
|
|
723
740
|
})();
|
|
724
741
|
scheduled.push(pending);
|
|
@@ -741,16 +758,17 @@ function createFacet(app) {
|
|
|
741
758
|
capability.revoke();
|
|
742
759
|
await Promise.allSettled(scheduled);
|
|
743
760
|
}
|
|
744
|
-
this.commitRevision(changed);
|
|
761
|
+
return this.commitRevision(changed);
|
|
745
762
|
});
|
|
746
763
|
await this.ctx.storage.sync();
|
|
747
|
-
return { result, revision
|
|
764
|
+
return { result, revision, tables: [...changed] };
|
|
748
765
|
});
|
|
749
766
|
}
|
|
750
767
|
commitRevision(changed) {
|
|
751
|
-
this.ctx.storage.sql.exec("UPDATE _flared_revision SET value=value+1 WHERE id=1");
|
|
768
|
+
const revision = Number(this.ctx.storage.sql.exec("UPDATE _flared_revision SET value=value+1 WHERE id=1 RETURNING value").one().value);
|
|
752
769
|
for (const name of changed)
|
|
753
|
-
this.ctx.storage.sql.exec("INSERT INTO _flared_changes VALUES (?,?) ON CONFLICT(name) DO UPDATE SET revision=excluded.revision", name,
|
|
770
|
+
this.ctx.storage.sql.exec("INSERT INTO _flared_changes VALUES (?,?) ON CONFLICT(name) DO UPDATE SET revision=excluded.revision", name, revision);
|
|
771
|
+
return revision;
|
|
754
772
|
}
|
|
755
773
|
pendingJobs(limit = 100) {
|
|
756
774
|
return this.serial(async () => {
|
|
@@ -875,7 +893,7 @@ function createFacet(app) {
|
|
|
875
893
|
boundedJson(input, LIMITS.inputBytes);
|
|
876
894
|
let rows = [];
|
|
877
895
|
const changed = new Set;
|
|
878
|
-
await this.ctx.storage.transaction(async () => {
|
|
896
|
+
const revision = await this.ctx.storage.transaction(async () => {
|
|
879
897
|
if (input.expectedRevision !== this.revision())
|
|
880
898
|
throw new FlareError("CONFLICT", "Data changed; reload before editing");
|
|
881
899
|
const capability = database(this.ctx.storage.sql, app.schema, true, new Set, changed);
|
|
@@ -897,10 +915,10 @@ function createFacet(app) {
|
|
|
897
915
|
} finally {
|
|
898
916
|
capability.revoke();
|
|
899
917
|
}
|
|
900
|
-
this.commitRevision(changed);
|
|
918
|
+
return this.commitRevision(changed);
|
|
901
919
|
});
|
|
902
920
|
await this.ctx.storage.sync();
|
|
903
|
-
return { rows, revision
|
|
921
|
+
return { rows, revision };
|
|
904
922
|
});
|
|
905
923
|
}
|
|
906
924
|
};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Flare application contract",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "dc5483b6d700713c8dcf9d96e707bb4d264f89f25e97b3ae5f44ab5c10fc0e71"
|
|
6
6
|
},
|
|
7
7
|
"components": {
|
|
8
8
|
"schemas": {},
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"protocol": 1,
|
|
3
3
|
"compatibilityDate": "2026-10-10",
|
|
4
4
|
"checksums": {
|
|
5
|
-
"facet": "
|
|
5
|
+
"facet": "8d7880b99b69d141a58da4c7574b26c39dbc529785512298683239dee657a38b",
|
|
6
6
|
"action": "9d4559fcd73c82006c36891f01b6747001fbce4e5c578e83addbf5251b320dc4",
|
|
7
7
|
"schema": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
|
|
8
8
|
"manifest": "006a07907dfd7619fa66152627bc761e581cf8ac538f5002f3b89b71ce92d733"
|
|
9
9
|
},
|
|
10
|
-
"hash": "
|
|
10
|
+
"hash": "dc5483b6d700713c8dcf9d96e707bb4d264f89f25e97b3ae5f44ab5c10fc0e71"
|
|
11
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="dark"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>Flare · Dashboard</title><meta http-equiv="content-security-policy" content="script-src 'self' 'sha256-xIb/Pa7FUshAu4ihwjchYcQpyCI8eS8kt40GpOAYCz8=' 'sha256-1BvDVWLr3QCC20uHhUDi27eDFVJpk1uMQJGIWKUks2I=' 'sha256-kmZE/W8I1iuTnl1b3yqzv9/DQZenPngd3NjSKMQl7y0=' 'sha256-Y8t0ntteBwH+PqGKUyjWW3CAk+BNJKSoQc0xZ68FjhM=' 'sha256-0O7iB6zr9x0r6X6eWYITC9V5q+yWCGAoFvcysBGbY9Q=' 'sha256-tQIkdAw2vqfQ1PjgUE4ML2A4pIV8SByQ1Seeehy6UIc=' 'sha256-4f86GpVBksx63uHEB4f15jGyhnVEOKjwqYxwnfDVOik='; style-src 'self' 'sha256-vv9IoKo7BSLbWcUHr3tNmfNVmm5L/9Cfn2H6LMk7/ow=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=';"><link rel="stylesheet" href="/_astro/index.BPQdjJ4j.css"></head><body><div id="flare-dashboard"><div class="p-6 text-sm text-muted-foreground" role="status">Loading Flare…</div></div><script type="module" src="/_astro/index.astro_astro_type_script_index_0_lang.
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="dark"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>Flare · Dashboard</title><meta http-equiv="content-security-policy" content="script-src 'self' 'sha256-xIb/Pa7FUshAu4ihwjchYcQpyCI8eS8kt40GpOAYCz8=' 'sha256-1BvDVWLr3QCC20uHhUDi27eDFVJpk1uMQJGIWKUks2I=' 'sha256-kmZE/W8I1iuTnl1b3yqzv9/DQZenPngd3NjSKMQl7y0=' 'sha256-Y8t0ntteBwH+PqGKUyjWW3CAk+BNJKSoQc0xZ68FjhM=' 'sha256-0O7iB6zr9x0r6X6eWYITC9V5q+yWCGAoFvcysBGbY9Q=' 'sha256-tQIkdAw2vqfQ1PjgUE4ML2A4pIV8SByQ1Seeehy6UIc=' 'sha256-4f86GpVBksx63uHEB4f15jGyhnVEOKjwqYxwnfDVOik='; style-src 'self' 'sha256-vv9IoKo7BSLbWcUHr3tNmfNVmm5L/9Cfn2H6LMk7/ow=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=';"><link rel="stylesheet" href="/_astro/index.BPQdjJ4j.css"></head><body><div id="flare-dashboard"><div class="p-6 text-sm text-muted-foreground" role="status">Loading Flare…</div></div><script type="module" src="/_astro/index.astro_astro_type_script_index_0_lang.Dsfj1oeZ.js"></script></body></html>
|
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": 1,
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"stateFormat": 1,
|
|
5
5
|
"protocol": 1,
|
|
6
6
|
"runtimeAbi": 4,
|
|
7
7
|
"compatibilityDate": "2026-10-10",
|
|
8
8
|
"wranglerVersion": "4.150.0",
|
|
9
9
|
"upgradeFrom": [
|
|
10
|
-
"0.3.
|
|
10
|
+
"0.3.9"
|
|
11
11
|
],
|
|
12
12
|
"files": [
|
|
13
13
|
{
|
|
14
14
|
"path": "admin.js",
|
|
15
|
-
"bytes":
|
|
16
|
-
"sha256": "
|
|
15
|
+
"bytes": 37414,
|
|
16
|
+
"sha256": "ff57c880be7a520f2c8dc48dd37f09d3e3e1b19e007c3b84e38207d2cc7648a0"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
|
-
"path": "dashboard/_astro/auth-view.
|
|
19
|
+
"path": "dashboard/_astro/auth-view.BhUFPmNv.js",
|
|
20
20
|
"bytes": 3494,
|
|
21
|
-
"sha256": "
|
|
21
|
+
"sha256": "b0d9bfb46f83decc6bbd7337a4c4700d5bcf51615329097e3f0706a6dbe5277c"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
|
-
"path": "dashboard/_astro/cli-approval.
|
|
24
|
+
"path": "dashboard/_astro/cli-approval.emPTVRqn.js",
|
|
25
25
|
"bytes": 2090,
|
|
26
|
-
"sha256": "
|
|
26
|
+
"sha256": "205448bcd17d236b992219ce3d46cc1f2fb890be8dd9152b5b13c690154176d3"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
|
-
"path": "dashboard/_astro/client.
|
|
30
|
-
"bytes":
|
|
31
|
-
"sha256": "
|
|
29
|
+
"path": "dashboard/_astro/client.4z54xJ_z.js",
|
|
30
|
+
"bytes": 9421,
|
|
31
|
+
"sha256": "971a52677beaca55fb45fe83c93c65873d8f33e5fbb24ef22a8e564ca9240c5b"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "dashboard/_astro/client.Bcl1NrNO.js",
|
|
@@ -41,19 +41,19 @@
|
|
|
41
41
|
"sha256": "734f339e4f5fe6dc3597d92c36a0c55023927eebfe4f006f23ad8552e5d48e9a"
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
"path": "dashboard/_astro/common.
|
|
45
|
-
"bytes":
|
|
46
|
-
"sha256": "
|
|
44
|
+
"path": "dashboard/_astro/common.9pujiaSZ.js",
|
|
45
|
+
"bytes": 188723,
|
|
46
|
+
"sha256": "d2313bf971c2c4e73f6ed7e5bd9f687c8ece4969f1405e8cc774cbc8885e335d"
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
|
-
"path": "dashboard/_astro/data-view.
|
|
49
|
+
"path": "dashboard/_astro/data-view.C-VU8Oxm.js",
|
|
50
50
|
"bytes": 5806,
|
|
51
|
-
"sha256": "
|
|
51
|
+
"sha256": "b3c0ae89c7ed79018be179c2d4d89a8d1036f9ba0d9eb8eef3c0ff9fcf3b1352"
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
|
-
"path": "dashboard/_astro/functions-view.
|
|
54
|
+
"path": "dashboard/_astro/functions-view.3yLrtS0h.js",
|
|
55
55
|
"bytes": 6206,
|
|
56
|
-
"sha256": "
|
|
56
|
+
"sha256": "5f0b0d4cf0551967a46038d72a605b1c8b4594e484b13f13a79fc52840c3cd8a"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"path": "dashboard/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2",
|
|
@@ -86,29 +86,29 @@
|
|
|
86
86
|
"sha256": "03da0b7733798a393d7ebdaf27b5bb63387da684ff3dcf8b3e87215947fa3409"
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
|
-
"path": "dashboard/_astro/index.astro_astro_type_script_index_0_lang.
|
|
89
|
+
"path": "dashboard/_astro/index.astro_astro_type_script_index_0_lang.Dsfj1oeZ.js",
|
|
90
90
|
"bytes": 37063,
|
|
91
|
-
"sha256": "
|
|
91
|
+
"sha256": "7f4aae37b3f2cac28e8b98b60f8414e4369cf27e6a26c2e96be2db5c8cd8e4d8"
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
|
-
"path": "dashboard/_astro/input-group.
|
|
94
|
+
"path": "dashboard/_astro/input-group.BZ1TZT7L.js",
|
|
95
95
|
"bytes": 3065,
|
|
96
|
-
"sha256": "
|
|
96
|
+
"sha256": "bc374261661a0f68182a5cfe074c66cbd932781da6e27891e79b9152f7e8c1bd"
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
|
-
"path": "dashboard/_astro/sdk-view.
|
|
99
|
+
"path": "dashboard/_astro/sdk-view.BAiQKNm8.js",
|
|
100
100
|
"bytes": 3363,
|
|
101
|
-
"sha256": "
|
|
101
|
+
"sha256": "d5264609f8697cff4853cf068513b7b9f416cc01aaff826b950ae905db49c7e8"
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
|
-
"path": "dashboard/_astro/services-view.
|
|
104
|
+
"path": "dashboard/_astro/services-view.BSrqpyr5.js",
|
|
105
105
|
"bytes": 8249,
|
|
106
|
-
"sha256": "
|
|
106
|
+
"sha256": "bc04feb0b2a3c76540717c52f53c2fb147cbed5a3aed575827fb72efb4804947"
|
|
107
107
|
},
|
|
108
108
|
{
|
|
109
|
-
"path": "dashboard/_astro/settings-view.
|
|
109
|
+
"path": "dashboard/_astro/settings-view.C_eYjlIE.js",
|
|
110
110
|
"bytes": 10768,
|
|
111
|
-
"sha256": "
|
|
111
|
+
"sha256": "e7c84f0c1e489648dafcf49f55c9de53ce6aaf05ebb3dce5eff996ca64da2d03"
|
|
112
112
|
},
|
|
113
113
|
{
|
|
114
114
|
"path": "dashboard/_headers",
|
|
@@ -127,8 +127,8 @@
|
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
"path": "dashboard/bootstrap/facet.js",
|
|
130
|
-
"bytes":
|
|
131
|
-
"sha256": "
|
|
130
|
+
"bytes": 40427,
|
|
131
|
+
"sha256": "8d7880b99b69d141a58da4c7574b26c39dbc529785512298683239dee657a38b"
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
134
|
"path": "dashboard/bootstrap/manifest.json",
|
|
@@ -138,12 +138,12 @@
|
|
|
138
138
|
{
|
|
139
139
|
"path": "dashboard/bootstrap/openapi.json",
|
|
140
140
|
"bytes": 362,
|
|
141
|
-
"sha256": "
|
|
141
|
+
"sha256": "d602aafe3f2f21942591873eda674010664184ff73cdf53febfb7be6fdb967e5"
|
|
142
142
|
},
|
|
143
143
|
{
|
|
144
144
|
"path": "dashboard/bootstrap/release.json",
|
|
145
145
|
"bytes": 484,
|
|
146
|
-
"sha256": "
|
|
146
|
+
"sha256": "aedb7f315473644366810a7ab4c722803fca8ee0a72b11849c57ed5ed195978b"
|
|
147
147
|
},
|
|
148
148
|
{
|
|
149
149
|
"path": "dashboard/bootstrap/schema.json",
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
{
|
|
154
154
|
"path": "dashboard/index.html",
|
|
155
155
|
"bytes": 1095,
|
|
156
|
-
"sha256": "
|
|
156
|
+
"sha256": "6406e6185bebae7aea73d6933d4027385b112591379e5db4ae139fcbd36cfd41"
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"path": "migrations/0001.sql",
|
|
@@ -187,9 +187,9 @@
|
|
|
187
187
|
},
|
|
188
188
|
{
|
|
189
189
|
"path": "runtime.js",
|
|
190
|
-
"bytes":
|
|
191
|
-
"sha256": "
|
|
190
|
+
"bytes": 356515,
|
|
191
|
+
"sha256": "2d1df9af7b4f165e6e8ba11d9f147ce2d2a8c8c93c74f63cc2bfb413b3fce043"
|
|
192
192
|
}
|
|
193
193
|
],
|
|
194
|
-
"digest": "
|
|
194
|
+
"digest": "60e168956cdc51d2d0897a15f1c18576cf727a1fe07dea39393670292a0ec974"
|
|
195
195
|
}
|