@tensorix/metahub 0.5.2 → 0.5.4
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 +8 -4
- package/README.zh-CN.md +9 -5
- package/dist/cli.js +5005 -4033
- package/dist/cli.js.map +66 -60
- package/dist/core/compact.d.ts.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/crdt.d.ts +12 -4
- package/dist/core/crdt.d.ts.map +1 -1
- package/dist/core/databases.d.ts +3 -2
- package/dist/core/databases.d.ts.map +1 -1
- package/dist/core/db.d.ts.map +1 -1
- package/dist/core/documents.d.ts.map +1 -1
- package/dist/core/driver.d.ts +5 -1
- package/dist/core/driver.d.ts.map +1 -1
- package/dist/core/errors.d.ts +19 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/guest-intent.d.ts +1 -1
- package/dist/core/guest-intent.d.ts.map +1 -1
- package/dist/core/history-cache.d.ts +13 -0
- package/dist/core/history-cache.d.ts.map +1 -0
- package/dist/core/history.d.ts.map +1 -1
- package/dist/core/hlc.d.ts +13 -0
- package/dist/core/hlc.d.ts.map +1 -1
- package/dist/core/integrity.d.ts +15 -3
- package/dist/core/integrity.d.ts.map +1 -1
- package/dist/core/md/grammar.d.ts +5 -0
- package/dist/core/md/grammar.d.ts.map +1 -1
- package/dist/core/md/heal.d.ts.map +1 -1
- package/dist/core/resolve.d.ts +8 -0
- package/dist/core/resolve.d.ts.map +1 -1
- package/dist/core/schema-init.d.ts +1 -1
- package/dist/core/schema-init.d.ts.map +1 -1
- package/dist/core/search.d.ts +1 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/site-channel-store.d.ts +1 -1
- package/dist/core/site-channel-store.d.ts.map +1 -1
- package/dist/core/snapshot.d.ts.map +1 -1
- package/dist/core/sync/auth.d.ts +2 -4
- package/dist/core/sync/auth.d.ts.map +1 -1
- package/dist/core/sync/cf-oauth.d.ts.map +1 -1
- package/dist/core/sync/client.d.ts +4 -0
- package/dist/core/sync/client.d.ts.map +1 -1
- package/dist/core/sync/drop-protocol.d.ts.map +1 -1
- package/dist/core/sync/drop-pull.d.ts +1 -1
- package/dist/core/sync/drop-pull.d.ts.map +1 -1
- package/dist/core/sync/http-status.d.ts.map +1 -1
- package/dist/core/sync/locale.d.ts +8 -0
- package/dist/core/sync/locale.d.ts.map +1 -0
- package/dist/core/sync/page-messages.d.ts +106 -0
- package/dist/core/sync/page-messages.d.ts.map +1 -0
- package/dist/core/sync/pairing.d.ts +4 -1
- package/dist/core/sync/pairing.d.ts.map +1 -1
- package/dist/core/sync/peers.d.ts +1 -1
- package/dist/core/sync/peers.d.ts.map +1 -1
- package/dist/core/sync/protocol.d.ts +1 -0
- package/dist/core/sync/protocol.d.ts.map +1 -1
- package/dist/core/sync/remote-shares-cache.d.ts +32 -0
- package/dist/core/sync/remote-shares-cache.d.ts.map +1 -0
- package/dist/core/sync/room-client.d.ts +1 -1
- package/dist/core/sync/room-client.d.ts.map +1 -1
- package/dist/core/sync/room-protocol.d.ts +1 -1
- package/dist/core/sync/room-protocol.d.ts.map +1 -1
- package/dist/core/sync/room-serve.d.ts.map +1 -1
- package/dist/core/sync/routes.d.ts +1 -1
- package/dist/core/sync/routes.d.ts.map +1 -1
- package/dist/core/sync/server.d.ts +2 -0
- package/dist/core/sync/server.d.ts.map +1 -1
- package/dist/core/sync/share-actions.d.ts +7 -2
- package/dist/core/sync/share-actions.d.ts.map +1 -1
- package/dist/core/sync/share-copy.d.ts +7 -0
- package/dist/core/sync/share-copy.d.ts.map +1 -0
- package/dist/core/sync/share-export.d.ts +3 -1
- package/dist/core/sync/share-export.d.ts.map +1 -1
- package/dist/core/sync/share-serve.d.ts.map +1 -1
- package/dist/core/sync/sites-serve.d.ts.map +1 -1
- package/dist/core/sync/storage.d.ts +1 -1
- package/dist/core/sync/storage.d.ts.map +1 -1
- package/dist/db-worker.js +115 -88
- package/dist/edge-worker.js +319 -84
- package/dist/index.js +1637 -418
- package/dist/index.js.map +55 -48
- package/dist/metahub-sdk.js +5 -5
- package/dist/mh-runtime.js +9 -1
- package/dist/sw.js +15 -7
- package/dist/webui/server/assets.d.ts.map +1 -1
- package/dist/webui/server/changes-route.d.ts +2 -0
- package/dist/webui/server/changes-route.d.ts.map +1 -1
- package/dist/webui/server/edge-routes.d.ts.map +1 -1
- package/dist/webui/server/icons.d.ts +12 -3
- package/dist/webui/server/icons.d.ts.map +1 -1
- package/dist/webui/server/routes.d.ts +2 -0
- package/dist/webui/server/routes.d.ts.map +1 -1
- package/dist/webui-fmt.js +8 -8
- package/dist/webui.js +190 -215
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -12,19 +12,43 @@ var __esm = (fn, res, err) => () => {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
// src/core/errors.ts
|
|
15
|
+
function interpolateMsg(s, params) {
|
|
16
|
+
return params ? s.replace(/\{(\w+)\}/g, (m, k) => (k in params) ? String(params[k]) : m) : s;
|
|
17
|
+
}
|
|
18
|
+
function mhError(code, key, params) {
|
|
19
|
+
return new MhError(code, interpolateMsg(key, params), { key, params });
|
|
20
|
+
}
|
|
21
|
+
function isSqliteBusy(e) {
|
|
22
|
+
if (!(e instanceof Error))
|
|
23
|
+
return false;
|
|
24
|
+
const code = e.code;
|
|
25
|
+
if (typeof code === "string" && SQLITE_BUSY_RE.test(code))
|
|
26
|
+
return true;
|
|
27
|
+
return e.message === "database is locked";
|
|
28
|
+
}
|
|
29
|
+
function asMhError(e) {
|
|
30
|
+
if (e instanceof MhError)
|
|
31
|
+
return e;
|
|
32
|
+
if (isSqliteBusy(e))
|
|
33
|
+
return mhError("busy", "\u6570\u636E\u5E93\u6B63\u88AB\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u5199\u5165\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
15
36
|
function errorCode(e) {
|
|
16
|
-
return e
|
|
37
|
+
return asMhError(e)?.code;
|
|
17
38
|
}
|
|
18
|
-
var MhError;
|
|
39
|
+
var MhError, SQLITE_BUSY_RE;
|
|
19
40
|
var init_errors = __esm(() => {
|
|
20
41
|
MhError = class MhError extends Error {
|
|
21
42
|
code;
|
|
22
|
-
|
|
43
|
+
i18n;
|
|
44
|
+
constructor(code, message, i18n) {
|
|
23
45
|
super(message);
|
|
24
46
|
this.code = code;
|
|
47
|
+
this.i18n = i18n;
|
|
25
48
|
this.name = "MhError";
|
|
26
49
|
}
|
|
27
50
|
};
|
|
51
|
+
SQLITE_BUSY_RE = /^SQLITE_(BUSY|LOCKED)/;
|
|
28
52
|
});
|
|
29
53
|
|
|
30
54
|
// src/core/paths.ts
|
|
@@ -41,6 +65,12 @@ function cacheDir() {
|
|
|
41
65
|
}
|
|
42
66
|
var init_paths = () => {};
|
|
43
67
|
|
|
68
|
+
// src/core/driver.ts
|
|
69
|
+
function writeTx(db, fn) {
|
|
70
|
+
const tx = db.transaction(fn);
|
|
71
|
+
return (tx.immediate ?? tx)();
|
|
72
|
+
}
|
|
73
|
+
|
|
44
74
|
// src/core/schema.ts
|
|
45
75
|
var CORE_SCHEMA = `
|
|
46
76
|
CREATE TABLE IF NOT EXISTS meta (
|
|
@@ -466,7 +496,7 @@ function setNodeLabel(db, label, nodeId) {
|
|
|
466
496
|
return;
|
|
467
497
|
if (!cur && next == null)
|
|
468
498
|
return;
|
|
469
|
-
withChangeGroup("node", () => {
|
|
499
|
+
withChangeGroup(db, "node", () => {
|
|
470
500
|
emit(db, "nodes", id, "label", next);
|
|
471
501
|
});
|
|
472
502
|
}
|
|
@@ -488,7 +518,7 @@ function describeSelf(db, info = {}) {
|
|
|
488
518
|
fields.label = seed;
|
|
489
519
|
}
|
|
490
520
|
if (Object.keys(fields).length > 0) {
|
|
491
|
-
withChangeGroup("node", () => {
|
|
521
|
+
withChangeGroup(db, "node", () => {
|
|
492
522
|
for (const [col, v] of Object.entries(fields))
|
|
493
523
|
emit(db, "nodes", id, col, v);
|
|
494
524
|
});
|
|
@@ -556,6 +586,12 @@ var init_node = __esm(() => {
|
|
|
556
586
|
});
|
|
557
587
|
|
|
558
588
|
// src/core/hlc.ts
|
|
589
|
+
function hlcSkewBound(now) {
|
|
590
|
+
return formatHlc({ millis: now + HLC_MAX_SKEW_MS, counter: MAX_HLC_COUNTER, node: "~~~~~~~~" });
|
|
591
|
+
}
|
|
592
|
+
function isSkewedHlc(hlc, now) {
|
|
593
|
+
return hlc > hlcSkewBound(now);
|
|
594
|
+
}
|
|
559
595
|
function carryCounter(millis, counter) {
|
|
560
596
|
if (counter <= MAX_HLC_COUNTER)
|
|
561
597
|
return { millis, counter };
|
|
@@ -586,6 +622,8 @@ function writeLast(db, h) {
|
|
|
586
622
|
}
|
|
587
623
|
function nextHlc(db, node, now = Date.now()) {
|
|
588
624
|
const last = readLast(db, node);
|
|
625
|
+
if (last.millis > now + HLC_MAX_SKEW_MS)
|
|
626
|
+
throw mhError("clock_skew", "\u672C\u673A\u903B\u8F91\u65F6\u949F\u6BD4\u7CFB\u7EDF\u65F6\u95F4\u8D85\u524D {min} \u5206\u949F\uFF08\u7CFB\u7EDF\u65F6\u949F\u66FE\u88AB\u8C03\u9519\uFF0C\u6216\u6536\u5230\u8FC7\u65F6\u949F\u9519\u8BEF\u8BBE\u5907\u7684\u6570\u636E\uFF09\uFF0C\u8FD0\u884C mh repair --clock \u4FEE\u590D", { min: Math.ceil((last.millis - now) / 60000) });
|
|
589
627
|
const millis = Math.max(last.millis, now);
|
|
590
628
|
const counter = millis === last.millis ? last.counter + 1 : 0;
|
|
591
629
|
const h = { ...carryCounter(millis, counter), node };
|
|
@@ -597,6 +635,8 @@ function observeHlc(db, node, remote, now = Date.now()) {
|
|
|
597
635
|
const r = parseHlc(remote);
|
|
598
636
|
if (!Number.isFinite(r.millis) || !Number.isFinite(r.counter))
|
|
599
637
|
return;
|
|
638
|
+
if (r.millis > now + HLC_MAX_SKEW_MS)
|
|
639
|
+
return;
|
|
600
640
|
const millis = Math.max(last.millis, r.millis, now);
|
|
601
641
|
let counter;
|
|
602
642
|
if (millis === last.millis && millis === r.millis)
|
|
@@ -609,7 +649,18 @@ function observeHlc(db, node, remote, now = Date.now()) {
|
|
|
609
649
|
counter = 0;
|
|
610
650
|
writeLast(db, { ...carryCounter(millis, counter), node });
|
|
611
651
|
}
|
|
612
|
-
|
|
652
|
+
function persistedHlc(db) {
|
|
653
|
+
const row = db.query("SELECT value FROM meta WHERE key = 'hlc'").get();
|
|
654
|
+
return row ? parseHlc(row.value) : null;
|
|
655
|
+
}
|
|
656
|
+
function resetHlc(db, node, now = Date.now()) {
|
|
657
|
+
writeLast(db, { millis: now, counter: 0, node });
|
|
658
|
+
}
|
|
659
|
+
var MAX_HLC_COUNTER = 65535, HLC_MAX_SKEW_MS;
|
|
660
|
+
var init_hlc = __esm(() => {
|
|
661
|
+
init_errors();
|
|
662
|
+
HLC_MAX_SKEW_MS = 5 * 60000;
|
|
663
|
+
});
|
|
613
664
|
|
|
614
665
|
// src/core/blocks.ts
|
|
615
666
|
function parseDocBlocks(md) {
|
|
@@ -712,6 +763,78 @@ function lcs(a, b) {
|
|
|
712
763
|
return pairs;
|
|
713
764
|
}
|
|
714
765
|
|
|
766
|
+
// src/core/history-cache.ts
|
|
767
|
+
function cacheFor(db) {
|
|
768
|
+
let c = caches.get(db);
|
|
769
|
+
if (!c) {
|
|
770
|
+
c = { docs: new Map, blockToDoc: new Map };
|
|
771
|
+
caches.set(db, c);
|
|
772
|
+
}
|
|
773
|
+
return c;
|
|
774
|
+
}
|
|
775
|
+
function dropDoc(c, docId) {
|
|
776
|
+
const e = c.docs.get(docId);
|
|
777
|
+
if (!e)
|
|
778
|
+
return;
|
|
779
|
+
c.docs.delete(docId);
|
|
780
|
+
for (const b of e.blockIds)
|
|
781
|
+
if (c.blockToDoc.get(b) === docId)
|
|
782
|
+
c.blockToDoc.delete(b);
|
|
783
|
+
}
|
|
784
|
+
function getDocHistory(db, docId) {
|
|
785
|
+
const c = caches.get(db);
|
|
786
|
+
const e = c?.docs.get(docId);
|
|
787
|
+
if (!c || !e)
|
|
788
|
+
return;
|
|
789
|
+
c.docs.delete(docId);
|
|
790
|
+
c.docs.set(docId, e);
|
|
791
|
+
return e;
|
|
792
|
+
}
|
|
793
|
+
function setDocHistory(db, docId, changes, blockIds) {
|
|
794
|
+
const c = cacheFor(db);
|
|
795
|
+
dropDoc(c, docId);
|
|
796
|
+
const entry = { changes, blockIds: new Set(blockIds), revisions: null, states: new Map };
|
|
797
|
+
c.docs.set(docId, entry);
|
|
798
|
+
for (const b of entry.blockIds)
|
|
799
|
+
c.blockToDoc.set(b, docId);
|
|
800
|
+
while (c.docs.size > MAX_DOCS)
|
|
801
|
+
dropDoc(c, c.docs.keys().next().value);
|
|
802
|
+
return entry;
|
|
803
|
+
}
|
|
804
|
+
function rememberDocState(entry, at, state) {
|
|
805
|
+
if (entry.states.size >= MAX_STATES)
|
|
806
|
+
entry.states.delete(entry.states.keys().next().value);
|
|
807
|
+
entry.states.set(at, state);
|
|
808
|
+
}
|
|
809
|
+
function noteChange(db, dataset, rowId, col, value) {
|
|
810
|
+
const c = caches.get(db);
|
|
811
|
+
if (!c)
|
|
812
|
+
return;
|
|
813
|
+
if (dataset === "documents") {
|
|
814
|
+
dropDoc(c, rowId);
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
if (dataset !== "doc_blocks")
|
|
818
|
+
return;
|
|
819
|
+
const owner = c.blockToDoc.get(rowId);
|
|
820
|
+
if (owner)
|
|
821
|
+
dropDoc(c, owner);
|
|
822
|
+
if (col === "doc_id" && value) {
|
|
823
|
+
try {
|
|
824
|
+
const target = JSON.parse(value);
|
|
825
|
+
if (typeof target === "string")
|
|
826
|
+
dropDoc(c, target);
|
|
827
|
+
} catch {}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
function invalidateHistory(db) {
|
|
831
|
+
caches.delete(db);
|
|
832
|
+
}
|
|
833
|
+
var caches, MAX_DOCS = 16, MAX_STATES = 64;
|
|
834
|
+
var init_history_cache = __esm(() => {
|
|
835
|
+
caches = new WeakMap;
|
|
836
|
+
});
|
|
837
|
+
|
|
715
838
|
// src/core/intent-retention.ts
|
|
716
839
|
function safeNow(now) {
|
|
717
840
|
return Math.max(0, Math.trunc(Number.isFinite(now) ? now : Date.now()));
|
|
@@ -760,27 +883,27 @@ function withNodeId(node, fn) {
|
|
|
760
883
|
currentNodeOverride = prev;
|
|
761
884
|
}
|
|
762
885
|
}
|
|
763
|
-
function withChangeGroup(label, fn) {
|
|
886
|
+
function withChangeGroup(db, label, fn) {
|
|
764
887
|
if (currentTxn !== null)
|
|
765
888
|
return fn();
|
|
766
889
|
currentTxn = (currentActor ? currentActor + "/" : "") + (label ? label + ":" : "") + randomSuffix(8);
|
|
767
890
|
try {
|
|
768
|
-
return fn
|
|
891
|
+
return writeTx(db, fn);
|
|
769
892
|
} finally {
|
|
770
893
|
currentTxn = null;
|
|
771
894
|
}
|
|
772
895
|
}
|
|
773
|
-
function withTxnId(txn, fn) {
|
|
896
|
+
function withTxnId(db, txn, fn) {
|
|
774
897
|
const prev = currentTxn;
|
|
775
898
|
currentTxn = txn;
|
|
776
899
|
try {
|
|
777
|
-
return fn
|
|
900
|
+
return writeTx(db, fn);
|
|
778
901
|
} finally {
|
|
779
902
|
currentTxn = prev;
|
|
780
903
|
}
|
|
781
904
|
}
|
|
782
905
|
function grouped(fn, label = null) {
|
|
783
|
-
return (...args) => withChangeGroup(label, () => fn(...args));
|
|
906
|
+
return (db, ...args) => withChangeGroup(db, label, () => fn(db, ...args));
|
|
784
907
|
}
|
|
785
908
|
function decodeMaterializeValue(dataset, col, valueJson) {
|
|
786
909
|
if (valueJson !== null)
|
|
@@ -827,6 +950,16 @@ function materialize(db, dataset, rowId, col, valueJson) {
|
|
|
827
950
|
}
|
|
828
951
|
return;
|
|
829
952
|
}
|
|
953
|
+
if (dataset === "databases" && col.startsWith("meta.")) {
|
|
954
|
+
ensureRow(db, "databases", rowId);
|
|
955
|
+
const key = col.slice(5);
|
|
956
|
+
if (valueJson === null) {
|
|
957
|
+
db.query(`UPDATE databases SET meta = json_remove(coalesce(meta, '{}'), '$."' || ? || '"') WHERE id = ?`).run(key, rowId);
|
|
958
|
+
} else {
|
|
959
|
+
db.query(`UPDATE databases SET meta = json_set(coalesce(meta, '{}'), '$."' || ? || '"', json(?)) WHERE id = ?`).run(key, valueJson, rowId);
|
|
960
|
+
}
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
830
963
|
const d = DOMAIN[dataset];
|
|
831
964
|
if (!d || !d.cols.has(col))
|
|
832
965
|
return;
|
|
@@ -844,6 +977,8 @@ function materialize(db, dataset, rowId, col, valueJson) {
|
|
|
844
977
|
function applyChange(db, c) {
|
|
845
978
|
const inserted = db.query("INSERT OR IGNORE INTO crdt_changes (hlc, node_id, dataset, row_id, col, value, txn) VALUES (?, ?, ?, ?, ?, ?, ?)").run(c.hlc, c.node_id, c.dataset, c.row_id, c.col, c.value, c.txn ?? null).changes > 0;
|
|
846
979
|
const cur = db.query("SELECT MAX(hlc) AS h FROM crdt_changes WHERE dataset = ? AND row_id = ? AND col = ?").get(c.dataset, c.row_id, c.col);
|
|
980
|
+
if (inserted)
|
|
981
|
+
noteChange(db, c.dataset, c.row_id, c.col, c.value);
|
|
847
982
|
if (cur.h !== c.hlc)
|
|
848
983
|
return { inserted, winner: false };
|
|
849
984
|
try {
|
|
@@ -857,18 +992,21 @@ function applyChange(db, c) {
|
|
|
857
992
|
return { inserted, winner: true };
|
|
858
993
|
}
|
|
859
994
|
function emit(db, dataset, rowId, col, value) {
|
|
860
|
-
const
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
995
|
+
const mint = () => {
|
|
996
|
+
const node = currentNodeOverride ?? getNodeId(db);
|
|
997
|
+
const change = {
|
|
998
|
+
hlc: nextHlc(db, node),
|
|
999
|
+
node_id: node,
|
|
1000
|
+
dataset,
|
|
1001
|
+
row_id: rowId,
|
|
1002
|
+
col,
|
|
1003
|
+
value: value === undefined ? null : JSON.stringify(value),
|
|
1004
|
+
txn: currentTxn
|
|
1005
|
+
};
|
|
1006
|
+
applyChange(db, change);
|
|
1007
|
+
return change;
|
|
869
1008
|
};
|
|
870
|
-
|
|
871
|
-
return change;
|
|
1009
|
+
return currentTxn !== null ? mint() : writeTx(db, mint);
|
|
872
1010
|
}
|
|
873
1011
|
function emitFields(db, dataset, rowId, fields) {
|
|
874
1012
|
const out = [];
|
|
@@ -878,16 +1016,24 @@ function emitFields(db, dataset, rowId, fields) {
|
|
|
878
1016
|
return out;
|
|
879
1017
|
}
|
|
880
1018
|
function ingest(db, changes, opts = {}) {
|
|
1019
|
+
return ingestDetailed(db, changes, opts).received;
|
|
1020
|
+
}
|
|
1021
|
+
function ingestDetailed(db, changes, opts = {}) {
|
|
881
1022
|
const now = opts.now ?? Date.now();
|
|
882
1023
|
pruneExpiredIntentReceipts(db, now);
|
|
883
1024
|
const node = getNodeId(db);
|
|
884
1025
|
let received = 0;
|
|
885
1026
|
let poisoned = 0;
|
|
886
|
-
const
|
|
887
|
-
|
|
1027
|
+
const skewed = {};
|
|
1028
|
+
const tx = () => {
|
|
1029
|
+
for (const c of changes) {
|
|
888
1030
|
if (isExpiredIntentReceipt(c, now))
|
|
889
1031
|
continue;
|
|
890
|
-
|
|
1032
|
+
if (isSkewedHlc(c.hlc, now)) {
|
|
1033
|
+
skewed[c.node_id] = (skewed[c.node_id] ?? 0) + 1;
|
|
1034
|
+
continue;
|
|
1035
|
+
}
|
|
1036
|
+
observeHlc(db, node, c.hlc, now);
|
|
891
1037
|
try {
|
|
892
1038
|
if (applyChange(db, c).inserted)
|
|
893
1039
|
received++;
|
|
@@ -896,11 +1042,13 @@ function ingest(db, changes, opts = {}) {
|
|
|
896
1042
|
console.error(`[ingest] skipped a change that failed to apply (dataset=${c.dataset} col=${c.col} row=${c.row_id}): ${e.message}`);
|
|
897
1043
|
}
|
|
898
1044
|
}
|
|
899
|
-
}
|
|
900
|
-
tx
|
|
1045
|
+
};
|
|
1046
|
+
writeTx(db, tx);
|
|
901
1047
|
if (poisoned)
|
|
902
1048
|
console.error(`[ingest] ${poisoned} change(s) skipped this batch (see above)`);
|
|
903
|
-
|
|
1049
|
+
for (const [n, k] of Object.entries(skewed))
|
|
1050
|
+
console.error(`[ingest] refused ${k} change(s) from node ${n}: stamped more than 5 min in the future (that device should run mh repair --clock)`);
|
|
1051
|
+
return { received, skewed };
|
|
904
1052
|
}
|
|
905
1053
|
function changesSince(db, since, opts = {}) {
|
|
906
1054
|
const rows = db.query(`SELECT ${CHANGE_SELECT} FROM crdt_changes WHERE hlc > ? ORDER BY hlc`).all(since);
|
|
@@ -936,7 +1084,9 @@ function changesAfterSeq(db, seq, opts = {}) {
|
|
|
936
1084
|
var CHANGE_COLS, CHANGE_SELECT, currentTxn = null, currentActor = null, ACTOR_TAG_RE, currentNodeOverride = null, DOMAIN, RECORD_META, OPLOG_ONLY_DATASETS, NOT_NULL_ZERO_COLS;
|
|
937
1085
|
var init_crdt = __esm(() => {
|
|
938
1086
|
init_node();
|
|
1087
|
+
init_hlc();
|
|
939
1088
|
init_ids();
|
|
1089
|
+
init_history_cache();
|
|
940
1090
|
init_intent_retention();
|
|
941
1091
|
CHANGE_COLS = ["hlc", "node_id", "dataset", "row_id", "col", "value", "txn"];
|
|
942
1092
|
CHANGE_SELECT = CHANGE_COLS.join(", ");
|
|
@@ -1243,7 +1393,19 @@ var init_properties = __esm(() => {
|
|
|
1243
1393
|
function rowOut(r) {
|
|
1244
1394
|
if (!r)
|
|
1245
1395
|
return null;
|
|
1246
|
-
|
|
1396
|
+
const meta = r.meta === null ? null : JSON.parse(r.meta);
|
|
1397
|
+
return { ...r, meta: meta && Object.keys(meta).length ? meta : null };
|
|
1398
|
+
}
|
|
1399
|
+
function emitMetaPatch(db, id, cur, patch) {
|
|
1400
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
1401
|
+
if (k.includes("."))
|
|
1402
|
+
throw new MhError("invalid_input", `meta key must not contain ".": ${k}`);
|
|
1403
|
+
const next = v === undefined ? null : v;
|
|
1404
|
+
const prev = cur && k in cur ? cur[k] : null;
|
|
1405
|
+
if (JSON.stringify(prev ?? null) === JSON.stringify(next ?? null))
|
|
1406
|
+
continue;
|
|
1407
|
+
emit(db, "databases", id, `meta.${k}`, next === null ? undefined : next);
|
|
1408
|
+
}
|
|
1247
1409
|
}
|
|
1248
1410
|
function getDatabase(db, id) {
|
|
1249
1411
|
return rowOut(db.query(`SELECT ${DATABASE_SELECT} FROM databases WHERE id = ? AND __deleted = 0`).get(id));
|
|
@@ -1282,7 +1444,9 @@ var init_databases = __esm(() => {
|
|
|
1282
1444
|
if (fields.meta !== undefined) {
|
|
1283
1445
|
if (fields.meta !== null && (typeof fields.meta !== "object" || Array.isArray(fields.meta)))
|
|
1284
1446
|
throw new MhError("invalid_input", "meta must be a JSON object or null");
|
|
1285
|
-
|
|
1447
|
+
const cur = getDatabase(db, id).meta;
|
|
1448
|
+
const patch = fields.meta ?? Object.fromEntries(Object.keys(cur ?? {}).map((k) => [k, null]));
|
|
1449
|
+
emitMetaPatch(db, id, cur, patch);
|
|
1286
1450
|
}
|
|
1287
1451
|
return getDatabase(db, id);
|
|
1288
1452
|
});
|
|
@@ -1296,8 +1460,7 @@ var init_databases = __esm(() => {
|
|
|
1296
1460
|
});
|
|
1297
1461
|
if (src.meta !== null) {
|
|
1298
1462
|
const { collapsed: _hidden, ...meta } = src.meta;
|
|
1299
|
-
|
|
1300
|
-
emit(db, "databases", dup.id, "meta", meta);
|
|
1463
|
+
emitMetaPatch(db, dup.id, null, meta);
|
|
1301
1464
|
}
|
|
1302
1465
|
const propIdMap = new Map;
|
|
1303
1466
|
const selfRelNew = new Set;
|
|
@@ -1425,7 +1588,37 @@ ${fmt(shown)}
|
|
|
1425
1588
|
function resolveRef(db, ref, opts = {}) {
|
|
1426
1589
|
return resolveEntity(db, ref, opts).id;
|
|
1427
1590
|
}
|
|
1428
|
-
|
|
1591
|
+
function lookupCandidates(db, ref, opts = {}) {
|
|
1592
|
+
const trimmed = ref.trim();
|
|
1593
|
+
if (!trimmed)
|
|
1594
|
+
return [];
|
|
1595
|
+
const limit = Math.max(1, Math.min(opts.limit ?? LOOKUP_LIMIT, 100));
|
|
1596
|
+
const cands = resolveCandidates(db, trimmed).filter((c) => c.kind !== "prop");
|
|
1597
|
+
cands.sort((a, b) => Number(b.id === trimmed) - Number(a.id === trimmed));
|
|
1598
|
+
const titleCache = new Map;
|
|
1599
|
+
const out = [];
|
|
1600
|
+
for (const c of cands.slice(0, limit)) {
|
|
1601
|
+
if (c.kind === "db") {
|
|
1602
|
+
out.push({ ...c, database_id: null });
|
|
1603
|
+
continue;
|
|
1604
|
+
}
|
|
1605
|
+
const row = db.query(`SELECT database_id FROM ${SPECS[c.kind].table} WHERE id = ?`).get(c.id);
|
|
1606
|
+
const databaseId = row?.database_id ?? null;
|
|
1607
|
+
let label = c.label;
|
|
1608
|
+
if (c.kind === "rec" && !label && databaseId) {
|
|
1609
|
+
if (!titleCache.has(databaseId))
|
|
1610
|
+
titleCache.set(databaseId, titlePropId(db, databaseId));
|
|
1611
|
+
const tp = titleCache.get(databaseId);
|
|
1612
|
+
if (tp) {
|
|
1613
|
+
const t = db.query(`SELECT data ->> '${tp.replace(/'/g, "''")}' AS title FROM records WHERE id = ?`).get(c.id);
|
|
1614
|
+
label = t?.title ? String(t.title) : "";
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
out.push({ kind: c.kind, id: c.id, label, database_id: databaseId });
|
|
1618
|
+
}
|
|
1619
|
+
return out;
|
|
1620
|
+
}
|
|
1621
|
+
var SPECS, PUBLIC_KINDS, HI = "{", LOOKUP_LIMIT = 20;
|
|
1429
1622
|
var init_resolve = __esm(() => {
|
|
1430
1623
|
init_ids();
|
|
1431
1624
|
init_errors();
|
|
@@ -2126,25 +2319,6 @@ var init_documents = __esm(() => {
|
|
|
2126
2319
|
throw new MhError("invalid_input", `anchor not found: no match for --old`);
|
|
2127
2320
|
if (count > 1 && !opts.replaceAll)
|
|
2128
2321
|
throw new MhError("ambiguous", `${count} matches for --old; add surrounding context or use --replace-all`);
|
|
2129
|
-
if (!opts.old.includes(`
|
|
2130
|
-
|
|
2131
|
-
`)) {
|
|
2132
|
-
const affected = blocks.filter((b) => b.text.includes(opts.old));
|
|
2133
|
-
const next = affected.map((b) => opts.replaceAll ? b.text.replaceAll(opts.old, () => opts.new) : b.text.replace(opts.old, () => opts.new));
|
|
2134
|
-
if (next.every((t) => t.length > 0 && !t.includes(`
|
|
2135
|
-
|
|
2136
|
-
`))) {
|
|
2137
|
-
const targets = opts.replaceAll ? affected : affected.slice(0, 1);
|
|
2138
|
-
let wrote = false;
|
|
2139
|
-
targets.forEach((b, i) => {
|
|
2140
|
-
if (next[i] !== b.text) {
|
|
2141
|
-
emit(db, "doc_blocks", b.id, "text", next[i]);
|
|
2142
|
-
wrote = true;
|
|
2143
|
-
}
|
|
2144
|
-
});
|
|
2145
|
-
return { id, changed: wrote, replaced: opts.replaceAll ? count : 1, version: documentVersion(db, id) };
|
|
2146
|
-
}
|
|
2147
|
-
}
|
|
2148
2322
|
const newBody = opts.replaceAll ? body.replaceAll(opts.old, () => opts.new) : body.replace(opts.old, () => opts.new);
|
|
2149
2323
|
reconcileBody(db, id, newBody);
|
|
2150
2324
|
return { id, changed: newBody !== body, replaced: opts.replaceAll ? count : 1, version: documentVersion(db, id) };
|
|
@@ -2342,7 +2516,7 @@ function knownNodes(db) {
|
|
|
2342
2516
|
return [...ids].map((nodeId) => ({ nodeId, label: nodeLabelOf(db, nodeId), self: nodeId === self }));
|
|
2343
2517
|
}
|
|
2344
2518
|
var POLICY_ID = "default", blobBytesResolver = null, setFullNodes = (db, nodeIds) => {
|
|
2345
|
-
withChangeGroup(null, () => {
|
|
2519
|
+
withChangeGroup(db, null, () => {
|
|
2346
2520
|
const seen = new Set;
|
|
2347
2521
|
const list = nodeIds.filter((n) => n && !seen.has(n) && seen.add(n) != null);
|
|
2348
2522
|
emit(db, "blob_policy", POLICY_ID, "full_nodes", list);
|
|
@@ -2405,7 +2579,7 @@ function migrateRecords(db) {
|
|
|
2405
2579
|
db.exec("ALTER TABLE records ADD COLUMN order_key TEXT");
|
|
2406
2580
|
if (!tableExists3(db, "record_values"))
|
|
2407
2581
|
return;
|
|
2408
|
-
|
|
2582
|
+
writeTx(db, () => {
|
|
2409
2583
|
db.exec(`
|
|
2410
2584
|
UPDATE records SET data = coalesce((
|
|
2411
2585
|
SELECT json_group_object(rv.property_id, json(rv.value))
|
|
@@ -2416,7 +2590,6 @@ function migrateRecords(db) {
|
|
|
2416
2590
|
db.exec("DROP TABLE record_values");
|
|
2417
2591
|
backfillRecordOrderKeys(db);
|
|
2418
2592
|
});
|
|
2419
|
-
tx();
|
|
2420
2593
|
backfillRecordOrderKeys(db);
|
|
2421
2594
|
}
|
|
2422
2595
|
function migrateShares(db) {
|
|
@@ -2474,7 +2647,7 @@ function migrateOplog(db) {
|
|
|
2474
2647
|
function migrateCrdtChangesSeq(db) {
|
|
2475
2648
|
if (hasColumn(db, "crdt_changes", "seq"))
|
|
2476
2649
|
return;
|
|
2477
|
-
|
|
2650
|
+
writeTx(db, () => {
|
|
2478
2651
|
db.exec(`
|
|
2479
2652
|
DROP TABLE IF EXISTS crdt_changes_new;
|
|
2480
2653
|
CREATE TABLE crdt_changes_new (
|
|
@@ -2504,7 +2677,6 @@ function migrateCrdtChangesSeq(db) {
|
|
|
2504
2677
|
if (tableExists3(db, "peers"))
|
|
2505
2678
|
db.exec("UPDATE peers SET push_cursor = 0, pull_cursor = 0");
|
|
2506
2679
|
});
|
|
2507
|
-
tx();
|
|
2508
2680
|
}
|
|
2509
2681
|
function migrateStoragePeerUrls(db) {
|
|
2510
2682
|
if (!tableExists3(db, "peers"))
|
|
@@ -2537,7 +2709,7 @@ function migrateStoragePeerUrls(db) {
|
|
|
2537
2709
|
if (renames.length === 0)
|
|
2538
2710
|
return;
|
|
2539
2711
|
const map = new Map(renames.map(({ oldUrl, newUrl }) => [oldUrl, newUrl]));
|
|
2540
|
-
|
|
2712
|
+
writeTx(db, () => {
|
|
2541
2713
|
for (const { oldUrl, newUrl } of renames) {
|
|
2542
2714
|
if (tableExists3(db, "storage_cursors"))
|
|
2543
2715
|
db.query("UPDATE storage_cursors SET peer_url = ? WHERE peer_url = ?").run(newUrl, oldUrl);
|
|
@@ -2549,7 +2721,6 @@ function migrateStoragePeerUrls(db) {
|
|
|
2549
2721
|
setFullNodes(db, fullNodes.map((n) => map.get(n) ?? n));
|
|
2550
2722
|
}
|
|
2551
2723
|
});
|
|
2552
|
-
tx();
|
|
2553
2724
|
}
|
|
2554
2725
|
function migrateDatabases(db) {
|
|
2555
2726
|
if (hasColumn(db, "databases", "meta"))
|
|
@@ -2602,11 +2773,11 @@ function replayDataset(db, dataset) {
|
|
|
2602
2773
|
WHERE dataset = ? AND seq > ? ORDER BY seq`).all(dataset, since);
|
|
2603
2774
|
if (changes.length === 0)
|
|
2604
2775
|
return;
|
|
2605
|
-
db
|
|
2606
|
-
for (const change of
|
|
2776
|
+
writeTx(db, () => {
|
|
2777
|
+
for (const change of changes)
|
|
2607
2778
|
applyChange(db, change);
|
|
2608
|
-
db.query("INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, String(
|
|
2609
|
-
})
|
|
2779
|
+
db.query("INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, String(changes[changes.length - 1].seq));
|
|
2780
|
+
});
|
|
2610
2781
|
}
|
|
2611
2782
|
function migrateSiteChannels(db) {
|
|
2612
2783
|
replayDataset(db, "site_channels");
|
|
@@ -3080,7 +3251,7 @@ function writeFileRow(db, siteId, cleanPath, contentType, encoding, content) {
|
|
|
3080
3251
|
return { ...same, changed: false };
|
|
3081
3252
|
const existing = fileIdFor(db, siteId, cleanPath);
|
|
3082
3253
|
const id = existing ?? newId("sf", cleanPath);
|
|
3083
|
-
withChangeGroup(null, () => {
|
|
3254
|
+
withChangeGroup(db, null, () => {
|
|
3084
3255
|
if (!existing) {
|
|
3085
3256
|
const first = emit(db, "site_files", id, "site_id", siteId);
|
|
3086
3257
|
emit(db, "site_files", id, "path", cleanPath);
|
|
@@ -8287,7 +8458,8 @@ var init_protocol = __esm(() => {
|
|
|
8287
8458
|
SyncResponseSchema = object({
|
|
8288
8459
|
node_id: string2().describe("Server's node id"),
|
|
8289
8460
|
changes: array(ChangeSchema).describe("Server changes after `since`"),
|
|
8290
|
-
cursor: number2().describe("New server cursor for the client to store")
|
|
8461
|
+
cursor: number2().describe("New server cursor for the client to store"),
|
|
8462
|
+
skewed_rejected: number2().optional().describe("Pushed changes the server refused for being stamped >5 min in the future")
|
|
8291
8463
|
});
|
|
8292
8464
|
HealthResponseSchema = object({
|
|
8293
8465
|
ok: boolean2(),
|
|
@@ -8315,6 +8487,9 @@ function getPeer(db, url) {
|
|
|
8315
8487
|
function setPeer(db, url, c) {
|
|
8316
8488
|
db.query("INSERT INTO peers (url, pull_cursor, push_cursor) VALUES (?, ?, ?) ON CONFLICT(url) DO UPDATE SET pull_cursor = excluded.pull_cursor, push_cursor = excluded.push_cursor").run(url, c.pull_cursor, c.push_cursor);
|
|
8317
8489
|
}
|
|
8490
|
+
function skewWarnings(source, skewed) {
|
|
8491
|
+
return Object.entries(skewed).map(([node, n]) => `${source}: refused ${n} change(s) from device ${node} stamped more than 5 min in the future \u2014 run \`mh repair --clock\` on that device`);
|
|
8492
|
+
}
|
|
8318
8493
|
function advanceAckedPrefix(db, fromSeq, received) {
|
|
8319
8494
|
if (received.length === 0)
|
|
8320
8495
|
return fromSeq;
|
|
@@ -8353,12 +8528,21 @@ async function syncWithPeer(db, url, opts = {}) {
|
|
|
8353
8528
|
throw new MhError(res.status === 401 || res.status === 403 ? "auth" : "network", `sync failed: ${res.status} ${await res.text()}`);
|
|
8354
8529
|
const data = await res.json();
|
|
8355
8530
|
const changes = data.changes ?? [];
|
|
8356
|
-
const
|
|
8531
|
+
const r = ingestDetailed(db, changes);
|
|
8532
|
+
const pulled = r.received;
|
|
8357
8533
|
setPeer(db, url, {
|
|
8358
8534
|
pull_cursor: data.cursor,
|
|
8359
8535
|
push_cursor: advanceAckedPrefix(db, toPush.cursor, changes)
|
|
8360
8536
|
});
|
|
8361
|
-
|
|
8537
|
+
const warnings = skewWarnings(url, r.skewed);
|
|
8538
|
+
if (data.skewed_rejected)
|
|
8539
|
+
warnings.push(`${url} refused ${data.skewed_rejected} of this device's change(s) as stamped more than 5 min in the future \u2014 run \`mh repair --clock\` here`);
|
|
8540
|
+
return {
|
|
8541
|
+
pushed: toPush.changes.length,
|
|
8542
|
+
pulled,
|
|
8543
|
+
received: changes.length,
|
|
8544
|
+
...warnings.length ? { warnings } : {}
|
|
8545
|
+
};
|
|
8362
8546
|
}
|
|
8363
8547
|
var changeKey = (c) => `${c.hlc}\x00${c.node_id}\x00${c.dataset}\x00${c.row_id}\x00${c.col}`;
|
|
8364
8548
|
var init_client = __esm(() => {
|
|
@@ -8857,9 +9041,10 @@ async function syncWithStorage(db, peerUrl, client, config, opts = {}) {
|
|
|
8857
9041
|
}
|
|
8858
9042
|
let snapKeys = [];
|
|
8859
9043
|
let pulled = 0;
|
|
9044
|
+
const skewed = {};
|
|
8860
9045
|
if (opts.pull ?? true) {
|
|
8861
9046
|
snapKeys = (await client.list(snapshotRoot(base))).map((o) => o.key).filter((k) => k.endsWith(".snap"));
|
|
8862
|
-
pulled += await pullSnapshots(db, peerUrl, snapKeys, client, key);
|
|
9047
|
+
pulled += await pullSnapshots(db, peerUrl, snapKeys, client, key, skewed);
|
|
8863
9048
|
for (const remote of await listRemoteNodes(client, base)) {
|
|
8864
9049
|
if (remote === node)
|
|
8865
9050
|
continue;
|
|
@@ -8876,7 +9061,7 @@ async function syncWithStorage(db, peerUrl, client, config, opts = {}) {
|
|
|
8876
9061
|
if (!bytes)
|
|
8877
9062
|
continue;
|
|
8878
9063
|
const changes = await decodeSegment(bytes, key);
|
|
8879
|
-
pulled +=
|
|
9064
|
+
pulled += collectSkew(skewed, ingestDetailed(db, changes));
|
|
8880
9065
|
setStorageCursor(db, peerUrl, remote, seg.key);
|
|
8881
9066
|
}
|
|
8882
9067
|
}
|
|
@@ -8903,9 +9088,15 @@ async function syncWithStorage(db, peerUrl, client, config, opts = {}) {
|
|
|
8903
9088
|
if (ownCount >= threshold)
|
|
8904
9089
|
await publishSnapshot(db, client, config, opts.snapshotRetainSegments);
|
|
8905
9090
|
}
|
|
8906
|
-
|
|
9091
|
+
const warnings = skewWarnings(peerUrl, skewed);
|
|
9092
|
+
return { pushed, pulled, pendingPush, ...warnings.length ? { warnings } : {} };
|
|
8907
9093
|
}
|
|
8908
|
-
|
|
9094
|
+
function collectSkew(into, r) {
|
|
9095
|
+
for (const [n, k] of Object.entries(r.skewed))
|
|
9096
|
+
into[n] = (into[n] ?? 0) + k;
|
|
9097
|
+
return r.received;
|
|
9098
|
+
}
|
|
9099
|
+
async function pullSnapshots(db, peerUrl, present, client, key, skewed = {}) {
|
|
8909
9100
|
if (present.length === 0)
|
|
8910
9101
|
return 0;
|
|
8911
9102
|
const consumed = getSnapshotConsumed(db, peerUrl);
|
|
@@ -8924,7 +9115,7 @@ async function pullSnapshots(db, peerUrl, present, client, key) {
|
|
|
8924
9115
|
if (!bytes)
|
|
8925
9116
|
continue;
|
|
8926
9117
|
const changes = await decodeSegment(bytes, key);
|
|
8927
|
-
pulled +=
|
|
9118
|
+
pulled += collectSkew(skewed, ingestDetailed(db, changes));
|
|
8928
9119
|
consumed.add(k);
|
|
8929
9120
|
for (const c of changes)
|
|
8930
9121
|
if (!local[c.node_id] || c.hlc > local[c.node_id])
|
|
@@ -8945,6 +9136,7 @@ var init_storage = __esm(() => {
|
|
|
8945
9136
|
init_crdt();
|
|
8946
9137
|
init_publisher_lease();
|
|
8947
9138
|
init_errors();
|
|
9139
|
+
init_client();
|
|
8948
9140
|
init_e2ee();
|
|
8949
9141
|
init_intent_retention();
|
|
8950
9142
|
DEFAULT_SNAPSHOT_MAX_INTERVAL_MS = 30 * 60000;
|
|
@@ -9156,7 +9348,7 @@ var package_default;
|
|
|
9156
9348
|
var init_package = __esm(() => {
|
|
9157
9349
|
package_default = {
|
|
9158
9350
|
name: "@tensorix/metahub",
|
|
9159
|
-
version: "0.5.
|
|
9351
|
+
version: "0.5.4",
|
|
9160
9352
|
description: "Metahub core library and CLI",
|
|
9161
9353
|
license: "AGPL-3.0-only",
|
|
9162
9354
|
type: "module",
|
|
@@ -9528,7 +9720,7 @@ function applyGuestIntent(db, policy, session, intent, opts) {
|
|
|
9528
9720
|
kind: policy.audience,
|
|
9529
9721
|
guestNode: session.guestNode
|
|
9530
9722
|
};
|
|
9531
|
-
|
|
9723
|
+
return writeTx(db, () => {
|
|
9532
9724
|
const prepared = prepareIntent(db, policy, principal, intent, opts.clock);
|
|
9533
9725
|
const txn = intentTxnPrefix(session.guestNode, intent.intentId) + prepared.fingerprint;
|
|
9534
9726
|
const receipt = readReceipt(db, session.guestNode, intent.intentId, acceptedNow);
|
|
@@ -9548,7 +9740,6 @@ function applyGuestIntent(db, policy, session, intent, opts) {
|
|
|
9548
9740
|
return applySubmitted(db, policy, principal, intent, prepared, txn, acceptedNow);
|
|
9549
9741
|
return applyAuthority(db, policy, principal, intent, prepared, txn, acceptedNow);
|
|
9550
9742
|
});
|
|
9551
|
-
return tx();
|
|
9552
9743
|
}
|
|
9553
9744
|
function prepareIntent(db, policy, principal, intent, clock) {
|
|
9554
9745
|
if (typeof intent.payload !== "object" || intent.payload === null || Array.isArray(intent.payload))
|
|
@@ -9586,7 +9777,7 @@ function prepareIntent(db, policy, principal, intent, clock) {
|
|
|
9586
9777
|
};
|
|
9587
9778
|
}
|
|
9588
9779
|
function applyAuthority(db, policy, principal, intent, prepared, txn, acceptedNow) {
|
|
9589
|
-
return withTxnId(txn, () => withNodeId(principal.guestNode, () => {
|
|
9780
|
+
return withTxnId(db, txn, () => withNodeId(principal.guestNode, () => {
|
|
9590
9781
|
if (intent.action === "createRecord")
|
|
9591
9782
|
assertGuestCreateCapacity(db, prepared.database, policy.limits);
|
|
9592
9783
|
const current = intent.action === "createRecord" ? createRecordPrepared(db, prepared.database, prepared.cells) : updateRecordPrepared(db, intent.recordId, prepared.cells);
|
|
@@ -9710,7 +9901,7 @@ function isRecordRow(value) {
|
|
|
9710
9901
|
}
|
|
9711
9902
|
function clampMillis(submittedAt, now) {
|
|
9712
9903
|
const safeNow = Math.max(0, Math.trunc(Number.isFinite(now) ? now : Date.now()));
|
|
9713
|
-
const ceil = safeNow +
|
|
9904
|
+
const ceil = safeNow + HLC_MAX_SKEW_MS;
|
|
9714
9905
|
if (!Number.isFinite(submittedAt))
|
|
9715
9906
|
return safeNow;
|
|
9716
9907
|
return Math.max(0, Math.min(Math.trunc(submittedAt), ceil));
|
|
@@ -9749,16 +9940,16 @@ function stableStringify(value) {
|
|
|
9749
9940
|
}
|
|
9750
9941
|
return JSON.stringify(value) ?? "null";
|
|
9751
9942
|
}
|
|
9752
|
-
var
|
|
9943
|
+
var INTENT_ID_RE, RECEIPT_COL = "result";
|
|
9753
9944
|
var init_guest_intent = __esm(() => {
|
|
9754
9945
|
init_errors();
|
|
9755
9946
|
init_records();
|
|
9947
|
+
init_hlc();
|
|
9756
9948
|
init_crdt();
|
|
9757
9949
|
init_ids();
|
|
9758
9950
|
init_intent_retention();
|
|
9759
9951
|
init_grants_core();
|
|
9760
9952
|
init_intent_retention();
|
|
9761
|
-
HLC_SKEW_MS = 5 * 60000;
|
|
9762
9953
|
INTENT_ID_RE = /^[A-Za-z0-9._-]{1,64}$/;
|
|
9763
9954
|
});
|
|
9764
9955
|
|
|
@@ -9766,6 +9957,7 @@ var init_guest_intent = __esm(() => {
|
|
|
9766
9957
|
var ROOM_PROTOCOL_VERSION = 1, ROOM_BLOB_CHUNK_LIMIT, STATE_TABLE;
|
|
9767
9958
|
var init_room_protocol = __esm(() => {
|
|
9768
9959
|
init_errors();
|
|
9960
|
+
init_history_cache();
|
|
9769
9961
|
init_crdt();
|
|
9770
9962
|
init_schema_init();
|
|
9771
9963
|
init_ids();
|
|
@@ -9867,13 +10059,13 @@ async function syncWithRoom(db, cfg, transport, opts = {}) {
|
|
|
9867
10059
|
}
|
|
9868
10060
|
assertGuestAuthored(resp.changes, cfg.guestBase);
|
|
9869
10061
|
const pulled = ingest(db, resp.changes);
|
|
9870
|
-
db
|
|
10062
|
+
writeTx(db, () => {
|
|
9871
10063
|
applyPartitionDiff(db, cfg.peerKey, {
|
|
9872
10064
|
entered: [...prep.shipped, ...pulledMemberRows(db, cfg, resp.changes)],
|
|
9873
10065
|
left: prep.diff.left
|
|
9874
10066
|
});
|
|
9875
10067
|
writeCursors(db, cfg.peerKey, { pull: resp.cursor, push: prep.pushCursor });
|
|
9876
|
-
})
|
|
10068
|
+
});
|
|
9877
10069
|
if (resp.need_baseline.length > 0)
|
|
9878
10070
|
await healBaselines(db, cfg, transport, resp.need_baseline);
|
|
9879
10071
|
let healed = false;
|
|
@@ -9909,14 +10101,14 @@ async function healBaselines(db, cfg, transport, keys) {
|
|
|
9909
10101
|
const resp = await roundTrip(db, cfg, transport, changes, evict);
|
|
9910
10102
|
if (resp.share_state === "expired")
|
|
9911
10103
|
return;
|
|
9912
|
-
db
|
|
10104
|
+
writeTx(db, () => {
|
|
9913
10105
|
applyPartitionDiff(db, cfg.peerKey, {
|
|
9914
10106
|
entered: [...entered, ...pulledMemberRows(db, cfg, resp.changes)],
|
|
9915
10107
|
left: evict
|
|
9916
10108
|
});
|
|
9917
10109
|
const cur = readCursors(db, cfg.peerKey);
|
|
9918
10110
|
writeCursors(db, cfg.peerKey, { pull: resp.cursor, push: cur.push });
|
|
9919
|
-
})
|
|
10111
|
+
});
|
|
9920
10112
|
}
|
|
9921
10113
|
async function fullReconcile(db, cfg, transport) {
|
|
9922
10114
|
const members = computePartitionMembers(db, cfg.scope);
|
|
@@ -9924,11 +10116,11 @@ async function fullReconcile(db, cfg, transport) {
|
|
|
9924
10116
|
const resp = await roundTrip(db, cfg, transport, winners, [], members);
|
|
9925
10117
|
if (resp.share_state === "expired")
|
|
9926
10118
|
return;
|
|
9927
|
-
db
|
|
10119
|
+
writeTx(db, () => {
|
|
9928
10120
|
resetPartitionShadow(db, cfg.peerKey, members);
|
|
9929
10121
|
const cur = readCursors(db, cfg.peerKey);
|
|
9930
10122
|
writeCursors(db, cfg.peerKey, { pull: resp.cursor, push: cur.push });
|
|
9931
|
-
})
|
|
10123
|
+
});
|
|
9932
10124
|
}
|
|
9933
10125
|
async function roundTrip(db, cfg, transport, changes, evict, members) {
|
|
9934
10126
|
const resp = await transport({
|
|
@@ -10330,7 +10522,7 @@ function updatePublicSiteChannelUrls(db, siteId, siteName) {
|
|
|
10330
10522
|
return changed;
|
|
10331
10523
|
}
|
|
10332
10524
|
function applySiteUpdate(db, siteId, opts, hooks) {
|
|
10333
|
-
return db
|
|
10525
|
+
return withChangeGroup(db, "site.update", () => {
|
|
10334
10526
|
const updated = updateSite(db, siteId, {
|
|
10335
10527
|
...opts,
|
|
10336
10528
|
visibility: opts.visibility === "public" ? "private" : opts.visibility
|
|
@@ -10342,15 +10534,15 @@ function applySiteUpdate(db, siteId, opts, hooks) {
|
|
|
10342
10534
|
if (opts.name !== undefined)
|
|
10343
10535
|
updatePublicSiteChannelUrls(db, siteId, updated.name);
|
|
10344
10536
|
return getSite(db, siteId);
|
|
10345
|
-
})
|
|
10537
|
+
});
|
|
10346
10538
|
}
|
|
10347
10539
|
function applySiteDelete(db, siteId) {
|
|
10348
|
-
return db
|
|
10540
|
+
return withChangeGroup(db, "site.delete", () => {
|
|
10349
10541
|
if (!deleteSite(db, siteId))
|
|
10350
10542
|
return false;
|
|
10351
10543
|
revokeAllSiteChannels(db, siteId);
|
|
10352
10544
|
return true;
|
|
10353
|
-
})
|
|
10545
|
+
});
|
|
10354
10546
|
}
|
|
10355
10547
|
function revokeAllSiteChannels(db, siteId) {
|
|
10356
10548
|
const active = listSiteChannelRows(db, siteId).filter((channel) => channel.desired_state === "active");
|
|
@@ -10475,7 +10667,7 @@ var init_site_channel_store = __esm(() => {
|
|
|
10475
10667
|
policy_json: input.policy == null ? null : JSON.stringify(input.policy),
|
|
10476
10668
|
desired_state: input.desiredState ?? "active"
|
|
10477
10669
|
};
|
|
10478
|
-
db
|
|
10670
|
+
writeTx(db, () => {
|
|
10479
10671
|
if (!existing) {
|
|
10480
10672
|
const first = emit(db, "site_channels", id, "site_id", input.siteId);
|
|
10481
10673
|
emit(db, "site_channels", id, "created_hlc", first.hlc);
|
|
@@ -10485,7 +10677,7 @@ var init_site_channel_store = __esm(() => {
|
|
|
10485
10677
|
continue;
|
|
10486
10678
|
emit(db, "site_channels", id, col, value);
|
|
10487
10679
|
}
|
|
10488
|
-
})
|
|
10680
|
+
});
|
|
10489
10681
|
return getSiteChannelRow(db, id);
|
|
10490
10682
|
});
|
|
10491
10683
|
setSiteChannelDesiredState = grouped(function setSiteChannelDesiredState(db, id, desired) {
|
|
@@ -10763,14 +10955,13 @@ async function rotateStoragePeer(db, url, input) {
|
|
|
10763
10955
|
};
|
|
10764
10956
|
}
|
|
10765
10957
|
function removePeer(db, url) {
|
|
10766
|
-
|
|
10958
|
+
return writeTx(db, () => {
|
|
10767
10959
|
const changed = db.query("DELETE FROM peers WHERE url = ?").run(url).changes > 0;
|
|
10768
10960
|
db.query("DELETE FROM peer_grants WHERE peer_url = ?").run(url);
|
|
10769
10961
|
db.query("DELETE FROM storage_cursors WHERE peer_url = ?").run(url);
|
|
10770
10962
|
db.query("DELETE FROM room_rows WHERE peer_key = ?").run(url);
|
|
10771
10963
|
return changed;
|
|
10772
10964
|
});
|
|
10773
|
-
return tx();
|
|
10774
10965
|
}
|
|
10775
10966
|
function setPeerEnabled(db, url, enabled) {
|
|
10776
10967
|
return db.query("UPDATE peers SET enabled = ? WHERE url = ?").run(enabled ? 1 : 0, url).changes > 0;
|
|
@@ -10845,7 +11036,7 @@ async function syncPeerOnce(db, url, opts) {
|
|
|
10845
11036
|
result = await syncWithPeer(db, url, { timeoutMs: opts?.timeoutMs });
|
|
10846
11037
|
}
|
|
10847
11038
|
updatePeerStatus(db, url, "ok", null);
|
|
10848
|
-
const warnings = [];
|
|
11039
|
+
const warnings = [...result.warnings ?? []];
|
|
10849
11040
|
try {
|
|
10850
11041
|
if (peer?.kind !== "s3" && peer?.kind !== "room")
|
|
10851
11042
|
clearCoveredSiteRollbacks(db, url);
|
|
@@ -11014,20 +11205,20 @@ function normalizePublicBaseUrl(input) {
|
|
|
11014
11205
|
try {
|
|
11015
11206
|
parsed = new URL(input.trim());
|
|
11016
11207
|
} catch {
|
|
11017
|
-
throw new
|
|
11208
|
+
throw new MhError("invalid_input", "\u8BF7\u8F93\u5165\u5B8C\u6574\u7684 http(s) \u5730\u5740");
|
|
11018
11209
|
}
|
|
11019
11210
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
|
|
11020
|
-
throw new
|
|
11211
|
+
throw new MhError("invalid_input", "\u7AD9\u70B9\u5165\u53E3\u53EA\u652F\u6301 HTTP \u6216 HTTPS");
|
|
11021
11212
|
if (parsed.username || parsed.password || parsed.search || parsed.hash)
|
|
11022
|
-
throw new
|
|
11213
|
+
throw new MhError("invalid_input", "\u7AD9\u70B9\u5165\u53E3\u4E0D\u80FD\u5305\u542B\u51ED\u636E\u3001\u67E5\u8BE2\u53C2\u6570\u6216\u7247\u6BB5");
|
|
11023
11214
|
if (parsed.pathname !== "/" && parsed.pathname !== "")
|
|
11024
|
-
throw new
|
|
11215
|
+
throw new MhError("invalid_input", "\u7AD9\u70B9\u5165\u53E3\u5FC5\u987B\u662F\u57DF\u540D\u6839\u5730\u5740\uFF0C\u4E0D\u80FD\u5305\u542B\u8DEF\u5F84");
|
|
11025
11216
|
const host = parsed.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
11026
11217
|
const scope = hostScope(host);
|
|
11027
11218
|
if (scope === "invalid")
|
|
11028
|
-
throw new
|
|
11219
|
+
throw new MhError("invalid_input", "\u7AD9\u70B9\u5165\u53E3\u5FC5\u987B\u662F\u53EF\u8BBF\u95EE\u7684\u4E3B\u673A\u5730\u5740");
|
|
11029
11220
|
if (parsed.protocol === "http:" && scope === "public")
|
|
11030
|
-
throw new
|
|
11221
|
+
throw new MhError("invalid_input", "\u516C\u7F51\u5165\u53E3\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF1BHTTP \u4EC5\u5141\u8BB8\u672C\u673A\u6216\u5C40\u57DF\u7F51\u5730\u5740");
|
|
11031
11222
|
parsed.pathname = "";
|
|
11032
11223
|
const url = parsed.toString().replace(/\/+$/, "");
|
|
11033
11224
|
return { url, scope };
|
|
@@ -11075,6 +11266,7 @@ function setServerConfig(db, partial) {
|
|
|
11075
11266
|
var MAX_BLOB_UPLOAD_BYTES, K_HOST = "cfg_host", K_PORT = "cfg_port", K_SYNC_INTERVAL = "cfg_sync_interval", K_AUTO_SYNC = "cfg_auto_sync", K_BLOB_QUOTA = "cfg_blob_quota", K_PUBLIC_BASE_URL = "cfg_public_base_url", DEFAULT_CONFIG;
|
|
11076
11267
|
var init_config = __esm(() => {
|
|
11077
11268
|
init_token();
|
|
11269
|
+
init_errors();
|
|
11078
11270
|
MAX_BLOB_UPLOAD_BYTES = Number(process.env.METAHUB_MAX_BLOB_UPLOAD) || 100 * 1024 * 1024;
|
|
11079
11271
|
DEFAULT_CONFIG = {
|
|
11080
11272
|
host: "127.0.0.1",
|
|
@@ -12099,6 +12291,8 @@ function redeemPairingCode(db, code) {
|
|
|
12099
12291
|
}
|
|
12100
12292
|
function mintGrant(db, peerUrl, nodeId) {
|
|
12101
12293
|
const token = randomSuffix(32);
|
|
12294
|
+
if (nodeId)
|
|
12295
|
+
db.query("DELETE FROM peer_grants WHERE node_id = ?").run(nodeId);
|
|
12102
12296
|
db.query("INSERT INTO peer_grants (token, peer_url, node_id, created_at) VALUES (?, ?, ?, ?)").run(token, peerUrl, nodeId, Date.now());
|
|
12103
12297
|
return token;
|
|
12104
12298
|
}
|
|
@@ -12433,6 +12627,7 @@ async function refreshBucketPresence(db, url) {
|
|
|
12433
12627
|
}
|
|
12434
12628
|
var init_devices = __esm(() => {
|
|
12435
12629
|
init_errors();
|
|
12630
|
+
init_hlc();
|
|
12436
12631
|
init_node();
|
|
12437
12632
|
init_peers();
|
|
12438
12633
|
init_pairing();
|
|
@@ -12979,12 +13174,171 @@ var init_blob_routes = __esm(() => {
|
|
|
12979
13174
|
];
|
|
12980
13175
|
});
|
|
12981
13176
|
|
|
12982
|
-
// src/core/sync/
|
|
12983
|
-
function
|
|
13177
|
+
// src/core/sync/locale.ts
|
|
13178
|
+
function localeFromTags(tags) {
|
|
13179
|
+
if (!tags || tags.length === 0)
|
|
13180
|
+
return "zh-CN";
|
|
13181
|
+
for (const tag of tags) {
|
|
13182
|
+
if (!tag)
|
|
13183
|
+
continue;
|
|
13184
|
+
if (/^zh\b/i.test(tag))
|
|
13185
|
+
return "zh-CN";
|
|
13186
|
+
if (/^en\b/i.test(tag))
|
|
13187
|
+
return "en";
|
|
13188
|
+
}
|
|
13189
|
+
return "en";
|
|
13190
|
+
}
|
|
13191
|
+
function localeFromAcceptLanguage(header) {
|
|
13192
|
+
if (!header)
|
|
13193
|
+
return "zh-CN";
|
|
13194
|
+
return localeFromTags(header.split(",").map((s) => s.split(";")[0].trim()));
|
|
13195
|
+
}
|
|
13196
|
+
function localeFromCookie(header) {
|
|
13197
|
+
if (!header)
|
|
13198
|
+
return null;
|
|
13199
|
+
for (const part of header.split(";")) {
|
|
13200
|
+
const eq = part.indexOf("=");
|
|
13201
|
+
if (eq < 0)
|
|
13202
|
+
continue;
|
|
13203
|
+
if (part.slice(0, eq).trim() !== LANG_COOKIE)
|
|
13204
|
+
continue;
|
|
13205
|
+
const v = decodeURIComponent(part.slice(eq + 1).trim());
|
|
13206
|
+
return isLocale(v) ? v : null;
|
|
13207
|
+
}
|
|
13208
|
+
return null;
|
|
13209
|
+
}
|
|
13210
|
+
function pickLocale(req) {
|
|
13211
|
+
return localeFromCookie(req.headers.get("cookie")) ?? localeFromAcceptLanguage(req.headers.get("accept-language"));
|
|
13212
|
+
}
|
|
13213
|
+
var LANG_COOKIE = "mh-lang", isLocale = (v) => v === "zh-CN" || v === "en";
|
|
13214
|
+
|
|
13215
|
+
// src/core/sync/page-messages.ts
|
|
13216
|
+
function pm(locale, key, params) {
|
|
13217
|
+
const s = locale === "en" ? EN[key] : key;
|
|
13218
|
+
return params ? s.replace(/\{(\w+)\}/g, (m, k) => (k in params) ? String(params[k]) : m) : s;
|
|
13219
|
+
}
|
|
13220
|
+
function pmIfKnown(locale, text, params) {
|
|
13221
|
+
if (locale === "en" && text in EN)
|
|
13222
|
+
return pm(locale, text, params);
|
|
13223
|
+
return params ? pm(locale, text, params) : text;
|
|
13224
|
+
}
|
|
13225
|
+
function localizeError(locale, e) {
|
|
13226
|
+
if (e instanceof MhError && e.i18n)
|
|
13227
|
+
return pmIfKnown(locale, e.i18n.key, e.i18n.params);
|
|
12984
13228
|
const message = e instanceof Error ? e.message : String(e);
|
|
13229
|
+
return pmIfKnown(locale, message);
|
|
13230
|
+
}
|
|
13231
|
+
var EN;
|
|
13232
|
+
var init_page_messages = __esm(() => {
|
|
13233
|
+
init_errors();
|
|
13234
|
+
EN = {
|
|
13235
|
+
"\u672C\u673A\u903B\u8F91\u65F6\u949F\u6BD4\u7CFB\u7EDF\u65F6\u95F4\u8D85\u524D {min} \u5206\u949F\uFF08\u7CFB\u7EDF\u65F6\u949F\u66FE\u88AB\u8C03\u9519\uFF0C\u6216\u6536\u5230\u8FC7\u65F6\u949F\u9519\u8BEF\u8BBE\u5907\u7684\u6570\u636E\uFF09\uFF0C\u8FD0\u884C mh repair --clock \u4FEE\u590D": "This device's logical clock is {min} min ahead of wall time (the system clock was wrong, or data arrived from a device with a wrong clock); run mh repair --clock",
|
|
13236
|
+
"\u6570\u636E\u5E93\u6B63\u88AB\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u5199\u5165\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5": "The database is being written by another process; retry shortly",
|
|
13237
|
+
"\u901A\u8FC7 metahub \u5206\u4EAB": "Shared via metahub",
|
|
13238
|
+
"\u7531 metahub \u6258\u7BA1": "Hosted by metahub",
|
|
13239
|
+
"\uFF08\u7A7A\u6587\u6863\uFF09": "(empty document)",
|
|
13240
|
+
\u{6587}\u{6863}: "Document",
|
|
13241
|
+
\u{8868}\u{683c}: "Table",
|
|
13242
|
+
\u{7f16}\u{8f91}: "Edit",
|
|
13243
|
+
\u{7f16}\u{8f91}\u{6587}\u{6863}: "Edit document",
|
|
13244
|
+
\u{4fdd}\u{5b58}: "Save",
|
|
13245
|
+
"\u4FDD\u5B58\u4E2D\u2026": "Saving\u2026",
|
|
13246
|
+
\u{4fdd}\u{5b58}\u{5931}\u{8d25}: "Save failed",
|
|
13247
|
+
"\u5DF2\u4FDD\u5B58 \u2713": "Saved \u2713",
|
|
13248
|
+
"\u53EF\u7F16\u8F91\u6587\u672C/\u6570\u5B57/URL/\u65E5\u671F\u5355\u5143\u683C\uFF0C\u5931\u7126\u81EA\u52A8\u4FDD\u5B58": "Text, number, URL and date cells are editable; changes save on blur",
|
|
13249
|
+
"\u7F16\u8F91\u7AD9\u70B9\u6587\u4EF6\uFF08\u6587\u672C\u6587\u4EF6\u53EF\u5728\u7EBF\u7F16\u8F91\uFF1B\u4FDD\u5B58\u5373\u5BF9\u6240\u6709\u8BBF\u95EE\u8005\u751F\u6548\uFF09\u3002": "Edit site files (text files can be edited here; saving applies to every visitor).",
|
|
13250
|
+
"\uFF08\u6682\u65E0\u6587\u4EF6\uFF09": "(no files yet)",
|
|
13251
|
+
"\u9884\u89C8 \u2197": "Preview \u2197",
|
|
13252
|
+
"\uFF08\u4E8C\u8FDB\u5236\u6587\u4EF6\uFF0C\u4E0D\u53EF\u5728\u7EBF\u7F16\u8F91\uFF09": "(binary file, cannot be edited here)",
|
|
13253
|
+
"{name} \xB7 \u6587\u4EF6": "{name} \xB7 Files",
|
|
13254
|
+
"\uD83D\uDD12 \u6B64\u5206\u4EAB\u53D7\u53E3\u4EE4\u4FDD\u62A4": "\uD83D\uDD12 This share is protected by a passcode",
|
|
13255
|
+
"\u53E3\u4EE4\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5\u3002": "Wrong passcode, try again.",
|
|
13256
|
+
\u{53e3}\u{4ee4}: "Passcode",
|
|
13257
|
+
\u{89e3}\u{9501}: "Unlock",
|
|
13258
|
+
\u{53d7}\u{4fdd}\u{62a4}\u{7684}\u{5206}\u{4eab}: "Protected share",
|
|
13259
|
+
\u{590d}\u{5236}\u{5168}\u{6587}: "Copy all",
|
|
13260
|
+
\u{5df2}\u{590d}\u{5236}: "Copied",
|
|
13261
|
+
\u{590d}\u{5236}\u{5931}\u{8d25}: "Copy failed",
|
|
13262
|
+
\u{7ad9}\u{70b9}\u{5c1a}\u{672a}\u{540c}\u{6b65}: "Site not synced yet",
|
|
13263
|
+
"\u5206\u4EAB\u65B9\u8BBE\u5907\u4E0A\u7EBF\u540C\u6B65\u540E\u5373\u53EF\u8BBF\u95EE\u3002": "Available once the sharing device comes online and syncs.",
|
|
13264
|
+
\u{9875}\u{9762}\u{4e0d}\u{5b58}\u{5728}: "Page not found",
|
|
13265
|
+
"\u8FD9\u4E2A\u7AD9\u70B9\u91CC\u6CA1\u6709\u8FD9\u4E2A\u9875\u9762\u6216\u6587\u4EF6\u3002": "This site has no such page or file.",
|
|
13266
|
+
\u{8d44}\u{6e90}\u{6682}\u{4e0d}\u{53ef}\u{7528}: "Resource temporarily unavailable",
|
|
13267
|
+
"\u6587\u4EF6\u5185\u5BB9\u5C1A\u672A\u540C\u6B65\u5230\u623F\u95F4\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002": "The file content has not synced to the room yet. Try again later.",
|
|
13268
|
+
"\u6587\u4EF6\u7684\u5185\u5BB9\u6682\u65F6\u65E0\u6CD5\u53D6\u5F97\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002": "The file content cannot be retrieved right now. Try again later.",
|
|
13269
|
+
\u{7ad9}\u{70b9}\u{4e0d}\u{5b58}\u{5728}: "Site not found",
|
|
13270
|
+
"\u6CA1\u6709\u540D\u4E3A \u201C{name}\u201D \u7684\u7AD9\u70B9\u3002": "There is no site named \u201C{name}\u201D.",
|
|
13271
|
+
\u{8fd4}\u{56de}\u{7ad9}\u{70b9}\u{9996}\u{9875}: "Back to site home",
|
|
13272
|
+
"\u9A8C\u8BC1\u8BBF\u95EE\u4EE4\u724C \xB7 metahub": "Verify access token \xB7 metahub",
|
|
13273
|
+
\u{8f93}\u{5165}\u{8bbf}\u{95ee}\u{4ee4}\u{724c}: "Enter the access token",
|
|
13274
|
+
"\u6B64\u670D\u52A1\u5668\u5DF2\u5F00\u542F\u8BBF\u95EE\u4FDD\u62A4\u3002\u5728\u5DF2\u767B\u5F55\u8BBE\u5907\u7684\u300C\u8BBE\u7F6E \u2192 \u8BBE\u5907\u4E0E\u6388\u6743\u300D\u83B7\u53D6\u767B\u5F55\u94FE\u63A5\u6216\u4E8C\u7EF4\u7801,\u6216\u5728\u670D\u52A1\u5668\u4E0A\u8FD0\u884C {cmd}\u3002": "This server requires an access token. Get a login link or QR code from Settings \u2192 Devices on a signed-in device, or run {cmd} on the server.",
|
|
13275
|
+
\u{7c98}\u{8d34}\u{8bbf}\u{95ee}\u{4ee4}\u{724c}\u{6216}\u{767b}\u{5f55}\u{94fe}\u{63a5}: "Paste the access token or login link",
|
|
13276
|
+
\u{663e}\u{793a}\u{4ee4}\u{724c}: "Show token",
|
|
13277
|
+
\u{9690}\u{85cf}\u{4ee4}\u{724c}: "Hide token",
|
|
13278
|
+
\u{89e3}\u{9501}\u{5e76}\u{8fdb}\u{5165}: "Unlock and enter",
|
|
13279
|
+
"\u8BF7\u8F93\u5165\u8BBF\u95EE\u4EE4\u724C\u3002": "Enter the access token.",
|
|
13280
|
+
"\u9A8C\u8BC1\u4E2D\u2026": "Verifying\u2026",
|
|
13281
|
+
"\u4EE4\u724C\u65E0\u6548,\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002": "Invalid token. Check it and try again.",
|
|
13282
|
+
"\u767B\u5F55\u5DF2\u8FC7\u671F,\u8BF7\u91CD\u65B0\u8F93\u5165\u4EE4\u724C\u3002": "Session expired. Enter the token again.",
|
|
13283
|
+
\u{9644}\u{4ef6}\u{5df2}\u{5931}\u{6548}: "Attachment unavailable",
|
|
13284
|
+
\u{94fe}\u{63a5}\u{7f3a}\u{5c11}\u{5206}\u{4eab}\u{6570}\u{636e}: "The link is missing share data",
|
|
13285
|
+
\u{8bf7}\u{8f93}\u{5165}\u{5206}\u{4eab}\u{53e3}\u{4ee4}: "Enter the share passcode",
|
|
13286
|
+
\u{94fe}\u{63a5}\u{7f3a}\u{5c11}\u{5bc6}\u{94a5}: "The link is missing its key",
|
|
13287
|
+
\u{53e3}\u{4ee4}\u{9519}\u{8bef}\u{6216}\u{94fe}\u{63a5}\u{5df2}\u{5931}\u{6548}: "Wrong passcode or the link has expired",
|
|
13288
|
+
\u{94fe}\u{63a5}\u{5df2}\u{5931}\u{6548}\u{6216}\u{5bc6}\u{94a5}\u{4e0d}\u{6b63}\u{786e}: "The link has expired or the key is wrong",
|
|
13289
|
+
\u{5206}\u{4eab}: "Share",
|
|
13290
|
+
\u{6b63}\u{5728}\u{52a0}\u{8f7d}: "Loading",
|
|
13291
|
+
"\u2705 \u5DF2\u6388\u6743": "\u2705 Authorized",
|
|
13292
|
+
"\u53EF\u4EE5\u5173\u95ED\u6B64\u6807\u7B7E\u9875\uFF0C\u56DE\u5230 MetaHub \u7EE7\u7EED\u90E8\u7F72\u3002": "You can close this tab and return to MetaHub to continue deploying.",
|
|
13293
|
+
\u{7ad9}\u{70b9}\u{5165}\u{53e3}\u{5065}\u{5eb7}\u{54cd}\u{5e94}\u{8fc7}\u{5927}: "Site entry health response is too large",
|
|
13294
|
+
\u{7ad9}\u{70b9}\u{5165}\u{53e3}\u{4e0d}\u{80fd}\u{6307}\u{5411}\u{4e91}\u{5e73}\u{53f0}\u{5143}\u{6570}\u{636e}\u{670d}\u{52a1}: "Site entry must not point at a cloud metadata service",
|
|
13295
|
+
"Desktop sidecar \u4EC5\u7528\u4E8E\u672C\u673A\u9884\u89C8\uFF1B\u8BF7\u542F\u52A8\u5E26\u9274\u6743\u7684 mh --server\uFF0C\u6216\u4F7F\u7528 Edge": "The desktop sidecar is for local preview only; start an authenticated mh --server, or use Edge",
|
|
13296
|
+
"\u7AD9\u70B9\u5165\u53E3\u5065\u5EB7\u68C0\u67E5\u5931\u8D25\uFF08HTTP {status}\uFF09": "Site entry health check failed (HTTP {status})",
|
|
13297
|
+
\u{7ad9}\u{70b9}\u{5165}\u{53e3}\u{5065}\u{5eb7}\u{54cd}\u{5e94}\u{65e0}\u{6548}: "Site entry health response is invalid",
|
|
13298
|
+
"\u7AD9\u70B9\u5165\u53E3\u8282\u70B9\u4E0D\u5339\u914D\uFF08\u671F\u671B {expected}\uFF0C\u5B9E\u9645 {actual}\uFF09\uFF1B\u8FD9\u662F\u9632\u8BEF\u914D\u68C0\u67E5\uFF0C\u4E0D\u662F\u8EAB\u4EFD\u8BA4\u8BC1": "Site entry node mismatch (expected {expected}, got {actual}); this is a misconfiguration guard, not authentication",
|
|
13299
|
+
"\u76EE\u6807\u8BBE\u5907\u7248\u672C\u4E0D\u652F\u6301\u5B9A\u5411\u53D1\u5E03\u6E20\u9053\uFF1B\u8BF7\u5148\u5347\u7EA7\u8BE5\u8BBE\u5907\uFF0C\u518D\u91CD\u65B0\u9A8C\u8BC1\u5165\u53E3": "The target device does not support targeted publishing channels; upgrade it, then verify the entry again",
|
|
13300
|
+
"\u65E0\u6CD5\u9A8C\u8BC1\u7AD9\u70B9\u5165\u53E3\uFF1A\u8FDE\u63A5\u8D85\u65F6": "Could not verify the site entry: connection timed out",
|
|
13301
|
+
"\u65E0\u6CD5\u9A8C\u8BC1\u7AD9\u70B9\u5165\u53E3\uFF1A{msg}": "Could not verify the site entry: {msg}",
|
|
13302
|
+
"\u8BF7\u5148\u5728\u201C\u8BBE\u7F6E \u2192 \u7AD9\u70B9\u6258\u7BA1\u201D\u914D\u7F6E\u5E76\u9A8C\u8BC1\u5F53\u524D\u8BBE\u5907\u7684\u516C\u7F51\u6216\u5C40\u57DF\u7F51\u5165\u53E3": "Configure and verify this device's public or LAN entry under Settings \u2192 Site hosting first",
|
|
13303
|
+
"\u914D\u5BF9\u8BBE\u5907\u7F3A\u5C11\u8282\u70B9\u8EAB\u4EFD\uFF0C\u91CD\u65B0\u914D\u5BF9\u540E\u518D\u8BD5": "The paired device has no node identity; pair again and retry",
|
|
13304
|
+
"\u8BE5\u7AD9\u70B9\u4ECD\u5728\u7B49\u5F85\u76EE\u6807\u8BBE\u5907\u786E\u8BA4\u56DE\u6EDA\uFF0C\u8BF7\u5148\u91CD\u8BD5\u56DE\u6EDA": "This site is still waiting for the target device to confirm the rollback; retry the rollback first",
|
|
13305
|
+
\u{914d}\u{5bf9}\u{8bbe}\u{5907}\u{540c}\u{6b65}\u{5931}\u{8d25}: "Sync with the paired device failed",
|
|
13306
|
+
\u{6ca1}\u{6709}\u{5f85}\u{786e}\u{8ba4}\u{7684}\u{7ad9}\u{70b9}\u{56de}\u{6eda}: "No site rollback is awaiting confirmation",
|
|
13307
|
+
"\u76EE\u6807\u914D\u5BF9\u8BBE\u5907\u4E0D\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u914D\u5BF9\u540E\u91CD\u8BD5": "The target paired device does not exist; pair again and retry",
|
|
13308
|
+
\u{7ad9}\u{70b9}\u{6e20}\u{9053}\u{5df2}\u{4e0d}\u{5b58}\u{5728}: "The site channel no longer exists",
|
|
13309
|
+
"OAuth \u6D41\u7A0B\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55": "The OAuth flow does not exist or has expired; sign in again",
|
|
13310
|
+
"OAuth \u6D41\u7A0B\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u8BD5": "The OAuth flow does not exist or has expired; try again",
|
|
13311
|
+
"Cloudflare \u6388\u6743\u5931\u8D25": "Cloudflare authorization failed",
|
|
13312
|
+
"Cloudflare \u6388\u6743\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u7A0D\u5019": "Cloudflare authorization is not finished yet; please wait",
|
|
13313
|
+
"\u7F3A\u5C11 Cloudflare \u8D26\u53F7 id": "Missing Cloudflare account id",
|
|
13314
|
+
"\u7F3A\u5C11 Cloudflare \u51ED\u636E\uFF08\u8BF7\u5148\u767B\u5F55\u6216\u63D0\u4F9B API Token\uFF09": "Missing Cloudflare credentials (sign in first or provide an API token)",
|
|
13315
|
+
"Cloudflare \u6388\u6743\u5931\u8D25\uFF1A{detail}": "Cloudflare authorization failed: {detail}",
|
|
13316
|
+
"\u672A\u8FD4\u56DE access token": "no access token returned",
|
|
13317
|
+
"\u65E0\u6CD5\u8FDE\u63A5 Cloudflare \u6388\u6743\u670D\u52A1\uFF1A{msg}": "Could not reach the Cloudflare authorization service: {msg}",
|
|
13318
|
+
"Cloudflare \u4EE4\u724C\u4EA4\u6362\u5931\u8D25\uFF08HTTP {status}\uFF09": "Cloudflare token exchange failed (HTTP {status})",
|
|
13319
|
+
"\u65E0\u6CD5\u8BFB\u53D6 Cloudflare \u8D26\u53F7\u5217\u8868\uFF1A{msg}": "Could not read the Cloudflare account list: {msg}",
|
|
13320
|
+
"\u8BFB\u53D6 Cloudflare \u8D26\u53F7\u5931\u8D25\uFF08HTTP {status}\uFF09": "Reading Cloudflare accounts failed (HTTP {status})",
|
|
13321
|
+
"\u672A\u914D\u7F6E Cloudflare OAuth \u5BA2\u6237\u7AEF\uFF0C\u8BF7\u6539\u7528 API Token \u90E8\u7F72": "No Cloudflare OAuth client is configured; deploy with an API token instead",
|
|
13322
|
+
"Cloudflare \u6388\u6743\u8D85\u65F6\uFF0C\u8BF7\u91CD\u8BD5": "Cloudflare authorization timed out; try again",
|
|
13323
|
+
"Cloudflare \u6388\u6743\u88AB\u62D2\u7EDD\uFF1A{detail}": "Cloudflare authorization was denied: {detail}",
|
|
13324
|
+
"OAuth state \u4E0D\u5339\u914D\uFF0C\u7591\u4F3C\u4F2A\u9020\u56DE\u8C03\uFF0C\u5DF2\u4E2D\u6B62": "OAuth state mismatch; the callback looks forged, aborted",
|
|
13325
|
+
"Cloudflare \u672A\u8FD4\u56DE\u6388\u6743\u7801": "Cloudflare did not return an authorization code",
|
|
13326
|
+
"\u8BF7\u8F93\u5165\u5B8C\u6574\u7684 http(s) \u5730\u5740": "Enter a complete http(s) address",
|
|
13327
|
+
"\u7AD9\u70B9\u5165\u53E3\u53EA\u652F\u6301 HTTP \u6216 HTTPS": "Site entry supports HTTP or HTTPS only",
|
|
13328
|
+
"\u7AD9\u70B9\u5165\u53E3\u4E0D\u80FD\u5305\u542B\u51ED\u636E\u3001\u67E5\u8BE2\u53C2\u6570\u6216\u7247\u6BB5": "Site entry must not contain credentials, query parameters or fragments",
|
|
13329
|
+
"\u7AD9\u70B9\u5165\u53E3\u5FC5\u987B\u662F\u57DF\u540D\u6839\u5730\u5740\uFF0C\u4E0D\u80FD\u5305\u542B\u8DEF\u5F84": "Site entry must be a domain root without a path",
|
|
13330
|
+
\u{7ad9}\u{70b9}\u{5165}\u{53e3}\u{5fc5}\u{987b}\u{662f}\u{53ef}\u{8bbf}\u{95ee}\u{7684}\u{4e3b}\u{673a}\u{5730}\u{5740}: "Site entry must be a reachable host address",
|
|
13331
|
+
"\u516C\u7F51\u5165\u53E3\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF1BHTTP \u4EC5\u5141\u8BB8\u672C\u673A\u6216\u5C40\u57DF\u7F51\u5730\u5740": "A public entry must use HTTPS; HTTP is only allowed for local or LAN addresses"
|
|
13332
|
+
};
|
|
13333
|
+
});
|
|
13334
|
+
|
|
13335
|
+
// src/core/sync/routes.ts
|
|
13336
|
+
function errorResponse(e, req) {
|
|
13337
|
+
const message = req ? localizeError(pickLocale(req), e) : e instanceof Error ? e.message : String(e);
|
|
12985
13338
|
const code = errorCode(e);
|
|
12986
13339
|
return Response.json(code ? { error: message, code } : { error: message }, {
|
|
12987
|
-
status: code ? HTTP_STATUS[code] : 400
|
|
13340
|
+
status: code ? HTTP_STATUS[code] : 400,
|
|
13341
|
+
...code === "busy" ? { headers: { "retry-after": "1" } } : {}
|
|
12988
13342
|
});
|
|
12989
13343
|
}
|
|
12990
13344
|
var HTTP_STATUS, syncRoutes, routes;
|
|
@@ -12995,6 +13349,7 @@ var init_routes = __esm(() => {
|
|
|
12995
13349
|
init_peers_routes();
|
|
12996
13350
|
init_blob_routes();
|
|
12997
13351
|
init_errors();
|
|
13352
|
+
init_page_messages();
|
|
12998
13353
|
init_package();
|
|
12999
13354
|
HTTP_STATUS = {
|
|
13000
13355
|
invalid_input: 400,
|
|
@@ -13005,6 +13360,8 @@ var init_routes = __esm(() => {
|
|
|
13005
13360
|
auth: 401,
|
|
13006
13361
|
network: 502,
|
|
13007
13362
|
rate_limited: 429,
|
|
13363
|
+
busy: 503,
|
|
13364
|
+
clock_skew: 409,
|
|
13008
13365
|
port_in_use: 500
|
|
13009
13366
|
};
|
|
13010
13367
|
syncRoutes = [
|
|
@@ -13016,12 +13373,18 @@ var init_routes = __esm(() => {
|
|
|
13016
13373
|
response: SyncResponseSchema,
|
|
13017
13374
|
async handler(req, { db, node }) {
|
|
13018
13375
|
const body = await req.json();
|
|
13019
|
-
|
|
13376
|
+
const r = ingestDetailed(db, body.changes ?? []);
|
|
13377
|
+
const skewed = Object.values(r.skewed).reduce((a, b) => a + b, 0);
|
|
13020
13378
|
const batch = changesAfterSeq(db, body.since ?? 0, {
|
|
13021
13379
|
limit: body.limit,
|
|
13022
13380
|
excludeDatasets: body.exclude_datasets
|
|
13023
13381
|
});
|
|
13024
|
-
return Response.json({
|
|
13382
|
+
return Response.json({
|
|
13383
|
+
node_id: node,
|
|
13384
|
+
changes: batch.changes,
|
|
13385
|
+
cursor: batch.cursor,
|
|
13386
|
+
...skewed ? { skewed_rejected: skewed } : {}
|
|
13387
|
+
});
|
|
13025
13388
|
}
|
|
13026
13389
|
},
|
|
13027
13390
|
{
|
|
@@ -13229,12 +13592,22 @@ function renewToken(req, url, cfg) {
|
|
|
13229
13592
|
function wantsHtml(req) {
|
|
13230
13593
|
return req.method === "GET" && (req.headers.get("accept") ?? "").includes("text/html");
|
|
13231
13594
|
}
|
|
13232
|
-
function unlockPage() {
|
|
13233
|
-
|
|
13595
|
+
function unlockPage(locale = "zh-CN") {
|
|
13596
|
+
const m = (key) => escapeAttr(pm(locale, key));
|
|
13597
|
+
const L = JSON.stringify({
|
|
13598
|
+
go: pm(locale, "\u89E3\u9501\u5E76\u8FDB\u5165"),
|
|
13599
|
+
show: pm(locale, "\u663E\u793A\u4EE4\u724C"),
|
|
13600
|
+
hide: pm(locale, "\u9690\u85CF\u4EE4\u724C"),
|
|
13601
|
+
empty: pm(locale, "\u8BF7\u8F93\u5165\u8BBF\u95EE\u4EE4\u724C\u3002"),
|
|
13602
|
+
verifying: pm(locale, "\u9A8C\u8BC1\u4E2D\u2026"),
|
|
13603
|
+
invalid: pm(locale, "\u4EE4\u724C\u65E0\u6548,\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002"),
|
|
13604
|
+
expired: pm(locale, "\u767B\u5F55\u5DF2\u8FC7\u671F,\u8BF7\u91CD\u65B0\u8F93\u5165\u4EE4\u724C\u3002")
|
|
13605
|
+
});
|
|
13606
|
+
return `<!doctype html><html lang="${locale}"><head>
|
|
13234
13607
|
<meta charset="utf-8">
|
|
13235
13608
|
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
13236
13609
|
<meta name="theme-color" content="#ffffff">
|
|
13237
|
-
<title
|
|
13610
|
+
<title>${m("\u9A8C\u8BC1\u8BBF\u95EE\u4EE4\u724C \xB7 metahub")}</title>
|
|
13238
13611
|
<script>
|
|
13239
13612
|
// FOUC-guard theme resolution, same key/logic as src/webui/theme.ts.
|
|
13240
13613
|
try {
|
|
@@ -13248,18 +13621,18 @@ function unlockPage() {
|
|
|
13248
13621
|
<div class="boot" id="boot"><svg viewBox="0 0 24 24">${CUBE_SVG}</svg></div>
|
|
13249
13622
|
<form class="card" id="f" style="display:none" autocomplete="on">
|
|
13250
13623
|
<div class="brand"><svg viewBox="0 0 24 24">${CUBE_SVG}</svg></div>
|
|
13251
|
-
<h1
|
|
13252
|
-
<p class="sub"
|
|
13624
|
+
<h1>${m("\u8F93\u5165\u8BBF\u95EE\u4EE4\u724C")}</h1>
|
|
13625
|
+
<p class="sub">${pm(locale, "\u6B64\u670D\u52A1\u5668\u5DF2\u5F00\u542F\u8BBF\u95EE\u4FDD\u62A4\u3002\u5728\u5DF2\u767B\u5F55\u8BBE\u5907\u7684\u300C\u8BBE\u7F6E \u2192 \u8BBE\u5907\u4E0E\u6388\u6743\u300D\u83B7\u53D6\u767B\u5F55\u94FE\u63A5\u6216\u4E8C\u7EF4\u7801,\u6216\u5728\u670D\u52A1\u5668\u4E0A\u8FD0\u884C {cmd}\u3002", { cmd: "<code>mh token show</code>" })}</p>
|
|
13253
13626
|
<div class="field">
|
|
13254
|
-
<input id="t" type="password" placeholder="\u7C98\u8D34\u8BBF\u95EE\u4EE4\u724C\u6216\u767B\u5F55\u94FE\u63A5"
|
|
13627
|
+
<input id="t" type="password" placeholder="${m("\u7C98\u8D34\u8BBF\u95EE\u4EE4\u724C\u6216\u767B\u5F55\u94FE\u63A5")}"
|
|
13255
13628
|
autocomplete="current-password" autocapitalize="off" autocorrect="off" spellcheck="false" enterkeyhint="go">
|
|
13256
|
-
<button type="button" class="peek" id="peek" aria-label="\u663E\u793A\u4EE4\u724C"><svg viewBox="0 0 24 24">${EYE_SVG}</svg></button>
|
|
13629
|
+
<button type="button" class="peek" id="peek" aria-label="${m("\u663E\u793A\u4EE4\u724C")}"><svg viewBox="0 0 24 24">${EYE_SVG}</svg></button>
|
|
13257
13630
|
</div>
|
|
13258
13631
|
<p class="err" id="e" style="display:none"></p>
|
|
13259
|
-
<button type="submit" class="go" id="go"
|
|
13632
|
+
<button type="submit" class="go" id="go">${m("\u89E3\u9501\u5E76\u8FDB\u5165")}</button>
|
|
13260
13633
|
</form>
|
|
13261
13634
|
<script>
|
|
13262
|
-
var KEY = "mh_token";
|
|
13635
|
+
var KEY = "mh_token", L = ${L};
|
|
13263
13636
|
var form = document.getElementById("f"), boot = document.getElementById("boot");
|
|
13264
13637
|
var input = document.getElementById("t"), errEl = document.getElementById("e");
|
|
13265
13638
|
var goBtn = document.getElementById("go"), peek = document.getElementById("peek");
|
|
@@ -13284,7 +13657,7 @@ function unlockPage() {
|
|
|
13284
13657
|
}
|
|
13285
13658
|
function fail(msg) {
|
|
13286
13659
|
goBtn.disabled = false;
|
|
13287
|
-
goBtn.
|
|
13660
|
+
goBtn.textContent = L.go;
|
|
13288
13661
|
errEl.textContent = msg;
|
|
13289
13662
|
errEl.style.display = "flex";
|
|
13290
13663
|
form.classList.remove("bad");
|
|
@@ -13297,7 +13670,7 @@ function unlockPage() {
|
|
|
13297
13670
|
var pw = input.type === "password";
|
|
13298
13671
|
input.type = pw ? "text" : "password";
|
|
13299
13672
|
peek.innerHTML = '<svg viewBox="0 0 24 24">' + (pw ? ${JSON.stringify(EYE_OFF_SVG)} : ${JSON.stringify(EYE_SVG)}) + "</svg>";
|
|
13300
|
-
peek.setAttribute("aria-label", pw ?
|
|
13673
|
+
peek.setAttribute("aria-label", pw ? L.hide : L.show);
|
|
13301
13674
|
input.focus();
|
|
13302
13675
|
});
|
|
13303
13676
|
input.addEventListener("input", function () {
|
|
@@ -13307,9 +13680,9 @@ function unlockPage() {
|
|
|
13307
13680
|
form.addEventListener("submit", function (ev) {
|
|
13308
13681
|
ev.preventDefault();
|
|
13309
13682
|
var token = normalize(input.value);
|
|
13310
|
-
if (!token) { fail(
|
|
13683
|
+
if (!token) { fail(L.empty); return; }
|
|
13311
13684
|
goBtn.disabled = true;
|
|
13312
|
-
goBtn.innerHTML = '<span class="spin"></span
|
|
13685
|
+
goBtn.innerHTML = '<span class="spin"></span>' + L.verifying;
|
|
13313
13686
|
var hdr = { headers: { authorization: "Bearer " + token } };
|
|
13314
13687
|
// Prefer the renewal endpoint (managed mode returns the canonical token,
|
|
13315
13688
|
// also upgrading a pasted in-grace token). Fall back to a cheap
|
|
@@ -13320,7 +13693,7 @@ function unlockPage() {
|
|
|
13320
13693
|
.then(function (d) {
|
|
13321
13694
|
if (d && d.token) { save(d.token); location.reload(); return; }
|
|
13322
13695
|
return fetch("/api/version", hdr).then(function (r) {
|
|
13323
|
-
if (r.status === 401) { fail(
|
|
13696
|
+
if (r.status === 401) { fail(L.invalid); return; }
|
|
13324
13697
|
// 200 (static-token mode) or no UI (404) \u2192 trust it and reload.
|
|
13325
13698
|
save(token); location.reload();
|
|
13326
13699
|
});
|
|
@@ -13337,7 +13710,7 @@ function unlockPage() {
|
|
|
13337
13710
|
.then(function (r) { return r.ok ? r.json() : null; })
|
|
13338
13711
|
.then(function (d) {
|
|
13339
13712
|
if (d && d.token) { save(d.token); location.reload(); }
|
|
13340
|
-
else showForm(
|
|
13713
|
+
else showForm(L.expired);
|
|
13341
13714
|
})
|
|
13342
13715
|
.catch(function () { showForm(""); });
|
|
13343
13716
|
} else {
|
|
@@ -13465,8 +13838,9 @@ var COOKIE = "mh_token", COOKIE_ATTRS = "path=/; SameSite=Strict; Max-Age=315360
|
|
|
13465
13838
|
@keyframes spin{to{transform:rotate(360deg)}}
|
|
13466
13839
|
@media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important}
|
|
13467
13840
|
.brand path{stroke-dashoffset:0}}
|
|
13468
|
-
|
|
13841
|
+
`, escapeAttr = (v) => v.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
13469
13842
|
var init_auth = __esm(() => {
|
|
13843
|
+
init_page_messages();
|
|
13470
13844
|
init_inject_runtime();
|
|
13471
13845
|
init_token();
|
|
13472
13846
|
init_pairing();
|
|
@@ -13496,7 +13870,9 @@ var init_http_status = __esm(() => {
|
|
|
13496
13870
|
stale: 409,
|
|
13497
13871
|
conflict: 409,
|
|
13498
13872
|
auth: 401,
|
|
13499
|
-
rate_limited: 429
|
|
13873
|
+
rate_limited: 429,
|
|
13874
|
+
busy: 503,
|
|
13875
|
+
clock_skew: 409
|
|
13500
13876
|
};
|
|
13501
13877
|
});
|
|
13502
13878
|
|
|
@@ -13851,6 +14227,29 @@ function isFenceClose(line, char, len) {
|
|
|
13851
14227
|
}
|
|
13852
14228
|
return trimmed.length >= len;
|
|
13853
14229
|
}
|
|
14230
|
+
function fenceMask(lines) {
|
|
14231
|
+
const mask = new Array(lines.length).fill(false);
|
|
14232
|
+
for (let i = 0;i < lines.length; i++) {
|
|
14233
|
+
const m = lines[i].match(RE.fenceOpen);
|
|
14234
|
+
if (!m)
|
|
14235
|
+
continue;
|
|
14236
|
+
const ch = m[1][0];
|
|
14237
|
+
const len = m[1].length;
|
|
14238
|
+
let close = -1;
|
|
14239
|
+
for (let j = i + 1;j < lines.length; j++) {
|
|
14240
|
+
if (isFenceClose(lines[j], ch, len)) {
|
|
14241
|
+
close = j;
|
|
14242
|
+
break;
|
|
14243
|
+
}
|
|
14244
|
+
}
|
|
14245
|
+
if (close === -1)
|
|
14246
|
+
continue;
|
|
14247
|
+
for (let j = i;j <= close; j++)
|
|
14248
|
+
mask[j] = true;
|
|
14249
|
+
i = close;
|
|
14250
|
+
}
|
|
14251
|
+
return mask;
|
|
14252
|
+
}
|
|
13854
14253
|
function cleanLang(lang) {
|
|
13855
14254
|
return lang.trim().replace(/[^A-Za-z0-9_+.#-]/g, "");
|
|
13856
14255
|
}
|
|
@@ -13985,29 +14384,6 @@ var init_inline = __esm(() => {
|
|
|
13985
14384
|
});
|
|
13986
14385
|
|
|
13987
14386
|
// src/core/md/heal.ts
|
|
13988
|
-
function fenceMask(lines) {
|
|
13989
|
-
const mask = new Array(lines.length).fill(false);
|
|
13990
|
-
for (let i = 0;i < lines.length; i++) {
|
|
13991
|
-
const m = lines[i].match(RE.fenceOpen);
|
|
13992
|
-
if (!m)
|
|
13993
|
-
continue;
|
|
13994
|
-
const ch = m[1][0];
|
|
13995
|
-
const len = m[1].length;
|
|
13996
|
-
let close = -1;
|
|
13997
|
-
for (let j = i + 1;j < lines.length; j++) {
|
|
13998
|
-
if (isFenceClose(lines[j], ch, len)) {
|
|
13999
|
-
close = j;
|
|
14000
|
-
break;
|
|
14001
|
-
}
|
|
14002
|
-
}
|
|
14003
|
-
if (close === -1)
|
|
14004
|
-
continue;
|
|
14005
|
-
for (let j = i;j <= close; j++)
|
|
14006
|
-
mask[j] = true;
|
|
14007
|
-
i = close;
|
|
14008
|
-
}
|
|
14009
|
-
return mask;
|
|
14010
|
-
}
|
|
14011
14387
|
function healLegacyMarkdown(src) {
|
|
14012
14388
|
if (!MAYBE_LEGACY.test(src))
|
|
14013
14389
|
return src;
|
|
@@ -14275,7 +14651,7 @@ async function serveSite(req, ctx, auth, opts = {}) {
|
|
|
14275
14651
|
const ambientOnly = mutating && authActive(auth) && explicitToken(req, url) == null;
|
|
14276
14652
|
if (!ambientOnly && hasValidToken(req, url, auth)) {
|
|
14277
14653
|
if (!site)
|
|
14278
|
-
return
|
|
14654
|
+
return siteNotFound(req, name);
|
|
14279
14655
|
if (!opts.forwardApi)
|
|
14280
14656
|
return new Response("not found", { status: 404 });
|
|
14281
14657
|
const fwd = new Request(`${url.origin}/${filePath}${url.search}`, req);
|
|
@@ -14302,17 +14678,18 @@ async function serveSite(req, ctx, auth, opts = {}) {
|
|
|
14302
14678
|
return serveSiteFile(req, ctx.db, site.id, filePath, { spa: site.spa === 1, isPublic: true });
|
|
14303
14679
|
}
|
|
14304
14680
|
if (!hasValidToken(req, url, auth)) {
|
|
14305
|
-
return wantsHtml(req) ? new Response(unlockPage(), { headers: { ...HTML_HEADERS, "x-mh-unlock": "1" } }) : unauthorized();
|
|
14681
|
+
return wantsHtml(req) ? new Response(unlockPage(pickLocale(req)), { headers: { ...HTML_HEADERS, "x-mh-unlock": "1" } }) : unauthorized();
|
|
14306
14682
|
}
|
|
14307
14683
|
if (!site)
|
|
14308
|
-
return
|
|
14684
|
+
return siteNotFound(req, name);
|
|
14309
14685
|
const res = await serveSiteFile(req, ctx.db, site.id, filePath, { spa: site.spa === 1 });
|
|
14310
14686
|
return withShim(res, auth, req, url);
|
|
14311
14687
|
}
|
|
14312
14688
|
async function serveSiteFile(req, db, siteId, path, opts = {}) {
|
|
14689
|
+
const locale = pickLocale(req);
|
|
14313
14690
|
const meta = getFileMetaForServe(db, siteId, path, { spa: opts.spa });
|
|
14314
14691
|
if (!meta)
|
|
14315
|
-
return notFoundResponse("\u9875\u9762\u4E0D\u5B58\u5728", "\u8FD9\u4E2A\u7AD9\u70B9\u91CC\u6CA1\u6709\u8FD9\u4E2A\u9875\u9762\u6216\u6587\u4EF6\u3002");
|
|
14692
|
+
return notFoundResponse(locale, pm(locale, "\u9875\u9762\u4E0D\u5B58\u5728"), pm(locale, "\u8FD9\u4E2A\u7AD9\u70B9\u91CC\u6CA1\u6709\u8FD9\u4E2A\u9875\u9762\u6216\u6587\u4EF6\u3002"));
|
|
14316
14693
|
const cacheControl = siteCacheControl(meta.row.content_type, meta.row.encoding, opts.isPublic ?? false);
|
|
14317
14694
|
const headers = { etag: meta.etag, "cache-control": cacheControl };
|
|
14318
14695
|
if (etagMatches(req.headers.get("if-none-match"), meta.etag)) {
|
|
@@ -14320,7 +14697,7 @@ async function serveSiteFile(req, db, siteId, path, opts = {}) {
|
|
|
14320
14697
|
}
|
|
14321
14698
|
const bytes = await decodeFileRow(db, meta.row);
|
|
14322
14699
|
if (!bytes) {
|
|
14323
|
-
return notFoundResponse("\u8D44\u6E90\u6682\u4E0D\u53EF\u7528", "\u6587\u4EF6\u7684\u5185\u5BB9\u6682\u65F6\u65E0\u6CD5\u53D6\u5F97\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002");
|
|
14700
|
+
return notFoundResponse(locale, pm(locale, "\u8D44\u6E90\u6682\u4E0D\u53EF\u7528"), pm(locale, "\u6587\u4EF6\u7684\u5185\u5BB9\u6682\u65F6\u65E0\u6CD5\u53D6\u5F97\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));
|
|
14324
14701
|
}
|
|
14325
14702
|
const body = new Uint8Array(bytes.byteLength);
|
|
14326
14703
|
body.set(bytes);
|
|
@@ -14345,8 +14722,12 @@ function etagMatches(header, etag) {
|
|
|
14345
14722
|
}
|
|
14346
14723
|
return false;
|
|
14347
14724
|
}
|
|
14348
|
-
function
|
|
14349
|
-
const
|
|
14725
|
+
function siteNotFound(req, name) {
|
|
14726
|
+
const locale = pickLocale(req);
|
|
14727
|
+
return notFoundResponse(locale, pm(locale, "\u7AD9\u70B9\u4E0D\u5B58\u5728"), pm(locale, "\u6CA1\u6709\u540D\u4E3A \u201C{name}\u201D \u7684\u7AD9\u70B9\u3002", { name: escapeHtml(name) }));
|
|
14728
|
+
}
|
|
14729
|
+
function notFoundResponse(locale, title, detail) {
|
|
14730
|
+
const html = `<!doctype html><html lang="${locale}"><head>
|
|
14350
14731
|
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
14351
14732
|
<meta name="robots" content="noindex">
|
|
14352
14733
|
<title>${escapeHtml(title)}</title>
|
|
@@ -14367,8 +14748,8 @@ function notFoundResponse(title, detail) {
|
|
|
14367
14748
|
<p class="code">404</p>
|
|
14368
14749
|
<h1>${escapeHtml(title)}</h1>
|
|
14369
14750
|
<p>${detail}</p>
|
|
14370
|
-
<a class="home" href="./"
|
|
14371
|
-
<footer
|
|
14751
|
+
<a class="home" href="./">${escapeHtml(pm(locale, "\u8FD4\u56DE\u7AD9\u70B9\u9996\u9875"))}</a>
|
|
14752
|
+
<footer>${escapeHtml(pm(locale, "\u7531 metahub \u6258\u7BA1"))}</footer>
|
|
14372
14753
|
</main></body></html>`;
|
|
14373
14754
|
return new Response(html, {
|
|
14374
14755
|
status: 404,
|
|
@@ -14383,6 +14764,7 @@ var init_sites_serve = __esm(() => {
|
|
|
14383
14764
|
init_grants_routes();
|
|
14384
14765
|
init_rate_limit();
|
|
14385
14766
|
init_share_render();
|
|
14767
|
+
init_page_messages();
|
|
14386
14768
|
init_auth();
|
|
14387
14769
|
});
|
|
14388
14770
|
|
|
@@ -14437,6 +14819,51 @@ async function mintGuestSession(scope, opts) {
|
|
|
14437
14819
|
return { sub: opts.sub, exp, cookie };
|
|
14438
14820
|
}
|
|
14439
14821
|
|
|
14822
|
+
// src/core/sync/share-copy.ts
|
|
14823
|
+
function markdownTable(header, rows) {
|
|
14824
|
+
const cell = (s) => s.replace(/\r?\n/g, " ").replace(/\|/g, "\\|").trim();
|
|
14825
|
+
const line = (cells) => `| ${cells.map(cell).join(" | ")} |`;
|
|
14826
|
+
return [line(header), `| ${header.map(() => "---").join(" | ")} |`, ...rows.map(line)].join(`
|
|
14827
|
+
`);
|
|
14828
|
+
}
|
|
14829
|
+
function copyButtonHtml(locale = "zh-CN") {
|
|
14830
|
+
const label = escapeHtml(pm(locale, "\u590D\u5236\u5168\u6587"));
|
|
14831
|
+
return `<button id="mh-copy" class="copy-btn" type="button" aria-label="${label}">${ICON_COPY}${ICON_CHECK}<span>${label}</span></button>`;
|
|
14832
|
+
}
|
|
14833
|
+
function copySourceHtml(text) {
|
|
14834
|
+
return `<template id="mh-src">${escapeHtml(text)}</template>`;
|
|
14835
|
+
}
|
|
14836
|
+
function copyScript(locale = "zh-CN") {
|
|
14837
|
+
const L = JSON.stringify({ idle: pm(locale, "\u590D\u5236\u5168\u6587"), done: pm(locale, "\u5DF2\u590D\u5236"), fail: pm(locale, "\u590D\u5236\u5931\u8D25") });
|
|
14838
|
+
return `(function(){
|
|
14839
|
+
var btn=document.getElementById('mh-copy');if(!btn)return;var L=${L};
|
|
14840
|
+
var label=btn.querySelector('span');var timer=0;
|
|
14841
|
+
function absolutize(root){root.querySelectorAll('img[src],a[href],video[src],audio[src]').forEach(function(el){var a=el.tagName==='A'?'href':'src';var v=el.getAttribute(a);if(v&&!/^(blob|data):/.test(v))el.setAttribute(a,new URL(v,location.href).href);});}
|
|
14842
|
+
function payload(){var src=document.getElementById('mh-src');var text=src?src.content.textContent:'';var body=document.querySelector('article.doc')||document.querySelector('.table-wrap');var html='';if(body){var c=body.cloneNode(true);absolutize(c);html=c.innerHTML;}return{text:text,html:html};}
|
|
14843
|
+
function legacy(text){var ta=document.createElement('textarea');ta.value=text;ta.setAttribute('readonly','');ta.style.cssText='position:fixed;top:0;left:0;opacity:0';document.body.appendChild(ta);ta.select();var ok=false;try{ok=document.execCommand('copy');}catch(e){}ta.remove();return ok?Promise.resolve():Promise.reject(new Error('copy'));}
|
|
14844
|
+
function write(p){var nc=navigator.clipboard;if(nc&&nc.write&&window.ClipboardItem){try{return nc.write([new ClipboardItem({'text/plain':new Blob([p.text],{type:'text/plain'}),'text/html':new Blob([p.html],{type:'text/html'})})]);}catch(e){}}if(nc&&nc.writeText)return nc.writeText(p.text);return legacy(p.text);}
|
|
14845
|
+
function settle(cls,txt){clearTimeout(timer);btn.classList.remove('done','fail');void btn.offsetWidth;btn.classList.add(cls);if(label)label.textContent=txt;timer=setTimeout(function(){btn.classList.remove(cls);if(label)label.textContent=L.idle;},1600);}
|
|
14846
|
+
btn.addEventListener('click',function(){var p=payload();write(p).then(function(){settle('done',L.done);},function(){legacy(p.text).then(function(){settle('done',L.done);},function(){settle('fail',L.fail);});});});
|
|
14847
|
+
})();`;
|
|
14848
|
+
}
|
|
14849
|
+
var ICON_COPY = '<svg class="ic-copy" viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h10"/></svg>', ICON_CHECK = '<svg class="ic-check" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12.5 10 17l9-10"/></svg>', COPY_CSS = `.mh-tools{display:flex;align-items:center;gap:8px;flex:none}
|
|
14850
|
+
.copy-btn{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--line);border-radius:7px;background:var(--bg);color:var(--fg);font:500 13px/1 inherit;font-family:inherit;cursor:pointer;transition:background .12s,border-color .12s,color .12s}
|
|
14851
|
+
.copy-btn:hover{background:var(--card)}.copy-btn:active{transform:translateY(.5px)}
|
|
14852
|
+
.copy-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
|
|
14853
|
+
.copy-btn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}
|
|
14854
|
+
.copy-btn .ic-check{display:none}
|
|
14855
|
+
.copy-btn.done{color:var(--ok,#1a7f37);border-color:var(--ok,#1a7f37)}
|
|
14856
|
+
.copy-btn.done .ic-copy{display:none}.copy-btn.done .ic-check{display:block}
|
|
14857
|
+
.copy-btn.done .ic-check path{stroke-dasharray:24;stroke-dashoffset:24;animation:mh-draw .22s ease-out forwards}
|
|
14858
|
+
.copy-btn.fail{color:#cf222e;border-color:#cf222e}
|
|
14859
|
+
@keyframes mh-draw{to{stroke-dashoffset:0}}
|
|
14860
|
+
@media (prefers-color-scheme:dark){:root{--ok:#3fb950}}
|
|
14861
|
+
@media (max-width:480px){.copy-btn span{display:none}.copy-btn{padding:0 9px}}
|
|
14862
|
+
@media (prefers-reduced-motion:reduce){.copy-btn .ic-check path{animation:none;stroke-dashoffset:0}}`;
|
|
14863
|
+
var init_share_copy = __esm(() => {
|
|
14864
|
+
init_page_messages();
|
|
14865
|
+
});
|
|
14866
|
+
|
|
14440
14867
|
// src/core/sync/share-serve.ts
|
|
14441
14868
|
function notFound() {
|
|
14442
14869
|
return new Response("not found", { status: 404 });
|
|
@@ -14467,25 +14894,26 @@ async function serveShare(req, ctx, opts = {}) {
|
|
|
14467
14894
|
return notFound();
|
|
14468
14895
|
if (share.transport !== "server")
|
|
14469
14896
|
return notFound();
|
|
14897
|
+
const locale = pickLocale(req);
|
|
14470
14898
|
if (shareExpired(share))
|
|
14471
14899
|
return gone();
|
|
14472
14900
|
if (sub === "unlock" && req.method === "POST")
|
|
14473
14901
|
return handleUnlock(ctx, req, share, url);
|
|
14474
14902
|
const locked = !!share.pw_hash && !await readShareSession(ctx, req, share);
|
|
14475
14903
|
if (locked) {
|
|
14476
|
-
return wantsHtml2(req) ? new Response(passwordPage(share, false), { headers: HTML }) : unauthorizedJson();
|
|
14904
|
+
return wantsHtml2(req) ? new Response(passwordPage(locale, share, false), { headers: HTML }) : unauthorizedJson();
|
|
14477
14905
|
}
|
|
14478
14906
|
if (sub.startsWith("blob/"))
|
|
14479
14907
|
return serveScopedBlob(ctx, share, sub.slice("blob/".length));
|
|
14480
14908
|
if (share.kind === "doc")
|
|
14481
|
-
return serveDoc(ctx, req, share, sub);
|
|
14909
|
+
return serveDoc(ctx, req, share, sub, locale);
|
|
14482
14910
|
if (share.kind === "database")
|
|
14483
|
-
return serveTable(ctx, req, share, sub);
|
|
14911
|
+
return serveTable(ctx, req, share, sub, locale);
|
|
14484
14912
|
if (share.kind === "site")
|
|
14485
|
-
return serveSiteShare(ctx, req, share, sub, opts);
|
|
14913
|
+
return serveSiteShare(ctx, req, share, sub, opts, locale);
|
|
14486
14914
|
return notFound();
|
|
14487
14915
|
}
|
|
14488
|
-
async function serveDoc(ctx, req, share, sub) {
|
|
14916
|
+
async function serveDoc(ctx, req, share, sub, locale) {
|
|
14489
14917
|
const doc = getDocument(ctx.db, share.target_id);
|
|
14490
14918
|
if (!doc)
|
|
14491
14919
|
return notFound();
|
|
@@ -14514,26 +14942,27 @@ async function serveDoc(ctx, req, share, sub) {
|
|
|
14514
14942
|
});
|
|
14515
14943
|
const version = documentVersion(ctx.db, share.target_id);
|
|
14516
14944
|
const editable = share.permission === "edit";
|
|
14517
|
-
const inner = `<article class="doc">${rendered ||
|
|
14518
|
-
const script = editable ? docEditScript(share.slug, version, doc.body ?? "") : "";
|
|
14519
|
-
return new Response(pageShell(doc.title || "\u6587\u6863", inner, { editable, editLabel: "\u7F16\u8F91\u6587\u6863", script }), { headers: HTML });
|
|
14945
|
+
const inner = `<article class="doc">${rendered || `<p class="muted">${escapeHtml(pm(locale, "\uFF08\u7A7A\u6587\u6863\uFF09"))}</p>`}</article>`;
|
|
14946
|
+
const script = editable ? docEditScript(locale, share.slug, version, doc.body ?? "") : "";
|
|
14947
|
+
return new Response(pageShell(doc.title || pm(locale, "\u6587\u6863"), inner, { lang: locale, editable, editLabel: pm(locale, "\u7F16\u8F91\u6587\u6863"), script, copySource: doc.body ?? "" }), { headers: HTML });
|
|
14520
14948
|
}
|
|
14521
|
-
function docEditScript(slug, version, body) {
|
|
14949
|
+
function docEditScript(locale, slug, version, body) {
|
|
14950
|
+
const L = JSON.stringify({ save: pm(locale, "\u4FDD\u5B58"), saving: pm(locale, "\u4FDD\u5B58\u4E2D\u2026"), failed: pm(locale, "\u4FDD\u5B58\u5931\u8D25") });
|
|
14522
14951
|
return `
|
|
14523
|
-
let editing=false; const ver=${JSON.stringify(version)}; const body0=${JSON.stringify(body)};
|
|
14952
|
+
let editing=false; const ver=${JSON.stringify(version)}; const body0=${JSON.stringify(body)}; const L=${L};
|
|
14524
14953
|
const art=document.querySelector('article.doc');
|
|
14525
14954
|
const btn=document.getElementById('mh-edit');
|
|
14526
14955
|
let ta;
|
|
14527
14956
|
btn.addEventListener('click', async ()=>{
|
|
14528
14957
|
if(!editing){
|
|
14529
|
-
editing=true; btn.textContent=
|
|
14958
|
+
editing=true; btn.textContent=L.save;
|
|
14530
14959
|
ta=document.createElement('textarea'); ta.className='mh-raw'; ta.value=body0;
|
|
14531
14960
|
art.replaceWith(ta); ta.focus();
|
|
14532
14961
|
} else {
|
|
14533
|
-
btn.disabled=true; btn.textContent=
|
|
14962
|
+
btn.disabled=true; btn.textContent=L.saving;
|
|
14534
14963
|
const res=await fetch('/share/${slug}/doc',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({body:ta.value,ifMatch:ver})});
|
|
14535
14964
|
if(res.ok){ location.reload(); }
|
|
14536
|
-
else { const j=await res.json().catch(()=>({})); alert(j.error||
|
|
14965
|
+
else { const j=await res.json().catch(()=>({})); alert(j.error||L.failed); btn.disabled=false; btn.textContent=L.save; }
|
|
14537
14966
|
}
|
|
14538
14967
|
});`;
|
|
14539
14968
|
}
|
|
@@ -14562,7 +14991,7 @@ function cellHtml(prop, value, titles) {
|
|
|
14562
14991
|
function editableType(t) {
|
|
14563
14992
|
return t === "text" || t === "number" || t === "url" || t === "date";
|
|
14564
14993
|
}
|
|
14565
|
-
async function serveTable(ctx, req, share, sub) {
|
|
14994
|
+
async function serveTable(ctx, req, share, sub, locale) {
|
|
14566
14995
|
const dbRow = getDatabase(ctx.db, share.target_id);
|
|
14567
14996
|
if (!dbRow)
|
|
14568
14997
|
return notFound();
|
|
@@ -14613,13 +15042,18 @@ async function serveTable(ctx, req, share, sub) {
|
|
|
14613
15042
|
return `<tr>${tds}</tr>`;
|
|
14614
15043
|
}).join("");
|
|
14615
15044
|
const inner = `<div class="table-wrap"><table class="db"><thead><tr>${head}</tr></thead><tbody>${rows}</tbody></table></div>`;
|
|
14616
|
-
const script = editable ? tableEditScript(share.slug) : "";
|
|
14617
|
-
|
|
14618
|
-
|
|
14619
|
-
|
|
14620
|
-
|
|
14621
|
-
|
|
15045
|
+
const script = editable ? tableEditScript(locale, share.slug) : "";
|
|
15046
|
+
const copySource = markdownTable(props.map((p) => p.name), records.map((r) => props.map((p) => cellText(p, r.cells[p.id], titlesFor(p)))));
|
|
15047
|
+
return new Response(pageShell(dbRow.name || pm(locale, "\u8868\u683C"), inner, {
|
|
15048
|
+
lang: locale,
|
|
15049
|
+
script,
|
|
15050
|
+
copySource,
|
|
15051
|
+
hint: editable ? pm(locale, "\u53EF\u7F16\u8F91\u6587\u672C/\u6570\u5B57/URL/\u65E5\u671F\u5355\u5143\u683C\uFF0C\u5931\u7126\u81EA\u52A8\u4FDD\u5B58") : ""
|
|
15052
|
+
}), { headers: HTML });
|
|
15053
|
+
}
|
|
15054
|
+
function tableEditScript(locale, slug) {
|
|
14622
15055
|
return `
|
|
15056
|
+
const L=${JSON.stringify({ failed: pm(locale, "\u4FDD\u5B58\u5931\u8D25") })};
|
|
14623
15057
|
document.querySelectorAll('td[contenteditable]').forEach(td=>{
|
|
14624
15058
|
let orig=td.textContent;
|
|
14625
15059
|
td.addEventListener('blur', async ()=>{
|
|
@@ -14631,11 +15065,11 @@ function tableEditScript(slug) {
|
|
|
14631
15065
|
const res=await fetch('/share/${slug}/record',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({id:td.dataset.rec,propId:td.dataset.prop,value:v})});
|
|
14632
15066
|
td.classList.remove('saving');
|
|
14633
15067
|
if(res.ok){ orig=val; td.classList.add('saved'); setTimeout(()=>td.classList.remove('saved'),600); }
|
|
14634
|
-
else { td.textContent=orig; const j=await res.json().catch(()=>({})); alert(j.error||
|
|
15068
|
+
else { td.textContent=orig; const j=await res.json().catch(()=>({})); alert(j.error||L.failed); }
|
|
14635
15069
|
});
|
|
14636
15070
|
});`;
|
|
14637
15071
|
}
|
|
14638
|
-
async function serveSiteShare(ctx, req, share, sub, opts = {}) {
|
|
15072
|
+
async function serveSiteShare(ctx, req, share, sub, opts = {}, locale = "zh-CN") {
|
|
14639
15073
|
let site;
|
|
14640
15074
|
try {
|
|
14641
15075
|
site = resolveSite(ctx.db, share.target_id);
|
|
@@ -14658,7 +15092,7 @@ async function serveSiteShare(ctx, req, share, sub, opts = {}) {
|
|
|
14658
15092
|
}
|
|
14659
15093
|
if (share.permission === "edit") {
|
|
14660
15094
|
if (sub === "_files")
|
|
14661
|
-
return new Response(siteFilesPage(ctx, share, siteId), { headers: HTML });
|
|
15095
|
+
return new Response(siteFilesPage(ctx, share, siteId, locale), { headers: HTML });
|
|
14662
15096
|
if (sub === "_file" && req.method === "POST") {
|
|
14663
15097
|
const body = await req.json().catch(() => ({}));
|
|
14664
15098
|
if (!body.path || typeof body.content !== "string")
|
|
@@ -14690,34 +15124,35 @@ async function serveSiteShare(ctx, req, share, sub, opts = {}) {
|
|
|
14690
15124
|
}
|
|
14691
15125
|
return serveSiteFile(req, ctx.db, siteId, sub, { spa: site.spa === 1 });
|
|
14692
15126
|
}
|
|
14693
|
-
function siteFilesPage(ctx, share, siteId) {
|
|
15127
|
+
function siteFilesPage(ctx, share, siteId, locale) {
|
|
14694
15128
|
const files = listFiles(ctx.db, siteId);
|
|
15129
|
+
const L = JSON.stringify({ binary: pm(locale, "\uFF08\u4E8C\u8FDB\u5236\u6587\u4EF6\uFF0C\u4E0D\u53EF\u5728\u7EBF\u7F16\u8F91\uFF09"), saved: pm(locale, "\u5DF2\u4FDD\u5B58 \u2713"), save: pm(locale, "\u4FDD\u5B58"), failed: pm(locale, "\u4FDD\u5B58\u5931\u8D25") });
|
|
14695
15130
|
const list = files.map((f) => `<li><button class="file" data-path="${escapeHtml(f.path)}" data-text="${f.encoding === "utf8" ? "1" : "0"}">${escapeHtml(f.path)}</button> <span class="muted">${escapeHtml(f.content_type)}</span></li>`).join("");
|
|
14696
15131
|
const inner = `
|
|
14697
|
-
<p class="hint"
|
|
14698
|
-
<ul class="files">${list ||
|
|
15132
|
+
<p class="hint">${escapeHtml(pm(locale, "\u7F16\u8F91\u7AD9\u70B9\u6587\u4EF6\uFF08\u6587\u672C\u6587\u4EF6\u53EF\u5728\u7EBF\u7F16\u8F91\uFF1B\u4FDD\u5B58\u5373\u5BF9\u6240\u6709\u8BBF\u95EE\u8005\u751F\u6548\uFF09\u3002"))}</p>
|
|
15133
|
+
<ul class="files">${list || `<li class="muted">${escapeHtml(pm(locale, "\uFF08\u6682\u65E0\u6587\u4EF6\uFF09"))}</li>`}</ul>
|
|
14699
15134
|
<div id="editor" hidden>
|
|
14700
|
-
<div class="row"><strong id="fpath"></strong> <a id="open" target="_blank" rel="noreferrer"
|
|
15135
|
+
<div class="row"><strong id="fpath"></strong> <a id="open" target="_blank" rel="noreferrer">${escapeHtml(pm(locale, "\u9884\u89C8 \u2197"))}</a></div>
|
|
14701
15136
|
<textarea class="mh-raw" id="fbody"></textarea>
|
|
14702
|
-
<div class="row"><button id="save"
|
|
15137
|
+
<div class="row"><button id="save">${escapeHtml(pm(locale, "\u4FDD\u5B58"))}</button></div>
|
|
14703
15138
|
</div>`;
|
|
14704
15139
|
const script = `
|
|
14705
|
-
const slug=${JSON.stringify(share.slug)};
|
|
15140
|
+
const slug=${JSON.stringify(share.slug)}; const L=${L};
|
|
14706
15141
|
const ed=document.getElementById('editor'), fpath=document.getElementById('fpath'), fbody=document.getElementById('fbody'), open=document.getElementById('open');
|
|
14707
15142
|
let cur=null;
|
|
14708
15143
|
document.querySelectorAll('button.file').forEach(b=>b.addEventListener('click', async ()=>{
|
|
14709
15144
|
cur=b.dataset.path; fpath.textContent=cur; open.href='/share/'+slug+'/'+cur;
|
|
14710
15145
|
if(b.dataset.text==='1'){ const r=await fetch('/share/'+slug+'/_raw?path='+encodeURIComponent(cur)); const j=await r.json(); fbody.value=j.content||''; fbody.disabled=false; }
|
|
14711
|
-
else { fbody.value=
|
|
15146
|
+
else { fbody.value=L.binary; fbody.disabled=true; }
|
|
14712
15147
|
ed.hidden=false;
|
|
14713
15148
|
}));
|
|
14714
15149
|
document.getElementById('save').addEventListener('click', async ()=>{
|
|
14715
15150
|
if(!cur||fbody.disabled) return;
|
|
14716
15151
|
const res=await fetch('/share/'+slug+'/_file',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({path:cur,content:fbody.value})});
|
|
14717
|
-
if(res.ok){ const s=document.getElementById('save'); s.textContent=
|
|
14718
|
-
else { const j=await res.json().catch(()=>({})); alert(j.error||
|
|
15152
|
+
if(res.ok){ const s=document.getElementById('save'); s.textContent=L.saved; setTimeout(()=>s.textContent=L.save,900); }
|
|
15153
|
+
else { const j=await res.json().catch(()=>({})); alert(j.error||L.failed); }
|
|
14719
15154
|
});`;
|
|
14720
|
-
return pageShell(
|
|
15155
|
+
return pageShell(pm(locale, "{name} \xB7 \u6587\u4EF6", { name: resolveSite(ctx.db, share.target_id).name }), inner, { lang: locale, script });
|
|
14721
15156
|
}
|
|
14722
15157
|
function referencedHashes2(ctx, share) {
|
|
14723
15158
|
const out = new Set;
|
|
@@ -14805,7 +15240,7 @@ async function handleUnlock(ctx, req, share, url) {
|
|
|
14805
15240
|
pw = form ? String(form.get("password") ?? "") : "";
|
|
14806
15241
|
}
|
|
14807
15242
|
if (!await verifySharePassword(share, pw)) {
|
|
14808
|
-
return new Response(passwordPage(share, true), { headers: HTML, status: 401 });
|
|
15243
|
+
return new Response(passwordPage(pickLocale(req), share, true), { headers: HTML, status: 401 });
|
|
14809
15244
|
}
|
|
14810
15245
|
const { cookie } = await mintShareSession(ctx, share, url);
|
|
14811
15246
|
return new Response(null, {
|
|
@@ -14816,21 +15251,23 @@ async function handleUnlock(ctx, req, share, url) {
|
|
|
14816
15251
|
function ttlRemaining(share) {
|
|
14817
15252
|
return share.expires_at == null ? SHARE_SESSION_TTL_MS : Math.max(0, share.expires_at - Date.now());
|
|
14818
15253
|
}
|
|
14819
|
-
function passwordPage(share, error) {
|
|
15254
|
+
function passwordPage(locale, share, error) {
|
|
14820
15255
|
const inner = `
|
|
14821
15256
|
<form method="post" action="/share/${share.slug}/unlock" class="pw">
|
|
14822
|
-
<h1
|
|
14823
|
-
${error ?
|
|
14824
|
-
<input type="password" name="password" placeholder="\u53E3\u4EE4" autofocus autocomplete="current-password">
|
|
14825
|
-
<button type="submit"
|
|
15257
|
+
<h1>${escapeHtml(pm(locale, "\uD83D\uDD12 \u6B64\u5206\u4EAB\u53D7\u53E3\u4EE4\u4FDD\u62A4"))}</h1>
|
|
15258
|
+
${error ? `<p class="err">${escapeHtml(pm(locale, "\u53E3\u4EE4\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5\u3002"))}</p>` : ""}
|
|
15259
|
+
<input type="password" name="password" placeholder="${escapeHtml(pm(locale, "\u53E3\u4EE4"))}" autofocus autocomplete="current-password">
|
|
15260
|
+
<button type="submit">${escapeHtml(pm(locale, "\u89E3\u9501"))}</button>
|
|
14826
15261
|
</form>`;
|
|
14827
|
-
return pageShell("\u53D7\u4FDD\u62A4\u7684\u5206\u4EAB", inner, { bare: true });
|
|
15262
|
+
return pageShell(pm(locale, "\u53D7\u4FDD\u62A4\u7684\u5206\u4EAB"), inner, { lang: locale, bare: true });
|
|
14828
15263
|
}
|
|
14829
|
-
function pageShell(title, inner, opts
|
|
14830
|
-
const editBtn = opts.editable ? `<button id="mh-edit" class="edit-btn">${opts.editLabel ?? "\u7F16\u8F91"}</button>` : "";
|
|
15264
|
+
function pageShell(title, inner, opts) {
|
|
15265
|
+
const editBtn = opts.editable ? `<button id="mh-edit" class="edit-btn">${escapeHtml(opts.editLabel ?? pm(opts.lang, "\u7F16\u8F91"))}</button>` : "";
|
|
15266
|
+
const copyBtn = opts.copySource !== undefined ? copyButtonHtml(opts.lang) : "";
|
|
15267
|
+
const tools = copyBtn || editBtn ? `<div class="mh-tools">${copyBtn}${editBtn}</div>` : "";
|
|
14831
15268
|
const hint = opts.hint ? `<p class="hint">${escapeHtml(opts.hint)}</p>` : "";
|
|
14832
|
-
const script = opts.script ? `<script>(function(){${opts.script}})();</script>` : "";
|
|
14833
|
-
return `<!doctype html><html lang="
|
|
15269
|
+
const script = (opts.script ? `<script>(function(){${opts.script}})();</script>` : "") + (opts.copySource !== undefined ? `${copySourceHtml(opts.copySource)}<script>${copyScript(opts.lang)}</script>` : "");
|
|
15270
|
+
return `<!doctype html><html lang="${opts.lang}"><head>
|
|
14834
15271
|
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
14835
15272
|
<meta name="robots" content="noindex">
|
|
14836
15273
|
<title>${escapeHtml(title)}</title>
|
|
@@ -14842,7 +15279,8 @@ function pageShell(title, inner, opts = {}) {
|
|
|
14842
15279
|
.wrap{max-width:820px;margin:0 auto;padding:32px 20px 80px}
|
|
14843
15280
|
header.mh{display:flex;align-items:center;gap:12px;justify-content:space-between;margin-bottom:20px;border-bottom:1px solid var(--line);padding-bottom:14px}
|
|
14844
15281
|
header.mh h1.title{font-size:22px;margin:0}
|
|
14845
|
-
.edit-btn{background:var(--accent);color:#fff;border:0;border-radius:7px;padding:
|
|
15282
|
+
.edit-btn{background:var(--accent);color:#fff;border:0;border-radius:7px;height:32px;padding:0 14px;cursor:pointer;font-size:13px;font-weight:500;font-family:inherit}
|
|
15283
|
+
${COPY_CSS}
|
|
14846
15284
|
.hint{color:var(--muted);font-size:13px;margin:0 0 14px}
|
|
14847
15285
|
article.doc h1,article.doc h2,article.doc h3{line-height:1.3;margin:1.4em 0 .5em}
|
|
14848
15286
|
article.doc h1{font-size:1.7em} article.doc h2{font-size:1.4em} article.doc h3{font-size:1.2em}
|
|
@@ -14873,10 +15311,10 @@ function pageShell(title, inner, opts = {}) {
|
|
|
14873
15311
|
footer.mh{margin-top:48px;border-top:1px solid var(--line);padding-top:14px;color:var(--muted);font-size:12px;text-align:center}
|
|
14874
15312
|
</style></head><body>
|
|
14875
15313
|
${opts.bare ? `<div class="wrap">${inner}</div>` : `<div class="wrap">
|
|
14876
|
-
<header class="mh"><h1 class="title">${escapeHtml(title)}</h1>${
|
|
15314
|
+
<header class="mh"><h1 class="title">${escapeHtml(title)}</h1>${tools}</header>
|
|
14877
15315
|
${hint}
|
|
14878
15316
|
${inner}
|
|
14879
|
-
<footer class="mh"
|
|
15317
|
+
<footer class="mh">${escapeHtml(pm(opts.lang, "\u901A\u8FC7 metahub \u5206\u4EAB"))}</footer>
|
|
14880
15318
|
</div>`}
|
|
14881
15319
|
${script}
|
|
14882
15320
|
</body></html>`;
|
|
@@ -14899,6 +15337,8 @@ var init_share_serve = __esm(() => {
|
|
|
14899
15337
|
init_grants_routes();
|
|
14900
15338
|
init_rate_limit();
|
|
14901
15339
|
init_share_render();
|
|
15340
|
+
init_share_copy();
|
|
15341
|
+
init_page_messages();
|
|
14902
15342
|
HTML = { "content-type": "text/html; charset=utf-8" };
|
|
14903
15343
|
HASH_RE2 = /^[0-9a-f]{16,64}$/;
|
|
14904
15344
|
SHARE_SESSION_TTL_MS = 12 * 60 * 60 * 1000;
|
|
@@ -15275,11 +15715,12 @@ var DROP_ENVELOPE_MAX_BYTES, DROP_HLC_SKEW_MS, GUEST_NODE_RE;
|
|
|
15275
15715
|
var init_drop_protocol = __esm(() => {
|
|
15276
15716
|
init_errors();
|
|
15277
15717
|
init_ids();
|
|
15718
|
+
init_hlc();
|
|
15278
15719
|
init_grants_core();
|
|
15279
15720
|
init_e2ee();
|
|
15280
15721
|
init_seal();
|
|
15281
15722
|
DROP_ENVELOPE_MAX_BYTES = 64 * 1024;
|
|
15282
|
-
DROP_HLC_SKEW_MS =
|
|
15723
|
+
DROP_HLC_SKEW_MS = HLC_MAX_SKEW_MS;
|
|
15283
15724
|
GUEST_NODE_RE = /^g[0-9a-z]{8}$/;
|
|
15284
15725
|
});
|
|
15285
15726
|
|
|
@@ -15333,12 +15774,12 @@ function applyDropV2(db, set, payload, now) {
|
|
|
15333
15774
|
};
|
|
15334
15775
|
const before = db.query("SELECT MAX(seq) AS s FROM crdt_changes").get().s ?? 0;
|
|
15335
15776
|
const ids = [];
|
|
15336
|
-
db
|
|
15777
|
+
writeTx(db, () => {
|
|
15337
15778
|
for (const intent of payload.intents) {
|
|
15338
15779
|
applyGuestIntent(db, policy, { guestNode: payload.guest_node }, intent, { clock: "submitted", now });
|
|
15339
15780
|
ids.push(intent.intentId);
|
|
15340
15781
|
}
|
|
15341
|
-
})
|
|
15782
|
+
});
|
|
15342
15783
|
const ingested = db.query("SELECT COUNT(*) AS n FROM crdt_changes WHERE seq > ?").get(before).n;
|
|
15343
15784
|
return { ackSeq: intentsMaxSeq(db, payload.guest_node, ids), ingested };
|
|
15344
15785
|
}
|
|
@@ -15532,6 +15973,7 @@ function appKind() {
|
|
|
15532
15973
|
function openMetahub() {
|
|
15533
15974
|
ensureDirs();
|
|
15534
15975
|
const db = new Database(dbPath(), { create: true });
|
|
15976
|
+
db.exec("PRAGMA busy_timeout = 5000;");
|
|
15535
15977
|
db.exec("PRAGMA journal_mode = WAL;");
|
|
15536
15978
|
initSchema(db);
|
|
15537
15979
|
const app = appKind();
|
|
@@ -15556,6 +15998,7 @@ function safeHostname() {
|
|
|
15556
15998
|
// src/core/index.ts
|
|
15557
15999
|
init_ids();
|
|
15558
16000
|
init_resolve();
|
|
16001
|
+
init_hlc();
|
|
15559
16002
|
init_crdt();
|
|
15560
16003
|
init_node();
|
|
15561
16004
|
init_databases();
|
|
@@ -15682,18 +16125,18 @@ function ensureIndex(db) {
|
|
|
15682
16125
|
return false;
|
|
15683
16126
|
const version = readMeta(db, "search_index_version");
|
|
15684
16127
|
const seq = readMeta(db, "search_seq");
|
|
15685
|
-
db
|
|
16128
|
+
writeTx(db, () => {
|
|
15686
16129
|
if (version !== SEARCH_INDEX_VERSION || seq === null)
|
|
15687
16130
|
fullRebuild(db);
|
|
15688
16131
|
else
|
|
15689
16132
|
incrementalUpdate(db);
|
|
15690
|
-
})
|
|
16133
|
+
});
|
|
15691
16134
|
return true;
|
|
15692
16135
|
}
|
|
15693
16136
|
function rebuildSearchIndex(db) {
|
|
15694
16137
|
if (!ftsAvailable(db))
|
|
15695
16138
|
return false;
|
|
15696
|
-
db
|
|
16139
|
+
writeTx(db, () => fullRebuild(db));
|
|
15697
16140
|
return true;
|
|
15698
16141
|
}
|
|
15699
16142
|
function ftsSearch(db, query, limit) {
|
|
@@ -15853,6 +16296,7 @@ function startServer(opts = {}) {
|
|
|
15853
16296
|
allowRemoteSiteHosting: opts.allowRemoteSiteHosting ?? true
|
|
15854
16297
|
};
|
|
15855
16298
|
const allRoutes = opts.ui ? [...routes, ...opts.ui.routes] : routes;
|
|
16299
|
+
opts.ui?.onStart?.(db);
|
|
15856
16300
|
const forwardApi = async (req) => {
|
|
15857
16301
|
const path = new URL(req.url).pathname;
|
|
15858
16302
|
const route = allRoutes.find((r) => r.method === req.method && r.path === path);
|
|
@@ -15898,7 +16342,7 @@ function startServer(opts = {}) {
|
|
|
15898
16342
|
} else {
|
|
15899
16343
|
const exempt = url.pathname === HEALTH_PATH || url.pathname === RENEW_PATH || url.pathname === PAIR_PATH || url.pathname === "/manifest.webmanifest" || url.pathname === "/sw.js" || url.pathname === "/metahub-sdk.js" || url.pathname.startsWith("/icons/") || url.pathname.startsWith("/share/") || url.pathname.startsWith("/sites/");
|
|
15900
16344
|
if (!exempt && !hasValidToken(req, url, auth)) {
|
|
15901
|
-
return wantsHtml(req) ? new Response(unlockPage(), { headers: { ...HTML_HEADERS, "x-mh-unlock": "1" } }) : unauthorized();
|
|
16345
|
+
return wantsHtml(req) ? new Response(unlockPage(pickLocale(req)), { headers: { ...HTML_HEADERS, "x-mh-unlock": "1" } }) : unauthorized();
|
|
15902
16346
|
}
|
|
15903
16347
|
}
|
|
15904
16348
|
if (url.pathname === RENEW_PATH) {
|
|
@@ -16065,6 +16509,8 @@ var styles_default = ` :root {
|
|
|
16065
16509
|
--fs-body:14px; --fs-ui:13.5px; --fs-sm:12.5px; --fs-xs:11.5px; --fs-micro:11px;
|
|
16066
16510
|
--ui:"Hanken Grotesk",-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
|
|
16067
16511
|
--mono:"JetBrains Mono",ui-monospace,SFMono-Regular,monospace;
|
|
16512
|
+
--kbd-font:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
|
|
16513
|
+
--tip-bg:#1f1f23; --tip-fg:#ffffff; --tip-kbd-bg:rgba(255,255,255,.14); --tip-kbd-fg:rgba(255,255,255,.92);
|
|
16068
16514
|
--note-lh:1.6;
|
|
16069
16515
|
--code-bg:#f8f8f6;
|
|
16070
16516
|
--hl-cmt:#9a9aa2; --hl-key:#a626a4; --hl-str:#28823f; --hl-num:#b76a00;
|
|
@@ -16083,6 +16529,7 @@ var styles_default = ` :root {
|
|
|
16083
16529
|
--hover:rgba(255,255,255,.05); --hover-2:rgba(255,255,255,.09);
|
|
16084
16530
|
--shadow-sm:0 1px 2px rgba(0,0,0,.4); --shadow-md:0 4px 14px rgba(0,0,0,.45); --shadow-lg:0 20px 56px rgba(0,0,0,.6);
|
|
16085
16531
|
--code-bg:#1d1d20;
|
|
16532
|
+
--tip-bg:#2e2e32; --tip-fg:var(--fg); --tip-kbd-bg:rgba(255,255,255,.08); --tip-kbd-fg:var(--fg-soft);
|
|
16086
16533
|
--hl-cmt:#7d7d86; --hl-key:#d291e4; --hl-str:#7ed492; --hl-num:#e0a566;
|
|
16087
16534
|
--hl-fn:#86a8ff; --hl-type:#5fc6e0; --hl-var:#f0936b;
|
|
16088
16535
|
}
|
|
@@ -16157,16 +16604,14 @@ var styles_default = ` :root {
|
|
|
16157
16604
|
height:var(--rz-guide-h, 100%); }
|
|
16158
16605
|
.sb-head { display:flex; align-items:center; gap:8px; padding:14px 14px 10px; }
|
|
16159
16606
|
.brand { display:flex; align-items:center; gap:8px; flex:1; font-weight:700; font-size:15px; letter-spacing:-.01em; }
|
|
16160
|
-
.brand .mark { width:24px; height:24px;
|
|
16161
|
-
|
|
16162
|
-
|
|
16163
|
-
.
|
|
16164
|
-
.sb-search { margin:0 12px 8px; display:flex; align-items:center; gap:7px; cursor:text;
|
|
16607
|
+
.brand .mark { width:24px; height:24px; display:grid; place-items:center; }
|
|
16608
|
+
.brand-icon { display:block; position:relative; width:100%; height:100%; overflow:hidden; }
|
|
16609
|
+
.brand-icon > img { display:block; position:absolute; max-width:none; }
|
|
16610
|
+
.sb-search { margin:0 12px 8px; width:calc(100% - 24px); display:flex; align-items:center; gap:7px; cursor:pointer; text-align:left;
|
|
16165
16611
|
background:var(--bg); border:1px solid var(--line); border-radius:var(--radius-sm); padding:6px 9px; color:var(--muted);
|
|
16166
|
-
box-shadow:var(--shadow-sm); transition:border-color .15s; }
|
|
16167
|
-
.sb-search:focus-
|
|
16168
|
-
.sb-search
|
|
16169
|
-
.sb-search kbd { font-family:var(--mono); font-size:10px; color:var(--muted); border:1px solid var(--line-strong); border-radius:4px; padding:1px 4px; }
|
|
16612
|
+
box-shadow:var(--shadow-sm); transition:border-color .15s; font:inherit; }
|
|
16613
|
+
.sb-search:hover, .sb-search:focus-visible { border-color:var(--line-strong); outline:none; }
|
|
16614
|
+
.sb-search-ph { flex:1; min-width:0; color:var(--muted); font-size:var(--fs-ui); }
|
|
16170
16615
|
.sb-scroll { flex:1; overflow-y:auto; padding:4px 8px 24px; }
|
|
16171
16616
|
/* Notion-style list switcher: the active tab is an icon+label pill, inactive
|
|
16172
16617
|
tabs are icon-only. One absolutely-positioned indicator slides & stretches
|
|
@@ -16380,6 +16825,9 @@ var styles_default = ` :root {
|
|
|
16380
16825
|
.set-row-tag { display:inline-block; margin-left:8px; font-size:11px; font-weight:500;
|
|
16381
16826
|
color:var(--muted); border:1px solid var(--line); border-radius:999px; padding:1px 7px; vertical-align:1px; }
|
|
16382
16827
|
.set-row-input { width:15em; min-width:0; }
|
|
16828
|
+
/* row dropdown (primitives.tsx RowSelect): current value + chevron */
|
|
16829
|
+
.row-select { gap:4px; padding:4px 6px 4px 10px; }
|
|
16830
|
+
.row-select .ico { width:13px; height:13px; color:var(--muted); }
|
|
16383
16831
|
|
|
16384
16832
|
/* Page chrome (primitives.tsx PageHeader / DangerZone) \u2014 every page opens
|
|
16385
16833
|
with its own PageHeader (the shell renders no title). */
|
|
@@ -16388,7 +16836,7 @@ var styles_default = ` :root {
|
|
|
16388
16836
|
.page-header-text { flex:1 1 auto; min-width:0; }
|
|
16389
16837
|
.page-header-title { font-size:26px; font-weight:700; letter-spacing:-.02em; color:var(--fg); margin:0; }
|
|
16390
16838
|
.page-header-sub { color:var(--muted); font-size:var(--fs-sm); margin-top:3px; }
|
|
16391
|
-
.page-header-action { flex:none; padding-top:4px; }
|
|
16839
|
+
.page-header-action { flex:none; display:flex; align-items:center; gap:8px; padding-top:4px; }
|
|
16392
16840
|
.page-header-banner { margin-top:8px; }
|
|
16393
16841
|
.danger-zone { margin-top:34px; }
|
|
16394
16842
|
.danger-zone-label { font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:.07em;
|
|
@@ -16437,11 +16885,6 @@ var styles_default = ` :root {
|
|
|
16437
16885
|
.audit-end::before, .audit-end::after { content:""; flex:1; height:1px; background:var(--line); }
|
|
16438
16886
|
@media (hover:none) { .audit-revert { opacity:1; } }
|
|
16439
16887
|
.set-callout.warn { border-color:color-mix(in srgb,var(--warning,#9a6700) 32%,var(--line)); }
|
|
16440
|
-
/* two-fact meta line under a block title (who publishes \xB7 where creds live) \u2014
|
|
16441
|
-
answers the questions hiding under "is this bucket for server or browser?" */
|
|
16442
|
-
.set-meta { display:flex; flex-wrap:wrap; gap:8px 16px; margin:0 0 12px; }
|
|
16443
|
-
.set-meta-item { display:inline-flex; align-items:center; gap:6px; font-size:var(--fs-sm); color:var(--fg-soft); }
|
|
16444
|
-
.set-meta-item svg { width:14px; height:14px; color:var(--accent); }
|
|
16445
16888
|
/* a quiet helper line under a field / chip group */
|
|
16446
16889
|
.set-hint { font-size:var(--fs-xs); color:var(--muted); line-height:1.5; margin:3px 0 4px; }
|
|
16447
16890
|
/* progressive disclosure ("\u5DE5\u4F5C\u539F\u7406" / "\u8FDB\u9636") \u2014 native details, themed */
|
|
@@ -16466,10 +16909,7 @@ var styles_default = ` :root {
|
|
|
16466
16909
|
mark sizes to a nav-icon's proportions scaled up; the version line reuses
|
|
16467
16910
|
.ver-num so App/Core/Web digits stay mono and tabular everywhere. */
|
|
16468
16911
|
.about-hero { display:flex; align-items:center; gap:16px; padding:6px 2px 2px; }
|
|
16469
|
-
.about-mark { flex:none; display:grid; place-items:center; width:44px; height:44px;
|
|
16470
|
-
border-radius:11px; border:1px solid var(--line-strong); background:var(--surface);
|
|
16471
|
-
color:var(--fg-soft); }
|
|
16472
|
-
.about-mark .ico { width:26px; height:26px; }
|
|
16912
|
+
.about-mark { flex:none; display:grid; place-items:center; width:44px; height:44px; }
|
|
16473
16913
|
.about-name { font-size:15px; font-weight:650; letter-spacing:-.01em; }
|
|
16474
16914
|
.about-vers { display:flex; align-items:baseline; flex-wrap:wrap; gap:6px;
|
|
16475
16915
|
margin-top:2px; color:var(--muted); font-size:var(--fs-micro); }
|
|
@@ -16519,6 +16959,9 @@ var styles_default = ` :root {
|
|
|
16519
16959
|
.theme-card.sel .tc-ico { background:var(--accent); color:var(--accent-fg); }
|
|
16520
16960
|
.theme-card.sel .tc-check { opacity:1; transform:scale(1); }
|
|
16521
16961
|
@media (max-width:560px) { .theme-grid { grid-template-columns:1fr; } }
|
|
16962
|
+
.brand-grid { grid-template-columns:repeat(auto-fit,minmax(min(100%,120px),1fr)); }
|
|
16963
|
+
.brand-preview { display:block; width:56px; height:56px; }
|
|
16964
|
+
.brand-caption { margin:12px 0 0; color:var(--muted); font-size:12px; line-height:1.5; }
|
|
16522
16965
|
.theme-card:disabled { opacity:.55; cursor:not-allowed; }
|
|
16523
16966
|
.theme-card:disabled:hover { transform:none; border-color:var(--line-strong); }
|
|
16524
16967
|
|
|
@@ -16526,39 +16969,18 @@ var styles_default = ` :root {
|
|
|
16526
16969
|
.peer-sub { font-size:12px; color:var(--muted); margin-top:2px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
16527
16970
|
.peer-menu { flex:none; padding:6px; }
|
|
16528
16971
|
|
|
16529
|
-
/*
|
|
16530
|
-
|
|
16531
|
-
.sync-health { margin:0; }
|
|
16532
|
-
.sync-health-line { display:inline-flex; align-items:center; gap:8px; max-width:100%; padding:2px 0;
|
|
16533
|
-
background:none; border:0; cursor:pointer; text-align:left; font:inherit; color:var(--fg-soft); }
|
|
16534
|
-
.sync-health-line:hover { color:var(--fg); }
|
|
16535
|
-
.sync-health-line:hover .sync-health-more { color:var(--fg); }
|
|
16972
|
+
/* \u6570\u636E\u4E0E\u5907\u4EFD health sentence (PageHeader sub): the dot alone carries tone */
|
|
16973
|
+
.sync-health-sub { display:inline-flex; align-items:center; gap:8px; max-width:100%; min-width:0; }
|
|
16536
16974
|
.sync-health-dot { flex:none; width:8px; height:8px; border-radius:50%; }
|
|
16537
16975
|
.sync-health-dot.dot-ok { background:var(--success); }
|
|
16538
16976
|
.sync-health-dot.dot-warn { background:var(--warning,#9a6700); }
|
|
16539
16977
|
.sync-health-dot.dot-error { background:var(--danger); }
|
|
16540
|
-
|
|
16541
|
-
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
16542
|
-
.sync-health-more { flex:none; font-size:var(--fs-xs); color:var(--muted); }
|
|
16543
|
-
/* shared expander chevron (SyncHealthLine \u8BE6\u60C5, device roster rows) */
|
|
16978
|
+
/* shared expander chevron (bucket + device roster rows) */
|
|
16544
16979
|
.row-chev { flex:none; color:var(--muted); display:flex; transition:transform .15s; }
|
|
16545
16980
|
.row-chev .ico { width:14px; height:14px; }
|
|
16546
16981
|
.row-chev.open { transform:rotate(180deg); }
|
|
16547
16982
|
/* confirm dialogs: keep \\n line breaks (consequence lists) */
|
|
16548
16983
|
.cfm-msg { white-space: pre-line; }
|
|
16549
|
-
/* concurrent problems under the headline (only when >1, else redundant) */
|
|
16550
|
-
.sync-health-issues { padding:2px 0 4px; }
|
|
16551
|
-
.sync-health-issue { font-size:12px; color:var(--muted); padding:2px 0 2px 18px; }
|
|
16552
|
-
/* \u67E5\u770B\u5404\u5904: a bordered place list (kind \xB7 name \xB7 freshness \xB7 inline retry) */
|
|
16553
|
-
.sync-health-places { margin-top:6px; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; }
|
|
16554
|
-
.sync-health-place { display:flex; align-items:center; gap:10px; padding:9px 12px; min-width:0; font-size:var(--fs-sm); }
|
|
16555
|
-
.sync-health-place + .sync-health-place { border-top:1px solid var(--line); }
|
|
16556
|
-
.sync-health-place-kind { flex:none; width:64px; font-size:var(--fs-xs); color:var(--muted); }
|
|
16557
|
-
.sync-health-place-label { flex:none; font-weight:550; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:40%; }
|
|
16558
|
-
.sync-health-place-cap { flex:1; min-width:0; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
16559
|
-
.sync-health-place .btn { margin-left:auto; }
|
|
16560
|
-
.sync-health-role { flex:none; font-size:11px; color:var(--accent); background:var(--accent-soft);
|
|
16561
|
-
border-radius:999px; padding:2px 7px; }
|
|
16562
16984
|
|
|
16563
16985
|
/* device roster (settings/devices-page.tsx): expanded detail = key/value
|
|
16564
16986
|
table + one action row + one plain sentence \u2014 no gray callout box. */
|
|
@@ -16580,7 +17002,6 @@ var styles_default = ` :root {
|
|
|
16580
17002
|
display:grid; grid-template-columns:1fr auto; gap:4px 12px; align-items:center; background:var(--surface-1); }
|
|
16581
17003
|
.cloud-cta-title { font-weight:650; font-size:var(--fs-body); }
|
|
16582
17004
|
.cloud-cta-sub { font-size:12px; color:var(--muted); margin-top:2px; line-height:1.6; }
|
|
16583
|
-
.cloud-cta-alt { grid-column:1 / -1; font-size:12px; }
|
|
16584
17005
|
|
|
16585
17006
|
/* printable recovery card */
|
|
16586
17007
|
.recovery-card { border:2px solid var(--fg); border-radius:12px; padding:16px 18px; margin-top:8px; background:var(--surface); }
|
|
@@ -16627,6 +17048,8 @@ var styles_default = ` :root {
|
|
|
16627
17048
|
.crumb-link { flex:none; padding:2px 5px; margin:-2px -3px; border-radius:var(--radius-sm); font-weight:500; }
|
|
16628
17049
|
.crumb-link:hover { background:var(--hover); }
|
|
16629
17050
|
.crumb-sep { flex:none; color:var(--muted); font-weight:400; }
|
|
17051
|
+
.crumb-title { flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
17052
|
+
.crumb-more { color:var(--muted); }
|
|
16630
17053
|
.iconbtn { width:30px; height:30px; display:grid; place-items:center; border-radius:var(--radius-sm); color:var(--fg-soft); transition:background .12s; }
|
|
16631
17054
|
.iconbtn:hover { background:var(--hover-2); color:var(--fg); }
|
|
16632
17055
|
/* Dead end of the history (topbar back/forward). pointer-events:none also
|
|
@@ -16720,7 +17143,7 @@ var styles_default = ` :root {
|
|
|
16720
17143
|
/* document editor */
|
|
16721
17144
|
.doc { max-width:740px; margin:0 auto; padding:60px 60px 36vh; }
|
|
16722
17145
|
.doc-title { font-size:38px; font-weight:700; letter-spacing:-.02em; outline:none; line-height:1.15; margin-bottom:4px; }
|
|
16723
|
-
.doc-title:empty::before { content:
|
|
17146
|
+
.doc-title:empty::before { content:attr(data-placeholder); color:var(--muted); }
|
|
16724
17147
|
/* Backstop for the plain-text titles (see plain-edit.ts): should markup ever
|
|
16725
17148
|
slip into one of these hosts, its inline font-size can't shrink the title. */
|
|
16726
17149
|
.doc-title *, .db-title * { font:inherit; color:inherit; background:none; }
|
|
@@ -17210,11 +17633,16 @@ var styles_default = ` :root {
|
|
|
17210
17633
|
.db-icon { width:38px; height:38px; border-radius:9px; background:var(--surface-2); display:grid; place-items:center; font-size:20px; }
|
|
17211
17634
|
.db-title { font-size:27px; font-weight:700; letter-spacing:-.02em; outline:none; }
|
|
17212
17635
|
.db-desc { color:var(--muted); font-size:13px; margin-top:2px; }
|
|
17213
|
-
.views { display:flex; align-items:center; gap:2px; border-bottom:1px solid var(--line); margin:16px 0 0; }
|
|
17214
|
-
.
|
|
17215
|
-
|
|
17636
|
+
.views { display:flex; align-items:center; gap:2px; border-bottom:1px solid var(--line); margin:16px 0 0; overflow-x:auto; scrollbar-width:none; }
|
|
17637
|
+
.views::-webkit-scrollbar { display:none; }
|
|
17638
|
+
.view-tab { display:flex; align-items:center; gap:6px; padding:8px 9px; font-size:var(--fs-ui); font-weight:500; color:var(--muted); cursor:pointer;
|
|
17639
|
+
border-bottom:2px solid transparent; margin-bottom:-1px; transition:color .12s; white-space:nowrap; border-radius:var(--radius-sm) var(--radius-sm) 0 0; }
|
|
17216
17640
|
.view-tab.active { color:var(--fg); border-bottom-color:var(--accent); }
|
|
17217
|
-
.view-tab:hover { color:var(--fg); } .view-tab svg { width:14px; height:14px; }
|
|
17641
|
+
.view-tab:hover { color:var(--fg); background:var(--hover); } .view-tab svg { width:14px; height:14px; }
|
|
17642
|
+
.view-tab .caret { width:12px; height:12px; color:var(--muted); margin-left:-2px; opacity:0; transition:opacity .12s; }
|
|
17643
|
+
.view-tab.active:hover .caret { opacity:1; }
|
|
17644
|
+
.view-add { width:28px; height:28px; display:grid; place-items:center; color:var(--muted); border-radius:var(--radius-sm); margin-left:2px; flex:none; }
|
|
17645
|
+
.view-add:hover { background:var(--hover-2); color:var(--fg); }
|
|
17218
17646
|
/* \u6D6E\u7A97\u770B\u677F (right end of the toolbar / board bar, desktop only): a quiet
|
|
17219
17647
|
Notion-style secondary pill \u2014 visible as a feature entry, never louder
|
|
17220
17648
|
than \u65B0\u5EFA. Hover lifts the pill and nudges the icon's top kanban card up
|
|
@@ -17230,12 +17658,56 @@ var styles_default = ` :root {
|
|
|
17230
17658
|
.popout-btn:active { transform:translateY(0); box-shadow:var(--shadow-sm); }
|
|
17231
17659
|
.popout-btn .i-card { transition:transform .18s ease; }
|
|
17232
17660
|
.popout-btn:hover .i-card { transform:translateY(-2px); }
|
|
17233
|
-
.toolbar { display:flex; align-items:center; gap:2px; padding:
|
|
17661
|
+
.toolbar { display:flex; align-items:center; gap:2px; padding:8px 0 6px; flex-wrap:wrap; }
|
|
17234
17662
|
.toolbar .spacer { flex:1; }
|
|
17235
|
-
.tbtn { display:flex; align-items:center; gap:6px; padding:5px 9px; border-radius:var(--radius-sm); color:var(--fg-soft); font-size:13px; font-weight:500; }
|
|
17663
|
+
.tbtn { display:flex; align-items:center; gap:6px; padding:5px 9px; border-radius:var(--radius-sm); color:var(--fg-soft); font-size:13px; font-weight:500; white-space:nowrap; }
|
|
17236
17664
|
.tbtn:hover { background:var(--hover-2); color:var(--fg); }
|
|
17237
17665
|
.tbtn.on { color:var(--accent); }
|
|
17238
|
-
.
|
|
17666
|
+
.tbtn.on:hover { background:var(--accent-soft); }
|
|
17667
|
+
.tbtn.icon { padding:5px 7px; }
|
|
17668
|
+
.tb-n { display:inline-grid; place-items:center; min-width:17px; height:17px; padding:0 5px; border-radius:999px; background:var(--accent-soft); color:var(--accent);
|
|
17669
|
+
font-size:var(--fs-micro); font-weight:700; font-variant-numeric:tabular-nums; }
|
|
17670
|
+
.tb-search { display:flex; align-items:center; gap:6px; padding:4px 8px; margin-left:2px; border:1px solid var(--line-strong); border-radius:var(--radius-sm); background:var(--bg);
|
|
17671
|
+
color:var(--muted); min-width:220px; transition:border-color .12s, box-shadow .12s; animation:pal-in .13s ease; }
|
|
17672
|
+
.tb-search:focus-within { border-color:var(--accent); color:var(--accent); box-shadow:0 0 0 2.5px color-mix(in srgb, var(--accent) 16%, transparent); }
|
|
17673
|
+
.tb-search input { flex:1; width:0; min-width:0; border:0; outline:none; background:transparent; font:inherit; font-size:13px; color:var(--fg); }
|
|
17674
|
+
.tb-search .clear { display:grid; place-items:center; width:18px; height:18px; border-radius:50%; color:var(--muted); flex:none; }
|
|
17675
|
+
.tb-search .clear:hover { background:var(--hover-2); color:var(--fg); }
|
|
17676
|
+
/* active filter / sort chips under the toolbar (Notion's rule row) */
|
|
17677
|
+
.tb-chips { display:flex; align-items:center; flex-wrap:wrap; gap:6px; padding:0 0 10px; }
|
|
17678
|
+
.chip-rule { display:inline-flex; align-items:center; gap:5px; padding:3px 6px 3px 8px; border:1px solid var(--line-strong); border-radius:999px; background:var(--bg);
|
|
17679
|
+
font-size:var(--fs-sm); color:var(--fg-soft); max-width:360px; transition:border-color .12s, background .12s; }
|
|
17680
|
+
.chip-rule:hover { border-color:var(--accent); background:var(--accent-soft); }
|
|
17681
|
+
.chip-rule > svg { width:13px; height:13px; color:var(--muted); flex:none; }
|
|
17682
|
+
.chip-rule .k { font-weight:600; color:var(--fg); white-space:nowrap; }
|
|
17683
|
+
.chip-rule .v { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
17684
|
+
.chip-rule .x { display:grid; place-items:center; width:16px; height:16px; border-radius:50%; color:var(--muted); margin-left:2px; }
|
|
17685
|
+
.chip-rule .x:hover { background:var(--hover-2); color:var(--fg); }
|
|
17686
|
+
.chip-rule.op { color:var(--accent); border-style:dashed; padding:3px 9px; font-weight:600; }
|
|
17687
|
+
.chip-rule.sort .k::before { content:""; }
|
|
17688
|
+
/* filter rule editor popover */
|
|
17689
|
+
.fr { min-width:272px; }
|
|
17690
|
+
.fr .lbl { display:flex; align-items:center; gap:6px; text-transform:none; letter-spacing:0; font-size:var(--fs-sm); color:var(--fg); }
|
|
17691
|
+
.fr-conds { display:flex; flex-wrap:wrap; gap:4px; padding:2px 4px 8px; }
|
|
17692
|
+
.fr-cond { padding:3px 9px; border-radius:999px; border:1px solid var(--line); font-size:var(--fs-sm); color:var(--fg-soft); background:var(--bg); white-space:nowrap; }
|
|
17693
|
+
.fr-cond:hover { background:var(--hover-2); color:var(--fg); }
|
|
17694
|
+
.fr-cond.on { background:var(--accent); border-color:var(--accent); color:var(--accent-fg); }
|
|
17695
|
+
.fr .dp { padding:0; }
|
|
17696
|
+
.fr-refs { display:flex; flex-wrap:wrap; gap:4px; padding:4px 8px 6px; font-size:var(--fs-sm); }
|
|
17697
|
+
.pop input.field { font:inherit; font-size:var(--fs-ui); color:var(--fg); }
|
|
17698
|
+
/* sort rows + property visibility rows in their popovers */
|
|
17699
|
+
.sortrow .sortname { flex:1; display:flex; align-items:center; gap:6px; min-width:0; font-size:var(--fs-ui); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
17700
|
+
.sortrow .sortname svg { color:var(--muted); flex:none; }
|
|
17701
|
+
.sortrow .sortdir { display:inline-flex; align-items:center; gap:4px; padding:3px 7px; border-radius:var(--radius-sm); font-size:var(--fs-sm); color:var(--fg-soft); white-space:nowrap; }
|
|
17702
|
+
.sortrow .sortdir:hover { background:var(--hover-2); color:var(--fg); }
|
|
17703
|
+
.flipv { transform:scaleY(-1); }
|
|
17704
|
+
.proprow-v .optlabel { gap:6px; align-items:center; font-size:var(--fs-ui); color:var(--fg); }
|
|
17705
|
+
.proprow-v .optlabel svg { color:var(--muted); flex:none; }
|
|
17706
|
+
.proprow-v .optlabel .nm { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
17707
|
+
.proprow-v.off .optlabel { color:var(--muted); }
|
|
17708
|
+
.proprow-v .x:disabled { opacity:.35; cursor:default; }
|
|
17709
|
+
.proprow-v .x:disabled:hover { background:none; color:var(--muted); }
|
|
17710
|
+
.tablewrap { border-top:1px solid var(--line); border-bottom:1px solid var(--line); }
|
|
17239
17711
|
.tablescroll { overflow-x:auto; }
|
|
17240
17712
|
/* fixed layout + max-content: each <col> width is authoritative, so the table
|
|
17241
17713
|
is exactly the sum of its columns and resizing one column never redistributes
|
|
@@ -17244,12 +17716,26 @@ var styles_default = ` :root {
|
|
|
17244
17716
|
table.grid { border-collapse:collapse; table-layout:fixed; width:max-content; min-width:100%; }
|
|
17245
17717
|
table.grid th, table.grid td { border-right:1px solid var(--line); border-bottom:1px solid var(--line); padding:0; text-align:left; }
|
|
17246
17718
|
table.grid th:last-child, table.grid td:last-child { border-right:0; }
|
|
17247
|
-
table.grid tbody tr:last-child td { border-bottom:
|
|
17248
|
-
thead th { background:var(--
|
|
17249
|
-
.colhead { display:flex; align-items:center; gap:7px; padding:
|
|
17250
|
-
.colhead:hover { background:var(--hover); }
|
|
17251
|
-
.colhead .ti { color:var(--muted); } .colhead .ti svg { width:14px; height:14px; }
|
|
17719
|
+
table.grid tbody tr:last-child td { border-bottom:1px solid var(--line); }
|
|
17720
|
+
thead th { background:var(--bg); position:relative; user-select:none; font-weight:500; color:var(--muted); }
|
|
17721
|
+
.colhead { display:flex; align-items:center; gap:7px; padding:8px 11px; font-size:13px; cursor:pointer; min-height:36px; }
|
|
17722
|
+
.colhead:hover { background:var(--hover); color:var(--fg-soft); }
|
|
17723
|
+
.colhead .ti { color:var(--muted); display:flex; } .colhead .ti svg { width:14px; height:14px; }
|
|
17252
17724
|
.colhead .nm { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
17725
|
+
.colhead .sortmark { width:12px; height:12px; color:var(--accent); flex:none; }
|
|
17726
|
+
.colhead .caret { width:12px; height:12px; color:var(--muted); flex:none; opacity:0; transition:opacity .12s; }
|
|
17727
|
+
.colhead:hover .caret { opacity:1; }
|
|
17728
|
+
table.grid.nowrap .cell { flex-wrap:nowrap; overflow:hidden; }
|
|
17729
|
+
table.grid.nowrap .cell .txt { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
17730
|
+
table.grid tfoot td { border-right:0; border-bottom:0; background:var(--bg); }
|
|
17731
|
+
table.grid tfoot td.calc { height:32px; cursor:pointer; padding:0 11px; font-size:var(--fs-xs); color:var(--muted); text-align:right; white-space:nowrap; user-select:none; }
|
|
17732
|
+
table.grid tfoot td.calc:hover { background:var(--hover); }
|
|
17733
|
+
table.grid tfoot td.calc .k { display:inline-flex; align-items:center; gap:2px; }
|
|
17734
|
+
table.grid tfoot td.calc .k.ghost { opacity:0; transition:opacity .12s; }
|
|
17735
|
+
table.grid tfoot td.calc .k.ghost svg { width:11px; height:11px; }
|
|
17736
|
+
table.grid tfoot:hover td.calc .k.ghost { opacity:.75; }
|
|
17737
|
+
table.grid tfoot td.calc.on .k { margin-right:6px; }
|
|
17738
|
+
table.grid tfoot td.calc.on .v { color:var(--fg); font-weight:600; font-variant-numeric:tabular-nums; }
|
|
17253
17739
|
.col-resizer { position:absolute; top:0; right:-4px; width:7px; height:100%; cursor:col-resize; z-index:2; touch-action:none; }
|
|
17254
17740
|
.addcol { min-width:46px; } .addcol .colhead { justify-content:flex-start; color:var(--muted); }
|
|
17255
17741
|
/* trailing filler column: empty canvas to the right of the data, not a real cell */
|
|
@@ -17257,19 +17743,24 @@ var styles_default = ` :root {
|
|
|
17257
17743
|
body.col-resizing { user-select:none; cursor:col-resize; }
|
|
17258
17744
|
table.grid .selcell { width:38px; min-width:38px; max-width:38px; text-align:center; }
|
|
17259
17745
|
/* relative: anchors the .celledit overlay editor to the cell */
|
|
17260
|
-
td.cell-td { position:relative; vertical-align:top; }
|
|
17746
|
+
td.cell-td { position:relative; vertical-align:top; user-select:none; }
|
|
17747
|
+
td.cell-td .celledit, td.cell-td .celledit * { user-select:text; }
|
|
17261
17748
|
.cell { padding:8px 11px; min-height:37px; cursor:text; word-break:break-word; display:flex; flex-wrap:wrap; gap:3px; align-items:center; }
|
|
17262
17749
|
/* hover/active tint goes on the <td> (always full row height) not the inner
|
|
17263
17750
|
.cell (only as tall as its content), so a taller sibling row never leaves a
|
|
17264
17751
|
gap of un-tinted space at the bottom of the hovered cell. */
|
|
17265
17752
|
td.cell-td { transition:background .1s; }
|
|
17266
|
-
|
|
17753
|
+
.cell.center { justify-content:center; }
|
|
17267
17754
|
tbody tr { transition:background .08s; }
|
|
17268
17755
|
tbody tr:hover { background:var(--hover); }
|
|
17269
17756
|
tbody tr.sel { background:var(--accent-soft); }
|
|
17270
17757
|
/* cell range selection: per-cell fill; the accent rectangle outline is drawn via inline box-shadow on edge cells. Placed after :hover so it wins on equal specificity. */
|
|
17271
17758
|
td.cell-td.cellsel, td.cell-td.cellsel:hover { background:var(--accent-soft); }
|
|
17272
17759
|
body.cell-selecting { user-select:none; cursor:cell; }
|
|
17760
|
+
td.cell-td.fillsel { background:var(--accent-soft); box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--accent) 45%, transparent); }
|
|
17761
|
+
.cell-fill-handle { position:absolute; right:-4px; bottom:-4px; width:8px; height:8px; border-radius:2px; background:var(--accent);
|
|
17762
|
+
border:1.5px solid var(--bg); cursor:crosshair; z-index:4; touch-action:none; }
|
|
17763
|
+
.cell-fill-handle::after { content:""; position:absolute; inset:-6px; }
|
|
17273
17764
|
body.cell-selecting .cell { cursor:cell; }
|
|
17274
17765
|
/* column reorder still marks the target <th>; rows use the .rowdrop line below */
|
|
17275
17766
|
table.grid th.drop-before { box-shadow:inset 2px 0 0 0 var(--accent); }
|
|
@@ -17325,23 +17816,57 @@ var styles_default = ` :root {
|
|
|
17325
17816
|
/* data-resolved (not prefers-color-scheme): tracks a manual dark choice too. */
|
|
17326
17817
|
:root[data-resolved="dark"] .chip { background:color-mix(in srgb,var(--c) 22%,transparent); color:color-mix(in srgb,var(--c) 75%,#fff); }
|
|
17327
17818
|
/* relation chip: an <a> that jumps to the target record */
|
|
17328
|
-
a.chip.rel { text-decoration:none; cursor:pointer; }
|
|
17819
|
+
a.chip.rel { display:inline-block; max-width:100%; overflow:hidden; text-overflow:ellipsis; text-decoration:none; cursor:pointer; }
|
|
17329
17820
|
a.chip.rel:hover { background:color-mix(in srgb,var(--c) 26%,transparent); text-decoration:underline; text-decoration-style:dashed; text-underline-offset:2px; }
|
|
17330
17821
|
/* doc chip whose target is deleted/unsynced: muted + dashed, same cue as the
|
|
17331
17822
|
editor's .cm-doclink-missing pill */
|
|
17332
17823
|
a.chip.rel.doc-missing { background:transparent; color:var(--muted); outline:1px dashed var(--line-strong); outline-offset:-1px; }
|
|
17333
|
-
.addrow { display:flex; align-items:center; gap:7px; padding:
|
|
17824
|
+
.addrow { display:flex; align-items:center; gap:7px; padding:8px 12px; color:var(--muted); font-size:13px; cursor:pointer; border-radius:var(--radius-sm); margin-top:2px; }
|
|
17334
17825
|
.addrow:hover { background:var(--hover); color:var(--fg-soft); }
|
|
17826
|
+
.addrow svg { width:14px; height:14px; }
|
|
17335
17827
|
.gridfoot { display:flex; gap:18px; color:var(--muted); font-size:12px; padding:8px 2px; }
|
|
17336
|
-
|
|
17828
|
+
.inlineedit { width:100%; border:0; outline:2px solid var(--accent); border-radius:0; padding:7px 9px; background:var(--bg); color:var(--fg); font:inherit; }
|
|
17829
|
+
textarea.inlineedit { resize:none; overflow:hidden; line-height:1.45; display:block; }
|
|
17830
|
+
.inlineedit.num { text-align:right; font-variant-numeric:tabular-nums; }
|
|
17337
17831
|
/* Overlay cell editor: floats over the td; the display content underneath
|
|
17338
17832
|
stays in flow so the row height never changes while editing. Padding on the
|
|
17339
|
-
input matches .cell (8px 11px) so the text doesn't shift on entering edit
|
|
17833
|
+
input matches .cell (8px 11px) so the text doesn't shift on entering edit;
|
|
17834
|
+
a multi-line text editor grows downward over the rows below. */
|
|
17340
17835
|
.celledit { position:absolute; top:0; left:0; width:100%; min-height:100%; z-index:10;
|
|
17341
|
-
display:flex; align-items:stretch; background:var(--bg); border-radius:
|
|
17342
|
-
box-shadow:0 0 0 2px var(--accent), var(--shadow-md); }
|
|
17343
|
-
.celledit
|
|
17836
|
+
display:flex; align-items:stretch; background:var(--bg); border-radius:0;
|
|
17837
|
+
box-shadow:inset 0 0 0 2px var(--accent), var(--shadow-md); }
|
|
17838
|
+
.celledit .inlineedit { width:100%; min-width:0; border:0; outline:0; border-radius:inherit;
|
|
17344
17839
|
padding:8px 11px; background:transparent; }
|
|
17840
|
+
.celledit textarea.inlineedit { min-height:37px; }
|
|
17841
|
+
.cell.num { justify-content:flex-end; font-variant-numeric:tabular-nums; }
|
|
17842
|
+
.cell .txt { white-space:pre-wrap; }
|
|
17843
|
+
.cell-url { display:inline-flex; align-items:center; gap:4px; max-width:100%; min-width:0; color:var(--accent); text-decoration:none; }
|
|
17844
|
+
.cell-url span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
17845
|
+
.cell-url svg { flex:none; width:12px; height:12px; opacity:0; transition:opacity .1s; }
|
|
17846
|
+
.cell-url:hover span { text-decoration:underline; text-underline-offset:2px; }
|
|
17847
|
+
td.cell-td:hover .cell-url svg { opacity:.7; }
|
|
17848
|
+
/* loading skeleton: the real grid's cells, sheen bars for content */
|
|
17849
|
+
table.grid.skel { pointer-events:none; }
|
|
17850
|
+
table.grid.skel .skel-t { display:block; height:13px; width:calc(38% + var(--i, 0) * 11%); border-radius:4px; }
|
|
17851
|
+
table.grid.skel th .skel-t { height:12px; width:calc(30% + var(--i, 0) * 9%); }
|
|
17852
|
+
/* date picker (date-picker.tsx) */
|
|
17853
|
+
.dp { padding:2px; }
|
|
17854
|
+
.dp .selsearch.invalid { border-color:var(--danger); }
|
|
17855
|
+
.dp-nav { display:flex; align-items:center; gap:4px; padding:2px 2px 6px; }
|
|
17856
|
+
.dp-nav .iconbtn.sm { width:26px; height:26px; }
|
|
17857
|
+
.dp-title { flex:1; text-align:center; font-size:var(--fs-ui); font-weight:600; color:var(--fg); }
|
|
17858
|
+
.dp-grid { display:grid; grid-template-columns:repeat(7, 32px); gap:2px; justify-content:center; }
|
|
17859
|
+
.dp-head span { text-align:center; font-size:var(--fs-micro); color:var(--muted); font-weight:600; padding:2px 0 4px; }
|
|
17860
|
+
.dp-day { width:32px; height:30px; border-radius:var(--radius-sm); font-size:var(--fs-sm); color:var(--fg); display:grid; place-items:center;
|
|
17861
|
+
font-variant-numeric:tabular-nums; }
|
|
17862
|
+
.dp-day.dim { color:var(--muted); opacity:.55; }
|
|
17863
|
+
.dp-day:hover { background:var(--hover-2); }
|
|
17864
|
+
.dp-day.focus { box-shadow:inset 0 0 0 1.5px var(--accent); }
|
|
17865
|
+
.dp-day.today { font-weight:700; color:var(--accent); }
|
|
17866
|
+
.dp-day.picked { background:var(--accent); color:var(--accent-fg); }
|
|
17867
|
+
.dp-day.picked:hover { background:var(--accent); }
|
|
17868
|
+
.dp-foot { display:flex; align-items:center; gap:2px; padding:8px 2px 2px; margin-top:4px; border-top:1px solid var(--line); }
|
|
17869
|
+
.dp-hint { margin-left:auto; font-size:var(--fs-xs); color:var(--muted); padding-right:4px; }
|
|
17345
17870
|
|
|
17346
17871
|
/* ---- sites (\u7AD9\u70B9\u7BA1\u7406) ---- */
|
|
17347
17872
|
.sites-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(264px, 1fr)); gap:14px; margin-top:4px; }
|
|
@@ -17690,6 +18215,11 @@ var styles_default = ` :root {
|
|
|
17690
18215
|
.proprow .v { flex:1; padding:7px 8px; border-radius:var(--radius-sm); cursor:text; min-height:33px; display:flex; flex-wrap:wrap; gap:3px; align-items:center; }
|
|
17691
18216
|
.proprow .v:hover { background:var(--hover); }
|
|
17692
18217
|
.peek-divider { height:1px; background:var(--line); margin:22px 0 18px; }
|
|
18218
|
+
.peek-hidden-toggle { display:flex; align-items:center; gap:6px; padding:7px 8px; margin:2px 0; border-radius:var(--radius-sm); color:var(--muted); font-size:13px; width:100%; text-align:left; }
|
|
18219
|
+
.peek-hidden-toggle:hover { background:var(--hover); color:var(--fg-soft); }
|
|
18220
|
+
.peek-hidden-toggle svg { transition:transform .15s; }
|
|
18221
|
+
.peek-hidden-toggle svg.down { transform:rotate(90deg); }
|
|
18222
|
+
.peek-head .peek-nav { display:flex; gap:2px; margin-left:4px; }
|
|
17693
18223
|
/* linked-document tabs + embedded editor below the peek's property list */
|
|
17694
18224
|
.peekdocs-tabs { display:flex; align-items:center; gap:4px; flex-wrap:wrap; margin-bottom:6px; }
|
|
17695
18225
|
.peekdocs-tab { border:0; background:none; font:inherit; font-size:var(--fs-sm); font-weight:500; color:var(--muted);
|
|
@@ -17720,7 +18250,7 @@ var styles_default = ` :root {
|
|
|
17720
18250
|
.hist-kind.repair { background:var(--danger-soft); color:var(--danger); }
|
|
17721
18251
|
.hist-now { font-size:var(--fs-xs); padding:1px 6px; border-radius:99px; background:var(--accent); color:var(--accent-fg); }
|
|
17722
18252
|
.hist-preview { flex:1; overflow:auto; padding:20px 24px; }
|
|
17723
|
-
.hist-doc-title { font-size:21px; font-weight:700; letter-spacing:-.02em; margin-bottom:14px; }
|
|
18253
|
+
.hist-doc-title { font-size:21px; font-weight:700; letter-spacing:-.02em; margin-bottom:14px; overflow-wrap:anywhere; }
|
|
17724
18254
|
.hist-foot { display:flex; justify-content:flex-end; padding:12px 16px; border-top:1px solid var(--line); }
|
|
17725
18255
|
.pad { padding:12px; }
|
|
17726
18256
|
.hist-rec-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; }
|
|
@@ -17827,50 +18357,68 @@ var styles_default = ` :root {
|
|
|
17827
18357
|
button.fname.link { border:0; background:none; padding:0; text-align:left; cursor:pointer; font-size:inherit; }
|
|
17828
18358
|
button.fname.link:hover { color:var(--accent); text-decoration:underline; text-decoration-style:dashed; }
|
|
17829
18359
|
|
|
18360
|
+
/* key caps (kbd.tsx) */
|
|
18361
|
+
.kbd { display:inline-flex; align-items:center; gap:2px; vertical-align:middle; font-family:var(--kbd-font);
|
|
18362
|
+
font-variant-numeric:tabular-nums; color:var(--muted); white-space:nowrap; }
|
|
18363
|
+
.kbd .key { display:inline-grid; place-items:center; min-width:18px; height:18px; padding:0 4px;
|
|
18364
|
+
border:1px solid var(--line-strong); border-radius:5px; background:var(--surface); font-size:10.5px; font-weight:500; line-height:1; }
|
|
18365
|
+
.kbd .key.sym { font-size:12.5px; }
|
|
18366
|
+
|
|
18367
|
+
/* tooltip (TooltipHost in ui.tsx) */
|
|
18368
|
+
.tip { position:fixed; z-index:118; pointer-events:none; display:inline-flex; align-items:center; gap:8px;
|
|
18369
|
+
padding:5px 8px; border-radius:7px; background:var(--tip-bg); color:var(--tip-fg); font-size:12px; line-height:1.3;
|
|
18370
|
+
white-space:nowrap; box-shadow:var(--shadow-md); animation:tip-in .12s ease-out; }
|
|
18371
|
+
:root[data-resolved="dark"] .tip { border:1px solid var(--line-strong); }
|
|
18372
|
+
.tip[data-side="above"] { animation-name:tip-in-above; }
|
|
18373
|
+
.tip .kbd { color:var(--tip-kbd-fg); }
|
|
18374
|
+
.tip .kbd .key { min-width:16px; height:16px; padding:0 3px; background:var(--tip-kbd-bg); border-color:transparent; font-size:10px; }
|
|
18375
|
+
.tip .kbd .key.sym { font-size:11.5px; }
|
|
18376
|
+
@keyframes tip-in { from { opacity:0; transform:translateY(2px); } }
|
|
18377
|
+
@keyframes tip-in-above { from { opacity:0; transform:translateY(-2px); } }
|
|
18378
|
+
|
|
17830
18379
|
/* menu / popover */
|
|
17831
18380
|
.menu-layer { position:fixed; inset:0; z-index:115; }
|
|
17832
18381
|
.pop { position:fixed; background:var(--bg); border:1px solid var(--line); border-radius:var(--radius); box-shadow:var(--shadow-lg);
|
|
17833
|
-
padding:6px; min-width:232px; max-height:70vh; overflow:auto; animation:pop .12s ease; }
|
|
18382
|
+
padding:6px; min-width:232px; max-width:min(420px, calc(100vw - 20px)); max-height:70vh; overflow:auto; animation:pop .12s ease; }
|
|
17834
18383
|
@keyframes pop { from { opacity:0; transform:translateY(-4px); } }
|
|
17835
18384
|
/* Action-sheet variant: MenuHost (ui.tsx) adds .sheet on phones, where an
|
|
17836
18385
|
anchored popover clips at the edges and sits under the finger. */
|
|
17837
18386
|
.pop.sheet { left:8px; right:8px; top:auto; bottom:calc(8px + env(safe-area-inset-bottom));
|
|
17838
|
-
min-width:0; max-height:60vh; max-height:60dvh; border-radius:var(--radius-lg);
|
|
18387
|
+
min-width:0; max-width:none; max-height:60vh; max-height:60dvh; border-radius:var(--radius-lg);
|
|
17839
18388
|
animation:sheet-in .18s ease; }
|
|
17840
18389
|
@keyframes sheet-in { from { opacity:0; transform:translateY(12px); } }
|
|
17841
|
-
.pop .lbl { font-size:var(--fs-micro); font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; padding:6px 8px 3px; }
|
|
17842
|
-
.pop .item { display:flex; align-items:center; gap:10px; padding:7px 8px; border-radius:var(--radius-sm); width:100%; text-align:left; color:var(--fg); font-size:var(--fs-ui); }
|
|
17843
|
-
.pop .item:hover, .pop .item.sel { background:var(--hover-2); }
|
|
17844
|
-
.pop .item
|
|
17845
|
-
.pop .item .lico
|
|
17846
|
-
.pop .item .
|
|
17847
|
-
|
|
17848
|
-
.pop .item .
|
|
17849
|
-
|
|
17850
|
-
|
|
17851
|
-
.pop .item
|
|
17852
|
-
.pop .
|
|
17853
|
-
.pop .sep { height:1px; background:var(--line); margin:5px 4px; }
|
|
18390
|
+
:is(.pop,.palette) .lbl { font-size:var(--fs-micro); font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; padding:6px 8px 3px; }
|
|
18391
|
+
:is(.pop,.palette) .item { display:flex; align-items:center; gap:10px; padding:7px 8px; border-radius:var(--radius-sm); width:100%; text-align:left; color:var(--fg); font-size:var(--fs-ui); }
|
|
18392
|
+
:is(.pop,.palette) .item:hover, :is(.pop,.palette) .item.sel { background:var(--hover-2); }
|
|
18393
|
+
:is(.pop,.palette) .item:focus-visible { outline:none; background:var(--hover-2); box-shadow:inset 0 0 0 1.5px var(--accent); }
|
|
18394
|
+
:is(.pop,.palette) .item .lico { width:28px; height:28px; display:grid; place-items:center; border:1px solid var(--line); border-radius:6px; color:var(--fg-soft); flex:none; }
|
|
18395
|
+
:is(.pop,.palette) .item .lico.plain { border:0; width:22px; height:22px; }
|
|
18396
|
+
:is(.pop,.palette) .item .meta { flex:1; min-width:0; }
|
|
18397
|
+
:is(.pop,.palette) .item .t { font-size:var(--fs-ui); display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } :is(.pop,.palette) .item .d { font-size:var(--fs-xs); color:var(--muted); display:block; }
|
|
18398
|
+
:is(.pop,.palette) .item .chk { color:var(--accent); margin-left:auto; }
|
|
18399
|
+
:is(.pop,.palette) .item .kbd { margin-left:auto; }
|
|
18400
|
+
:is(.pop,.palette) .item.danger { color:var(--danger); } :is(.pop,.palette) .item.danger .lico { color:var(--danger); }
|
|
18401
|
+
:is(.pop,.palette) .sep { height:1px; background:var(--line); margin:5px 4px; }
|
|
17854
18402
|
.pop .typegrid { display:grid; grid-template-columns:repeat(4,1fr); gap:4px; padding:2px 2px 4px; }
|
|
17855
18403
|
.pop .typegrid .item { flex-direction:column; gap:5px; padding:9px 4px; text-align:center; }
|
|
17856
18404
|
.pop .typegrid .item .lico { margin:0 auto; }
|
|
17857
18405
|
.pop input.field { width:100%; border:1px solid var(--line-strong); border-radius:var(--radius-sm); padding:7px 9px; outline:none; background:var(--surface); margin:2px; }
|
|
17858
18406
|
.pop input.field:focus { border-color:var(--accent); }
|
|
17859
18407
|
/* select-cell picker: search/create input at the top of the popover */
|
|
17860
|
-
.pop .selsearch { display:flex; align-items:center; gap:7px; margin:2px 2px 6px; padding:6px 9px;
|
|
18408
|
+
:is(.pop,.palette) .selsearch { display:flex; align-items:center; gap:7px; margin:2px 2px 6px; padding:6px 9px;
|
|
17861
18409
|
border:1px solid var(--line-strong); border-radius:var(--radius-sm); background:var(--surface); color:var(--muted);
|
|
17862
18410
|
transition:border-color .12s ease, box-shadow .12s ease, color .12s ease; }
|
|
17863
|
-
.pop .selsearch:focus-within { border-color:var(--accent); color:var(--accent);
|
|
18411
|
+
:is(.pop,.palette) .selsearch:focus-within { border-color:var(--accent); color:var(--accent);
|
|
17864
18412
|
box-shadow:0 0 0 2.5px color-mix(in srgb, var(--accent) 16%, transparent); }
|
|
17865
|
-
.pop .selsearch input { flex:1; width:0; min-width:0; border:0; background:transparent; outline:none;
|
|
18413
|
+
:is(.pop,.palette) .selsearch input { flex:1; width:0; min-width:0; border:0; background:transparent; outline:none;
|
|
17866
18414
|
font:inherit; font-size:var(--fs-ui); color:var(--fg); }
|
|
17867
|
-
.pop .selsearch input::placeholder { color:var(--muted); }
|
|
17868
|
-
.pop .selsearch .clear { display:grid; place-items:center; width:18px; height:18px; margin:-2px -3px -2px 0;
|
|
18415
|
+
:is(.pop,.palette) .selsearch input::placeholder { color:var(--muted); }
|
|
18416
|
+
:is(.pop,.palette) .selsearch .clear { display:grid; place-items:center; width:18px; height:18px; margin:-2px -3px -2px 0;
|
|
17869
18417
|
border-radius:50%; color:var(--muted); flex:none; }
|
|
17870
|
-
.pop .selsearch .clear:hover { background:var(--hover-2); color:var(--fg); }
|
|
18418
|
+
:is(.pop,.palette) .selsearch .clear:hover { background:var(--hover-2); color:var(--fg); }
|
|
17871
18419
|
/* relation record picker: fixed-height list \u2014 the popover is positioned once
|
|
17872
18420
|
on open, so async-loaded rows must scroll instead of growing off-screen */
|
|
17873
|
-
.pop .rellist { max-height:264px; overflow-y:auto; }
|
|
18421
|
+
:is(.pop,.palette) .rellist { max-height:264px; overflow-y:auto; }
|
|
17874
18422
|
.optrow { display:flex; align-items:center; gap:6px; padding:3px 4px; }
|
|
17875
18423
|
.optrow .chip { flex:1; }
|
|
17876
18424
|
.optrow .grip { width:18px; height:22px; display:grid; place-items:center; color:var(--muted); cursor:grab; touch-action:none; flex:none; }
|
|
@@ -17915,12 +18463,46 @@ var styles_default = ` :root {
|
|
|
17915
18463
|
/* opt-in (openModal aboveMenus): stack one dialog over the menu layer (115)
|
|
17916
18464
|
so a confirm can appear without dismissing an open popover */
|
|
17917
18465
|
.modal-scrim.above-menus { z-index:130; }
|
|
17918
|
-
.modal { background:var(--bg); border-radius:var(--radius-xl); box-shadow:var(--shadow-lg); width:440px; max-width:100%; max-height:100%; display:flex; flex-direction:column; overflow:hidden;
|
|
18466
|
+
.modal { background:var(--bg); border-radius:var(--radius-xl); box-shadow:var(--shadow-lg); width:440px; max-width:100%; max-height:100%; display:flex; flex-direction:column; overflow:hidden;
|
|
18467
|
+
animation:mo-in .13s ease-out; }
|
|
18468
|
+
@keyframes mo-in { from { opacity:0; transform:translateY(6px) scale(.98); } }
|
|
18469
|
+
@keyframes mo-out { to { opacity:0; transform:translateY(4px) scale(.985); } }
|
|
18470
|
+
.modal-scrim.closing .modal { animation:mo-out .12s ease-in forwards; }
|
|
18471
|
+
/* command palette (palette.tsx) */
|
|
18472
|
+
.palette { width:600px; align-self:flex-start; margin-top:11vh; padding:0 8px 0; max-height:min(64vh, 560px);
|
|
18473
|
+
animation:pal-in .13s ease-out; }
|
|
18474
|
+
@keyframes pal-in { from { opacity:0; transform:translateY(-6px) scale(.985); } }
|
|
18475
|
+
.pal-head { display:flex; align-items:center; gap:10px; padding:13px 8px 12px 10px; margin:0 0 6px; border-bottom:1px solid var(--line); color:var(--muted); }
|
|
18476
|
+
.pal-head input { flex:1; width:0; min-width:0; border:0; background:transparent; outline:none; font:inherit; font-size:16px; color:var(--fg); }
|
|
18477
|
+
.pal-head input::placeholder { color:var(--muted); }
|
|
18478
|
+
.pal-head .clear { display:grid; place-items:center; width:20px; height:20px; border-radius:50%; color:var(--muted); flex:none; }
|
|
18479
|
+
.pal-head .clear:hover { background:var(--hover-2); color:var(--fg); }
|
|
18480
|
+
.pal-close { display:none; place-items:center; width:28px; height:28px; border-radius:50%; color:var(--muted); flex:none; }
|
|
18481
|
+
.pal-close:active { background:var(--hover-2); }
|
|
18482
|
+
.pal-list { flex:1; min-height:0; overflow-y:auto; padding-bottom:4px; overscroll-behavior:contain; }
|
|
18483
|
+
.pal-sec + .pal-sec { margin-top:4px; }
|
|
18484
|
+
.palette .item { padding:7px 10px; }
|
|
18485
|
+
.palette .item .lico.plain { color:var(--muted); }
|
|
18486
|
+
:is(.pop,.palette) .item .lico .emo { font-size:15px; line-height:1; }
|
|
18487
|
+
:is(.pop,.palette) .item.sub-r .meta { display:flex; align-items:baseline; gap:12px; }
|
|
18488
|
+
:is(.pop,.palette) .item.sub-r .t { flex:1; }
|
|
18489
|
+
:is(.pop,.palette) .item.sub-r .d { flex:none; max-width:42%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
18490
|
+
.palette .item .d.snip { flex:1 1 100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
18491
|
+
.palette .item:has(.snip) .meta { flex-wrap:wrap; gap:1px 12px; }
|
|
18492
|
+
:is(.pop,.palette) mark { background:transparent; color:var(--accent); font-weight:600; }
|
|
18493
|
+
:is(.pop,.palette) .item .ret { margin-left:auto; flex:none; opacity:0; transition:opacity .1s; }
|
|
18494
|
+
:is(.pop,.palette) .item.sel .ret, :is(.pop,.palette) .item:focus-visible .ret { opacity:1; }
|
|
18495
|
+
:is(.pop,.palette) .pal-empty { padding:22px 12px 20px; text-align:center; color:var(--muted); font-size:var(--fs-ui); }
|
|
18496
|
+
.pal-foot { display:flex; align-items:center; gap:12px; padding:8px 10px 9px; margin:4px -8px 0; border-top:1px solid var(--line); color:var(--muted); font-size:var(--fs-xs); }
|
|
18497
|
+
.pal-foot .keys { display:flex; align-items:center; gap:4px 10px; flex-wrap:wrap; }
|
|
18498
|
+
.pal-foot .kbd { margin-right:2px; }
|
|
18499
|
+
.pal-foot .hint { margin-left:auto; white-space:nowrap; }
|
|
17919
18500
|
.modal-head { padding:20px 22px 0; }
|
|
17920
18501
|
.modal-head h3 { margin:0; font-size:18px; font-weight:700; letter-spacing:-.01em; }
|
|
17921
18502
|
.modal-head p { margin:6px 0 0; color:var(--muted); font-size:var(--fs-ui); }
|
|
17922
18503
|
.modal-body { padding:18px 22px; overflow-y:auto; }
|
|
17923
|
-
.modal-foot { display:flex; justify-content:flex-end; gap:8px; padding:14px 22px; background:var(--surface); border-top:1px solid var(--line); }
|
|
18504
|
+
.modal-foot { display:flex; justify-content:flex-end; align-items:center; gap:8px; padding:14px 22px; background:var(--surface); border-top:1px solid var(--line); }
|
|
18505
|
+
.modal-hint { margin-right:auto; display:flex; align-items:center; gap:4px 8px; color:var(--muted); font-size:var(--fs-xs); }
|
|
17924
18506
|
.field-label { font-size:12px; font-weight:600; color:var(--fg-soft); margin:12px 0 5px; }
|
|
17925
18507
|
.field-label:first-child { margin-top:0; }
|
|
17926
18508
|
.text-input { width:100%; border:1px solid var(--line-strong); border-radius:var(--radius-sm); padding:9px 11px; outline:none; background:var(--surface); font-size:var(--fs-body); }
|
|
@@ -17943,6 +18525,12 @@ var styles_default = ` :root {
|
|
|
17943
18525
|
.toast { background:var(--fg); color:var(--bg); padding:10px 14px; border-radius:9px; font-size:13px; box-shadow:var(--shadow-lg);
|
|
17944
18526
|
display:flex; align-items:center; gap:8px; animation:slidein .2s ease; }
|
|
17945
18527
|
@keyframes slidein { from { opacity:0; transform:translateX(-12px); } }
|
|
18528
|
+
.toast.error { background:var(--danger); color:#fff; }
|
|
18529
|
+
.toast.leaving { animation:toast-out .16s ease-in forwards; pointer-events:none; }
|
|
18530
|
+
@keyframes toast-out { to { opacity:0; transform:translateX(-8px); } }
|
|
18531
|
+
.toast-msg { min-width:0; }
|
|
18532
|
+
.toast-act { margin-left:4px; padding:3px 9px; border-radius:6px; font-weight:600; color:inherit; background:color-mix(in srgb, var(--bg) 16%, transparent); white-space:nowrap; }
|
|
18533
|
+
.toast-act:hover { background:color-mix(in srgb, var(--bg) 28%, transparent); }
|
|
17946
18534
|
|
|
17947
18535
|
/* misc */
|
|
17948
18536
|
.empty { display:flex; flex-direction:column; align-items:center; justify-content:center; height:100%;
|
|
@@ -18010,9 +18598,74 @@ var styles_default = ` :root {
|
|
|
18010
18598
|
.kg-glow { opacity:.6 !important; }
|
|
18011
18599
|
.kg-particle { opacity:0 !important; }
|
|
18012
18600
|
}
|
|
18013
|
-
.error-bar { margin:12px 24px; padding:10px
|
|
18601
|
+
.error-bar { margin:12px 24px; padding:8px 10px 8px 12px; background:var(--danger-soft); color:var(--danger); border-radius:var(--radius-sm); font-size:13px;
|
|
18602
|
+
display:flex; align-items:center; gap:8px; animation:mo-in .13s ease-out; }
|
|
18603
|
+
.error-bar .error-msg { flex:1; min-width:0; overflow-wrap:anywhere; }
|
|
18604
|
+
.error-bar .error-x { display:grid; place-items:center; width:22px; height:22px; border-radius:50%; color:inherit; flex:none; }
|
|
18605
|
+
.error-bar .error-x:hover { background:color-mix(in srgb, var(--danger) 14%, transparent); }
|
|
18606
|
+
.sb-empty { color:var(--muted); gap:6px; width:100%; text-align:left; }
|
|
18607
|
+
.sb-empty:hover { color:var(--fg); }
|
|
18608
|
+
.tbl-empty { padding:36px 20px 28px; }
|
|
18609
|
+
.set-empty { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:6px 0; }
|
|
18610
|
+
.blob-mgr-empty { display:flex; flex-direction:column; align-items:center; gap:12px; }
|
|
18611
|
+
.doc-skel { max-width:720px; margin:40px auto; padding:0 24px; }
|
|
18612
|
+
|
|
18613
|
+
/* share / publish modal (share-modal.tsx) */
|
|
18614
|
+
.mhshare-body { display:flex; flex-direction:column; gap:10px; }
|
|
18615
|
+
.mhshare-section { font-size:var(--fs-micro); font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; margin-top:6px; }
|
|
18616
|
+
.mhshare-field { display:flex; align-items:center; gap:12px; }
|
|
18617
|
+
.mhshare-field > span { width:64px; color:var(--muted); flex:none; font-size:var(--fs-ui); }
|
|
18618
|
+
.mhshare-field select, .mhshare-field input { flex:1; padding:7px 9px; border:1px solid var(--line-strong); border-radius:var(--radius-sm); background:var(--surface); color:inherit; min-width:0; font:inherit; }
|
|
18619
|
+
.mhshare-field select:focus, .mhshare-field input:focus { border-color:var(--accent); outline:none; }
|
|
18620
|
+
.mhshare-field .row-select { flex:1; justify-content:space-between; border:1px solid var(--line-strong); background:var(--surface); }
|
|
18621
|
+
.mhshare-foot { display:flex; justify-content:flex-end; gap:8px; margin:4px 0 2px; }
|
|
18622
|
+
.mhshare-foot button, .mhshare-result button, .mhshare-result a, .mhshare-li-actions button, .mhshare-li-actions a, .mhshare-guide-actions button {
|
|
18623
|
+
display:inline-flex; align-items:center; gap:6px; padding:5px 11px; border:1px solid var(--line-strong); border-radius:var(--radius-sm);
|
|
18624
|
+
background:var(--surface); color:inherit; font-size:var(--fs-sm); font-weight:500; text-decoration:none; cursor:pointer; transition:all .12s; }
|
|
18625
|
+
.mhshare-foot button:hover, .mhshare-result button:hover, .mhshare-result a:hover, .mhshare-li-actions button:hover, .mhshare-li-actions a:hover, .mhshare-guide-actions button:hover { background:var(--hover-2); }
|
|
18626
|
+
.mhshare-primary { background:var(--accent) !important; color:var(--accent-fg) !important; border-color:var(--accent) !important; }
|
|
18627
|
+
.mhshare-primary:hover { filter:brightness(1.05); }
|
|
18628
|
+
.mhshare-primary:disabled { opacity:.6; cursor:default; }
|
|
18629
|
+
.mhshare-note { color:var(--muted); font-size:var(--fs-sm); margin:2px 0; line-height:1.5; }
|
|
18630
|
+
.mhshare-err { color:var(--danger); font-size:var(--fs-sm); margin:0; }
|
|
18631
|
+
.mhshare-ok { color:var(--success); font-size:var(--fs-sm); margin:0; }
|
|
18632
|
+
.mhshare-warn { color:var(--fg-soft); font-size:var(--fs-xs); }
|
|
18633
|
+
.mhshare-result { display:flex; gap:6px; align-items:center; padding:8px; border:1px solid var(--line); border-radius:var(--radius-sm); background:var(--surface); }
|
|
18634
|
+
.mhshare-result code { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--fs-xs); font-family:var(--mono); }
|
|
18635
|
+
.mhshare-list { list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:8px; }
|
|
18636
|
+
.mhshare-list li { border:1px solid var(--line); border-radius:var(--radius); padding:9px 11px; display:flex; flex-direction:column; gap:6px; }
|
|
18637
|
+
.mhshare-li-main { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
|
|
18638
|
+
.mhshare-badge { font-size:var(--fs-micro); background:var(--surface-2); border:1px solid var(--line); border-radius:999px; padding:1px 8px; }
|
|
18639
|
+
.mhshare-badge-pub { color:var(--accent); border-color:transparent; background:var(--accent-soft); }
|
|
18640
|
+
.mhshare-src { font-weight:600; overflow-wrap:anywhere; }
|
|
18641
|
+
.mhshare-meta { color:var(--muted); font-size:var(--fs-xs); }
|
|
18642
|
+
.mhshare-li-actions { display:flex; gap:6px; align-items:center; flex-wrap:wrap; }
|
|
18643
|
+
.mhshare-danger { color:var(--danger) !important; }
|
|
18644
|
+
.mhshare-form { display:flex; flex-direction:column; gap:10px; border:1px solid var(--line); border-radius:var(--radius); padding:12px; }
|
|
18645
|
+
.mhshare-addrow { display:flex; gap:8px; }
|
|
18646
|
+
.mhshare-addbtn { flex:1; display:flex; flex-direction:column; align-items:flex-start; gap:2px; padding:9px 12px; border:1px solid var(--line-strong); border-radius:var(--radius); background:none; color:inherit; cursor:pointer; text-align:left; transition:border-color .12s, box-shadow .12s; }
|
|
18647
|
+
.mhshare-addbtn:hover { background:var(--hover); }
|
|
18648
|
+
.mhshare-addbtn.sel { border-color:var(--accent); box-shadow:0 0 0 1px var(--accent) inset; }
|
|
18649
|
+
.mhshare-grants { display:flex; flex-direction:column; gap:6px; }
|
|
18650
|
+
.mhshare-grantlist { list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:4px; }
|
|
18651
|
+
.mhshare-grantlist li { display:flex; align-items:center; gap:14px; padding:5px 8px; border:1px solid var(--line); border-radius:var(--radius-sm); }
|
|
18652
|
+
.mhshare-grantlist label { display:flex; align-items:center; gap:4px; font-size:var(--fs-sm); color:var(--muted); cursor:pointer; }
|
|
18653
|
+
.mhshare-grantdb { flex:1; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
18654
|
+
.mhshare-adv { align-self:flex-start; background:none; border:0; color:var(--accent); font-size:var(--fs-xs); cursor:pointer; padding:0; }
|
|
18655
|
+
.mhshare-acard-t { font-weight:600; font-size:var(--fs-ui); }
|
|
18656
|
+
.mhshare-acard-d { color:var(--muted); font-size:var(--fs-xs); }
|
|
18657
|
+
.mhshare-hostsum { flex:1; display:flex; align-items:center; gap:8px; padding:8px 10px; border:1px solid var(--line-strong); border-radius:var(--radius-sm); background:var(--surface); font-size:var(--fs-sm); }
|
|
18658
|
+
.mhshare-hostsum span { flex:1; }
|
|
18659
|
+
.mhshare-hostsum button { background:none; border:0; color:var(--accent); font-size:var(--fs-xs); cursor:pointer; padding:0; flex:none; }
|
|
18660
|
+
.mhshare-guide { border:1px solid var(--line-strong); border-left:3px solid var(--accent); border-radius:var(--radius-sm); padding:8px 11px; display:flex; flex-direction:column; gap:6px; }
|
|
18661
|
+
.mhshare-guide p { margin:0; font-size:var(--fs-sm); color:var(--fg); }
|
|
18662
|
+
.mhshare-guide-actions { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
|
|
18663
|
+
.mhshare-guide-link { border:0 !important; background:none !important; color:var(--accent) !important; padding:4px 0 !important; }
|
|
18014
18664
|
.offline-bar { margin:12px 24px 0; padding:8px 14px; background:var(--surface-2); color:var(--fg-soft); border-radius:var(--radius-sm); font-size:12.5px; }
|
|
18015
18665
|
.search-hit { margin:0 0 8px; padding:10px 14px; background:var(--surface); border-radius:var(--radius-sm); font-size:13px; cursor:pointer; }
|
|
18666
|
+
.search-hit-head { display:flex; align-items:baseline; gap:6px; min-width:0; }
|
|
18667
|
+
.search-hit-head strong { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
18668
|
+
.search-hit-head .muted { flex:none; }
|
|
18016
18669
|
.search-hit:hover { background:var(--surface-2); }
|
|
18017
18670
|
.search-hit mark { background:transparent; color:var(--accent); font-weight:600; }
|
|
18018
18671
|
.view-placeholder { padding:40px; text-align:center; border:1px dashed var(--line-strong); border-radius:var(--radius); color:var(--muted); margin-top:8px; }
|
|
@@ -18235,17 +18888,15 @@ var styles_default = ` :root {
|
|
|
18235
18888
|
.navitem { padding:9px 8px; font-size:16px; }
|
|
18236
18889
|
.navitem .emoji { font-size:18px; }
|
|
18237
18890
|
.navitem .tw { width:26px; height:26px; }
|
|
18238
|
-
.sb-search kbd, .pop .item kbd { display:none; } /* no hardware keyboard, no shortcut hint */
|
|
18891
|
+
.sb-search .kbd, :is(.pop,.palette) .item .kbd { display:none; } /* no hardware keyboard, no shortcut hint */
|
|
18239
18892
|
/* Search box is hidden until the header search button reveals it; it then
|
|
18240
18893
|
slides+fades down in. Desktop base (.sb-search{display:flex}) is untouched,
|
|
18241
18894
|
so search stays always-on there. reduced-motion is handled globally. */
|
|
18242
18895
|
.sb-search { display:none; }
|
|
18243
|
-
.sb-search.open { display:flex; animation:search-reveal .22s cubic-bezier(.32,.72,0,1); }
|
|
18244
|
-
@keyframes search-reveal { from { opacity:0; transform:translateY(-8px); } }
|
|
18245
18896
|
.btn { font-size:15px; }
|
|
18246
18897
|
.crumb { font-size:16px; }
|
|
18247
|
-
.pop .item { font-size:16px; }
|
|
18248
|
-
.pop .item .t { font-size:16px; }
|
|
18898
|
+
:is(.pop,.palette) .item { font-size:16px; }
|
|
18899
|
+
:is(.pop,.palette) .item .t { font-size:16px; }
|
|
18249
18900
|
|
|
18250
18901
|
/* Document: bigger body text, tighter side padding for narrow screens. */
|
|
18251
18902
|
.doc { padding:24px 18px calc(36vh + env(safe-area-inset-bottom)); }
|
|
@@ -18296,11 +18947,24 @@ var styles_default = ` :root {
|
|
|
18296
18947
|
border-radius:var(--radius-xl) var(--radius-xl) 0 0;
|
|
18297
18948
|
padding-bottom:env(safe-area-inset-bottom);
|
|
18298
18949
|
animation:sheet-up .22s cubic-bezier(.32,.72,0,1); }
|
|
18950
|
+
.modal-scrim.closing .modal { animation:sheet-out .16s ease-in forwards; }
|
|
18951
|
+
.modal-scrim.closing .modal.palette { animation:sheet-down-out .16s ease-in forwards; }
|
|
18952
|
+
.modal.palette { align-self:flex-start; margin-top:0; max-height:80vh; max-height:80dvh;
|
|
18953
|
+
padding:env(safe-area-inset-top) 8px 0; border-radius:0 0 var(--radius-xl) var(--radius-xl);
|
|
18954
|
+
animation:sheet-down .22s cubic-bezier(.32,.72,0,1); }
|
|
18955
|
+
:is(.pop,.palette) .item.sub-r .meta { display:block; }
|
|
18956
|
+
:is(.pop,.palette) .item.sub-r .d { max-width:none; }
|
|
18957
|
+
:is(.pop,.palette) .item .ret, .pal-foot .keys, .pal-head .kbd, .modal-hint { display:none; }
|
|
18958
|
+
.pal-foot .hint { margin-left:0; }
|
|
18959
|
+
.pal-close { display:grid; }
|
|
18299
18960
|
.toasts { left:12px; right:12px; bottom:calc(12px + env(safe-area-inset-bottom)); }
|
|
18300
18961
|
.toast { justify-content:center; }
|
|
18301
18962
|
.selbar { bottom:calc(16px + env(safe-area-inset-bottom)); max-width:calc(100vw - 24px); }
|
|
18302
18963
|
}
|
|
18303
18964
|
@keyframes sheet-up { from { transform:translateY(100%); } }
|
|
18965
|
+
@keyframes sheet-down { from { transform:translateY(-100%); } }
|
|
18966
|
+
@keyframes sheet-out { to { transform:translateY(100%); } }
|
|
18967
|
+
@keyframes sheet-down-out { to { transform:translateY(-100%); } }
|
|
18304
18968
|
/* In-flow stand-in for the old two-pane slide: only the entering view
|
|
18305
18969
|
animates (the other is display:none, document-scroll layout above). */
|
|
18306
18970
|
@keyframes page-in { from { transform:translateX(28px); opacity:0; } }
|
|
@@ -18317,7 +18981,7 @@ var styles_default = ` :root {
|
|
|
18317
18981
|
.sb-tabs .add { width:40px; height:40px; display:grid; place-items:center; padding:0; }
|
|
18318
18982
|
.iconbtn { width:40px; height:40px; }
|
|
18319
18983
|
.btn { padding:9px 14px; min-height:40px; }
|
|
18320
|
-
.pop .item { padding:11px 10px; }
|
|
18984
|
+
:is(.pop,.palette) .item { padding:11px 10px; }
|
|
18321
18985
|
/* Column/sidebar resize handles: 7px is a mouse affordance, not a finger's. */
|
|
18322
18986
|
.col-resizer, .doc-col-resizer, .sb-resizer { width:16px; right:-8px; }
|
|
18323
18987
|
/* cell-rectangle corner handle: big enough to grab with a finger (it is the
|
|
@@ -18391,6 +19055,8 @@ var styles_default = ` :root {
|
|
|
18391
19055
|
.qn-body { flex:1; overflow:auto; scrollbar-gutter:stable; scrollbar-width:thin; -webkit-app-region:no-drag; }
|
|
18392
19056
|
.qn-body .doc { max-width:none; margin:0; padding:14px 1px 30vh 12px; }
|
|
18393
19057
|
.qn-body .doc-title { font-size:24px; margin-bottom:2px; }
|
|
19058
|
+
.qn-body .doc-title { overflow-wrap:anywhere; }
|
|
19059
|
+
.qn-body .doc-title:not(:focus) { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
18394
19060
|
.qn-body .doc-meta { display:none; }
|
|
18395
19061
|
/* The CM6 hover gutter never fits the compact window: quick notes offer no
|
|
18396
19062
|
block insert/drag handles (Enter / slash commands cover insertion). */
|
|
@@ -18411,6 +19077,7 @@ var styles_default = ` :root {
|
|
|
18411
19077
|
share .pop/.item/.lico with the main app; scope under the quick window
|
|
18412
19078
|
body classes so the main app keeps its roomier density). */
|
|
18413
19079
|
body.quicknote .pop, body.quickboard .pop { padding:5px; border-radius:9px; }
|
|
19080
|
+
body.quicknote .menu-layer .pop, body.quickboard .menu-layer .pop { max-width:50vw; }
|
|
18414
19081
|
body.quicknote .pop .lbl, body.quickboard .pop .lbl { padding:4px 8px 2px; font-size:10px; }
|
|
18415
19082
|
body.quicknote .pop .item, body.quickboard .pop .item { padding:5px 9px; gap:8px; font-size:var(--fs-sm); }
|
|
18416
19083
|
body.quicknote .pop .item .t, body.quickboard .pop .item .t { font-size:var(--fs-sm); }
|
|
@@ -18645,17 +19312,7 @@ var styles_default = ` :root {
|
|
|
18645
19312
|
.switch.on .switch-knob { transform:translateX(16px); }
|
|
18646
19313
|
.ico.spin { animation:save-spin .8s linear infinite; }
|
|
18647
19314
|
|
|
18648
|
-
/* clear-policy segmented control (redundancy any/all) */
|
|
18649
19315
|
.seg { display:flex; gap:8px; }
|
|
18650
|
-
.seg-opt { flex:1 1 0; display:flex; flex-direction:column; gap:2px; align-items:flex-start;
|
|
18651
|
-
text-align:left; padding:9px 12px; border:1px solid var(--line-strong); border-radius:var(--radius);
|
|
18652
|
-
background:var(--surface); cursor:pointer; transition:border-color .14s, background .14s, box-shadow .14s; }
|
|
18653
|
-
.seg-opt:hover { border-color:var(--muted); }
|
|
18654
|
-
.seg-opt.on { border-color:var(--accent); background:var(--accent-soft); box-shadow:0 0 0 1px var(--accent) inset; }
|
|
18655
|
-
.seg-opt:disabled { opacity:.6; cursor:default; }
|
|
18656
|
-
.seg-opt-t { font-size:var(--fs-sm); font-weight:600; color:var(--fg); }
|
|
18657
|
-
.seg-opt-s { font-size:var(--fs-xs); color:var(--muted); }
|
|
18658
|
-
.seg-opt.on .seg-opt-s { color:var(--accent); }
|
|
18659
19316
|
|
|
18660
19317
|
/* cache-usage ring hero (settings/cache-ring.tsx CacheRingHero): legend
|
|
18661
19318
|
column left, 152px three-segment ring right. Arcs animate 0 \u2192 share on
|
|
@@ -18671,9 +19328,6 @@ var styles_default = ` :root {
|
|
|
18671
19328
|
.blob-dot.keep { background:var(--line-strong); }
|
|
18672
19329
|
.blob-dot.pin { background:var(--muted); opacity:.6; }
|
|
18673
19330
|
.blob-total { margin:13px 0 14px; font-size:var(--fs-xs); color:var(--muted); }
|
|
18674
|
-
/* headline number over the legend (\u6570\u636E\u4E0E\u5907\u4EFD \xB7 \u9644\u4EF6) */
|
|
18675
|
-
.blob-stat { font-size:20px; font-weight:700; letter-spacing:-.02em; font-variant-numeric:tabular-nums; margin-bottom:10px; }
|
|
18676
|
-
.blob-stat small { font-size:var(--fs-sm); font-weight:500; color:var(--muted); margin-left:8px; letter-spacing:0; }
|
|
18677
19331
|
/* a status sentence in the action row (never a disabled button) */
|
|
18678
19332
|
.blob-actions .blob-status { display:inline-flex; align-items:center; gap:6px; font-size:var(--fs-sm); color:var(--muted); }
|
|
18679
19333
|
.blob-actions .blob-status .ico { width:14px; height:14px; color:var(--success); }
|
|
@@ -18777,9 +19431,14 @@ var styles_default = ` :root {
|
|
|
18777
19431
|
`;
|
|
18778
19432
|
|
|
18779
19433
|
// src/webui/server/icons.ts
|
|
18780
|
-
var ICON_192 = "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";
|
|
18781
|
-
var ICON_512 = "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";
|
|
18782
|
-
var ICON_180 = "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";
|
|
19434
|
+
var COLOR_ICON_192 = "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";
|
|
19435
|
+
var COLOR_ICON_512 = "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAIAoAMABAAAAAEAAAIAAAAAAAv4tYUAAAHNaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMDI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjEwMjQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4Kwe07qQAAQABJREFUeAHsvWusb1l23XXP89b70d1ux20nHZMY2XLccRwLWcRx4kREeRKCMA8JIpSgKEJOeEjwASGwSPiABAIUkAJI+UBkgiKwFJAikg8R4hECWIlIsGTJsZu4LavjdndXux/1uPecw/iNMefa639udZx0VVd1dc1173/vteYcc8y5xt5r7f/5n3PPffBg2igwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKPDeUuDsvVXuVDsKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqMAqPAKDAKjAKjwCgwCowCo8AoMAqM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";
|
|
19436
|
+
var COLOR_ICON_180 = "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";
|
|
19437
|
+
var COLOR_ICON_32 = "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";
|
|
19438
|
+
var ICON_192 = COLOR_ICON_192;
|
|
19439
|
+
var ICON_512 = COLOR_ICON_512;
|
|
19440
|
+
var ICON_180 = COLOR_ICON_180;
|
|
19441
|
+
var ICON_32 = COLOR_ICON_32;
|
|
18783
19442
|
|
|
18784
19443
|
// src/webui/fmt/manifest.ts
|
|
18785
19444
|
var FMT_PROVIDERS = [
|
|
@@ -18821,7 +19480,7 @@ var FMT_PROVIDERS = [
|
|
|
18821
19480
|
init_package();
|
|
18822
19481
|
var RUNNING_FROM_SOURCE = import.meta.url.includes("/src/webui/");
|
|
18823
19482
|
var HTML2 = `<!doctype html>
|
|
18824
|
-
<html lang="zh">
|
|
19483
|
+
<html lang="zh-CN">
|
|
18825
19484
|
<head>
|
|
18826
19485
|
<meta charset="utf-8" />
|
|
18827
19486
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
@@ -18845,7 +19504,11 @@ var HTML2 = `<!doctype html>
|
|
|
18845
19504
|
alone, so the dark palette exists exactly once \u2014 see styles.css. Dark also
|
|
18846
19505
|
pre-tints the status bar (hex mirrors --bg) so the first frame isn't white. -->
|
|
18847
19506
|
<script>try{var t=localStorage.getItem('mh-theme'),d=t==='dark'||(t!=='light'&&matchMedia('(prefers-color-scheme: dark)').matches);document.documentElement.dataset.resolved=d?'dark':'light';if(d)document.getElementById('theme-color-meta').content='#1a1a1c'}catch(e){}</script>
|
|
19507
|
+
<!-- Same for the UI language: mirror src/webui/i18n/locale.ts so <html lang>
|
|
19508
|
+
is right before the bundle runs. -->
|
|
19509
|
+
<script>try{var l=localStorage.getItem('mh-lang');if(l!=='zh-CN'&&l!=='en'){var ls=navigator.languages&&navigator.languages.length?navigator.languages:[navigator.language];l='en';for(var i=0;i<ls.length;i++){var g=ls[i]||'';if(/^zh\\b/i.test(g)){l='zh-CN';break}if(/^en\\b/i.test(g))break}}document.documentElement.lang=l}catch(e){}</script>
|
|
18848
19510
|
<link rel="manifest" href="/manifest.webmanifest">
|
|
19511
|
+
<link rel="icon" type="image/png" sizes="32x32" href="/icons/icon-32.png">
|
|
18849
19512
|
<link rel="apple-touch-icon" href="/icons/icon-180.png">
|
|
18850
19513
|
<link rel="stylesheet" href="/webui.css">
|
|
18851
19514
|
</head>
|
|
@@ -19010,6 +19673,7 @@ var MANIFEST = JSON.stringify({
|
|
|
19010
19673
|
]
|
|
19011
19674
|
});
|
|
19012
19675
|
var ICONS = {
|
|
19676
|
+
"/icons/icon-32.png": ICON_32,
|
|
19013
19677
|
"/icons/icon-192.png": ICON_192,
|
|
19014
19678
|
"/icons/icon-512.png": ICON_512,
|
|
19015
19679
|
"/icons/icon-180.png": ICON_180
|
|
@@ -19095,6 +19759,358 @@ async function serveWebui(req) {
|
|
|
19095
19759
|
}
|
|
19096
19760
|
// src/webui/server/routes.ts
|
|
19097
19761
|
init_zod();
|
|
19762
|
+
|
|
19763
|
+
// src/core/integrity.ts
|
|
19764
|
+
init_crdt();
|
|
19765
|
+
init_properties();
|
|
19766
|
+
init_hlc();
|
|
19767
|
+
init_node();
|
|
19768
|
+
init_history_cache();
|
|
19769
|
+
var REF_RULES = [
|
|
19770
|
+
{ srcTable: "properties", fk: "database_id", tgtTable: "databases", fix: "tombstone-src" },
|
|
19771
|
+
{ srcTable: "records", fk: "database_id", tgtTable: "databases", fix: "tombstone-src" },
|
|
19772
|
+
{ srcTable: "documents", fk: "database_id", tgtTable: "databases", fix: "null-fk" },
|
|
19773
|
+
{ srcTable: "documents", fk: "parent_id", tgtTable: "documents", fix: "null-fk" },
|
|
19774
|
+
{ srcTable: "doc_blocks", fk: "doc_id", tgtTable: "documents", fix: "tombstone-src" },
|
|
19775
|
+
{ srcTable: "site_files", fk: "site_id", tgtTable: "sites", fix: "tombstone-src" }
|
|
19776
|
+
];
|
|
19777
|
+
function brokenRefRows(db, r) {
|
|
19778
|
+
return db.query(`SELECT s.id AS id, s.${r.fk} AS ref FROM ${r.srcTable} s
|
|
19779
|
+
JOIN ${r.tgtTable} t ON t.id = s.${r.fk} AND t.__deleted = 1
|
|
19780
|
+
WHERE s.__deleted = 0 AND s.${r.fk} IS NOT NULL
|
|
19781
|
+
ORDER BY s.id`).all();
|
|
19782
|
+
}
|
|
19783
|
+
function detectBrokenRefs(db) {
|
|
19784
|
+
const out = [];
|
|
19785
|
+
for (const r of REF_RULES) {
|
|
19786
|
+
for (const row of brokenRefRows(db, r)) {
|
|
19787
|
+
out.push({
|
|
19788
|
+
category: "broken_ref",
|
|
19789
|
+
entity: r.srcTable,
|
|
19790
|
+
id: row.id,
|
|
19791
|
+
detail: `${r.fk} \u2192 deleted ${r.tgtTable} ${row.ref} (${r.fix === "tombstone-src" ? "tombstone" : `clear ${r.fk}`})`,
|
|
19792
|
+
fixable: true
|
|
19793
|
+
});
|
|
19794
|
+
}
|
|
19795
|
+
}
|
|
19796
|
+
return out;
|
|
19797
|
+
}
|
|
19798
|
+
function repairBrokenRefs(db) {
|
|
19799
|
+
let n = 0;
|
|
19800
|
+
for (const r of REF_RULES) {
|
|
19801
|
+
for (const row of brokenRefRows(db, r)) {
|
|
19802
|
+
if (r.fix === "tombstone-src")
|
|
19803
|
+
emit(db, r.srcTable, row.id, "__deleted", 1);
|
|
19804
|
+
else
|
|
19805
|
+
emit(db, r.srcTable, row.id, r.fk, null);
|
|
19806
|
+
n++;
|
|
19807
|
+
}
|
|
19808
|
+
}
|
|
19809
|
+
return n;
|
|
19810
|
+
}
|
|
19811
|
+
function orphanCellRows(db) {
|
|
19812
|
+
return db.query(`SELECT r.id AS rec, j.key AS prop
|
|
19813
|
+
FROM records r, json_each(coalesce(r.data, '{}')) j
|
|
19814
|
+
JOIN properties p ON p.id = j.key AND p.__deleted = 1
|
|
19815
|
+
WHERE r.__deleted = 0
|
|
19816
|
+
ORDER BY r.id, j.key`).all();
|
|
19817
|
+
}
|
|
19818
|
+
function detectOrphanCells(db) {
|
|
19819
|
+
return orphanCellRows(db).map((row) => ({
|
|
19820
|
+
category: "orphan_cell",
|
|
19821
|
+
entity: "records",
|
|
19822
|
+
id: row.rec,
|
|
19823
|
+
detail: `cell for deleted property ${row.prop}`,
|
|
19824
|
+
fixable: true
|
|
19825
|
+
}));
|
|
19826
|
+
}
|
|
19827
|
+
function repairOrphanCells(db) {
|
|
19828
|
+
const rows = orphanCellRows(db);
|
|
19829
|
+
for (const row of rows)
|
|
19830
|
+
emit(db, "records", row.rec, row.prop, undefined);
|
|
19831
|
+
return rows.length;
|
|
19832
|
+
}
|
|
19833
|
+
function deadCellRefRows(db) {
|
|
19834
|
+
const props = db.query("SELECT id, type FROM properties WHERE __deleted = 0 AND type IN ('relation', 'doc') ORDER BY id").all();
|
|
19835
|
+
const out = [];
|
|
19836
|
+
for (const p of props) {
|
|
19837
|
+
const tgtTable = p.type === "relation" ? "records" : "documents";
|
|
19838
|
+
const pid = p.id.replace(/'/g, "''");
|
|
19839
|
+
const rows = db.query(`SELECT r.id AS rec, j.value AS dead
|
|
19840
|
+
FROM records r, json_each(r.data -> '${pid}') j
|
|
19841
|
+
JOIN ${tgtTable} t ON t.id = j.value AND t.__deleted = 1
|
|
19842
|
+
WHERE r.__deleted = 0 AND json_type(r.data -> '${pid}') = 'array'
|
|
19843
|
+
ORDER BY r.id, j.value`).all();
|
|
19844
|
+
let cur = null;
|
|
19845
|
+
for (const row of rows) {
|
|
19846
|
+
if (!cur || cur.rec !== row.rec) {
|
|
19847
|
+
cur = { rec: row.rec, prop: p.id, tgtTable, dead: [] };
|
|
19848
|
+
out.push(cur);
|
|
19849
|
+
}
|
|
19850
|
+
cur.dead.push(row.dead);
|
|
19851
|
+
}
|
|
19852
|
+
}
|
|
19853
|
+
return out;
|
|
19854
|
+
}
|
|
19855
|
+
function detectDeadCellRefs(db) {
|
|
19856
|
+
return deadCellRefRows(db).map((g) => ({
|
|
19857
|
+
category: "dead_cell_ref",
|
|
19858
|
+
entity: "records",
|
|
19859
|
+
id: g.rec,
|
|
19860
|
+
detail: `cell ${g.prop} references deleted ${g.tgtTable === "records" ? "record" : "document"}: ${g.dead.join(", ")}`,
|
|
19861
|
+
fixable: true
|
|
19862
|
+
}));
|
|
19863
|
+
}
|
|
19864
|
+
function repairDeadCellRefs(db) {
|
|
19865
|
+
const groups = deadCellRefRows(db);
|
|
19866
|
+
for (const g of groups) {
|
|
19867
|
+
const row = db.query("SELECT data FROM records WHERE id = ?").get(g.rec);
|
|
19868
|
+
if (!row)
|
|
19869
|
+
continue;
|
|
19870
|
+
const data = JSON.parse(row.data || "{}");
|
|
19871
|
+
const arr = data[g.prop];
|
|
19872
|
+
if (!Array.isArray(arr))
|
|
19873
|
+
continue;
|
|
19874
|
+
const deadSet = new Set(g.dead);
|
|
19875
|
+
emit(db, "records", g.rec, g.prop, arr.filter((v) => !deadSet.has(String(v))));
|
|
19876
|
+
}
|
|
19877
|
+
return groups.length;
|
|
19878
|
+
}
|
|
19879
|
+
function dupPathLosers(db) {
|
|
19880
|
+
const rows = db.query(`SELECT id, site_id, path FROM site_files
|
|
19881
|
+
WHERE __deleted = 0 AND site_id IS NOT NULL AND path IS NOT NULL
|
|
19882
|
+
ORDER BY site_id, path, created_hlc, id`).all();
|
|
19883
|
+
const losers = [];
|
|
19884
|
+
let group = null;
|
|
19885
|
+
for (const r of rows) {
|
|
19886
|
+
const key = `${r.site_id}\x00${r.path}`;
|
|
19887
|
+
if (key === group)
|
|
19888
|
+
losers.push({ id: r.id });
|
|
19889
|
+
else
|
|
19890
|
+
group = key;
|
|
19891
|
+
}
|
|
19892
|
+
return losers;
|
|
19893
|
+
}
|
|
19894
|
+
function detectDupPaths(db) {
|
|
19895
|
+
return dupPathLosers(db).map((row) => ({
|
|
19896
|
+
category: "dup_path",
|
|
19897
|
+
entity: "site_files",
|
|
19898
|
+
id: row.id,
|
|
19899
|
+
detail: "redundant duplicate (site_id, path); loser tombstoned",
|
|
19900
|
+
fixable: true
|
|
19901
|
+
}));
|
|
19902
|
+
}
|
|
19903
|
+
function repairDupPaths(db) {
|
|
19904
|
+
const losers = dupPathLosers(db);
|
|
19905
|
+
for (const row of losers)
|
|
19906
|
+
emit(db, "site_files", row.id, "__deleted", 1);
|
|
19907
|
+
return losers.length;
|
|
19908
|
+
}
|
|
19909
|
+
function detectParentCycles(db) {
|
|
19910
|
+
const rows = db.query(`SELECT d.id AS id, d.parent_id AS parent, d.created_hlc AS hlc
|
|
19911
|
+
FROM documents d
|
|
19912
|
+
WHERE d.__deleted = 0 AND d.parent_id IS NOT NULL
|
|
19913
|
+
AND EXISTS (SELECT 1 FROM documents p WHERE p.id = d.parent_id AND p.__deleted = 0)
|
|
19914
|
+
ORDER BY d.id`).all();
|
|
19915
|
+
const parent = new Map(rows.map((r) => [r.id, r.parent]));
|
|
19916
|
+
const hlc = new Map(rows.map((r) => [r.id, r.hlc]));
|
|
19917
|
+
const seen = new Set;
|
|
19918
|
+
const cycles = [];
|
|
19919
|
+
for (const start of parent.keys()) {
|
|
19920
|
+
if (seen.has(start))
|
|
19921
|
+
continue;
|
|
19922
|
+
const path = [];
|
|
19923
|
+
const pos = new Map;
|
|
19924
|
+
let cur = start;
|
|
19925
|
+
while (cur != null && parent.has(cur) && !seen.has(cur)) {
|
|
19926
|
+
if (pos.has(cur)) {
|
|
19927
|
+
cycles.push(path.slice(pos.get(cur)));
|
|
19928
|
+
break;
|
|
19929
|
+
}
|
|
19930
|
+
pos.set(cur, path.length);
|
|
19931
|
+
path.push(cur);
|
|
19932
|
+
cur = parent.get(cur);
|
|
19933
|
+
}
|
|
19934
|
+
for (const n of path)
|
|
19935
|
+
seen.add(n);
|
|
19936
|
+
}
|
|
19937
|
+
return { cycles, hlc };
|
|
19938
|
+
}
|
|
19939
|
+
function geHlcId(hlc, a, b) {
|
|
19940
|
+
const ha = hlc.get(a) ?? "";
|
|
19941
|
+
const hb = hlc.get(b) ?? "";
|
|
19942
|
+
if (ha !== hb)
|
|
19943
|
+
return ha > hb;
|
|
19944
|
+
return a >= b;
|
|
19945
|
+
}
|
|
19946
|
+
function detectCycleIssues(db) {
|
|
19947
|
+
const { cycles } = detectParentCycles(db);
|
|
19948
|
+
return cycles.map((cyc) => ({
|
|
19949
|
+
category: "parent_cycle",
|
|
19950
|
+
entity: "documents",
|
|
19951
|
+
id: [...cyc].sort()[0],
|
|
19952
|
+
detail: `parent cycle: ${[...cyc].sort().join(" \u2192 ")}`,
|
|
19953
|
+
fixable: true
|
|
19954
|
+
}));
|
|
19955
|
+
}
|
|
19956
|
+
function repairParentCycles(db) {
|
|
19957
|
+
const { cycles, hlc } = detectParentCycles(db);
|
|
19958
|
+
for (const cyc of cycles) {
|
|
19959
|
+
const brk = cyc.reduce((a, b) => geHlcId(hlc, a, b) ? a : b);
|
|
19960
|
+
emit(db, "documents", brk, "parent_id", null);
|
|
19961
|
+
}
|
|
19962
|
+
return cycles.length;
|
|
19963
|
+
}
|
|
19964
|
+
function detectDupNames(db) {
|
|
19965
|
+
const out = [];
|
|
19966
|
+
const props = db.query(`SELECT database_id AS db, lower(name) AS n, count(*) AS c, group_concat(id) AS ids
|
|
19967
|
+
FROM properties
|
|
19968
|
+
WHERE __deleted = 0 AND name IS NOT NULL AND database_id IS NOT NULL
|
|
19969
|
+
GROUP BY database_id, lower(name) HAVING c > 1
|
|
19970
|
+
ORDER BY database_id, n`).all();
|
|
19971
|
+
for (const r of props)
|
|
19972
|
+
out.push({
|
|
19973
|
+
category: "dup_name",
|
|
19974
|
+
entity: "properties",
|
|
19975
|
+
id: r.ids.split(",").sort()[0],
|
|
19976
|
+
detail: `${r.c} properties named "${r.n}" in database ${r.db}: ${r.ids}`,
|
|
19977
|
+
fixable: false
|
|
19978
|
+
});
|
|
19979
|
+
const dbs = db.query(`SELECT lower(name) AS n, count(*) AS c, group_concat(id) AS ids
|
|
19980
|
+
FROM databases WHERE __deleted = 0 AND name IS NOT NULL
|
|
19981
|
+
GROUP BY lower(name) HAVING c > 1 ORDER BY n`).all();
|
|
19982
|
+
for (const r of dbs)
|
|
19983
|
+
out.push({
|
|
19984
|
+
category: "dup_name",
|
|
19985
|
+
entity: "databases",
|
|
19986
|
+
id: r.ids.split(",").sort()[0],
|
|
19987
|
+
detail: `${r.c} databases named "${r.n}": ${r.ids}`,
|
|
19988
|
+
fixable: false
|
|
19989
|
+
});
|
|
19990
|
+
return out;
|
|
19991
|
+
}
|
|
19992
|
+
function configIssue(type, config) {
|
|
19993
|
+
if (!PROP_TYPES.has(type))
|
|
19994
|
+
return `unknown property type: ${type}`;
|
|
19995
|
+
if (type === "select" || type === "multi_select") {
|
|
19996
|
+
const opts = config?.options;
|
|
19997
|
+
if (!Array.isArray(opts) || opts.length === 0 || !opts.every((o) => typeof o === "string"))
|
|
19998
|
+
return `${type} missing config.options: string[]`;
|
|
19999
|
+
}
|
|
20000
|
+
if (type === "relation" && typeof config?.database !== "string")
|
|
20001
|
+
return "relation missing config.database";
|
|
20002
|
+
return null;
|
|
20003
|
+
}
|
|
20004
|
+
function detectBadConfig(db) {
|
|
20005
|
+
const rows = db.query("SELECT id, type, config FROM properties WHERE __deleted = 0 ORDER BY id").all();
|
|
20006
|
+
const out = [];
|
|
20007
|
+
for (const r of rows) {
|
|
20008
|
+
let config = null;
|
|
20009
|
+
try {
|
|
20010
|
+
config = r.config ? JSON.parse(r.config) : null;
|
|
20011
|
+
} catch {
|
|
20012
|
+
out.push({ category: "bad_config", entity: "properties", id: r.id, detail: "config is not valid JSON", fixable: false });
|
|
20013
|
+
continue;
|
|
20014
|
+
}
|
|
20015
|
+
const problem = configIssue(r.type, config);
|
|
20016
|
+
if (problem)
|
|
20017
|
+
out.push({ category: "bad_config", entity: "properties", id: r.id, detail: problem, fixable: false });
|
|
20018
|
+
}
|
|
20019
|
+
return out;
|
|
20020
|
+
}
|
|
20021
|
+
function detectClockSkew(db, now) {
|
|
20022
|
+
const rows = db.query("SELECT node_id, COUNT(*) AS n FROM crdt_changes WHERE hlc > ? GROUP BY node_id").all(hlcSkewBound(now));
|
|
20023
|
+
const issues = rows.map((r) => ({
|
|
20024
|
+
category: "clock_skew",
|
|
20025
|
+
entity: "nodes",
|
|
20026
|
+
id: r.node_id,
|
|
20027
|
+
detail: `${r.n} change(s) stamped more than 5 min in the future \u2014 run \`mh repair --clock\``,
|
|
20028
|
+
fixable: false
|
|
20029
|
+
}));
|
|
20030
|
+
const local = persistedHlc(db);
|
|
20031
|
+
if (local && local.millis > now + HLC_MAX_SKEW_MS)
|
|
20032
|
+
issues.push({
|
|
20033
|
+
category: "clock_skew",
|
|
20034
|
+
entity: "meta",
|
|
20035
|
+
id: "hlc",
|
|
20036
|
+
detail: `local logical clock is ${Math.ceil((local.millis - now) / 60000)} min ahead of wall time \u2014 writes refuse until \`mh repair --clock\``,
|
|
20037
|
+
fixable: false
|
|
20038
|
+
});
|
|
20039
|
+
return issues;
|
|
20040
|
+
}
|
|
20041
|
+
function repairClock(db, now = Date.now()) {
|
|
20042
|
+
return writeTx(db, () => {
|
|
20043
|
+
const rows = db.query(`SELECT seq, ${CHANGE_SELECT} FROM crdt_changes WHERE hlc > ? ORDER BY hlc, seq`).all(hlcSkewBound(now));
|
|
20044
|
+
const byNode = {};
|
|
20045
|
+
const local = persistedHlc(db);
|
|
20046
|
+
const clockReset = rows.length > 0 || local != null && local.millis > now + HLC_MAX_SKEW_MS;
|
|
20047
|
+
if (clockReset)
|
|
20048
|
+
resetHlc(db, getNodeId(db), now);
|
|
20049
|
+
if (rows.length === 0)
|
|
20050
|
+
return { restamped: 0, byNode, clockReset };
|
|
20051
|
+
const touched = new Map;
|
|
20052
|
+
for (const r of rows) {
|
|
20053
|
+
db.query("DELETE FROM crdt_changes WHERE seq = ?").run(r.seq);
|
|
20054
|
+
const { seq: _seq, ...c } = r;
|
|
20055
|
+
const change = { ...c, hlc: nextHlc(db, r.node_id, now) };
|
|
20056
|
+
applyChange(db, change);
|
|
20057
|
+
touched.set(`${c.dataset}\x00${c.row_id}\x00${c.col}`, change);
|
|
20058
|
+
byNode[r.node_id] = (byNode[r.node_id] ?? 0) + 1;
|
|
20059
|
+
}
|
|
20060
|
+
for (const c of touched.values()) {
|
|
20061
|
+
const winner = db.query(`SELECT ${CHANGE_SELECT} FROM crdt_changes WHERE dataset = ? AND row_id = ? AND col = ? ORDER BY hlc DESC LIMIT 1`).get(c.dataset, c.row_id, c.col);
|
|
20062
|
+
if (winner)
|
|
20063
|
+
applyChange(db, winner);
|
|
20064
|
+
}
|
|
20065
|
+
invalidateHistory(db);
|
|
20066
|
+
return { restamped: rows.length, byNode, clockReset };
|
|
20067
|
+
});
|
|
20068
|
+
}
|
|
20069
|
+
function validateHub(db, opts = {}) {
|
|
20070
|
+
const issues = [
|
|
20071
|
+
...detectBrokenRefs(db),
|
|
20072
|
+
...detectOrphanCells(db),
|
|
20073
|
+
...detectDeadCellRefs(db),
|
|
20074
|
+
...detectDupPaths(db),
|
|
20075
|
+
...detectCycleIssues(db),
|
|
20076
|
+
...detectDupNames(db),
|
|
20077
|
+
...detectBadConfig(db),
|
|
20078
|
+
...detectClockSkew(db, opts.now ?? Date.now())
|
|
20079
|
+
];
|
|
20080
|
+
const counts = {};
|
|
20081
|
+
for (const i of issues)
|
|
20082
|
+
counts[i.category] = (counts[i.category] ?? 0) + 1;
|
|
20083
|
+
return { ok: issues.length === 0, total: issues.length, counts, issues };
|
|
20084
|
+
}
|
|
20085
|
+
function repairPass(db) {
|
|
20086
|
+
const fixed = {};
|
|
20087
|
+
const bump = (cat, n) => {
|
|
20088
|
+
if (n)
|
|
20089
|
+
fixed[cat] = (fixed[cat] ?? 0) + n;
|
|
20090
|
+
};
|
|
20091
|
+
bump("broken_ref", repairBrokenRefs(db));
|
|
20092
|
+
bump("orphan_cell", repairOrphanCells(db));
|
|
20093
|
+
bump("dead_cell_ref", repairDeadCellRefs(db));
|
|
20094
|
+
bump("dup_path", repairDupPaths(db));
|
|
20095
|
+
bump("parent_cycle", repairParentCycles(db));
|
|
20096
|
+
const applied = Object.values(fixed).reduce((a, b) => a + b, 0);
|
|
20097
|
+
return { applied, fixed };
|
|
20098
|
+
}
|
|
20099
|
+
var repairHub = grouped(function repairHub(db) {
|
|
20100
|
+
const fixed = {};
|
|
20101
|
+
let applied = 0;
|
|
20102
|
+
for (let i = 0;i < 20; i++) {
|
|
20103
|
+
const pass = repairPass(db);
|
|
20104
|
+
if (pass.applied === 0)
|
|
20105
|
+
break;
|
|
20106
|
+
applied += pass.applied;
|
|
20107
|
+
for (const [cat, n] of Object.entries(pass.fixed))
|
|
20108
|
+
fixed[cat] = (fixed[cat] ?? 0) + n;
|
|
20109
|
+
}
|
|
20110
|
+
return { applied, fixed, remaining: validateHub(db) };
|
|
20111
|
+
}, "repair");
|
|
20112
|
+
|
|
20113
|
+
// src/webui/server/routes.ts
|
|
19098
20114
|
init_errors();
|
|
19099
20115
|
init_routes();
|
|
19100
20116
|
init_databases();
|
|
@@ -19107,6 +20123,7 @@ init_crdt();
|
|
|
19107
20123
|
init_documents();
|
|
19108
20124
|
init_properties();
|
|
19109
20125
|
init_errors();
|
|
20126
|
+
init_history_cache();
|
|
19110
20127
|
var REVISION_GAP_MS = 1500;
|
|
19111
20128
|
function hlcMillis(hlc) {
|
|
19112
20129
|
return Number(hlc.slice(0, 15));
|
|
@@ -19164,16 +20181,23 @@ function rowChanges(db, dataset, rowId) {
|
|
|
19164
20181
|
function everBlockIds(db, docId) {
|
|
19165
20182
|
return db.query("SELECT DISTINCT row_id FROM crdt_changes WHERE dataset = 'doc_blocks' AND col = 'doc_id' AND value = ?").all(JSON.stringify(docId)).map((r) => r.row_id);
|
|
19166
20183
|
}
|
|
19167
|
-
function
|
|
20184
|
+
function docHistory(db, docId) {
|
|
20185
|
+
const cached = getDocHistory(db, docId);
|
|
20186
|
+
if (cached)
|
|
20187
|
+
return cached;
|
|
19168
20188
|
const blocks = everBlockIds(db, docId);
|
|
19169
20189
|
const placeholders = blocks.map(() => "?").join(",");
|
|
19170
20190
|
const blockClause = blocks.length ? ` OR (dataset = 'doc_blocks' AND row_id IN (${placeholders}))` : "";
|
|
19171
|
-
|
|
20191
|
+
const changes = db.query(`SELECT ${CHANGE_SELECT} FROM crdt_changes
|
|
19172
20192
|
WHERE (dataset = 'documents' AND row_id = ?)${blockClause}
|
|
19173
20193
|
ORDER BY hlc`).all(docId, ...blocks);
|
|
20194
|
+
return setDocHistory(db, docId, changes, blocks);
|
|
19174
20195
|
}
|
|
19175
20196
|
function listDocumentRevisions(db, id) {
|
|
19176
|
-
const
|
|
20197
|
+
const entry = docHistory(db, id);
|
|
20198
|
+
if (entry.revisions)
|
|
20199
|
+
return entry.revisions.slice();
|
|
20200
|
+
const changes = entry.changes;
|
|
19177
20201
|
if (!changes.length)
|
|
19178
20202
|
throw new MhError("not_found", `no such document: ${id}`);
|
|
19179
20203
|
const reg = new Map;
|
|
@@ -19228,12 +20252,17 @@ function listDocumentRevisions(db, id) {
|
|
|
19228
20252
|
blocks_deleted: deletedBlocks.size
|
|
19229
20253
|
});
|
|
19230
20254
|
}
|
|
19231
|
-
|
|
20255
|
+
entry.revisions = out.reverse();
|
|
20256
|
+
return entry.revisions.slice();
|
|
19232
20257
|
}
|
|
19233
20258
|
function documentAtVersion(db, id, at) {
|
|
19234
20259
|
if (!at)
|
|
19235
20260
|
throw new MhError("invalid_input", "missing version cutoff");
|
|
19236
|
-
const
|
|
20261
|
+
const entry = docHistory(db, id);
|
|
20262
|
+
const hit = entry.states.get(at);
|
|
20263
|
+
if (hit)
|
|
20264
|
+
return { ...hit };
|
|
20265
|
+
const changes = entry.changes.filter((c) => c.hlc <= at);
|
|
19237
20266
|
if (!changes.length)
|
|
19238
20267
|
throw new MhError("not_found", `no version of document ${id} at or before ${at}`);
|
|
19239
20268
|
const docRegs = registersAt(changes.filter((c) => c.dataset === "documents"), at);
|
|
@@ -19279,13 +20308,15 @@ function documentAtVersion(db, id, at) {
|
|
|
19279
20308
|
return a.id < b.id ? -1 : 1;
|
|
19280
20309
|
});
|
|
19281
20310
|
const body = byBlock.size ? serializeDocBlocks(blocks) : parse("body") ?? "";
|
|
19282
|
-
|
|
20311
|
+
const state = {
|
|
19283
20312
|
id,
|
|
19284
20313
|
title: parse("title") ?? "",
|
|
19285
20314
|
body,
|
|
19286
20315
|
deleted: docRegs.get("__deleted") ? flagSet(docRegs.get("__deleted").value) : false,
|
|
19287
20316
|
version: changes[changes.length - 1].hlc
|
|
19288
20317
|
};
|
|
20318
|
+
rememberDocState(entry, at, state);
|
|
20319
|
+
return { ...state };
|
|
19289
20320
|
}
|
|
19290
20321
|
var revertDocument = grouped(function revertDocument(db, id, to, opts = {}) {
|
|
19291
20322
|
let cur = getDocument(db, id);
|
|
@@ -19917,6 +20948,7 @@ var revertChangeGroup = grouped(function revertChangeGroup(db, txn) {
|
|
|
19917
20948
|
}, "revert");
|
|
19918
20949
|
|
|
19919
20950
|
// src/webui/server/routes.ts
|
|
20951
|
+
init_resolve();
|
|
19920
20952
|
init_node();
|
|
19921
20953
|
init_blobs();
|
|
19922
20954
|
init_config();
|
|
@@ -20081,7 +21113,7 @@ async function createBucketShare(db, opts) {
|
|
|
20081
21113
|
contentType: "application/octet-stream"
|
|
20082
21114
|
});
|
|
20083
21115
|
await mergeViewerCors(opts.config, opts.viewerOrigin);
|
|
20084
|
-
return { manifestUrl, presignExp, keyB64: opts.password ? undefined : toB64(shareKey), saltB64, title };
|
|
21116
|
+
return { manifestUrl, presignExp, keyB64: opts.password ? undefined : toB64(shareKey), saltB64, title, meta };
|
|
20085
21117
|
}
|
|
20086
21118
|
async function renewBucketShare(db, config, slug, expiresSec = MAX_PRESIGN_SECONDS) {
|
|
20087
21119
|
const meta = await readMeta2(config, slug);
|
|
@@ -20148,7 +21180,7 @@ async function represignBucketShare(config, slug, expiresSec = MAX_PRESIGN_SECON
|
|
|
20148
21180
|
async function listBucketShares(config) {
|
|
20149
21181
|
const client = storageClientFor(config);
|
|
20150
21182
|
const root = sharesRoot(config.prefix);
|
|
20151
|
-
const entries = await client.list(`${root}/`, undefined, "/")
|
|
21183
|
+
const entries = await client.list(`${root}/`, undefined, "/");
|
|
20152
21184
|
const slugs = entries.map((e) => e.key.slice(`${root}/`.length).replace(/\/$/, "")).filter((s) => s && !s.includes("/"));
|
|
20153
21185
|
const out = [];
|
|
20154
21186
|
for (const slug of slugs) {
|
|
@@ -20177,10 +21209,156 @@ function clampExpiry(sec) {
|
|
|
20177
21209
|
|
|
20178
21210
|
// src/core/sync/share-actions.ts
|
|
20179
21211
|
init_storage_s3_sign();
|
|
21212
|
+
|
|
21213
|
+
// src/core/sync/remote-shares-cache.ts
|
|
21214
|
+
init_peers();
|
|
21215
|
+
var caches2 = new WeakMap;
|
|
21216
|
+
var listeners = new Set;
|
|
21217
|
+
var REMOTE_SHARES_STALE_MS = 60000;
|
|
21218
|
+
var PEER_LIST_TIMEOUT_MS = 4000;
|
|
21219
|
+
function absoluteShareUrl(url, base) {
|
|
21220
|
+
try {
|
|
21221
|
+
return new URL(url, `${base.replace(/\/+$/, "")}/`).toString();
|
|
21222
|
+
} catch {
|
|
21223
|
+
return url;
|
|
21224
|
+
}
|
|
21225
|
+
}
|
|
21226
|
+
function bucketShareItem(bucket, m) {
|
|
21227
|
+
return {
|
|
21228
|
+
slug: m.slug,
|
|
21229
|
+
kind: m.kind,
|
|
21230
|
+
target_id: m.target_id,
|
|
21231
|
+
title: m.title || m.target_id,
|
|
21232
|
+
permission: m.permission,
|
|
21233
|
+
transport: "s3",
|
|
21234
|
+
source: `\u6876 ${bucket.label ?? bucket.url}`,
|
|
21235
|
+
sourceKind: "bucket",
|
|
21236
|
+
hosting: "s3",
|
|
21237
|
+
expiresAt: m.presign_exp,
|
|
21238
|
+
hasPassword: m.has_password,
|
|
21239
|
+
contentUpdatedAt: m.content_updated_at ?? m.created_at
|
|
21240
|
+
};
|
|
21241
|
+
}
|
|
21242
|
+
async function fetchPeerShares(url, token, targetId) {
|
|
21243
|
+
const u = `${url.replace(/\/+$/, "")}/api/shares${targetId ? `?target=${encodeURIComponent(targetId)}` : ""}`;
|
|
21244
|
+
const res = await Promise.race([
|
|
21245
|
+
fetch(u, { headers: { authorization: `Bearer ${token}` } }),
|
|
21246
|
+
new Promise((_r, rej) => setTimeout(() => rej(new Error("timeout")), PEER_LIST_TIMEOUT_MS))
|
|
21247
|
+
]);
|
|
21248
|
+
if (!res.ok)
|
|
21249
|
+
return [];
|
|
21250
|
+
return (await res.json()).map((item) => ({
|
|
21251
|
+
...item,
|
|
21252
|
+
...item.url ? { url: absoluteShareUrl(item.url, url) } : {}
|
|
21253
|
+
}));
|
|
21254
|
+
}
|
|
21255
|
+
function remoteShareSources(db) {
|
|
21256
|
+
return listPeers(db).flatMap((p) => {
|
|
21257
|
+
if (p.kind === "s3" && p.config)
|
|
21258
|
+
return [{ url: p.url, kind: "bucket", peer: p }];
|
|
21259
|
+
if (p.kind === "http" && p.token)
|
|
21260
|
+
return [{ url: p.url, kind: "peer", peer: p }];
|
|
21261
|
+
return [];
|
|
21262
|
+
});
|
|
21263
|
+
}
|
|
21264
|
+
async function fetchSource(s) {
|
|
21265
|
+
if (s.kind === "bucket") {
|
|
21266
|
+
const config = JSON.parse(s.peer.config);
|
|
21267
|
+
return (await listBucketShares(config)).map((m) => bucketShareItem(s.peer, m));
|
|
21268
|
+
}
|
|
21269
|
+
return (await fetchPeerShares(s.url, s.peer.token)).map((it) => ({
|
|
21270
|
+
...it,
|
|
21271
|
+
source: s.peer.label ?? s.url,
|
|
21272
|
+
sourceKind: "peer",
|
|
21273
|
+
sourceUrl: s.url
|
|
21274
|
+
}));
|
|
21275
|
+
}
|
|
21276
|
+
function cacheFor2(db) {
|
|
21277
|
+
let m = caches2.get(db);
|
|
21278
|
+
if (!m) {
|
|
21279
|
+
m = new Map;
|
|
21280
|
+
caches2.set(db, m);
|
|
21281
|
+
}
|
|
21282
|
+
return m;
|
|
21283
|
+
}
|
|
21284
|
+
function entryFor(db, url) {
|
|
21285
|
+
const m = cacheFor2(db);
|
|
21286
|
+
let e = m.get(url);
|
|
21287
|
+
if (!e) {
|
|
21288
|
+
e = { items: [], fetchedAt: 0, error: null, inflight: null };
|
|
21289
|
+
m.set(url, e);
|
|
21290
|
+
}
|
|
21291
|
+
return e;
|
|
21292
|
+
}
|
|
21293
|
+
function notify(db) {
|
|
21294
|
+
for (const fn of [...listeners])
|
|
21295
|
+
fn(db);
|
|
21296
|
+
}
|
|
21297
|
+
function refreshRemoteSource(db, s) {
|
|
21298
|
+
const e = entryFor(db, s.url);
|
|
21299
|
+
if (e.inflight)
|
|
21300
|
+
return e.inflight;
|
|
21301
|
+
e.inflight = fetchSource(s).then((items) => {
|
|
21302
|
+
const changed = JSON.stringify(items) !== JSON.stringify(e.items);
|
|
21303
|
+
e.items = items;
|
|
21304
|
+
e.error = null;
|
|
21305
|
+
e.fetchedAt = Date.now();
|
|
21306
|
+
if (changed)
|
|
21307
|
+
notify(db);
|
|
21308
|
+
}).catch((err) => {
|
|
21309
|
+
e.error = err instanceof Error ? err.message : String(err);
|
|
21310
|
+
e.fetchedAt = Date.now();
|
|
21311
|
+
}).finally(() => {
|
|
21312
|
+
e.inflight = null;
|
|
21313
|
+
});
|
|
21314
|
+
return e.inflight;
|
|
21315
|
+
}
|
|
21316
|
+
function cachedRemoteShares(db, targetId, opts = {}) {
|
|
21317
|
+
const now = opts.now ?? Date.now();
|
|
21318
|
+
const sources = remoteShareSources(db);
|
|
21319
|
+
const m = cacheFor2(db);
|
|
21320
|
+
const live = new Set(sources.map((s) => s.url));
|
|
21321
|
+
for (const key of [...m.keys()])
|
|
21322
|
+
if (!live.has(key))
|
|
21323
|
+
m.delete(key);
|
|
21324
|
+
const out = [];
|
|
21325
|
+
for (const s of sources) {
|
|
21326
|
+
const e = entryFor(db, s.url);
|
|
21327
|
+
if (opts.refresh !== false && !e.inflight && now - e.fetchedAt >= REMOTE_SHARES_STALE_MS)
|
|
21328
|
+
refreshRemoteSource(db, s);
|
|
21329
|
+
for (const it of e.items)
|
|
21330
|
+
if (!targetId || it.target_id === targetId)
|
|
21331
|
+
out.push(it);
|
|
21332
|
+
}
|
|
21333
|
+
return out;
|
|
21334
|
+
}
|
|
21335
|
+
function primeRemoteShare(db, url, item) {
|
|
21336
|
+
const e = entryFor(db, url);
|
|
21337
|
+
e.items = [...e.items.filter((it) => it.slug !== item.slug), item];
|
|
21338
|
+
}
|
|
21339
|
+
function dropRemoteShare(db, url, slug) {
|
|
21340
|
+
const e = caches2.get(db)?.get(url);
|
|
21341
|
+
if (e)
|
|
21342
|
+
e.items = e.items.filter((it) => it.slug !== slug);
|
|
21343
|
+
}
|
|
21344
|
+
function findCachedBucketShare(db, slug) {
|
|
21345
|
+
const m = caches2.get(db);
|
|
21346
|
+
if (!m)
|
|
21347
|
+
return null;
|
|
21348
|
+
for (const s of remoteShareSources(db)) {
|
|
21349
|
+
if (s.kind !== "bucket")
|
|
21350
|
+
continue;
|
|
21351
|
+
const item = m.get(s.url)?.items.find((it) => it.slug === slug);
|
|
21352
|
+
if (item)
|
|
21353
|
+
return { source: s, item };
|
|
21354
|
+
}
|
|
21355
|
+
return null;
|
|
21356
|
+
}
|
|
21357
|
+
|
|
21358
|
+
// src/core/sync/share-actions.ts
|
|
20180
21359
|
init_site_channel_store();
|
|
20181
21360
|
var DEFAULT_SHARE_VIEWER = "https://share.mh.tensorix.org";
|
|
20182
21361
|
var DEFAULT_S3_EXPIRY_SEC = MAX_PRESIGN_SECONDS;
|
|
20183
|
-
var PEER_LIST_TIMEOUT_MS = 4000;
|
|
20184
21362
|
var PEER_SHARE_TIMEOUT_MS = 1e4;
|
|
20185
21363
|
var CreatedShareWireSchema = object({
|
|
20186
21364
|
slug: string2().min(1).max(128),
|
|
@@ -20277,13 +21455,6 @@ function bucketLink(base, manifestUrl, keyB64, saltB64) {
|
|
|
20277
21455
|
const frag = `m=${encodeURIComponent(manifestUrl)}&` + (keyB64 ? `k=${keyB64}` : `s=${saltB64}`);
|
|
20278
21456
|
return `${base}/#${frag}`;
|
|
20279
21457
|
}
|
|
20280
|
-
function absoluteShareUrl(url, base) {
|
|
20281
|
-
try {
|
|
20282
|
-
return new URL(url, `${base.replace(/\/+$/, "")}/`).toString();
|
|
20283
|
-
} catch {
|
|
20284
|
-
return url;
|
|
20285
|
-
}
|
|
20286
|
-
}
|
|
20287
21458
|
function assertShareCombo(req) {
|
|
20288
21459
|
const fail = (msg) => {
|
|
20289
21460
|
throw new MhError("invalid_input", msg);
|
|
@@ -20321,6 +21492,7 @@ async function createShareAction(db, req) {
|
|
|
20321
21492
|
expiresSec: req.expiresMs != null ? Math.floor(req.expiresMs / 1000) : DEFAULT_S3_EXPIRY_SEC,
|
|
20322
21493
|
viewerOrigin: viewerOriginOf(base)
|
|
20323
21494
|
});
|
|
21495
|
+
primeRemoteShare(db, bucketUrl, bucketShareItem({ url: bucketUrl, label }, out.meta));
|
|
20324
21496
|
return {
|
|
20325
21497
|
slug,
|
|
20326
21498
|
kind: req.kind,
|
|
@@ -20510,28 +21682,21 @@ function listServerSharesLocal(db, targetId) {
|
|
|
20510
21682
|
}
|
|
20511
21683
|
return out;
|
|
20512
21684
|
}
|
|
20513
|
-
async function listSharesLocal(db, targetId) {
|
|
21685
|
+
async function listSharesLocal(db, targetId, opts = {}) {
|
|
20514
21686
|
const out = listServerSharesLocal(db, targetId);
|
|
21687
|
+
if (opts.mode === "cached") {
|
|
21688
|
+
for (const it of cachedRemoteShares(db, targetId))
|
|
21689
|
+
if (it.sourceKind === "bucket")
|
|
21690
|
+
out.push(it);
|
|
21691
|
+
return out;
|
|
21692
|
+
}
|
|
20515
21693
|
for (const p of listPeers(db).filter((x) => x.kind === "s3" && x.config)) {
|
|
20516
21694
|
const config = JSON.parse(p.config);
|
|
20517
21695
|
const metas = await listBucketShares(config).catch(() => []);
|
|
20518
21696
|
for (const m of metas) {
|
|
20519
21697
|
if (targetId && m.target_id !== targetId)
|
|
20520
21698
|
continue;
|
|
20521
|
-
out.push(
|
|
20522
|
-
slug: m.slug,
|
|
20523
|
-
kind: m.kind,
|
|
20524
|
-
target_id: m.target_id,
|
|
20525
|
-
title: m.title || m.target_id,
|
|
20526
|
-
permission: m.permission,
|
|
20527
|
-
transport: "s3",
|
|
20528
|
-
source: `\u6876 ${p.label ?? p.url}`,
|
|
20529
|
-
sourceKind: "bucket",
|
|
20530
|
-
hosting: "s3",
|
|
20531
|
-
expiresAt: m.presign_exp,
|
|
20532
|
-
hasPassword: m.has_password,
|
|
20533
|
-
contentUpdatedAt: m.content_updated_at ?? m.created_at
|
|
20534
|
-
});
|
|
21699
|
+
out.push(bucketShareItem(p, m));
|
|
20535
21700
|
}
|
|
20536
21701
|
}
|
|
20537
21702
|
return out;
|
|
@@ -20561,10 +21726,16 @@ async function revokeShareByRequestId(db, requestId) {
|
|
|
20561
21726
|
const share = getShareByRequestId(db, requestId);
|
|
20562
21727
|
return share ? revokeShareAction(db, share.slug) : { ok: false, status: "not_found" };
|
|
20563
21728
|
}
|
|
20564
|
-
async function listSharesAggregated(db, targetId) {
|
|
21729
|
+
async function listSharesAggregated(db, targetId, opts = {}) {
|
|
20565
21730
|
const bySlug = new Map;
|
|
20566
|
-
for (const item of await listSharesLocal(db, targetId))
|
|
21731
|
+
for (const item of await listSharesLocal(db, targetId, opts))
|
|
20567
21732
|
bySlug.set(item.slug, item);
|
|
21733
|
+
if (opts.mode === "cached") {
|
|
21734
|
+
for (const it of cachedRemoteShares(db, targetId, { refresh: false }))
|
|
21735
|
+
if (it.sourceKind === "peer" && !bySlug.has(it.slug))
|
|
21736
|
+
bySlug.set(it.slug, it);
|
|
21737
|
+
return [...bySlug.values()];
|
|
21738
|
+
}
|
|
20568
21739
|
await Promise.all(listShareServers(db).map(async ({ url, label }) => {
|
|
20569
21740
|
const peer = getPeer2(db, url);
|
|
20570
21741
|
if (!peer?.token)
|
|
@@ -20582,19 +21753,6 @@ async function listSharesAggregated(db, targetId) {
|
|
|
20582
21753
|
}));
|
|
20583
21754
|
return [...bySlug.values()];
|
|
20584
21755
|
}
|
|
20585
|
-
async function fetchPeerShares(url, token, targetId) {
|
|
20586
|
-
const u = `${url.replace(/\/+$/, "")}/api/shares${targetId ? `?target=${encodeURIComponent(targetId)}` : ""}`;
|
|
20587
|
-
const res = await Promise.race([
|
|
20588
|
-
fetch(u, { headers: { authorization: `Bearer ${token}` } }),
|
|
20589
|
-
new Promise((_r, rej) => setTimeout(() => rej(new Error("timeout")), PEER_LIST_TIMEOUT_MS))
|
|
20590
|
-
]);
|
|
20591
|
-
if (!res.ok)
|
|
20592
|
-
return [];
|
|
20593
|
-
return (await res.json()).map((item) => ({
|
|
20594
|
-
...item,
|
|
20595
|
-
...item.url ? { url: absoluteShareUrl(item.url, url) } : {}
|
|
20596
|
-
}));
|
|
20597
|
-
}
|
|
20598
21756
|
async function revokeShareAction(db, slug) {
|
|
20599
21757
|
if (getShare(db, slug)) {
|
|
20600
21758
|
const channels = listSiteChannelRows(db).filter((channel) => channel.audience === "link" && channel.target_ref === slug && channel.desired_state === "active");
|
|
@@ -20623,37 +21781,50 @@ async function revokeShareAction(db, slug) {
|
|
|
20623
21781
|
status: "revoked"
|
|
20624
21782
|
};
|
|
20625
21783
|
}
|
|
21784
|
+
const owner = await bucketOwning(db, slug);
|
|
21785
|
+
if (!owner)
|
|
21786
|
+
return { ok: false, status: "not_found" };
|
|
21787
|
+
await deleteBucketShareObjects(JSON.parse(owner.peer.config), slug);
|
|
21788
|
+
dropRemoteShare(db, owner.peer.url, slug);
|
|
21789
|
+
return { ok: true, status: "revoked" };
|
|
21790
|
+
}
|
|
21791
|
+
async function bucketOwning(db, slug) {
|
|
21792
|
+
const cached = findCachedBucketShare(db, slug);
|
|
21793
|
+
if (cached)
|
|
21794
|
+
return { peer: cached.source.peer, kind: cached.item.kind, item: cached.item };
|
|
20626
21795
|
for (const p of listPeers(db).filter((x) => x.kind === "s3" && x.config)) {
|
|
20627
|
-
const
|
|
20628
|
-
const
|
|
20629
|
-
if (
|
|
20630
|
-
|
|
20631
|
-
return { ok: true, status: "revoked" };
|
|
20632
|
-
}
|
|
21796
|
+
const metas = await listBucketShares(JSON.parse(p.config)).catch(() => []);
|
|
21797
|
+
const m = metas.find((x) => x.slug === slug);
|
|
21798
|
+
if (m)
|
|
21799
|
+
return { peer: p, kind: m.kind, item: null };
|
|
20633
21800
|
}
|
|
20634
|
-
return
|
|
21801
|
+
return null;
|
|
20635
21802
|
}
|
|
20636
21803
|
async function renewShareAction(db, slug, viewerBaseOverride, opts) {
|
|
20637
|
-
|
|
20638
|
-
|
|
20639
|
-
|
|
20640
|
-
|
|
20641
|
-
|
|
20642
|
-
|
|
20643
|
-
|
|
20644
|
-
|
|
20645
|
-
|
|
20646
|
-
|
|
20647
|
-
|
|
20648
|
-
permission: "view",
|
|
20649
|
-
transport: "s3",
|
|
20650
|
-
hosting: "s3",
|
|
20651
|
-
url: bucketLink(base, out.manifestUrl, out.keyB64, out.saltB64),
|
|
21804
|
+
const owner = await bucketOwning(db, slug);
|
|
21805
|
+
if (!owner)
|
|
21806
|
+
throw new MhError("not_found", `no such object-storage share: ${slug}`);
|
|
21807
|
+
const { peer: p } = owner;
|
|
21808
|
+
const config = JSON.parse(p.config);
|
|
21809
|
+
const base = viewerBase(db, viewerBaseOverride);
|
|
21810
|
+
const out = opts?.refreshContent ? await renewBucketShare(db, config, slug) : await represignBucketShare(config, slug);
|
|
21811
|
+
if (owner.item)
|
|
21812
|
+
primeRemoteShare(db, p.url, {
|
|
21813
|
+
...owner.item,
|
|
21814
|
+
title: out.title || owner.item.title,
|
|
20652
21815
|
expiresAt: out.presignExp,
|
|
20653
|
-
|
|
20654
|
-
};
|
|
20655
|
-
|
|
20656
|
-
|
|
21816
|
+
...opts?.refreshContent ? { contentUpdatedAt: Date.now() } : {}
|
|
21817
|
+
});
|
|
21818
|
+
return {
|
|
21819
|
+
slug,
|
|
21820
|
+
kind: owner.kind,
|
|
21821
|
+
permission: "view",
|
|
21822
|
+
transport: "s3",
|
|
21823
|
+
hosting: "s3",
|
|
21824
|
+
url: bucketLink(base, out.manifestUrl, out.keyB64, out.saltB64),
|
|
21825
|
+
expiresAt: out.presignExp,
|
|
21826
|
+
source: `\u6876 ${p.label ?? p.url}`
|
|
21827
|
+
};
|
|
20657
21828
|
}
|
|
20658
21829
|
function freshSlug(db) {
|
|
20659
21830
|
let slug = randomSuffix(12);
|
|
@@ -20752,7 +21923,7 @@ var shareRoutes = [
|
|
|
20752
21923
|
handler: async (req, { db }) => {
|
|
20753
21924
|
try {
|
|
20754
21925
|
const target = new URL(req.url).searchParams.get("target") ?? undefined;
|
|
20755
|
-
return Response.json(await listSharesLocal(db, target));
|
|
21926
|
+
return Response.json(await listSharesLocal(db, target, { mode: "cached" }));
|
|
20756
21927
|
} catch (e) {
|
|
20757
21928
|
return errorResponse(e);
|
|
20758
21929
|
}
|
|
@@ -20766,7 +21937,7 @@ var shareRoutes = [
|
|
|
20766
21937
|
handler: async (req, { db }) => {
|
|
20767
21938
|
try {
|
|
20768
21939
|
const target = new URL(req.url).searchParams.get("target") ?? undefined;
|
|
20769
|
-
return Response.json(await listSharesAggregated(db, target));
|
|
21940
|
+
return Response.json(await listSharesAggregated(db, target, { mode: "cached" }));
|
|
20770
21941
|
} catch (e) {
|
|
20771
21942
|
return errorResponse(e);
|
|
20772
21943
|
}
|
|
@@ -21057,7 +22228,7 @@ function jsonHandler(fn) {
|
|
|
21057
22228
|
try {
|
|
21058
22229
|
return Response.json(await fn(req, ctx) ?? null);
|
|
21059
22230
|
} catch (e) {
|
|
21060
|
-
return errorResponse(e);
|
|
22231
|
+
return errorResponse(e, req);
|
|
21061
22232
|
}
|
|
21062
22233
|
};
|
|
21063
22234
|
}
|
|
@@ -21227,20 +22398,24 @@ async function verifyBase(input, expectedNode, allowRemote = true) {
|
|
|
21227
22398
|
headers: { accept: "application/json" }
|
|
21228
22399
|
});
|
|
21229
22400
|
if (res.status < 200 || res.status >= 300)
|
|
21230
|
-
throw
|
|
22401
|
+
throw mhError("network", "\u7AD9\u70B9\u5165\u53E3\u5065\u5EB7\u68C0\u67E5\u5931\u8D25\uFF08HTTP {status}\uFF09", { status: res.status });
|
|
21231
22402
|
const body = await limitedJson(res, HEALTH_RESPONSE_MAX);
|
|
21232
22403
|
if (!body?.ok || !body.node)
|
|
21233
22404
|
throw new MhError("network", "\u7AD9\u70B9\u5165\u53E3\u5065\u5EB7\u54CD\u5E94\u65E0\u6548");
|
|
21234
22405
|
if (body.node !== expectedNode)
|
|
21235
|
-
throw
|
|
22406
|
+
throw mhError("conflict", "\u7AD9\u70B9\u5165\u53E3\u8282\u70B9\u4E0D\u5339\u914D\uFF08\u671F\u671B {expected}\uFF0C\u5B9E\u9645 {actual}\uFF09\uFF1B\u8FD9\u662F\u9632\u8BEF\u914D\u68C0\u67E5\uFF0C\u4E0D\u662F\u8EAB\u4EFD\u8BA4\u8BC1", {
|
|
22407
|
+
expected: expectedNode,
|
|
22408
|
+
actual: body.node
|
|
22409
|
+
});
|
|
21236
22410
|
if (!Array.isArray(body.capabilities) || !body.capabilities.includes("site_channels"))
|
|
21237
22411
|
throw new MhError("conflict", "\u76EE\u6807\u8BBE\u5907\u7248\u672C\u4E0D\u652F\u6301\u5B9A\u5411\u53D1\u5E03\u6E20\u9053\uFF1B\u8BF7\u5148\u5347\u7EA7\u8BE5\u8BBE\u5907\uFF0C\u518D\u91CD\u65B0\u9A8C\u8BC1\u5165\u53E3");
|
|
21238
22412
|
return { ...base, node: body.node };
|
|
21239
22413
|
} catch (e) {
|
|
21240
22414
|
if (e instanceof MhError)
|
|
21241
22415
|
throw e;
|
|
21242
|
-
|
|
21243
|
-
|
|
22416
|
+
if (e.name === "AbortError")
|
|
22417
|
+
throw mhError("network", "\u65E0\u6CD5\u9A8C\u8BC1\u7AD9\u70B9\u5165\u53E3\uFF1A\u8FDE\u63A5\u8D85\u65F6");
|
|
22418
|
+
throw mhError("network", "\u65E0\u6CD5\u9A8C\u8BC1\u7AD9\u70B9\u5165\u53E3\uFF1A{msg}", { msg: e.message });
|
|
21244
22419
|
} finally {
|
|
21245
22420
|
clearTimeout(timer);
|
|
21246
22421
|
}
|
|
@@ -21561,6 +22736,7 @@ var siteHostingRoutes = [
|
|
|
21561
22736
|
// src/webui/server/edge-routes.ts
|
|
21562
22737
|
init_zod();
|
|
21563
22738
|
init_errors();
|
|
22739
|
+
init_page_messages();
|
|
21564
22740
|
|
|
21565
22741
|
// src/core/sync/edge-service.ts
|
|
21566
22742
|
init_errors();
|
|
@@ -21727,6 +22903,7 @@ init_errors();
|
|
|
21727
22903
|
init_http_status();
|
|
21728
22904
|
init_ids();
|
|
21729
22905
|
init_access_policy();
|
|
22906
|
+
init_page_messages();
|
|
21730
22907
|
init_grants_routes();
|
|
21731
22908
|
init_rate_limit();
|
|
21732
22909
|
init_sites_core();
|
|
@@ -22208,6 +23385,7 @@ function disconnectEdge(db) {
|
|
|
22208
23385
|
|
|
22209
23386
|
// src/core/sync/cf-oauth.ts
|
|
22210
23387
|
init_errors();
|
|
23388
|
+
init_page_messages();
|
|
22211
23389
|
init_e2ee();
|
|
22212
23390
|
var CF_OAUTH_CLIENT_ID = process.env.METAHUB_CF_OAUTH_CLIENT_ID || "0062224f5b80ba3a2074780e73a9d305";
|
|
22213
23391
|
var AUTH_ENDPOINT = "https://dash.cloudflare.com/oauth2/auth";
|
|
@@ -22257,7 +23435,7 @@ function buildTokenRequestBody(p) {
|
|
|
22257
23435
|
function parseTokenResponse(data) {
|
|
22258
23436
|
const d = data ?? {};
|
|
22259
23437
|
if (!d.access_token)
|
|
22260
|
-
throw
|
|
23438
|
+
throw mhError("auth", "Cloudflare \u6388\u6743\u5931\u8D25\uFF1A{detail}", { detail: d.error_description || d.error || "\u672A\u8FD4\u56DE access token" });
|
|
22261
23439
|
return {
|
|
22262
23440
|
accessToken: d.access_token,
|
|
22263
23441
|
refreshToken: d.refresh_token ?? null,
|
|
@@ -22277,11 +23455,11 @@ async function exchangeCode(p) {
|
|
|
22277
23455
|
body: buildTokenRequestBody(p)
|
|
22278
23456
|
});
|
|
22279
23457
|
} catch (e) {
|
|
22280
|
-
throw
|
|
23458
|
+
throw mhError("network", "\u65E0\u6CD5\u8FDE\u63A5 Cloudflare \u6388\u6743\u670D\u52A1\uFF1A{msg}", { msg: e.message });
|
|
22281
23459
|
}
|
|
22282
23460
|
const data = await res.json().catch(() => null);
|
|
22283
23461
|
if (!res.ok && !data?.access_token)
|
|
22284
|
-
throw
|
|
23462
|
+
throw mhError("auth", "Cloudflare \u4EE4\u724C\u4EA4\u6362\u5931\u8D25\uFF08HTTP {status}\uFF09", { status: res.status });
|
|
22285
23463
|
return parseTokenResponse(data);
|
|
22286
23464
|
}
|
|
22287
23465
|
async function discoverAccounts(accessToken) {
|
|
@@ -22291,11 +23469,11 @@ async function discoverAccounts(accessToken) {
|
|
|
22291
23469
|
headers: { authorization: `Bearer ${accessToken}`, accept: "application/json" }
|
|
22292
23470
|
});
|
|
22293
23471
|
} catch (e) {
|
|
22294
|
-
throw
|
|
23472
|
+
throw mhError("network", "\u65E0\u6CD5\u8BFB\u53D6 Cloudflare \u8D26\u53F7\u5217\u8868\uFF1A{msg}", { msg: e.message });
|
|
22295
23473
|
}
|
|
22296
23474
|
const data = await res.json().catch(() => null);
|
|
22297
23475
|
if (!res.ok)
|
|
22298
|
-
throw
|
|
23476
|
+
throw mhError("auth", "\u8BFB\u53D6 Cloudflare \u8D26\u53F7\u5931\u8D25\uFF08HTTP {status}\uFF09", { status: res.status });
|
|
22299
23477
|
return parseAccounts(data);
|
|
22300
23478
|
}
|
|
22301
23479
|
async function startCfLogin(opts = {}) {
|
|
@@ -22314,7 +23492,9 @@ async function startCfLogin(opts = {}) {
|
|
|
22314
23492
|
if (url.pathname !== CALLBACK_PATH)
|
|
22315
23493
|
return new Response("not found", { status: 404 });
|
|
22316
23494
|
settle(url.searchParams);
|
|
22317
|
-
return new Response(
|
|
23495
|
+
return new Response(callbackHtml(localeFromAcceptLanguage(req.headers.get("accept-language"))), {
|
|
23496
|
+
headers: { "content-type": "text/html; charset=utf-8" }
|
|
23497
|
+
});
|
|
22318
23498
|
}
|
|
22319
23499
|
});
|
|
22320
23500
|
const redirectUri = `http://127.0.0.1:${server.port}${CALLBACK_PATH}`;
|
|
@@ -22345,7 +23525,7 @@ async function startCfLogin(opts = {}) {
|
|
|
22345
23525
|
try {
|
|
22346
23526
|
const q = await Promise.race([caught, timeout]);
|
|
22347
23527
|
if (q.get("error"))
|
|
22348
|
-
throw
|
|
23528
|
+
throw mhError("auth", "Cloudflare \u6388\u6743\u88AB\u62D2\u7EDD\uFF1A{detail}", { detail: q.get("error_description") || q.get("error") || "" });
|
|
22349
23529
|
if (q.get("state") !== state)
|
|
22350
23530
|
throw new MhError("auth", "OAuth state \u4E0D\u5339\u914D\uFF0C\u7591\u4F3C\u4F2A\u9020\u56DE\u8C03\uFF0C\u5DF2\u4E2D\u6B62");
|
|
22351
23531
|
const code = q.get("code");
|
|
@@ -22366,9 +23546,9 @@ async function startCfLogin(opts = {}) {
|
|
|
22366
23546
|
}
|
|
22367
23547
|
};
|
|
22368
23548
|
}
|
|
22369
|
-
var
|
|
23549
|
+
var callbackHtml = (locale) => `<!doctype html><html lang="${locale}"><meta charset="utf-8"><title>MetaHub</title>
|
|
22370
23550
|
<body style="font:15px system-ui;display:grid;place-items:center;height:100vh;margin:0">
|
|
22371
|
-
<div style="text-align:center"><h2
|
|
23551
|
+
<div style="text-align:center"><h2>${pm(locale, "\u2705 \u5DF2\u6388\u6743")}</h2><p>${pm(locale, "\u53EF\u4EE5\u5173\u95ED\u6B64\u6807\u7B7E\u9875\uFF0C\u56DE\u5230 MetaHub \u7EE7\u7EED\u90E8\u7F72\u3002")}</p></div>`;
|
|
22372
23552
|
|
|
22373
23553
|
// src/webui/server/edge-routes.ts
|
|
22374
23554
|
init_ids();
|
|
@@ -22439,7 +23619,7 @@ function resolveCfCreds(body) {
|
|
|
22439
23619
|
if (!flow)
|
|
22440
23620
|
throw new MhError("not_found", "OAuth \u6D41\u7A0B\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55");
|
|
22441
23621
|
if (flow.state === "error")
|
|
22442
|
-
throw new MhError("auth", flow.error || "Cloudflare \u6388\u6743\u5931\u8D25");
|
|
23622
|
+
throw new MhError("auth", flow.error || "Cloudflare \u6388\u6743\u5931\u8D25", flow.errorI18n);
|
|
22443
23623
|
if (flow.state !== "ready" || !flow.token)
|
|
22444
23624
|
throw new MhError("conflict", "Cloudflare \u6388\u6743\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u7A0D\u5019");
|
|
22445
23625
|
apiToken = flow.token;
|
|
@@ -22483,6 +23663,7 @@ var edgeRoutes = [
|
|
|
22483
23663
|
}).catch((e) => {
|
|
22484
23664
|
flow.state = "error";
|
|
22485
23665
|
flow.error = e.message;
|
|
23666
|
+
flow.errorI18n = e instanceof MhError ? e.i18n : undefined;
|
|
22486
23667
|
});
|
|
22487
23668
|
return { flowId, authUrl: handle.authUrl };
|
|
22488
23669
|
})
|
|
@@ -22501,7 +23682,8 @@ var edgeRoutes = [
|
|
|
22501
23682
|
const flow = flows.get(flowId);
|
|
22502
23683
|
if (!flow)
|
|
22503
23684
|
throw new MhError("not_found", "OAuth \u6D41\u7A0B\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u8BD5");
|
|
22504
|
-
|
|
23685
|
+
const error = flow.error === undefined ? undefined : flow.errorI18n ? pmIfKnown(pickLocale(req), flow.errorI18n.key, flow.errorI18n.params) : pmIfKnown(pickLocale(req), flow.error);
|
|
23686
|
+
return { state: flow.state, accounts: flow.accounts, error };
|
|
22505
23687
|
})
|
|
22506
23688
|
},
|
|
22507
23689
|
{
|
|
@@ -22603,6 +23785,7 @@ var DatabaseSchema = object({
|
|
|
22603
23785
|
id: string2(),
|
|
22604
23786
|
name: string2(),
|
|
22605
23787
|
icon: string2().nullable(),
|
|
23788
|
+
meta: record(string2(), any()).nullable(),
|
|
22606
23789
|
created_hlc: string2()
|
|
22607
23790
|
});
|
|
22608
23791
|
var PropertySchema = object({
|
|
@@ -22646,11 +23829,18 @@ var SearchHitSchema = object({
|
|
|
22646
23829
|
title: string2().optional(),
|
|
22647
23830
|
snippet: string2()
|
|
22648
23831
|
});
|
|
23832
|
+
var LookupHitSchema = object({
|
|
23833
|
+
kind: _enum(["db", "doc", "rec"]),
|
|
23834
|
+
id: string2(),
|
|
23835
|
+
label: string2(),
|
|
23836
|
+
database_id: string2().nullable()
|
|
23837
|
+
});
|
|
22649
23838
|
var OkSchema2 = object({ ok: boolean2() });
|
|
22650
23839
|
var CreateDatabaseReq = object({ name: string2(), icon: string2().optional() });
|
|
22651
23840
|
var UpdateDatabaseReq = object({
|
|
22652
23841
|
name: string2().optional(),
|
|
22653
|
-
icon: string2().nullable().optional()
|
|
23842
|
+
icon: string2().nullable().optional(),
|
|
23843
|
+
meta: record(string2(), any()).nullable().optional().describe("Merge patch over per-key metadata; null value deletes a key, null object clears all")
|
|
22654
23844
|
});
|
|
22655
23845
|
var DuplicateDatabaseReq = object({
|
|
22656
23846
|
name: string2().optional().describe("Name for the copy (defaults to the source name)"),
|
|
@@ -22909,7 +24099,7 @@ function handle3(fn) {
|
|
|
22909
24099
|
return out;
|
|
22910
24100
|
return Response.json(out ?? null);
|
|
22911
24101
|
} catch (e) {
|
|
22912
|
-
return errorResponse(e);
|
|
24102
|
+
return errorResponse(e, req);
|
|
22913
24103
|
}
|
|
22914
24104
|
};
|
|
22915
24105
|
}
|
|
@@ -22972,7 +24162,7 @@ var webuiRoutes = [
|
|
|
22972
24162
|
{
|
|
22973
24163
|
method: "PATCH",
|
|
22974
24164
|
path: "/api/database",
|
|
22975
|
-
summary: "Rename a database or
|
|
24165
|
+
summary: "Rename a database, change its icon or patch its metadata. Query: ?id=<id>",
|
|
22976
24166
|
request: UpdateDatabaseReq,
|
|
22977
24167
|
response: DatabaseSchema,
|
|
22978
24168
|
handler: handle3(async (req, { db }) => {
|
|
@@ -23358,6 +24548,16 @@ var webuiRoutes = [
|
|
|
23358
24548
|
return search(db, need3(req, "q"), { limit: limit ? Number(limit) : undefined });
|
|
23359
24549
|
})
|
|
23360
24550
|
},
|
|
24551
|
+
{
|
|
24552
|
+
method: "GET",
|
|
24553
|
+
path: "/api/resolve",
|
|
24554
|
+
summary: "Navigable entities (db/doc/rec) matching a full id, id prefix, bare slug or name \u2014 the `mh get <ref>` rule. Query: ?ref=<text>&limit=<n>",
|
|
24555
|
+
response: array(LookupHitSchema),
|
|
24556
|
+
handler: handle3((req, { db }) => {
|
|
24557
|
+
const limit = opt(req, "limit");
|
|
24558
|
+
return lookupCandidates(db, need3(req, "ref"), { limit: limit ? Number(limit) : undefined });
|
|
24559
|
+
})
|
|
24560
|
+
},
|
|
23361
24561
|
{
|
|
23362
24562
|
method: "GET",
|
|
23363
24563
|
path: "/api/blob-cache",
|
|
@@ -23382,6 +24582,13 @@ var webuiRoutes = [
|
|
|
23382
24582
|
response: ClearResultSchema,
|
|
23383
24583
|
handler: handle3((_req, { db }) => clearCache(db))
|
|
23384
24584
|
},
|
|
24585
|
+
{
|
|
24586
|
+
method: "POST",
|
|
24587
|
+
path: "/api/repair/clock",
|
|
24588
|
+
summary: "Restamp oplog rows dated more than 5 min in the future with this clock and reset the logical clock (fixes clock_skew; local-only).",
|
|
24589
|
+
response: object({ restamped: number2(), byNode: record(string2(), number2()) }),
|
|
24590
|
+
handler: handle3(async (_req, { db }) => repairClock(db))
|
|
24591
|
+
},
|
|
23385
24592
|
{
|
|
23386
24593
|
method: "POST",
|
|
23387
24594
|
path: "/api/blob-cache/pin",
|
|
@@ -23455,6 +24662,7 @@ export {
|
|
|
23455
24662
|
DOCUMENT_COLS,
|
|
23456
24663
|
DOMAIN,
|
|
23457
24664
|
HEALTH_PATH,
|
|
24665
|
+
HLC_MAX_SKEW_MS,
|
|
23458
24666
|
HealthResponseSchema,
|
|
23459
24667
|
INLINE_LIMIT,
|
|
23460
24668
|
MAX_HLC_COUNTER,
|
|
@@ -23480,6 +24688,7 @@ export {
|
|
|
23480
24688
|
advanceAckedPrefix,
|
|
23481
24689
|
appendDocument,
|
|
23482
24690
|
applyChange,
|
|
24691
|
+
asMhError,
|
|
23483
24692
|
backfillDocumentOrderKeys,
|
|
23484
24693
|
backfillRecordOrderKeys,
|
|
23485
24694
|
base64ToBytes,
|
|
@@ -23540,12 +24749,16 @@ export {
|
|
|
23540
24749
|
getSiteByName,
|
|
23541
24750
|
grouped,
|
|
23542
24751
|
hasIndex,
|
|
24752
|
+
hlcSkewBound,
|
|
23543
24753
|
idKind,
|
|
23544
24754
|
inferContentType,
|
|
23545
24755
|
ingest,
|
|
24756
|
+
ingestDetailed,
|
|
23546
24757
|
initSchema,
|
|
24758
|
+
interpolateMsg,
|
|
23547
24759
|
isImageType,
|
|
23548
24760
|
isSitePublic,
|
|
24761
|
+
isSkewedHlc,
|
|
23549
24762
|
isTextType,
|
|
23550
24763
|
keyBetween,
|
|
23551
24764
|
keysBetween,
|
|
@@ -23557,10 +24770,12 @@ export {
|
|
|
23557
24770
|
listRecords,
|
|
23558
24771
|
listSites,
|
|
23559
24772
|
liveFileRowIfSame,
|
|
24773
|
+
lookupCandidates,
|
|
23560
24774
|
loopbackUiRejection,
|
|
23561
24775
|
makeId,
|
|
23562
24776
|
maybeAutoIndex,
|
|
23563
24777
|
metahubHome,
|
|
24778
|
+
mhError,
|
|
23564
24779
|
migrateDocBlocks,
|
|
23565
24780
|
migrateDocuments,
|
|
23566
24781
|
migrateNodes,
|
|
@@ -23579,6 +24794,7 @@ export {
|
|
|
23579
24794
|
openMetahub,
|
|
23580
24795
|
parseDocBlocks,
|
|
23581
24796
|
parseHlc,
|
|
24797
|
+
persistedHlc,
|
|
23582
24798
|
platformFromProcess,
|
|
23583
24799
|
prepareRecordCells,
|
|
23584
24800
|
prependDocument,
|
|
@@ -23595,6 +24811,7 @@ export {
|
|
|
23595
24811
|
removeProperty,
|
|
23596
24812
|
removeSelectOption,
|
|
23597
24813
|
renameSelectOption,
|
|
24814
|
+
resetHlc,
|
|
23598
24815
|
resolveCandidates,
|
|
23599
24816
|
resolveData,
|
|
23600
24817
|
resolveEntity,
|
|
@@ -23614,6 +24831,7 @@ export {
|
|
|
23614
24831
|
sha256Hex,
|
|
23615
24832
|
siteCacheControl,
|
|
23616
24833
|
siteLifecycle,
|
|
24834
|
+
skewWarnings,
|
|
23617
24835
|
slugify,
|
|
23618
24836
|
startServer,
|
|
23619
24837
|
syncWithPeer,
|
|
@@ -23631,7 +24849,8 @@ export {
|
|
|
23631
24849
|
withChangeGroup,
|
|
23632
24850
|
withNodeId,
|
|
23633
24851
|
withTxnId,
|
|
23634
|
-
writeFileRow
|
|
24852
|
+
writeFileRow,
|
|
24853
|
+
writeTx
|
|
23635
24854
|
};
|
|
23636
24855
|
|
|
23637
|
-
//# debugId=
|
|
24856
|
+
//# debugId=313E5D38AF56C98B64756E2164756E21
|