chainlesschain 0.157.3 → 0.157.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/package.json +2 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{ActionButton-mV_H2ZBW.js → ActionButton-CwL5V4rk.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-GW0Daj2c.js → Analytics-BlsG3Nvq.js} +1 -1
- package/src/assets/web-panel/assets/AppLayout-CDW-fEBB.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-bQJ6NJkS.js +1 -0
- package/src/assets/web-panel/assets/{Backup-BP13XrWC.js → Backup-CKjf2R2f.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BAFrPrGk.js → BaseInput-nL30Uqw9.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D6KtPMGk.js → Chat-CArgL-BR.js} +2 -2
- package/src/assets/web-panel/assets/{Checkbox-xnGUwzCJ.js → Checkbox-C2UDDSs8.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVK4mypO.js → Col-B7ocl9Ww.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CreqDQST.js → Community-BRYhwndT.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-HV2KpdeM.js → Compact-Dya_aHuV.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BIhVZQdQ.js → Cowork-Jz5Q55Gv.js} +1 -1
- package/src/assets/web-panel/assets/{Cron-ZYoqq3dP.js → Cron-DbD6XGF3.js} +1 -1
- package/src/assets/web-panel/assets/Crosschain-DThGgQk8.css +1 -0
- package/src/assets/web-panel/assets/Crosschain-Dtu8IMai.js +1 -0
- package/src/assets/web-panel/assets/{DID-Dzs7_3Ix.js → DID-BxckhNcy.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-DpWD0jBe.js → Dashboard-C8vWq_IC.js} +1 -1
- package/src/assets/web-panel/assets/{Dropdown-BhJQ7ase.js → Dropdown-Bjndts_O.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D0BWmaoR.js → FormItemContext-bOF0FL5N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-bXqWPH2a.js → Git-BtH4vugY.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CHwQzfXh.js → KnowledgeGraph-CauuWTCg.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-pjiNzTno.js → Logs-DCfoGLWg.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Dyfg9_ug.js → Marketplace-BNv5w-8n.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bltof0JN.js → McpTools-vh8oeQ_N.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-ClxOtILG.js → Memory-B-BtLRWD.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DkAhw9_e.js → Notes-D-V-KW8L.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-DddzeMd6.js → Organization-DE_QjJF0.js} +1 -1
- package/src/assets/web-panel/assets/{Overflow-CZY_3usr.js → Overflow-CvGooyM4.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Buux_Lgw.js → P2P-bmQWjcTu.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-Cqn9Jeuf.js → Permissions-C0kqPJfm.js} +3 -3
- package/src/assets/web-panel/assets/{ProjectSettings-BQPrAum5.js → ProjectSettings-DRqY-cna.js} +1 -1
- package/src/assets/web-panel/assets/{Projects-BEbAmoTM.js → Projects-C9N8_IbI.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-CYeQV4vn.js → Providers-D_UuBLoY.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DfL3PHtV.js → Row-B_nOQOCt.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DI5F5RaQ.js → RssFeed-C7pFhGvD.js} +2 -2
- package/src/assets/web-panel/assets/{Security-Dvn_envm.js → Security-C81wAGw7.js} +1 -1
- package/src/assets/web-panel/assets/{Services-CuaENMDT.js → Services-CXO09HRi.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DZIDyklE.js → Skeleton-pzCg9Pnc.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BkPNofwG.js → Skills-0AKMVnae.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-h03UxSCR.js → Tasks-BobOO2E9.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-B1OanGmU.js → Templates-CDjBR3fZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CyX3zvNU.js → Trigger-Bvwds95J.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CJHLV59r.js → VideoEditing-DF_v4mGP.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-GwRmIUiB.js → Wallet-By5UwKVh.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CZ_q_1nf.js → WebAuthn-BwVVXAv2.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor--0SM6yv0.js → WorkflowEditor-5U7bQ2W8.js} +1 -1
- package/src/assets/web-panel/assets/{colors-ZsSPXEpx.js → colors-umO_4d2G.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CwFgypMe.js → compact-item-DQizAYSA.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CXDfCmTY.js → createContext-B4cgNOPl.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-CuA5Qv5d.js → hasIn-BlpjKJek.js} +1 -1
- package/src/assets/web-panel/assets/icons-C0xSkzug.js +57 -0
- package/src/assets/web-panel/assets/{index-Bdz6ZN2n.js → index-0Kan5LKq.js} +2 -2
- package/src/assets/web-panel/assets/{index-BrBmPm9P.js → index-8iWNplHD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CU5HVlet.js → index-BBXgHH-n.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiyAMvep.js → index-BFCm-ez3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTmBSfDP.js → index-BLSfu07o.js} +2 -2
- package/src/assets/web-panel/assets/{index-Bzai2qqL.js → index-BWQQnruX.js} +2 -2
- package/src/assets/web-panel/assets/{index-7fYLkWFb.js → index-BjshxRqs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGV4y7Ok.js → index-Bpn272aB.js} +1 -1
- package/src/assets/web-panel/assets/index-BqEMjyrg.js +1 -0
- package/src/assets/web-panel/assets/{index-CyZXgmzB.js → index-BrLgYcYw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOlW8HfH.js → index-Bxa12jHB.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZeKq1gO8.js → index-BxkDaXvc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPLo4dr_.js → index-BzatTiIv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf6QSnBq.js → index-C-24swjx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI6cGrS9.js → index-C-ri0NGO.js} +1 -1
- package/src/assets/web-panel/assets/index-C1kMaz6E.js +1 -0
- package/src/assets/web-panel/assets/{index-DaMGhrmy.js → index-CHFoDNQ0.js} +3 -3
- package/src/assets/web-panel/assets/{index-nOYPI6Gi.js → index-CUBfNblp.js} +2 -2
- package/src/assets/web-panel/assets/{index-wnbQQPT7.js → index-CUqnZufL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZeiwAUS.js → index-CbEcq7vH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DILaZYt9.js → index-Cf_9fnbE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CW0BgiQ7.js → index-CmnzbK4b.js} +1 -1
- package/src/assets/web-panel/assets/{index-CP6IHxV9.js → index-CqwDvOkw.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_3tdh8I.js → index-Cqykb9ZW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CotI08pv.js → index-DF_WAwo2.js} +1 -1
- package/src/assets/web-panel/assets/index-DKyOq7hH.js +36 -0
- package/src/assets/web-panel/assets/{index-Ck5LhFMy.js → index-DXYL4L2w.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1aCZ8tU.js → index-DbN_ZPnl.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi6eldWX.js → index-DtPNcQ4n.js} +1 -1
- package/src/assets/web-panel/assets/{index-GHDuYmBz.js → index-Ho9akU7U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYpWUsV7.js → index-LUf68SrL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dj1YuMWN.js → index-ZPIbAiEU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnoDj1K9.js → index-g91q-v6w.js} +1 -1
- package/src/assets/web-panel/assets/{index-nGWg45HB.js → index-lUKzY82L.js} +2 -2
- package/src/assets/web-panel/assets/{index-BoAaMGTC.js → index-mHBrdFck.js} +1 -1
- package/src/assets/web-panel/assets/{index-0BsRZQ70.js → index-oC0OINzs.js} +2 -2
- package/src/assets/web-panel/assets/{index-mzATEmde.js → index-ug3GpVu7.js} +1 -1
- package/src/assets/web-panel/assets/{index--02skmxm.js → index-uzrAZgzY.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DFvrAEOp.js → initDefaultProps-D7cer4hW.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cfd1jQ_B.js → motion-CnElQ3Xy.js} +1 -1
- package/src/assets/web-panel/assets/{move-CtwIMT78.js → move-dvqokDN1.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DsID1k1x.js → omit-DYHi-pbs.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-hmUpaGeX.js → pickAttrs-DUC9etdU.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Mcm6Nlo6.js → placementArrow-CZyEeX_l.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CARlpUva.js → responsiveObserve-CAycKNvy.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CoE_bmVd.js → slide-BAObbkl7.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DXv0eID1.js → statusUtils-Bu8BSzrG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-KAcyElmo.js → styleChecker-CnYmg0_G.js} +1 -1
- package/src/assets/web-panel/assets/{transition-CzoVM28y.js → transition-8JSy_yCb.js} +1 -1
- package/src/assets/web-panel/assets/{useConfigInject-D5hyBDTd.js → useConfigInject-CypxEK_1.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-P_d7Gj-x.js → useFlexGapSupport-Ckda3t4R.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DUk2z77k.js → vnode-BE-GtqXI.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BTYQHwzp.js → zoom-5CInnogB.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/db.js +309 -151
- package/src/assets/web-panel/assets/AppLayout-CILzvZ4I.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-DznHOSmD.js +0 -1
- package/src/assets/web-panel/assets/icons-DuLXY5ve.js +0 -57
- package/src/assets/web-panel/assets/index-CzEyEx5i.js +0 -1
- package/src/assets/web-panel/assets/index-D8XA7siu.js +0 -36
- package/src/assets/web-panel/assets/index-psUMSTuC.js +0 -1
package/src/commands/db.js
CHANGED
|
@@ -12,22 +12,277 @@ import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
|
12
12
|
const requireCjs = createRequire(import.meta.url);
|
|
13
13
|
const quoteIdent = (name) => `"${String(name).replace(/"/g, '""')}"`;
|
|
14
14
|
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
|
|
15
|
+
// SQLite driver loader for db check/repair. Cascades: native → wasm.
|
|
16
|
+
// Native (better-sqlite3) is fast but needs prebuilt binaries — fails on
|
|
17
|
+
// Apple Silicon w/o prebuilds, musl Linux, and some Node-version drift.
|
|
18
|
+
// WASM (sql.js) is pure JS+WASM, slower but always loadable.
|
|
19
|
+
// Inlined here rather than imported from core-db because the published
|
|
20
|
+
// @chainlesschain/core-db@0.1.0 doesn't export its loader; bumping core-db
|
|
21
|
+
// would have wider ripple, so we duplicate the cascade locally.
|
|
22
|
+
async function loadAnyDriver() {
|
|
20
23
|
for (const pkg of ["better-sqlite3-multiple-ciphers", "better-sqlite3"]) {
|
|
21
24
|
try {
|
|
22
25
|
const Database = requireCjs(pkg);
|
|
23
26
|
const probe = new Database(":memory:");
|
|
24
27
|
probe.close();
|
|
25
|
-
return { name: pkg, Database };
|
|
28
|
+
return { kind: "native", name: pkg, Database };
|
|
26
29
|
} catch (_e) {
|
|
27
30
|
/* try next */
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
|
-
|
|
33
|
+
try {
|
|
34
|
+
const initSqlJs = requireCjs("sql.js");
|
|
35
|
+
const SQL = await initSqlJs();
|
|
36
|
+
return { kind: "wasm", name: "sql.js", SQL };
|
|
37
|
+
} catch (_e) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Run integrity check. Normalizes both driver shapes to { ok, diagnostics }.
|
|
43
|
+
// native: db.pragma("integrity_check") → [{integrity_check: "ok"}] or [{integrity_check: "*** in db ***\n..."}]
|
|
44
|
+
// wasm: db.exec("PRAGMA integrity_check") → [{columns: [...], values: [["ok"]]}]
|
|
45
|
+
async function runIntegrityCheck(driver, dbPath, checkName) {
|
|
46
|
+
const fs = requireCjs("fs");
|
|
47
|
+
if (driver.kind === "native") {
|
|
48
|
+
const conn = new driver.Database(dbPath, {
|
|
49
|
+
readonly: true,
|
|
50
|
+
fileMustExist: true,
|
|
51
|
+
});
|
|
52
|
+
const rows = conn.pragma(checkName);
|
|
53
|
+
conn.close();
|
|
54
|
+
const lines = rows.map((r) => (r && r[checkName]) || JSON.stringify(r));
|
|
55
|
+
return {
|
|
56
|
+
ok: lines.length === 1 && lines[0] === "ok",
|
|
57
|
+
diagnostics: lines,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const buf = fs.readFileSync(dbPath);
|
|
61
|
+
const conn = new driver.SQL.Database(buf);
|
|
62
|
+
let res;
|
|
63
|
+
try {
|
|
64
|
+
res = conn.exec(`PRAGMA ${checkName}`);
|
|
65
|
+
} finally {
|
|
66
|
+
conn.close();
|
|
67
|
+
}
|
|
68
|
+
const lines = (res[0]?.values || []).map((v) => String(v[0]));
|
|
69
|
+
return {
|
|
70
|
+
ok: lines.length === 1 && lines[0] === "ok",
|
|
71
|
+
diagnostics: lines,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Best-effort row salvage. Handles both native and wasm drivers.
|
|
76
|
+
// onTable(name, copied, lost, err?) is called for each table for live progress.
|
|
77
|
+
// Returns { stats: {tables, rowsCopied, rowsLost, schemasFailed} }.
|
|
78
|
+
async function salvageDatabase(driver, srcPath, dstPath, onTable) {
|
|
79
|
+
const fs = requireCjs("fs");
|
|
80
|
+
const stats = { tables: 0, rowsCopied: 0, rowsLost: 0, schemasFailed: 0 };
|
|
81
|
+
|
|
82
|
+
if (driver.kind === "native") {
|
|
83
|
+
const src = new driver.Database(srcPath, {
|
|
84
|
+
readonly: true,
|
|
85
|
+
fileMustExist: true,
|
|
86
|
+
});
|
|
87
|
+
const dst = new driver.Database(dstPath);
|
|
88
|
+
dst.pragma("journal_mode = WAL");
|
|
89
|
+
try {
|
|
90
|
+
const schemaRows = src
|
|
91
|
+
.prepare(
|
|
92
|
+
"SELECT type, name, sql FROM sqlite_master WHERE type IN ('table','index','view') AND sql IS NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY (type='table') DESC, name",
|
|
93
|
+
)
|
|
94
|
+
.all();
|
|
95
|
+
for (const r of schemaRows) {
|
|
96
|
+
try {
|
|
97
|
+
dst.exec(r.sql);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
stats.schemasFailed++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const tables = src
|
|
103
|
+
.prepare(
|
|
104
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name",
|
|
105
|
+
)
|
|
106
|
+
.all()
|
|
107
|
+
.map((t) => t.name);
|
|
108
|
+
for (const t of tables) {
|
|
109
|
+
let copied = 0;
|
|
110
|
+
let lost = 0;
|
|
111
|
+
let err = null;
|
|
112
|
+
try {
|
|
113
|
+
const cols = src
|
|
114
|
+
.prepare(`PRAGMA table_info(${quoteIdent(t)})`)
|
|
115
|
+
.all()
|
|
116
|
+
.map((c) => c.name);
|
|
117
|
+
if (cols.length === 0) {
|
|
118
|
+
stats.tables++;
|
|
119
|
+
onTable(t, 0, 0, "no columns");
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const colList = cols.map(quoteIdent).join(",");
|
|
123
|
+
const placeholders = cols.map(() => "?").join(",");
|
|
124
|
+
const insert = dst.prepare(
|
|
125
|
+
`INSERT OR IGNORE INTO ${quoteIdent(t)} (${colList}) VALUES (${placeholders})`,
|
|
126
|
+
);
|
|
127
|
+
const iter = src
|
|
128
|
+
.prepare(`SELECT ${colList} FROM ${quoteIdent(t)}`)
|
|
129
|
+
.iterate();
|
|
130
|
+
while (true) {
|
|
131
|
+
let next;
|
|
132
|
+
try {
|
|
133
|
+
next = iter.next();
|
|
134
|
+
} catch (_e) {
|
|
135
|
+
lost++;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
if (next.done) break;
|
|
139
|
+
try {
|
|
140
|
+
insert.run(...cols.map((c) => next.value[c]));
|
|
141
|
+
copied++;
|
|
142
|
+
} catch (_e) {
|
|
143
|
+
lost++;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
iter.return && iter.return();
|
|
148
|
+
} catch (_e) {
|
|
149
|
+
/* swallow */
|
|
150
|
+
}
|
|
151
|
+
} catch (e) {
|
|
152
|
+
err = e.message;
|
|
153
|
+
}
|
|
154
|
+
stats.tables++;
|
|
155
|
+
stats.rowsCopied += copied;
|
|
156
|
+
stats.rowsLost += lost;
|
|
157
|
+
onTable(t, copied, lost, err);
|
|
158
|
+
}
|
|
159
|
+
} finally {
|
|
160
|
+
try {
|
|
161
|
+
src.close();
|
|
162
|
+
} catch (_e) {
|
|
163
|
+
/* swallow */
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
dst.close();
|
|
167
|
+
} catch (_e) {
|
|
168
|
+
/* swallow */
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { stats };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// wasm path
|
|
175
|
+
const buf = fs.readFileSync(srcPath);
|
|
176
|
+
const src = new driver.SQL.Database(buf);
|
|
177
|
+
const dst = new driver.SQL.Database();
|
|
178
|
+
try {
|
|
179
|
+
let schemaRows = [];
|
|
180
|
+
try {
|
|
181
|
+
const r = src.exec(
|
|
182
|
+
"SELECT type, name, sql FROM sqlite_master WHERE type IN ('table','index','view') AND sql IS NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY (type='table') DESC, name",
|
|
183
|
+
);
|
|
184
|
+
schemaRows = (r[0]?.values || []).map((v) => ({
|
|
185
|
+
type: v[0],
|
|
186
|
+
name: v[1],
|
|
187
|
+
sql: v[2],
|
|
188
|
+
}));
|
|
189
|
+
} catch (_e) {
|
|
190
|
+
/* sqlite_master unreadable */
|
|
191
|
+
}
|
|
192
|
+
for (const r of schemaRows) {
|
|
193
|
+
try {
|
|
194
|
+
dst.exec(r.sql);
|
|
195
|
+
} catch (_e) {
|
|
196
|
+
stats.schemasFailed++;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
let tables = [];
|
|
200
|
+
try {
|
|
201
|
+
const r = src.exec(
|
|
202
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name",
|
|
203
|
+
);
|
|
204
|
+
tables = (r[0]?.values || []).map((v) => v[0]);
|
|
205
|
+
} catch (_e) {
|
|
206
|
+
/* tables unreadable */
|
|
207
|
+
}
|
|
208
|
+
for (const t of tables) {
|
|
209
|
+
let copied = 0;
|
|
210
|
+
let lost = 0;
|
|
211
|
+
let err = null;
|
|
212
|
+
try {
|
|
213
|
+
const ti = src.exec(`PRAGMA table_info(${quoteIdent(t)})`);
|
|
214
|
+
const cols = (ti[0]?.values || []).map((v) => v[1]);
|
|
215
|
+
if (cols.length === 0) {
|
|
216
|
+
stats.tables++;
|
|
217
|
+
onTable(t, 0, 0, "no columns");
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
const colList = cols.map(quoteIdent).join(",");
|
|
221
|
+
const placeholders = cols.map(() => "?").join(",");
|
|
222
|
+
const insertSql = `INSERT OR IGNORE INTO ${quoteIdent(t)} (${colList}) VALUES (${placeholders})`;
|
|
223
|
+
const insertStmt = dst.prepare(insertSql);
|
|
224
|
+
const selectStmt = src.prepare(
|
|
225
|
+
`SELECT ${colList} FROM ${quoteIdent(t)}`,
|
|
226
|
+
);
|
|
227
|
+
try {
|
|
228
|
+
while (true) {
|
|
229
|
+
let stepped;
|
|
230
|
+
try {
|
|
231
|
+
stepped = selectStmt.step();
|
|
232
|
+
} catch (_e) {
|
|
233
|
+
lost++;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
if (!stepped) break;
|
|
237
|
+
let row;
|
|
238
|
+
try {
|
|
239
|
+
row = selectStmt.get();
|
|
240
|
+
} catch (_e) {
|
|
241
|
+
lost++;
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
insertStmt.run(row);
|
|
246
|
+
} catch (_e) {
|
|
247
|
+
lost++;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
} finally {
|
|
251
|
+
try {
|
|
252
|
+
selectStmt.free();
|
|
253
|
+
} catch (_e) {
|
|
254
|
+
/* swallow */
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
insertStmt.free();
|
|
258
|
+
} catch (_e) {
|
|
259
|
+
/* swallow */
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
} catch (e) {
|
|
263
|
+
err = e.message;
|
|
264
|
+
}
|
|
265
|
+
stats.tables++;
|
|
266
|
+
stats.rowsCopied += copied;
|
|
267
|
+
stats.rowsLost += lost;
|
|
268
|
+
onTable(t, copied, lost, err);
|
|
269
|
+
}
|
|
270
|
+
// Persist wasm in-memory DB to disk.
|
|
271
|
+
const outBuf = dst.export();
|
|
272
|
+
fs.writeFileSync(dstPath, Buffer.from(outBuf));
|
|
273
|
+
} finally {
|
|
274
|
+
try {
|
|
275
|
+
src.close();
|
|
276
|
+
} catch (_e) {
|
|
277
|
+
/* swallow */
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
dst.close();
|
|
281
|
+
} catch (_e) {
|
|
282
|
+
/* swallow */
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { stats };
|
|
31
286
|
}
|
|
32
287
|
|
|
33
288
|
export function registerDbCommand(program) {
|
|
@@ -191,42 +446,54 @@ export function registerDbCommand(program) {
|
|
|
191
446
|
await shutdown();
|
|
192
447
|
process.exit(1);
|
|
193
448
|
}
|
|
194
|
-
const driver =
|
|
449
|
+
const driver = await loadAnyDriver();
|
|
195
450
|
if (!driver) {
|
|
196
451
|
logger.error(
|
|
197
|
-
"
|
|
452
|
+
"No SQLite driver available. Install better-sqlite3 or sql.js.",
|
|
198
453
|
);
|
|
199
454
|
await shutdown();
|
|
200
455
|
process.exit(1);
|
|
201
456
|
}
|
|
202
|
-
const conn = new driver.Database(dbPath, {
|
|
203
|
-
readonly: true,
|
|
204
|
-
fileMustExist: true,
|
|
205
|
-
});
|
|
206
457
|
const checkName = options.quick ? "quick_check" : "integrity_check";
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
458
|
+
const { ok, diagnostics } = await runIntegrityCheck(
|
|
459
|
+
driver,
|
|
460
|
+
dbPath,
|
|
461
|
+
checkName,
|
|
462
|
+
);
|
|
211
463
|
if (options.json) {
|
|
212
464
|
console.log(
|
|
213
|
-
JSON.stringify(
|
|
465
|
+
JSON.stringify(
|
|
466
|
+
{
|
|
467
|
+
ok,
|
|
468
|
+
check: checkName,
|
|
469
|
+
path: dbPath,
|
|
470
|
+
driver: driver.name,
|
|
471
|
+
diagnostics,
|
|
472
|
+
},
|
|
473
|
+
null,
|
|
474
|
+
2,
|
|
475
|
+
),
|
|
214
476
|
);
|
|
215
477
|
} else if (ok) {
|
|
216
478
|
logger.success(
|
|
217
|
-
`Database integrity OK (${checkName}): ${chalk.cyan(dbPath)}`,
|
|
479
|
+
`Database integrity OK (${checkName} via ${driver.name}): ${chalk.cyan(dbPath)}`,
|
|
218
480
|
);
|
|
219
481
|
} else {
|
|
220
|
-
logger.error(
|
|
221
|
-
|
|
222
|
-
|
|
482
|
+
logger.error(
|
|
483
|
+
`Database is CORRUPT (${checkName} via ${driver.name}): ${chalk.cyan(dbPath)}`,
|
|
484
|
+
);
|
|
485
|
+
for (const msg of diagnostics) {
|
|
223
486
|
const lines = String(msg).split("\n").slice(0, 20);
|
|
224
487
|
for (const line of lines) console.log(" " + line);
|
|
225
488
|
}
|
|
226
489
|
console.log("");
|
|
227
490
|
logger.warn("Recovery options:");
|
|
228
|
-
console.log(
|
|
229
|
-
|
|
491
|
+
console.log(
|
|
492
|
+
" cc db repair – best-effort row salvage into a new file",
|
|
493
|
+
);
|
|
494
|
+
console.log(
|
|
495
|
+
" cc db reset – back up corrupt DB and start fresh",
|
|
496
|
+
);
|
|
230
497
|
}
|
|
231
498
|
exitCode = ok ? 0 : 2;
|
|
232
499
|
await shutdown();
|
|
@@ -311,10 +578,10 @@ export function registerDbCommand(program) {
|
|
|
311
578
|
await shutdown();
|
|
312
579
|
process.exit(1);
|
|
313
580
|
}
|
|
314
|
-
const driver =
|
|
581
|
+
const driver = await loadAnyDriver();
|
|
315
582
|
if (!driver) {
|
|
316
583
|
logger.error(
|
|
317
|
-
"
|
|
584
|
+
"No SQLite driver available. Install better-sqlite3 or sql.js.",
|
|
318
585
|
);
|
|
319
586
|
await shutdown();
|
|
320
587
|
process.exit(1);
|
|
@@ -327,133 +594,24 @@ export function registerDbCommand(program) {
|
|
|
327
594
|
process.exit(1);
|
|
328
595
|
}
|
|
329
596
|
logger.info(
|
|
330
|
-
`Salvaging ${chalk.cyan(dbPath)} → ${chalk.cyan(outPath)}`,
|
|
597
|
+
`Salvaging ${chalk.cyan(dbPath)} → ${chalk.cyan(outPath)} (driver: ${driver.name})`,
|
|
331
598
|
);
|
|
332
599
|
|
|
333
|
-
const
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
} catch (e) {
|
|
349
|
-
logger.error(`Cannot read sqlite_master: ${e.message}`);
|
|
350
|
-
src.close();
|
|
351
|
-
dst.close();
|
|
352
|
-
await shutdown();
|
|
353
|
-
process.exit(1);
|
|
354
|
-
}
|
|
355
|
-
const stats = {
|
|
356
|
-
tables: 0,
|
|
357
|
-
rowsCopied: 0,
|
|
358
|
-
rowsLost: 0,
|
|
359
|
-
schemasFailed: 0,
|
|
360
|
-
};
|
|
361
|
-
for (const r of schemaRows) {
|
|
362
|
-
try {
|
|
363
|
-
dst.exec(r.sql);
|
|
364
|
-
} catch (e) {
|
|
365
|
-
stats.schemasFailed++;
|
|
366
|
-
logger.warn(`schema replay failed for ${r.name}: ${e.message}`);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
const tableRows = src
|
|
371
|
-
.prepare(
|
|
372
|
-
"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name",
|
|
373
|
-
)
|
|
374
|
-
.all();
|
|
375
|
-
const tables = tableRows.map((t) => t.name);
|
|
376
|
-
for (const t of tables) {
|
|
377
|
-
let copied = 0;
|
|
378
|
-
let lost = 0;
|
|
379
|
-
let cols = [];
|
|
380
|
-
try {
|
|
381
|
-
cols = src
|
|
382
|
-
.prepare(`PRAGMA table_info(${quoteIdent(t)})`)
|
|
383
|
-
.all()
|
|
384
|
-
.map((c) => c.name);
|
|
385
|
-
} catch (e) {
|
|
386
|
-
console.log(
|
|
387
|
-
` ${t.padEnd(28)} ${chalk.red("schema unreadable")}`,
|
|
388
|
-
);
|
|
389
|
-
stats.tables++;
|
|
390
|
-
continue;
|
|
391
|
-
}
|
|
392
|
-
if (cols.length === 0) {
|
|
393
|
-
console.log(` ${t.padEnd(28)} ${chalk.gray("no columns")}`);
|
|
394
|
-
stats.tables++;
|
|
395
|
-
continue;
|
|
396
|
-
}
|
|
397
|
-
const colList = cols.map(quoteIdent).join(",");
|
|
398
|
-
const placeholders = cols.map(() => "?").join(",");
|
|
399
|
-
let insert;
|
|
400
|
-
try {
|
|
401
|
-
insert = dst.prepare(
|
|
402
|
-
`INSERT OR IGNORE INTO ${quoteIdent(t)} (${colList}) VALUES (${placeholders})`,
|
|
403
|
-
);
|
|
404
|
-
} catch (e) {
|
|
405
|
-
console.log(
|
|
406
|
-
` ${t.padEnd(28)} ${chalk.red("dest insert prep failed")}`,
|
|
407
|
-
);
|
|
408
|
-
stats.tables++;
|
|
409
|
-
continue;
|
|
410
|
-
}
|
|
411
|
-
let iter;
|
|
412
|
-
try {
|
|
413
|
-
iter = src
|
|
414
|
-
.prepare(`SELECT ${colList} FROM ${quoteIdent(t)}`)
|
|
415
|
-
.iterate();
|
|
416
|
-
} catch (e) {
|
|
417
|
-
console.log(
|
|
418
|
-
` ${t.padEnd(28)} ${chalk.red("table read aborted: " + e.message.slice(0, 40))}`,
|
|
419
|
-
);
|
|
420
|
-
stats.tables++;
|
|
421
|
-
continue;
|
|
422
|
-
}
|
|
423
|
-
while (true) {
|
|
424
|
-
let next;
|
|
425
|
-
try {
|
|
426
|
-
next = iter.next();
|
|
427
|
-
} catch (e) {
|
|
428
|
-
lost++;
|
|
429
|
-
break;
|
|
430
|
-
}
|
|
431
|
-
if (next.done) break;
|
|
432
|
-
try {
|
|
433
|
-
insert.run(...cols.map((c) => next.value[c]));
|
|
434
|
-
copied++;
|
|
435
|
-
} catch (e) {
|
|
436
|
-
lost++;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
try {
|
|
440
|
-
iter.return && iter.return();
|
|
441
|
-
} catch (_e) {
|
|
442
|
-
/* swallow */
|
|
443
|
-
}
|
|
444
|
-
stats.tables++;
|
|
445
|
-
stats.rowsCopied += copied;
|
|
446
|
-
stats.rowsLost += lost;
|
|
447
|
-
const status =
|
|
448
|
-
lost > 0
|
|
449
|
-
? chalk.yellow(`${copied} copied, ${lost} lost`)
|
|
450
|
-
: copied === 0
|
|
451
|
-
? chalk.gray(`${copied} copied`)
|
|
452
|
-
: chalk.green(`${copied} copied`);
|
|
453
|
-
console.log(` ${t.padEnd(28)} ${status}`);
|
|
454
|
-
}
|
|
455
|
-
src.close();
|
|
456
|
-
dst.close();
|
|
600
|
+
const { stats } = await salvageDatabase(
|
|
601
|
+
driver,
|
|
602
|
+
dbPath,
|
|
603
|
+
outPath,
|
|
604
|
+
(name, copied, lost, err) => {
|
|
605
|
+
const tag = err
|
|
606
|
+
? chalk.red(err)
|
|
607
|
+
: lost > 0
|
|
608
|
+
? chalk.yellow(`${copied} copied, ${lost} lost`)
|
|
609
|
+
: copied === 0
|
|
610
|
+
? chalk.gray(`${copied} copied`)
|
|
611
|
+
: chalk.green(`${copied} copied`);
|
|
612
|
+
console.log(` ${name.padEnd(28)} ${tag}`);
|
|
613
|
+
},
|
|
614
|
+
);
|
|
457
615
|
|
|
458
616
|
logger.log("");
|
|
459
617
|
logger.success(`Recovered DB written to ${chalk.cyan(outPath)}`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.app-root[data-v-1a3da385]{min-height:100vh;background:var(--bg-base)}.sidebar[data-v-1a3da385]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s}[data-v-1a3da385] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden}.main-area[data-v-1a3da385]{background:var(--bg-base)}.logo[data-v-1a3da385]{height:52px;display:flex;align-items:center;padding:0 18px;gap:10px;border-bottom:1px solid var(--border-color);overflow:hidden;white-space:nowrap;flex-shrink:0}.logo.collapsed[data-v-1a3da385]{padding:0;justify-content:center}.logo-icon[data-v-1a3da385]{width:24px;height:24px;flex-shrink:0;object-fit:contain}.logo-text[data-v-1a3da385]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-1a3da385]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-1a3da385]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-1a3da385]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-1a3da385]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-1a3da385]{color:#722ed1}.banner-info[data-v-1a3da385]{flex:1;min-width:0}.banner-name[data-v-1a3da385]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-1a3da385]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-1a3da385]{color:#c084fc}.mode-icon-sm[data-v-1a3da385]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-1a3da385]{border:none!important;margin-top:2px;-webkit-user-select:none;user-select:none;background:transparent!important;flex:1;overflow-y:auto;overflow-x:hidden}.group-label[data-v-1a3da385]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-1a3da385] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-1a3da385] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-1a3da385]{margin:4px 0!important}.sidebar-footer[data-v-1a3da385]{flex-shrink:0;padding:8px 18px;display:flex;align-items:center;gap:8px;border-top:1px solid var(--border-color)}.sidebar-footer.collapsed[data-v-1a3da385]{justify-content:center;padding:8px 0}.footer-text[data-v-1a3da385]{color:var(--text-secondary);font-size:11px}.app-header[data-v-1a3da385]{background:var(--bg-header)!important;padding:0 20px!important;border-bottom:1px solid var(--border-color);height:50px!important;line-height:50px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;box-shadow:0 1px 4px #0000000f}.header-left[data-v-1a3da385],.header-right[data-v-1a3da385]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-1a3da385]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-1a3da385]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-1a3da385]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-1a3da385]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-1a3da385]{display:flex;align-items:center;gap:4px;background:var(--bg-card);border:1px solid var(--border-color);border-radius:20px;padding:3px 6px}.theme-btn[data-v-1a3da385]{width:26px;height:26px;border:none;border-radius:50%;cursor:pointer;background:transparent;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;transition:background .15s,transform .15s;opacity:.55}.theme-btn[data-v-1a3da385]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-1a3da385]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-1a3da385]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-1a3da385]{margin:0!important;font-size:11px}.page-content[data-v-1a3da385]{padding:24px;overflow:auto;background:var(--bg-base);min-height:calc(100vh - 50px)}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{l as je,m as v,x as t,q as d,B as Se,C as Te,v as i,c as e,D as a,E as j,u as s,F as r,G as B,H as S,I as g,J as l,K as Be,L as Re,r as Le,j as y}from"./vendor-xFZ6Jlpw.js";import{u as xe}from"./ws-Dg01CdRG.js";import{u as Ae,T as De}from"./index-D8XA7siu.js";import{_ as Ie}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as b,G as R,D,M as I,R as N,C as U,a as P,A as K,b as M,c as V,B as F,d as E,S as G,e as W,f as z,h as q,i as H,j as $,I as J,L as Y,W as Q,k as X,l as Z,P as h,m as ee,n as te,o as oe,p as se,U as ne,V as Ne,q as le,K as ae,r as Ue}from"./icons-DuLXY5ve.js";const Pe=["src"],Ke={key:0,class:"logo-text"},Me={key:0,class:"mode-banner project"},Ve={class:"banner-info"},Fe={class:"banner-name"},Ee={key:1,class:"mode-banner global"},Ge=["title"],We={key:0,class:"footer-text"},ze={class:"header-left"},qe={class:"header-right"},He={class:"theme-switcher"},$e=["data-theme-key","onClick"],Je={class:"version-tag"},Ye={__name:"AppLayout",setup(Qe){const ie=Se(),de=Te(),O=xe(),T=Ae(),u=Le(!1),k=window.__CC_CONFIG__||{},m=y(()=>k.mode==="project"),ue="v5.0.3.1",re=new URL(""+new URL("logo-DBCYUiWP.png",import.meta.url).href,import.meta.url).href,pe=y(()=>T.current),ce=y(()=>T.config.vars["--menu-mode"]),L=y(()=>{const p=de.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[p]||p]}),C=y(()=>O.status),me=y(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[O.status]||"default"),ye=y(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[O.status]||"未知");function ke(p){T.setTheme(p)}function fe({key:p}){ie.push({mcp:"/mcp"}[p]||`/${p}`)}return je(()=>O.connect()),(p,o)=>{const n=d("a-menu-item"),c=d("a-menu-item-group"),f=d("a-menu-divider"),_e=d("a-menu"),ve=d("a-badge"),ge=d("a-layout-sider"),x=d("a-tooltip"),be=d("a-tag"),Oe=d("a-layout-header"),Ce=d("router-view"),we=d("a-layout-content"),A=d("a-layout");return i(),v(A,{class:"app-root"},{default:t(()=>[e(ge,{collapsed:u.value,"onUpdate:collapsed":o[1]||(o[1]=_=>u.value=_),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[a("div",{class:j(["logo",{collapsed:u.value}])},[a("img",{src:s(re),alt:"ChainlessChain",class:"logo-icon"},null,8,Pe),u.value?B("",!0):(i(),r("span",Ke,"ChainlessChain"))],2),u.value?(i(),r("div",{key:1,class:"mode-icon-sm",title:m.value?s(k).projectName:"全局模式"},[m.value?(i(),v(s(b),{key:0,style:{color:"#1677ff"}})):(i(),v(s(R),{key:1,style:{color:"#722ed1"}}))],8,Ge)):(i(),r(S,{key:0},[m.value?(i(),r("div",Me,[e(s(b),{class:"banner-icon"}),a("div",Ve,[a("div",Fe,g(s(k).projectName||"项目"),1),o[2]||(o[2]=a("div",{class:"banner-sub"},"项目级面板",-1))])])):(i(),r("div",Ee,[e(s(R),{class:"banner-icon"}),o[3]||(o[3]=a("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(_e,{selectedKeys:L.value,"onUpdate:selectedKeys":o[0]||(o[0]=_=>L.value=_),theme:ce.value,mode:"inline","inline-collapsed":u.value,class:"side-menu",onClick:fe},{default:t(()=>[u.value?(i(),r(S,{key:1},[e(n,{key:"dashboard"},{icon:t(()=>[e(s(D))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(I))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(N))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(U))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(P))]),_:1}),e(f,{class:"divider-sm"}),e(n,{key:"skills"},{icon:t(()=>[e(s(K))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(M))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(V))]),_:1}),e(n,{key:"project-settings"},{icon:t(()=>[e(s(b))]),_:1}),e(f,{class:"divider-sm"}),e(n,{key:"notes"},{icon:t(()=>[e(s(F))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(E))]),_:1}),e(n,{key:"knowledge"},{icon:t(()=>[e(s(G))]),_:1}),e(n,{key:"marketplace"},{icon:t(()=>[e(s(W))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(z))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(q))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(H))]),_:1}),e(f,{class:"divider-sm"}),e(n,{key:"security"},{icon:t(()=>[e(s($))]),_:1}),e(n,{key:"did"},{icon:t(()=>[e(s(J))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(Y))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(Q))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(X))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Z))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(h))]),_:1}),e(f,{class:"divider-sm"}),e(n,{key:"wallet"},{icon:t(()=>[e(s(ee))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(te))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(oe))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(se))]),_:1}),e(f,{class:"divider-sm"}),e(n,{key:"community"},{icon:t(()=>[e(s(ne))]),_:1}),e(f,{class:"divider-sm"}),e(n,{key:"rssfeed"},{icon:t(()=>[e(s(le))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(ae))]),_:1})],64)):(i(),r(S,{key:0},[e(c,null,{title:t(()=>[...o[4]||(o[4]=[a("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(n,{key:"dashboard"},{icon:t(()=>[e(s(D))]),default:t(()=>[o[5]||(o[5]=l("仪表板",-1))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(I))]),default:t(()=>[o[6]||(o[6]=l("AI 对话",-1))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(N))]),default:t(()=>[o[7]||(o[7]=l("日常协作",-1))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(U))]),default:t(()=>[o[8]||(o[8]=l("服务管理",-1))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(P))]),default:t(()=>[o[9]||(o[9]=l("日志查看",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[10]||(o[10]=[a("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(n,{key:"skills"},{icon:t(()=>[e(s(K))]),default:t(()=>[o[11]||(o[11]=l("技能管理",-1))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(M))]),default:t(()=>[o[12]||(o[12]=l("LLM 配置",-1))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(V))]),default:t(()=>[o[13]||(o[13]=l("MCP 工具",-1))]),_:1}),e(n,{key:"project-settings"},{icon:t(()=>[e(s(b))]),default:t(()=>[o[14]||(o[14]=l("项目存储",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[15]||(o[15]=[a("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(n,{key:"notes"},{icon:t(()=>[e(s(F))]),default:t(()=>[o[16]||(o[16]=l("笔记管理",-1))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(E))]),default:t(()=>[o[17]||(o[17]=l("记忆文件",-1))]),_:1}),e(n,{key:"knowledge"},{icon:t(()=>[e(s(G))]),default:t(()=>[o[18]||(o[18]=l("知识图谱",-1))]),_:1}),e(n,{key:"marketplace"},{icon:t(()=>[e(s(W))]),default:t(()=>[o[19]||(o[19]=l("技能市场",-1))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(z))]),default:t(()=>[o[20]||(o[20]=l("定时任务",-1))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(q))]),default:t(()=>[o[21]||(o[21]=l("工作流编辑",-1))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(H))]),default:t(()=>[o[22]||(o[22]=l("后台任务",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[23]||(o[23]=[a("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(n,{key:"security"},{icon:t(()=>[e(s($))]),default:t(()=>[o[24]||(o[24]=l("安全中心",-1))]),_:1}),e(n,{key:"did"},{icon:t(()=>[e(s(J))]),default:t(()=>[o[25]||(o[25]=l("DID 身份",-1))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(Y))]),default:t(()=>[o[26]||(o[26]=l("权限管理",-1))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(Q))]),default:t(()=>[o[27]||(o[27]=l("P2P 网络",-1))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(X))]),default:t(()=>[o[28]||(o[28]=l("备份同步",-1))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Z))]),default:t(()=>[o[29]||(o[29]=l("Git 与数据",-1))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(h))]),default:t(()=>[o[30]||(o[30]=l("项目管理",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[31]||(o[31]=[a("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(n,{key:"wallet"},{icon:t(()=>[e(s(ee))]),default:t(()=>[o[32]||(o[32]=l("钱包管理",-1))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(te))]),default:t(()=>[o[33]||(o[33]=l("组织管理",-1))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(oe))]),default:t(()=>[o[34]||(o[34]=l("使用分析",-1))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(se))]),default:t(()=>[o[35]||(o[35]=l("模板中心",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[36]||(o[36]=[a("span",{class:"group-label"},"社 交",-1)])]),default:t(()=>[e(n,{key:"community"},{icon:t(()=>[e(s(ne))]),default:t(()=>[o[37]||(o[37]=l("社区",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[38]||(o[38]=[a("span",{class:"group-label"},"媒 体",-1)])]),default:t(()=>[e(n,{key:"video"},{icon:t(()=>[e(s(Ne))]),default:t(()=>[o[39]||(o[39]=l("视频剪辑",-1))]),_:1})]),_:1}),e(c,null,{title:t(()=>[...o[40]||(o[40]=[a("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(n,{key:"rssfeed"},{icon:t(()=>[e(s(le))]),default:t(()=>[o[41]||(o[41]=l("RSS 订阅",-1))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(ae))]),default:t(()=>[o[42]||(o[42]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","theme","inline-collapsed"]),a("div",{class:j(["sidebar-footer",{collapsed:u.value}])},[e(ve,{status:me.value},null,8,["status"]),u.value?B("",!0):(i(),r("span",We,g(ye.value),1))],2)]),_:1},8,["collapsed"]),e(A,{class:"main-area"},{default:t(()=>[e(Oe,{class:"app-header"},{default:t(()=>[a("div",ze,[a("div",{class:j(["scope-tag",m.value?"project":"global"])},[(i(),v(Be(m.value?s(b):s(R)))),a("span",null,g(m.value?s(k).projectName||"项目":"全局模式"),1),m.value&&s(k).projectRoot?(i(),v(x,{key:0,title:s(k).projectRoot},{default:t(()=>[e(s(Ue),{class:"info-icon"})]),_:1},8,["title"])):B("",!0)],2)]),a("div",qe,[a("div",He,[(i(!0),r(S,null,Re(s(De),(_,w)=>(i(),v(x,{key:w,title:_.label},{default:t(()=>[a("button",{class:j(["theme-btn",{active:pe.value===w}]),"data-theme-key":w,onClick:Xe=>ke(w)},g(_.icon),11,$e)]),_:2},1032,["title"]))),128))]),a("span",Je,g(s(ue)),1),e(be,{color:C.value==="connected"?"green":C.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(g(C.value==="connected"?"已连接":C.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(we,{class:"page-content"},{default:t(()=>[e(Ce)]),_:1})]),_:1})]),_:1})}}},st=Ie(Ye,[["__scopeId","data-v-1a3da385"]]);export{st as default};
|