chainlesschain 0.157.8 → 0.158.0
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/bin/chainlesschain.js +0 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-Dmur24hV.js → AIOps-9QEKGr43.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BiXQ5MCX.js → ActionButton-BQElVBgD.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BrBdBLPi.js → Analytics-DbZbFR_a.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-BbfBwVfE.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-CKMl4NLf.css +1 -0
- package/src/assets/web-panel/assets/{Audit-DLYnWfX_.js → Audit-DzddAZVx.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CKHLFZZS.js → Backup-D46qSgzQ.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B7lryLAY.js → BaseInput-60t9IMEz.js} +1 -1
- package/src/assets/web-panel/assets/Chat-3Kj2JQP4.js +2 -0
- package/src/assets/web-panel/assets/{Checkbox-DAqCmQtS.js → Checkbox-Ba1Rf2Ea.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-AVAcL7NA.css +1 -0
- package/src/assets/web-panel/assets/Codegen-WiYmL3oB.js +1 -0
- package/src/assets/web-panel/assets/{Col-BxNojt4A.js → Col-D2zhpSqE.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BG7vSQg7.js → Community-DgqmUGwT.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Bl_FTVcP.js → Compact-D_dbJDbi.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CL6jUiTf.js → Compliance-BVcVb-e2.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Q37C8zUh.js → Cowork-pgKzBNDo.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Kq3eJC0L.js → Cron-Cs5QaKTP.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CvI5bEH8.js → Crosschain-pjWfIM8s.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BD9PovRf.js → DID-DQtsjz3X.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BXSj5-OS.js → Dashboard-sqj42zKx.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BcEYFA4h.js → Dropdown-BM_ljd87.js} +1 -1
- package/src/assets/web-panel/assets/Federation-BftELHDw.css +1 -0
- package/src/assets/web-panel/assets/Federation-CId-3zn6.js +1 -0
- package/src/assets/web-panel/assets/{FormItemContext-C_8M0L9X.js → FormItemContext-CnzbixSE.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DW9KmRrN.js → Git-B38QeOPF.js} +2 -2
- package/src/assets/web-panel/assets/{Governance--0gVd3YR.js → Governance-DrGkAjd1.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CSuaikJO.js → Inference-BjkHB4sD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bz8-Uh6r.js → KnowledgeGraph-Trs1XJFK.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BMTqVPem.js → Logs-B39LUZs9.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CTZqO_RV.js → Marketplace-BnpOoITi.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-IN5l2BCN.js → McpTools-DbwkdBUE.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DEJ96vkh.js → Memory-BHXHpldt.js} +2 -2
- package/src/assets/web-panel/assets/NLProgramming-B3BALajs.js +1 -0
- package/src/assets/web-panel/assets/{Notes-DAP1s6Bg.js → Notes-u6lLTv0t.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-CutzdziK.js → Organization-CQ1X722j.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CFLJpWAb.js → Overflow-DHKu8e8g.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-H7hLODDc.js → P2P-BflX74Hm.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-B7UejC3D.js → Permissions-B2XrAUBW.js} +3 -3
- package/src/assets/web-panel/assets/Pipeline-C0K9-DnR.js +1 -0
- package/src/assets/web-panel/assets/Privacy-BKPoZngH.js +1 -0
- package/src/assets/web-panel/assets/{ProjectSettings-BiKBzbRF.js → ProjectSettings-C34C7hFt.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-asWgm0Iz.js → Projects-DLvUzeIB.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-C2eO_XrC.js → Providers-BFiMVWaM.js} +2 -2
- package/src/assets/web-panel/assets/{Recommend-CIZjeClx.js → Recommend-BmUhysGC.js} +1 -1
- package/src/assets/web-panel/assets/Reputation-BlfSvJww.js +1 -0
- package/src/assets/web-panel/assets/{Row-BBRGnkyd.js → Row-Dl74576S.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B4jpCYCI.js → RssFeed-9_MkDUxZ.js} +3 -3
- package/src/assets/web-panel/assets/Search-BTk9rglb.css +1 -0
- package/src/assets/web-panel/assets/Search-CSRY_TYa.js +1 -0
- package/src/assets/web-panel/assets/{Security-D2BQD7tk.js → Security-DfDoKfkl.js} +4 -4
- package/src/assets/web-panel/assets/{Services-VasZTmqN.js → Services-7Blny0Jc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-1joyz4wO.js → Skeleton-6CF_3QUY.js} +1 -1
- package/src/assets/web-panel/assets/Skills-DowQcRe1.js +1 -0
- package/src/assets/web-panel/assets/{Sla-DTbGerEL.js → Sla-B93c8j92.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-DI3oKTDz.js → Tasks-Db9TRjE7.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-C9Z_82IH.js → Templates-DJ_hvs5c.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-kLu9x3Ty.js → Tenant-BXS8s6vl.js} +1 -1
- package/src/assets/web-panel/assets/Tokens-CvmTVU7E.js +1 -0
- package/src/assets/web-panel/assets/Tokens-KvJRHQcl.css +1 -0
- package/src/assets/web-panel/assets/{Trigger-BIXZjkDZ.js → Trigger-BenSsaoN.js} +1 -1
- package/src/assets/web-panel/assets/Trust-BLI308Ik.css +1 -0
- package/src/assets/web-panel/assets/Trust-HMz40LfZ.js +1 -0
- package/src/assets/web-panel/assets/{VideoEditing-nIRTUjK_.js → VideoEditing-DEhH42sI.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-bO-fXxBx.js → Wallet-AGwfOdTM.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-uNwYx1Yn.js → WebAuthn-DK5tKWul.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Bw6cIw_h.js → WorkflowEditor-vlujdL6I.js} +1 -1
- package/src/assets/web-panel/assets/{colors-WgDc41S9.js → colors-BiB5aDao.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BI2RK_Ub.js → compact-item-CHderV9n.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-gy9ZhS49.js → createContext-DMZ-5dy2.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-BeuofWqK.js → hasIn-BKDBYP3s.js} +1 -1
- package/src/assets/web-panel/assets/icons-ukMaZ3tx.js +57 -0
- package/src/assets/web-panel/assets/{index-B1KhJnQM.js → index-7fxCGMoL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUV4Xqwc.js → index-7pqZqPD2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhwkejpN.js → index-A4RpHMOa.js} +1 -1
- package/src/assets/web-panel/assets/{index--V8HSAh9.js → index-AIdelwOe.js} +1 -1
- package/src/assets/web-panel/assets/index-B5oebI6W.js +1 -0
- package/src/assets/web-panel/assets/{index-BIlQFerH.js → index-B7fivpG2.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChQfosO1.js → index-BBWUR4u4.js} +1 -1
- package/src/assets/web-panel/assets/{index-bpC7BiFY.js → index-BBk2e7vJ.js} +2 -2
- package/src/assets/web-panel/assets/{index-CCe5JJYI.js → index-BRRFK-im.js} +1 -1
- package/src/assets/web-panel/assets/{index-t8Iy1rHD.js → index-BVOI707f.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cwuee4M2.js → index-BadelvSE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLcTmwiN.js → index-BfKFNptm.js} +3 -3
- package/src/assets/web-panel/assets/{index-BSrnzqkD.js → index-BgDX-tzO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFjz2AoU.js → index-BjSojphX.js} +1 -1
- package/src/assets/web-panel/assets/{index-vwTt5gIV.js → index-BlXskar6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3LHutKn.js → index-BryAkWUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q7v4BZgp.js → index-C1p_dZw0.js} +3 -3
- package/src/assets/web-panel/assets/{index-BhSfMAk_.js → index-CBYNsy51.js} +1 -1
- package/src/assets/web-panel/assets/{index-IXyQceyp.js → index-CEpcKl17.js} +2 -2
- package/src/assets/web-panel/assets/{index-B_Jn0gUS.js → index-CUT3Nmzx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ct1YvTCX.js → index-CbpCY2ch.js} +2 -2
- package/src/assets/web-panel/assets/index-D3PGpBPm.js +1 -0
- package/src/assets/web-panel/assets/{index-CwzHos3n.js → index-D3lD9wgX.js} +1 -1
- package/src/assets/web-panel/assets/index-D5Beu9ZA.js +1 -0
- package/src/assets/web-panel/assets/{index-Dxy2NQqS.js → index-DRRzH4Ge.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeI4fOXN.js → index-DRcTAUJA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CndKqpaA.js → index-DZ8MjPLC.js} +1 -1
- package/src/assets/web-panel/assets/index-DfcXDy2A.js +36 -0
- package/src/assets/web-panel/assets/index-DtDFSCfE.js +12 -0
- package/src/assets/web-panel/assets/{index-BVg8Wf40.js → index-DvI8Xtzv.js} +1 -1
- package/src/assets/web-panel/assets/{index-pGLDMYoo.js → index-DvfAkHw8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhwwIcoT.js → index-DyXslU_B.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBI2Y4Kj.js → index-MoLxDrkb.js} +2 -2
- package/src/assets/web-panel/assets/{index-D_bHyAnC.js → index-Ncxqj2UN.js} +1 -1
- package/src/assets/web-panel/assets/{index-t5BUMwJ1.js → index-YgC7QI1N.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqUqxSm3.js → index-_sntSncx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBfv-ndK.js → index-uujjC_4g.js} +1 -1
- package/src/assets/web-panel/assets/index-yMt4C1Gh.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-C1zn_AKT.js → initDefaultProps-B2vQoQga.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BflWvLDD.js → motion-D2eluOJu.js} +1 -1
- package/src/assets/web-panel/assets/{move-TfXJb-sS.js → move-CgcvSoZ7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-COjrlUIA.js → omit-DvLh7wH1.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-1WCywewt.js → pickAttrs-BsseBclw.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-y75Pew0G.js → placementArrow-XLLtr9qD.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BDt6Mlnb.js → responsiveObserve-ByCb5zZK.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B1oHu6JW.js → slide-CeP5JCiZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CO9QQaYQ.js → statusUtils-DMVoo96t.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-C2ONfKU2.js → styleChecker-Cz5mJgc8.js} +1 -1
- package/src/assets/web-panel/assets/{transition-atE2sWdv.js → transition-DSe9CgZe.js} +1 -1
- package/src/assets/web-panel/assets/{useConfigInject-DIKG5Y4I.js → useConfigInject-DCcT0grw.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C0OopxrG.js → useFlexGapSupport-BZkoDuF3.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cryb4eNl.js → vnode-Dexy2NN9.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-zuDCIwwE.js → zoom-CDfM_sRk.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/nlprog.js +25 -15
- package/src/gateways/ws/ws-server.js +12 -1
- package/src/lib/web-ui-server.js +33 -0
- package/src/assets/web-panel/assets/AppLayout-DCrLKryi.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-DGosvMBr.js +0 -1
- package/src/assets/web-panel/assets/Chat-Ga0oUawB.js +0 -2
- package/src/assets/web-panel/assets/NLProgramming-BMftRM4D.js +0 -1
- package/src/assets/web-panel/assets/Pipeline-DhmIDzq5.js +0 -1
- package/src/assets/web-panel/assets/Privacy-D98lbFiD.js +0 -1
- package/src/assets/web-panel/assets/Reputation-Dq21I6NZ.js +0 -1
- package/src/assets/web-panel/assets/Skills-BkTmE8SJ.js +0 -1
- package/src/assets/web-panel/assets/icons-E3MGhN6s.js +0 -57
- package/src/assets/web-panel/assets/index-B4FsQ2CI.js +0 -1
- package/src/assets/web-panel/assets/index-CK4CCFyw.js +0 -1
- package/src/assets/web-panel/assets/index-CapUO117.js +0 -12
- package/src/assets/web-panel/assets/index-CsESExuO.js +0 -1
- package/src/assets/web-panel/assets/index-DPaLf3-g.js +0 -36
- package/src/assets/web-panel/assets/index-TpCAHpWv.js +0 -1
package/src/commands/nlprog.js
CHANGED
|
@@ -74,6 +74,16 @@ function _dbFromCtx(cmd) {
|
|
|
74
74
|
return root?._db;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
function _requireDb(cmd) {
|
|
78
|
+
const db = _dbFromCtx(cmd);
|
|
79
|
+
if (!db) {
|
|
80
|
+
throw new Error(
|
|
81
|
+
"No ChainlessChain project database in this directory. Run `cc init` first, or run from a project root.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return db;
|
|
85
|
+
}
|
|
86
|
+
|
|
77
87
|
export function registerNlProgCommand(program) {
|
|
78
88
|
const nlp = new Command("nlprog")
|
|
79
89
|
.description("Natural language programming system (Phase 28)")
|
|
@@ -164,7 +174,7 @@ export function registerNlProgCommand(program) {
|
|
|
164
174
|
.option("-a, --ambiguities <json>", "Ambiguity list JSON")
|
|
165
175
|
.option("--json", "JSON output")
|
|
166
176
|
.action((text, opts) => {
|
|
167
|
-
const db =
|
|
177
|
+
const db = _requireDb(nlp);
|
|
168
178
|
const result = translate(db, {
|
|
169
179
|
text,
|
|
170
180
|
intent: opts.intent,
|
|
@@ -184,7 +194,7 @@ export function registerNlProgCommand(program) {
|
|
|
184
194
|
.description("Show translation details")
|
|
185
195
|
.option("--json", "JSON output")
|
|
186
196
|
.action((id, opts) => {
|
|
187
|
-
const db =
|
|
197
|
+
const db = _requireDb(nlp);
|
|
188
198
|
const t = getTranslation(db, id);
|
|
189
199
|
if (!t) return console.log("Translation not found.");
|
|
190
200
|
if (opts.json) return console.log(JSON.stringify(t, null, 2));
|
|
@@ -207,7 +217,7 @@ export function registerNlProgCommand(program) {
|
|
|
207
217
|
.option("--limit <n>", "Max results", parseInt)
|
|
208
218
|
.option("--json", "JSON output")
|
|
209
219
|
.action((opts) => {
|
|
210
|
-
const db =
|
|
220
|
+
const db = _requireDb(nlp);
|
|
211
221
|
const results = listTranslations(db, {
|
|
212
222
|
intent: opts.intent,
|
|
213
223
|
status: opts.status,
|
|
@@ -227,7 +237,7 @@ export function registerNlProgCommand(program) {
|
|
|
227
237
|
.description("Update translation status (draft/complete/refined)")
|
|
228
238
|
.option("--json", "JSON output")
|
|
229
239
|
.action((id, status, opts) => {
|
|
230
|
-
const db =
|
|
240
|
+
const db = _requireDb(nlp);
|
|
231
241
|
const result = updateTranslationStatus(db, id, status);
|
|
232
242
|
if (opts.json) return console.log(JSON.stringify(result, null, 2));
|
|
233
243
|
console.log(
|
|
@@ -244,7 +254,7 @@ export function registerNlProgCommand(program) {
|
|
|
244
254
|
.option("-a, --ambiguities <json>", "Updated ambiguities JSON")
|
|
245
255
|
.option("--json", "JSON output")
|
|
246
256
|
.action((id, opts) => {
|
|
247
|
-
const db =
|
|
257
|
+
const db = _requireDb(nlp);
|
|
248
258
|
const result = refineTranslation(db, id, {
|
|
249
259
|
spec: opts.spec,
|
|
250
260
|
ambiguities: opts.ambiguities,
|
|
@@ -260,7 +270,7 @@ export function registerNlProgCommand(program) {
|
|
|
260
270
|
.description("Remove a translation")
|
|
261
271
|
.option("--json", "JSON output")
|
|
262
272
|
.action((id, opts) => {
|
|
263
|
-
const db =
|
|
273
|
+
const db = _requireDb(nlp);
|
|
264
274
|
const result = removeTranslation(db, id);
|
|
265
275
|
if (opts.json) return console.log(JSON.stringify(result, null, 2));
|
|
266
276
|
console.log(
|
|
@@ -283,7 +293,7 @@ export function registerNlProgCommand(program) {
|
|
|
283
293
|
.option("-s, --source-files <json>", "Source files JSON")
|
|
284
294
|
.option("--json", "JSON output")
|
|
285
295
|
.action((opts) => {
|
|
286
|
-
const db =
|
|
296
|
+
const db = _requireDb(nlp);
|
|
287
297
|
const result = addConvention(db, {
|
|
288
298
|
category: opts.category,
|
|
289
299
|
pattern: opts.pattern,
|
|
@@ -301,7 +311,7 @@ export function registerNlProgCommand(program) {
|
|
|
301
311
|
.description("Show convention details")
|
|
302
312
|
.option("--json", "JSON output")
|
|
303
313
|
.action((id, opts) => {
|
|
304
|
-
const db =
|
|
314
|
+
const db = _requireDb(nlp);
|
|
305
315
|
const c = getConvention(db, id);
|
|
306
316
|
if (!c) return console.log("Convention not found.");
|
|
307
317
|
if (opts.json) return console.log(JSON.stringify(c, null, 2));
|
|
@@ -319,7 +329,7 @@ export function registerNlProgCommand(program) {
|
|
|
319
329
|
.option("--limit <n>", "Max results", parseInt)
|
|
320
330
|
.option("--json", "JSON output")
|
|
321
331
|
.action((opts) => {
|
|
322
|
-
const db =
|
|
332
|
+
const db = _requireDb(nlp);
|
|
323
333
|
const results = listConventions(db, {
|
|
324
334
|
category: opts.category,
|
|
325
335
|
limit: opts.limit,
|
|
@@ -338,7 +348,7 @@ export function registerNlProgCommand(program) {
|
|
|
338
348
|
.description("Remove a convention")
|
|
339
349
|
.option("--json", "JSON output")
|
|
340
350
|
.action((id, opts) => {
|
|
341
|
-
const db =
|
|
351
|
+
const db = _requireDb(nlp);
|
|
342
352
|
const result = removeConvention(db, id);
|
|
343
353
|
if (opts.json) return console.log(JSON.stringify(result, null, 2));
|
|
344
354
|
console.log(
|
|
@@ -353,7 +363,7 @@ export function registerNlProgCommand(program) {
|
|
|
353
363
|
.description("NL Programming statistics")
|
|
354
364
|
.option("--json", "JSON output")
|
|
355
365
|
.action((opts) => {
|
|
356
|
-
const db =
|
|
366
|
+
const db = _requireDb(nlp);
|
|
357
367
|
const s = getNlProgrammingStats(db);
|
|
358
368
|
if (opts.json) return console.log(JSON.stringify(s, null, 2));
|
|
359
369
|
console.log(
|
|
@@ -473,7 +483,7 @@ export function registerNlProgCommand(program) {
|
|
|
473
483
|
.option("-m, --metadata <json>", "Metadata JSON")
|
|
474
484
|
.option("--json", "JSON output")
|
|
475
485
|
.action((specId, opts) => {
|
|
476
|
-
const db =
|
|
486
|
+
const db = _requireDb(nlp);
|
|
477
487
|
const rec = registerSpecV2(db, {
|
|
478
488
|
specId,
|
|
479
489
|
authorId: opts.author,
|
|
@@ -506,7 +516,7 @@ export function registerNlProgCommand(program) {
|
|
|
506
516
|
.option("-r, --reason <text>", "Reason")
|
|
507
517
|
.option("-m, --metadata <json>", "Metadata patch (JSON)")
|
|
508
518
|
.action((id, status, opts) => {
|
|
509
|
-
const db =
|
|
519
|
+
const db = _requireDb(nlp);
|
|
510
520
|
const rec = setSpecMaturityV2(db, id, status, {
|
|
511
521
|
reason: opts.reason,
|
|
512
522
|
metadata: _parseMetaV2(opts.metadata),
|
|
@@ -568,7 +578,7 @@ export function registerNlProgCommand(program) {
|
|
|
568
578
|
.option("-m, --metadata <json>", "Metadata JSON")
|
|
569
579
|
.option("--json", "JSON output")
|
|
570
580
|
.action((turnId, opts) => {
|
|
571
|
-
const db =
|
|
581
|
+
const db = _requireDb(nlp);
|
|
572
582
|
const rec = registerDialogueTurnV2(db, {
|
|
573
583
|
turnId,
|
|
574
584
|
specId: opts.spec,
|
|
@@ -603,7 +613,7 @@ export function registerNlProgCommand(program) {
|
|
|
603
613
|
.option("-r, --reason <text>", "Reason")
|
|
604
614
|
.option("-m, --metadata <json>", "Metadata patch (JSON)")
|
|
605
615
|
.action((id, status, opts) => {
|
|
606
|
-
const db =
|
|
616
|
+
const db = _requireDb(nlp);
|
|
607
617
|
const rec = setDialogueTurnStatusV2(db, id, status, {
|
|
608
618
|
answer: opts.answer,
|
|
609
619
|
reason: opts.reason,
|
|
@@ -168,7 +168,11 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
168
168
|
*/
|
|
169
169
|
constructor(options = {}) {
|
|
170
170
|
super();
|
|
171
|
-
|
|
171
|
+
// Use ?? so an explicit `port: 0` (OS-assigned, used by tests + the
|
|
172
|
+
// desktop web-shell bootstrap) is preserved instead of falling back to
|
|
173
|
+
// the hardcoded 18800. The address() readback after listen() updates
|
|
174
|
+
// this.port to the actual bound port — see start().
|
|
175
|
+
this.port = options.port ?? 18800;
|
|
172
176
|
this.host = options.host || "127.0.0.1";
|
|
173
177
|
this.token = options.token || null;
|
|
174
178
|
this.maxConnections = options.maxConnections || 10;
|
|
@@ -558,6 +562,13 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
558
562
|
...process.env,
|
|
559
563
|
FORCE_COLOR: "0",
|
|
560
564
|
NO_SPINNER: "1",
|
|
565
|
+
// When this server runs inside Electron (e.g. desktop web-shell)
|
|
566
|
+
// process.execPath points at the Electron binary, not node. Setting
|
|
567
|
+
// ELECTRON_RUN_AS_NODE=1 makes Electron behave as a plain Node
|
|
568
|
+
// runtime for this child, so the CLI script runs normally instead
|
|
569
|
+
// of being interpreted as a packaged Electron app entry. No-op
|
|
570
|
+
// outside Electron.
|
|
571
|
+
...(process.versions.electron ? { ELECTRON_RUN_AS_NODE: "1" } : {}),
|
|
561
572
|
},
|
|
562
573
|
stdio: ["pipe", "pipe", "pipe"],
|
|
563
574
|
windowsHide: true,
|
package/src/lib/web-ui-server.js
CHANGED
|
@@ -1186,6 +1186,11 @@ function buildConfigJson(opts) {
|
|
|
1186
1186
|
projectRoot: opts.projectRoot,
|
|
1187
1187
|
projectName: opts.projectName,
|
|
1188
1188
|
mode: opts.mode,
|
|
1189
|
+
// True only when the SPA is hosted by the desktop web-shell. Lets the
|
|
1190
|
+
// SPA prefer in-process custom WS topics (e.g. `skill.list`) over
|
|
1191
|
+
// `ws.execute(...)` which can't fork a real `cc` from inside Electron.
|
|
1192
|
+
// Default false so the CLI's own `cc serve` is unaffected.
|
|
1193
|
+
embeddedShell: opts.embeddedShell === true,
|
|
1189
1194
|
})
|
|
1190
1195
|
.replace(/</g, "\\u003c")
|
|
1191
1196
|
.replace(/>/g, "\\u003e")
|
|
@@ -1365,6 +1370,34 @@ export function createWebUIServer(opts) {
|
|
|
1365
1370
|
// '$&', '$`', "$'" etc. in configJson as special replacement patterns
|
|
1366
1371
|
// (e.g. projectRoot="/path/$HOME" would corrupt the JSON otherwise).
|
|
1367
1372
|
html = html.replace("__CC_CONFIG_PLACEHOLDER__", () => configJson);
|
|
1373
|
+
if (opts.embeddedShell) {
|
|
1374
|
+
// Electron's titleBarOverlay reserves the top-right ~138px for
|
|
1375
|
+
// native min/max/close buttons. Web-panel's `.app-header` lays
|
|
1376
|
+
// out a right-aligned cluster (status badge, version chip, action
|
|
1377
|
+
// icons) in the same region, so the OS controls visually cover
|
|
1378
|
+
// it. Push the cluster left by that amount only when the SPA is
|
|
1379
|
+
// hosted inside the desktop web-shell.
|
|
1380
|
+
//
|
|
1381
|
+
// We inject both a `<style>` block (covers selectors at first
|
|
1382
|
+
// paint) and a post-load script that sets the padding via inline
|
|
1383
|
+
// styles (specificity 1000+, beats anything Ant Design or page-
|
|
1384
|
+
// specific CSS sets later).
|
|
1385
|
+
const overlayPad = "158px"; // 138 native + 20 gap
|
|
1386
|
+
html = html.replace(
|
|
1387
|
+
"</head>",
|
|
1388
|
+
'<style id="cc-embedded-shell-overrides">' +
|
|
1389
|
+
"header.app-header,header.ant-layout-header.app-header,.app-header{" +
|
|
1390
|
+
`padding-right:${overlayPad} !important;` +
|
|
1391
|
+
"}" +
|
|
1392
|
+
"</style>" +
|
|
1393
|
+
"<script>(function(){function apply(){var els=document.querySelectorAll('.app-header,header.ant-layout-header');" +
|
|
1394
|
+
`for(var i=0;i<els.length;i++){els[i].style.setProperty('padding-right','${overlayPad}','important');}}` +
|
|
1395
|
+
"if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',apply);}else{apply();}" +
|
|
1396
|
+
"var mo=new MutationObserver(apply);mo.observe(document.body||document.documentElement,{childList:true,subtree:true});" +
|
|
1397
|
+
"})();</script>" +
|
|
1398
|
+
"</head>",
|
|
1399
|
+
);
|
|
1400
|
+
}
|
|
1368
1401
|
res.writeHead(200, {
|
|
1369
1402
|
"Content-Type": "text/html; charset=utf-8",
|
|
1370
1403
|
"Cache-Control": "no-store",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.app-root[data-v-e1404e16]{height:100vh;background:var(--bg-base);overflow:hidden}.sidebar[data-v-e1404e16]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s;height:100vh}[data-v-e1404e16] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden;height:100%}.main-area[data-v-e1404e16]{background:var(--bg-base);height:100vh;display:flex;flex-direction:column}.logo[data-v-e1404e16]{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-e1404e16]{padding:0;justify-content:center}.logo-icon[data-v-e1404e16]{width:24px;height:24px;flex-shrink:0;object-fit:contain}.logo-text[data-v-e1404e16]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-e1404e16]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-e1404e16]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-e1404e16]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-e1404e16]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-e1404e16]{color:#722ed1}.banner-info[data-v-e1404e16]{flex:1;min-width:0}.banner-name[data-v-e1404e16]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-e1404e16]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-e1404e16]{color:#c084fc}.mode-icon-sm[data-v-e1404e16]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-e1404e16]{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-e1404e16]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-e1404e16] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-e1404e16] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-e1404e16]{margin:4px 0!important}.sidebar-footer[data-v-e1404e16]{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-e1404e16]{justify-content:center;padding:8px 0}.footer-text[data-v-e1404e16]{color:var(--text-secondary);font-size:11px}.app-header[data-v-e1404e16]{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-e1404e16],.header-right[data-v-e1404e16]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-e1404e16]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-e1404e16]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-e1404e16]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-e1404e16]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-e1404e16]{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-e1404e16]{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-e1404e16]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-e1404e16]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-e1404e16]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-e1404e16]{margin:0!important;font-size:11px}.page-content[data-v-e1404e16]{padding:24px;overflow:auto;background:var(--bg-base);flex:1;min-height:0}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as U,w as Ve,l as Ge,m as g,x as t,q as u,B as We,C as ze,v as a,c as e,D as i,E as S,u as n,F as p,G as x,H as j,I as v,J as l,K as Je,L as He,j as m}from"./vendor-BVetwVfk.js";import{u as Ye}from"./ws-Bv7YH0VB.js";import{u as qe,T as $e}from"./index-DPaLf3-g.js";import{_ as Qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as O,G as B,D as A,M as P,R as D,C as E,A as F,a as M,b as V,c as G,d as W,B as z,e as J,f as H,S as Y,h as q,i as $,j as Q,P as X,k as Z,l as h,m as ee,I as te,L as oe,W as ne,n as se,o as le,p as ie,q as ae,r as de,E as ue,s as re,t as pe,u as ye,v as ke,w as ce,x as me,U as fe,y as _e,z as ge,H as ve,V as Xe,J as Oe,K as be,N as Ze}from"./icons-E3MGhN6s.js";const he=["src"],et={key:0,class:"logo-text"},tt={key:0,class:"mode-banner project"},ot={class:"banner-info"},nt={class:"banner-name"},st={key:1,class:"mode-banner global"},lt=["title"],it={key:0,class:"footer-text"},at={class:"header-left"},dt={class:"header-right"},ut={class:"theme-switcher"},rt=["data-theme-key","onClick"],pt={class:"version-tag"},we="cc.web-panel.sidebar.openKeys",yt={__name:"AppLayout",setup(kt){const Ce=We(),Se=ze(),b=Ye(),K=qe(),r=U(!1),f=window.__CC_CONFIG__||{},c=m(()=>f.mode==="project"),je="v5.0.3.1",Ae=new URL(""+new URL("logo-DBCYUiWP.png",import.meta.url).href,import.meta.url).href,Ke=m(()=>K.current),Le=m(()=>K.config.vars["--menu-mode"]),T=m(()=>{const d=Se.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[d]||d]}),N=["g-overview","g-config","g-data","g-advanced","g-enterprise","g-social","g-media","g-extension"];function xe(){try{const d=localStorage.getItem(we);if(d){const o=JSON.parse(d);if(Array.isArray(o))return o.filter(s=>N.includes(s))}}catch{}return[...N]}const L=U(xe());Ve(L,d=>{try{localStorage.setItem(we,JSON.stringify(d))}catch{}},{deep:!0});const w=m(()=>b.status),Be=m(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[b.status]||"default"),Te=m(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[b.status]||"未知");function Ne(d){K.setTheme(d)}function Re({key:d}){Ce.push({mcp:"/mcp"}[d]||`/${d}`)}return Ge(()=>b.connect()),(d,o)=>{const s=u("a-menu-item"),y=u("a-sub-menu"),_=u("a-menu-divider"),Ie=u("a-menu"),Ue=u("a-badge"),Pe=u("a-layout-sider"),R=u("a-tooltip"),De=u("a-tag"),Ee=u("a-layout-header"),Fe=u("router-view"),Me=u("a-layout-content"),I=u("a-layout");return a(),g(I,{class:"app-root"},{default:t(()=>[e(Pe,{collapsed:r.value,"onUpdate:collapsed":o[2]||(o[2]=k=>r.value=k),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[i("div",{class:S(["logo",{collapsed:r.value}])},[i("img",{src:n(Ae),alt:"ChainlessChain",class:"logo-icon"},null,8,he),r.value?x("",!0):(a(),p("span",et,"ChainlessChain"))],2),r.value?(a(),p("div",{key:1,class:"mode-icon-sm",title:c.value?n(f).projectName:"全局模式"},[c.value?(a(),g(n(O),{key:0,style:{color:"#1677ff"}})):(a(),g(n(B),{key:1,style:{color:"#722ed1"}}))],8,lt)):(a(),p(j,{key:0},[c.value?(a(),p("div",tt,[e(n(O),{class:"banner-icon"}),i("div",ot,[i("div",nt,v(n(f).projectName||"项目"),1),o[3]||(o[3]=i("div",{class:"banner-sub"},"项目级面板",-1))])])):(a(),p("div",st,[e(n(B),{class:"banner-icon"}),o[4]||(o[4]=i("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(Ie,{selectedKeys:T.value,"onUpdate:selectedKeys":o[0]||(o[0]=k=>T.value=k),openKeys:L.value,"onUpdate:openKeys":o[1]||(o[1]=k=>L.value=k),theme:Le.value,mode:"inline","inline-collapsed":r.value,class:"side-menu",onClick:Re},{default:t(()=>[r.value?(a(),p(j,{key:1},[e(s,{key:"dashboard"},{icon:t(()=>[e(n(A))]),_:1}),e(s,{key:"chat"},{icon:t(()=>[e(n(P))]),_:1}),e(s,{key:"cowork"},{icon:t(()=>[e(n(D))]),_:1}),e(s,{key:"services"},{icon:t(()=>[e(n(E))]),_:1}),e(s,{key:"aiops"},{icon:t(()=>[e(n(F))]),_:1}),e(s,{key:"logs"},{icon:t(()=>[e(n(M))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"skills"},{icon:t(()=>[e(n(V))]),_:1}),e(s,{key:"providers"},{icon:t(()=>[e(n(G))]),_:1}),e(s,{key:"mcp"},{icon:t(()=>[e(n(W))]),_:1}),e(s,{key:"project-settings"},{icon:t(()=>[e(n(O))]),_:1}),e(s,{key:"nlprog"},{icon:t(()=>[e(n(z))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"notes"},{icon:t(()=>[e(n(J))]),_:1}),e(s,{key:"memory"},{icon:t(()=>[e(n(H))]),_:1}),e(s,{key:"knowledge"},{icon:t(()=>[e(n(Y))]),_:1}),e(s,{key:"marketplace"},{icon:t(()=>[e(n(q))]),_:1}),e(s,{key:"cron"},{icon:t(()=>[e(n($))]),_:1}),e(s,{key:"workflow"},{icon:t(()=>[e(n(Q))]),_:1}),e(s,{key:"pipeline"},{icon:t(()=>[e(n(X))]),_:1}),e(s,{key:"tasks"},{icon:t(()=>[e(n(Z))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"security"},{icon:t(()=>[e(n(h))]),_:1}),e(s,{key:"audit"},{icon:t(()=>[e(n(ee))]),_:1}),e(s,{key:"did"},{icon:t(()=>[e(n(te))]),_:1}),e(s,{key:"permissions"},{icon:t(()=>[e(n(oe))]),_:1}),e(s,{key:"p2p"},{icon:t(()=>[e(n(ne))]),_:1}),e(s,{key:"backup"},{icon:t(()=>[e(n(se))]),_:1}),e(s,{key:"git"},{icon:t(()=>[e(n(le))]),_:1}),e(s,{key:"projects"},{icon:t(()=>[e(n(ie))]),_:1}),e(s,{key:"crosschain"},{icon:t(()=>[e(n(ae))]),_:1}),e(s,{key:"compliance"},{icon:t(()=>[e(n(de))]),_:1}),e(s,{key:"privacy"},{icon:t(()=>[e(n(ue))]),_:1}),e(s,{key:"inference"},{icon:t(()=>[e(n(re))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"wallet"},{icon:t(()=>[e(n(pe))]),_:1}),e(s,{key:"organization"},{icon:t(()=>[e(n(ye))]),_:1}),e(s,{key:"tenant"},{icon:t(()=>[e(n(ke))]),_:1}),e(s,{key:"sla"},{icon:t(()=>[e(n(A))]),_:1}),e(s,{key:"analytics"},{icon:t(()=>[e(n(ce))]),_:1}),e(s,{key:"templates"},{icon:t(()=>[e(n(me))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"community"},{icon:t(()=>[e(n(fe))]),_:1}),e(s,{key:"governance"},{icon:t(()=>[e(n(_e))]),_:1}),e(s,{key:"reputation"},{icon:t(()=>[e(n(ge))]),_:1}),e(s,{key:"recommend"},{icon:t(()=>[e(n(ve))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"rssfeed"},{icon:t(()=>[e(n(Oe))]),_:1}),e(s,{key:"webauthn"},{icon:t(()=>[e(n(be))]),_:1})],64)):(a(),p(j,{key:0},[e(y,{key:"g-overview"},{title:t(()=>[...o[5]||(o[5]=[i("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(s,{key:"dashboard"},{icon:t(()=>[e(n(A))]),default:t(()=>[o[6]||(o[6]=l("仪表板",-1))]),_:1}),e(s,{key:"chat"},{icon:t(()=>[e(n(P))]),default:t(()=>[o[7]||(o[7]=l("AI 对话",-1))]),_:1}),e(s,{key:"cowork"},{icon:t(()=>[e(n(D))]),default:t(()=>[o[8]||(o[8]=l("日常协作",-1))]),_:1}),e(s,{key:"services"},{icon:t(()=>[e(n(E))]),default:t(()=>[o[9]||(o[9]=l("服务管理",-1))]),_:1}),e(s,{key:"aiops"},{icon:t(()=>[e(n(F))]),default:t(()=>[o[10]||(o[10]=l("AIOps",-1))]),_:1}),e(s,{key:"logs"},{icon:t(()=>[e(n(M))]),default:t(()=>[o[11]||(o[11]=l("日志查看",-1))]),_:1})]),_:1}),e(y,{key:"g-config"},{title:t(()=>[...o[12]||(o[12]=[i("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(s,{key:"skills"},{icon:t(()=>[e(n(V))]),default:t(()=>[o[13]||(o[13]=l("技能管理",-1))]),_:1}),e(s,{key:"providers"},{icon:t(()=>[e(n(G))]),default:t(()=>[o[14]||(o[14]=l("LLM 配置",-1))]),_:1}),e(s,{key:"mcp"},{icon:t(()=>[e(n(W))]),default:t(()=>[o[15]||(o[15]=l("MCP 工具",-1))]),_:1}),e(s,{key:"project-settings"},{icon:t(()=>[e(n(O))]),default:t(()=>[o[16]||(o[16]=l("项目存储",-1))]),_:1}),e(s,{key:"nlprog"},{icon:t(()=>[e(n(z))]),default:t(()=>[o[17]||(o[17]=l("自然语言编程",-1))]),_:1})]),_:1}),e(y,{key:"g-data"},{title:t(()=>[...o[18]||(o[18]=[i("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(s,{key:"notes"},{icon:t(()=>[e(n(J))]),default:t(()=>[o[19]||(o[19]=l("笔记管理",-1))]),_:1}),e(s,{key:"memory"},{icon:t(()=>[e(n(H))]),default:t(()=>[o[20]||(o[20]=l("记忆文件",-1))]),_:1}),e(s,{key:"knowledge"},{icon:t(()=>[e(n(Y))]),default:t(()=>[o[21]||(o[21]=l("知识图谱",-1))]),_:1}),e(s,{key:"marketplace"},{icon:t(()=>[e(n(q))]),default:t(()=>[o[22]||(o[22]=l("技能市场",-1))]),_:1}),e(s,{key:"cron"},{icon:t(()=>[e(n($))]),default:t(()=>[o[23]||(o[23]=l("定时任务",-1))]),_:1}),e(s,{key:"workflow"},{icon:t(()=>[e(n(Q))]),default:t(()=>[o[24]||(o[24]=l("工作流编辑",-1))]),_:1}),e(s,{key:"pipeline"},{icon:t(()=>[e(n(X))]),default:t(()=>[o[25]||(o[25]=l("开发流水线",-1))]),_:1}),e(s,{key:"tasks"},{icon:t(()=>[e(n(Z))]),default:t(()=>[o[26]||(o[26]=l("后台任务",-1))]),_:1})]),_:1}),e(y,{key:"g-advanced"},{title:t(()=>[...o[27]||(o[27]=[i("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(s,{key:"security"},{icon:t(()=>[e(n(h))]),default:t(()=>[o[28]||(o[28]=l("安全中心",-1))]),_:1}),e(s,{key:"audit"},{icon:t(()=>[e(n(ee))]),default:t(()=>[o[29]||(o[29]=l("审计日志",-1))]),_:1}),e(s,{key:"did"},{icon:t(()=>[e(n(te))]),default:t(()=>[o[30]||(o[30]=l("DID 身份",-1))]),_:1}),e(s,{key:"permissions"},{icon:t(()=>[e(n(oe))]),default:t(()=>[o[31]||(o[31]=l("权限管理",-1))]),_:1}),e(s,{key:"p2p"},{icon:t(()=>[e(n(ne))]),default:t(()=>[o[32]||(o[32]=l("P2P 网络",-1))]),_:1}),e(s,{key:"backup"},{icon:t(()=>[e(n(se))]),default:t(()=>[o[33]||(o[33]=l("备份同步",-1))]),_:1}),e(s,{key:"git"},{icon:t(()=>[e(n(le))]),default:t(()=>[o[34]||(o[34]=l("Git 与数据",-1))]),_:1}),e(s,{key:"projects"},{icon:t(()=>[e(n(ie))]),default:t(()=>[o[35]||(o[35]=l("项目管理",-1))]),_:1}),e(s,{key:"crosschain"},{icon:t(()=>[e(n(ae))]),default:t(()=>[o[36]||(o[36]=l("跨链桥",-1))]),_:1}),e(s,{key:"compliance"},{icon:t(()=>[e(n(de))]),default:t(()=>[o[37]||(o[37]=l("合规与情报",-1))]),_:1}),e(s,{key:"privacy"},{icon:t(()=>[e(n(ue))]),default:t(()=>[o[38]||(o[38]=l("隐私计算",-1))]),_:1}),e(s,{key:"inference"},{icon:t(()=>[e(n(re))]),default:t(()=>[o[39]||(o[39]=l("推理网络",-1))]),_:1})]),_:1}),e(y,{key:"g-enterprise"},{title:t(()=>[...o[40]||(o[40]=[i("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(s,{key:"wallet"},{icon:t(()=>[e(n(pe))]),default:t(()=>[o[41]||(o[41]=l("钱包管理",-1))]),_:1}),e(s,{key:"organization"},{icon:t(()=>[e(n(ye))]),default:t(()=>[o[42]||(o[42]=l("组织管理",-1))]),_:1}),e(s,{key:"tenant"},{icon:t(()=>[e(n(ke))]),default:t(()=>[o[43]||(o[43]=l("多租户 SaaS",-1))]),_:1}),e(s,{key:"sla"},{icon:t(()=>[e(n(A))]),default:t(()=>[o[44]||(o[44]=l("SLA 管理",-1))]),_:1}),e(s,{key:"analytics"},{icon:t(()=>[e(n(ce))]),default:t(()=>[o[45]||(o[45]=l("使用分析",-1))]),_:1}),e(s,{key:"templates"},{icon:t(()=>[e(n(me))]),default:t(()=>[o[46]||(o[46]=l("模板中心",-1))]),_:1})]),_:1}),e(y,{key:"g-social"},{title:t(()=>[...o[47]||(o[47]=[i("span",{class:"group-label"},"社 交",-1)])]),default:t(()=>[e(s,{key:"community"},{icon:t(()=>[e(n(fe))]),default:t(()=>[o[48]||(o[48]=l("社区",-1))]),_:1}),e(s,{key:"governance"},{icon:t(()=>[e(n(_e))]),default:t(()=>[o[49]||(o[49]=l("社区治理",-1))]),_:1}),e(s,{key:"reputation"},{icon:t(()=>[e(n(ge))]),default:t(()=>[o[50]||(o[50]=l("声誉优化",-1))]),_:1}),e(s,{key:"recommend"},{icon:t(()=>[e(n(ve))]),default:t(()=>[o[51]||(o[51]=l("智能推荐",-1))]),_:1})]),_:1}),e(y,{key:"g-media"},{title:t(()=>[...o[52]||(o[52]=[i("span",{class:"group-label"},"媒 体",-1)])]),default:t(()=>[e(s,{key:"video"},{icon:t(()=>[e(n(Xe))]),default:t(()=>[o[53]||(o[53]=l("视频剪辑",-1))]),_:1})]),_:1}),e(y,{key:"g-extension"},{title:t(()=>[...o[54]||(o[54]=[i("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(s,{key:"rssfeed"},{icon:t(()=>[e(n(Oe))]),default:t(()=>[o[55]||(o[55]=l("RSS 订阅",-1))]),_:1}),e(s,{key:"webauthn"},{icon:t(()=>[e(n(be))]),default:t(()=>[o[56]||(o[56]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","openKeys","theme","inline-collapsed"]),i("div",{class:S(["sidebar-footer",{collapsed:r.value}])},[e(Ue,{status:Be.value},null,8,["status"]),r.value?x("",!0):(a(),p("span",it,v(Te.value),1))],2)]),_:1},8,["collapsed"]),e(I,{class:"main-area"},{default:t(()=>[e(Ee,{class:"app-header"},{default:t(()=>[i("div",at,[i("div",{class:S(["scope-tag",c.value?"project":"global"])},[(a(),g(Je(c.value?n(O):n(B)))),i("span",null,v(c.value?n(f).projectName||"项目":"全局模式"),1),c.value&&n(f).projectRoot?(a(),g(R,{key:0,title:n(f).projectRoot},{default:t(()=>[e(n(Ze),{class:"info-icon"})]),_:1},8,["title"])):x("",!0)],2)]),i("div",dt,[i("div",ut,[(a(!0),p(j,null,He(n($e),(k,C)=>(a(),g(R,{key:C,title:k.label},{default:t(()=>[i("button",{class:S(["theme-btn",{active:Ke.value===C}]),"data-theme-key":C,onClick:ct=>Ne(C)},v(k.icon),11,rt)]),_:2},1032,["title"]))),128))]),i("span",pt,v(n(je)),1),e(De,{color:w.value==="connected"?"green":w.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(v(w.value==="connected"?"已连接":w.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(Me,{class:"page-content"},{default:t(()=>[e(Fe)]),_:1})]),_:1})]),_:1})}}},Ot=Qe(yt,[["__scopeId","data-v-e1404e16"]]);export{Ot as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{v as t,F as a,D as s,m as b,u as i,I as u,G as x,E as j,j as m,w as G,l as H,c as d,x as v,H as T,L as M,J as g,O as J,P as V,q as z,r as E,a as K,n as P}from"./vendor-BVetwVfk.js";import{u as U}from"./chat-CVn-r3oV.js";import{_ as N}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{_ as W,$ as X,i as Y,a0 as Z,a1 as ee,F as te,G as oe,M as ne,Q as se,a2 as ae}from"./icons-E3MGhN6s.js";import{r as le}from"./markdown-vYH_ziAO.js";import"./ws-Bv7YH0VB.js";import"./markdown-xjUYbPSW.js";const ie=["data-testid"],re={class:"cb-action__icon"},de={class:"cb-action__label"},ce={key:0,class:"cb-action__detail"},ue={key:1,class:"cb-action__caret"},pe={__name:"ToolInvocationCard",props:{item:{type:Object,required:!0},expandable:{type:Boolean,default:!1},expanded:{type:Boolean,default:!1}},emits:["toggle"],setup(r,{emit:f}){const h=r,l=f;function y(){h.expandable&&l("toggle")}return(k,c)=>(t(),a("div",{class:j(["cb-action",[`cb-action--${r.item.status}`,{"cb-action--expandable":r.expandable,"cb-action--open":r.expanded}]]),"data-testid":`tool-card-${r.item.id}`,onClick:y},[s("span",re,[r.item.status==="done"?(t(),b(i(W),{key:0})):r.item.status==="running"?(t(),b(i(X),{key:1})):(t(),b(i(Y),{key:2}))]),s("span",de,u(r.item.label),1),r.item.detail?(t(),a("span",ce,u(r.item.detail),1)):x("",!0),r.expandable?(t(),a("span",ue,[r.expanded?(t(),b(i(Z),{key:0})):(t(),b(i(ee),{key:1}))])):x("",!0)],10,ie))}},ve=N(pe,[["__scopeId","data-v-cf5a0925"]]),xe=["innerHTML"],fe={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(r){const f=r,h=m(()=>le(f.content||""));return(l,y)=>(t(),a("div",{class:"markdown-content",innerHTML:h.value},null,8,xe))}},F=N(fe,[["__scopeId","data-v-693ca57e"]]),ye={style:{display:"flex",height:"calc(100vh - 56px - 48px)",gap:"16px"}},_e={style:{width:"240px","flex-shrink":"0",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},ge={key:0,style:{padding:"6px 12px 4px","font-size":"11px",color:"#1677ff",background:"rgba(22,119,255,.07)","border-bottom":"1px solid rgba(22,119,255,.15)",display:"flex","align-items":"center",gap:"4px"}},me=["title"],be={key:1,style:{padding:"6px 12px 4px","font-size":"11px",color:"#722ed1",background:"rgba(114,46,209,.07)","border-bottom":"1px solid rgba(114,46,209,.15)",display:"flex","align-items":"center",gap:"4px"}},ke={style:{padding:"10px 12px","border-bottom":"1px solid var(--border-color)",display:"flex",gap:"8px"}},he={style:{flex:"1","overflow-y":"auto",padding:"8px"}},we=["onClick"],Ce={class:"session-icon"},$e={class:"session-info"},Se={class:"session-title"},Oe={class:"session-meta"},Ie={key:0,style:{"text-align":"center",color:"var(--text-muted)",padding:"24px 0","font-size":"13px"}},Te={style:{flex:"1",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},Me={key:0,style:{flex:"1",display:"flex","flex-direction":"column","align-items":"center","justify-content":"center",color:"var(--text-muted)"}},ze={style:{"margin-top":"24px",display:"flex",gap:"12px"}},je={key:0,class:"tool-msg"},Ne={key:0,class:"tool-detail"},Le={class:"tool-detail__pre tool-detail__pre--input"},Re={key:0,class:"tool-detail__result"},Be={class:"tool-detail__pre tool-detail__pre--result"},Ee={key:1,class:"user-msg"},Fe={class:"bubble user"},qe={key:2,class:"assistant-msg"},Ae={key:0,class:"assistant-msg"},De={key:1,class:"question-card"},Qe={class:"question-text"},Ge={key:0,style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"10px"}},He={key:2,style:{padding:"16px","border-top":"1px solid var(--border-color)"}},Je={style:{display:"flex",gap:"8px","align-items":"flex-end"}},Ve={__name:"Chat",setup(r){const f=window.__CC_CONFIG__||{},h=m(()=>f.mode==="project"),l=U(),y=E(null),k=E(""),c=m(()=>l.currentSessionId),L=m(()=>c.value?l.getMessages(c.value):[]),I=m(()=>{const n=l.streaming[c.value];return n?.active?n.content:null}),$=m(()=>l.pendingQuestion[c.value]),S=m(()=>l.getIsLoading(c.value)),w=K(new Set);function q(n){w.has(n)?w.delete(n):w.add(n)}function A(n,e){return{id:`tool-${e}`,label:n.tool||"unknown",detail:D(n),status:n.status==="done"?"done":"running"}}function D(n){if(n.status==="running"){const C=n.input&&typeof n.input=="object"?Object.keys(n.input):[];return C.length?`参数 ${C.length} · ${C[0]}…`:"执行中"}if(n.result==null)return"完成";const p=(typeof n.result=="string"?n.result:JSON.stringify(n.result)).split(`
|
|
2
|
-
`)[0]||"";return p.length>48?`${p.slice(0,48)}…`:p||"完成"}async function O(n){await l.createSession(n)}async function R(){if(!k.value.trim()||S.value||!c.value)return;const n=k.value;k.value="",await l.sendMessage(c.value,n)}function B(n){l.answerQuestion(c.value,n)}return G([L,I],()=>{P(()=>{y.value&&(y.value.scrollTop=y.value.scrollHeight)})},{deep:!0}),H(()=>{l.loadSessions()}),(n,e)=>{const p=z("a-button"),C=z("a-input-search"),Q=z("a-textarea");return t(),a("div",ye,[s("div",_e,[h.value?(t(),a("div",ge,[d(i(te)),s("span",{style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"},title:i(f).projectRoot},u(i(f).projectName||"项目"),9,me)])):(t(),a("div",be,[d(i(oe)),e[5]||(e[5]=s("span",null,"全局会话",-1))])),s("div",ke,[d(p,{type:"primary",size:"small",style:{flex:"1"},onClick:e[0]||(e[0]=o=>O("chat"))},{icon:v(()=>[d(i(ne))]),default:v(()=>[e[6]||(e[6]=g(" Chat ",-1))]),_:1}),d(p,{size:"small",style:{flex:"1"},onClick:e[1]||(e[1]=o=>O("agent"))},{icon:v(()=>[d(i(se))]),default:v(()=>[e[7]||(e[7]=g(" Agent ",-1))]),_:1})]),s("div",he,[(t(!0),a(T,null,M(i(l).sessions,o=>(t(),a("div",{key:o.id,class:j(["session-item",{active:o.id===i(l).currentSessionId}]),onClick:_=>i(l).switchSession(o.id)},[s("span",Ce,u(o.type==="agent"?"🤖":"💬"),1),s("div",$e,[s("div",Se,u(o.title||"新对话"),1),s("div",Oe,u(o.messageCount||0)+" 条消息",1)])],10,we))),128)),i(l).sessions.length?x("",!0):(t(),a("div",Ie,[...e[8]||(e[8]=[g(" 点击上方按钮",-1),s("br",null,null,-1),g("开始新对话 ",-1)])]))])]),s("div",Te,[c.value?(t(),a("div",{key:1,style:{flex:"1","overflow-y":"auto",padding:"20px"},ref_key:"messagesEl",ref:y},[(t(!0),a(T,null,M(L.value,(o,_)=>(t(),a("div",{key:_,class:j(["message-row",o.role])},[o.role==="tool"?(t(),a("div",je,[d(ve,{item:A(o,_),expandable:"",expanded:w.has(_),onToggle:Ke=>q(_)},null,8,["item","expanded","onToggle"]),w.has(_)?(t(),a("div",Ne,[s("pre",Le,u(JSON.stringify(o.input,null,2)),1),o.result?(t(),a("div",Re,[s("pre",Be,u(typeof o.result=="string"?o.result:JSON.stringify(o.result,null,2)),1)])):x("",!0)])):x("",!0)])):o.role==="user"?(t(),a("div",Ee,[s("div",Fe,u(o.content),1)])):(t(),a("div",qe,[e[14]||(e[14]=s("div",{class:"avatar"},"AI",-1)),d(F,{class:"bubble assistant",content:o.content},null,8,["content"])]))],2))),128)),I.value?(t(),a("div",Ae,[e[15]||(e[15]=s("div",{class:"avatar"},"AI",-1)),d(F,{class:"bubble assistant streaming",content:I.value},null,8,["content"])])):x("",!0),$.value?(t(),a("div",De,[s("div",Qe,u($.value.question),1),$.value.choices?.length?(t(),a("div",Ge,[(t(!0),a(T,null,M($.value.choices,o=>(t(),b(p,{key:o,size:"small",onClick:_=>B(o)},{default:v(()=>[g(u(o),1)]),_:2},1032,["onClick"]))),128))])):(t(),b(C,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:B}))])):x("",!0)],512)):(t(),a("div",Me,[e[11]||(e[11]=s("div",{style:{"font-size":"48px","margin-bottom":"16px"}},"💬",-1)),e[12]||(e[12]=s("div",{style:{"font-size":"16px","margin-bottom":"8px",color:"#777"}},"开始 AI 对话",-1)),e[13]||(e[13]=s("div",{style:{"font-size":"13px",color:"var(--text-muted)"}},"选择左侧会话或创建新对话",-1)),s("div",ze,[d(p,{type:"primary",onClick:e[2]||(e[2]=o=>O("chat"))},{default:v(()=>[...e[9]||(e[9]=[g("新建 Chat",-1)])]),_:1}),d(p,{style:{},onClick:e[3]||(e[3]=o=>O("agent"))},{default:v(()=>[...e[10]||(e[10]=[g("新建 Agent",-1)])]),_:1})])])),c.value?(t(),a("div",He,[s("div",Je,[d(Q,{value:k.value,"onUpdate:value":e[4]||(e[4]=o=>k.value=o),placeholder:S.value?"等待响应中...":"输入消息,Shift+Enter 换行,Enter 发送","auto-size":{minRows:1,maxRows:6},disabled:S.value,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)",color:"var(--text-primary)",resize:"none",flex:"1"},onKeydown:J(V(R,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),d(p,{type:"primary",loading:S.value,onClick:R,style:{height:"40px"}},{icon:v(()=>[d(i(ae))]),_:1},8,["loading"])])])):x("",!0)])])}}},tt=N(Ve,[["__scopeId","data-v-868f97d8"]]);export{tt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as tt}from"./ws-Bv7YH0VB.js";import{s as nt}from"./community-parser-CO25nZFt.js";import{_ as at}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as v}from"./index-DLcTmwiN.js";import{O as ot,aa as lt,B as rt,o as ve,a as ge,aH as st,aq as it,a8 as ut}from"./icons-E3MGhN6s.js";import{l as ct,F as f,D as x,c as n,x as t,m as S,G as g,q as p,r as k,v as i,J as u,u as m,H as C,L as w,I as c,N as pt,j as _e,a as xe}from"./vendor-BVetwVfk.js";import"./index-DPaLf3-g.js";import"./useConfigInject-DIKG5Y4I.js";import"./transition-atE2sWdv.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function J(l){const o=nt(l);if(!o)return null;try{return JSON.parse(o)}catch{}const s=o.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const ae=Object.freeze(["create_component","add_feature","fix_bug","refactor","add_api","add_test","update_style","configure","general"]),$e=Object.freeze(["draft","complete","refined"]),be=Object.freeze(["naming","architecture","testing","style","imports","components"]);function I(l,o=0){return typeof l=="number"&&Number.isFinite(l)?l:o}function q(l,o){if(l==null)return o;if(typeof l!="string")return l;try{return JSON.parse(l)}catch{return l}}function dt(l){const o=J(l);return!o||typeof o!="object"||Array.isArray(o)?null:{intent:String(o.intent||"general"),confidence:I(o.confidence,0)}}function ft(l){const o=J(l);if(!o||typeof o!="object"||Array.isArray(o))return null;const s=Array.isArray(o.entities)?o.entities.map(_=>_&&typeof _=="object"?{type:String(_.type||""),value:String(_.value||"")}:null).filter(Boolean):[];return{entities:s,count:I(o.count,s.length)}}function yt(l){const o=J(l);if(!o||typeof o!="object"||Array.isArray(o))return null;const s=Array.isArray(o.detected)?o.detected.filter(_=>typeof _=="string"):[];return{detected:s,primary:o.primary?String(o.primary):s[0]||null}}function mt(l,o=0){if(!l||typeof l!="object")return null;const s=l.id||"";return s?{key:s,id:s,inputText:l.inputText??l.input_text??"",intent:String(l.intent||"general"),entities:q(l.entities,[]),techStack:q(l.techStack??l.tech_stack,[]),spec:q(l.spec,null),completenessScore:I(l.completenessScore??l.completeness_score,0),ambiguities:q(l.ambiguities,[]),status:String(l.status||"draft").toLowerCase(),createdAt:l.createdAt??l.created_at??null,updatedAt:l.updatedAt??l.updated_at??null,_idx:o}:null}function vt(l){const o=J(l);return Array.isArray(o)?o.map(mt).filter(Boolean):[]}function gt(l){const o=J(l);return!o||typeof o!="object"||Array.isArray(o)||o.translationId===void 0?null:{translated:!!o.translated,translationId:o.translationId,intent:String(o.intent||""),completeness:I(o.completeness,0)}}function _t(l){if(!l)return{noDb:!1,error:""};const o=/Cannot read properties of undefined \(reading ['"]prepare['"]\)/i.test(l)||/TypeError.*prepare/i.test(l),s=l.match(/TypeError:\s*(.+?)(?:\r?\n|$)/i);return{noDb:o,error:s?s[1].trim():""}}function xt(l,o=0){if(!l||typeof l!="object")return null;const s=l.id||"";return s?{key:s,id:s,category:String(l.category||""),pattern:String(l.pattern||""),examples:q(l.examples,[]),confidence:I(l.confidence,0),sourceFiles:q(l.sourceFiles??l.source_files,[]),createdAt:l.createdAt??l.created_at??null,_idx:o}:null}function bt(l){const o=J(l);return Array.isArray(o)?o.map(xt).filter(Boolean):[]}const kt={translations:{total:0,byIntent:{},byStatus:{draft:0,complete:0,refined:0},avgCompleteness:0},conventions:{total:0,byCategory:{}}};function St(l){const o=JSON.parse(JSON.stringify(kt));for(const _ of ae)o.translations.byIntent[_]=0;for(const _ of be)o.conventions.byCategory[_]=0;const s=J(l);if(!s||typeof s!="object"||Array.isArray(s))return o;if(s.translations&&typeof s.translations=="object"){if(o.translations.total=I(s.translations.total,0),o.translations.avgCompleteness=I(s.translations.avgCompleteness??s.translations.avg_completeness,0),s.translations.byIntent&&typeof s.translations.byIntent=="object")for(const[_,A]of Object.entries(s.translations.byIntent))typeof A=="number"&&Number.isFinite(A)&&(o.translations.byIntent[_]=A);if(s.translations.byStatus&&typeof s.translations.byStatus=="object")for(const _ of Object.keys(o.translations.byStatus))o.translations.byStatus[_]=I(s.translations.byStatus[_],0)}if(s.conventions&&typeof s.conventions=="object"&&(o.conventions.total=I(s.conventions.total,0),s.conventions.byCategory&&typeof s.conventions.byCategory=="object"))for(const[_,A]of Object.entries(s.conventions.byCategory))typeof A=="number"&&Number.isFinite(A)&&(o.conventions.byCategory[_]=A);return o}function ne(l){if(l==null||l==="")return"—";const o=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(o.getTime())?String(l):o.toLocaleString("zh-CN",{hour12:!1})}const zt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ct={class:"filter-bar"},At={key:0,style:{color:"var(--text-primary)"}},ht={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},jt={class:"filter-bar"},wt={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Nt={key:0,style:{color:"var(--text-muted)"}},Ot={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Ft={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},$t={key:0,style:{"margin-bottom":"12px"}},Rt={style:{color:"var(--text-secondary)","font-size":"12px"}},It={key:1,style:{"margin-bottom":"12px"}},Ut={style:{"font-size":"12px",color:"var(--text-secondary)","margin-bottom":"4px"}},Dt={key:0,style:{color:"var(--text-muted)"}},Lt={key:2},Et={key:0,style:{color:"var(--text-muted)"}},Jt={key:0,style:{"padding-top":"8px"}},Bt={style:{"white-space":"pre-wrap",color:"var(--text-primary)"}},Mt={style:{"margin-top":"16px"}},Pt={class:"json-block"},qt={class:"json-block"},Vt={key:0},Kt={class:"json-block"},Gt={__name:"NLProgramming",setup(l){const o=tt(),s=k(!1),_=k(!1),A=k(!1),oe=k(!1),ke=k([]),le=k([]),N=k({translations:{total:0,byIntent:{},byStatus:{draft:0,complete:0,refined:0},avgCompleteness:0},conventions:{total:0,byCategory:{}}}),re=k("translations"),V=k(""),K=k(""),Y=k(""),se=k(!1),Q=k(!1),X=k(!1),ie=k(!1),ue=xe({text:""}),O=xe({text:"",intent:null}),b=xe({category:"naming",pattern:"",examples:"",confidence:.8}),F=k(null),$=k(null),j=k(null),Z=k({noDb:!1,error:""}),z=k(null),Re=[{title:"原文",key:"inputText"},{title:"意图",key:"intent",width:"140px"},{title:"完整度",key:"completeness",width:"160px"},{title:"状态",key:"status",width:"100px"},{title:"更新时间",key:"updatedAt",width:"160px"},{title:"操作",key:"action",width:"210px"}],Ie=[{title:"类别",key:"category",width:"120px"},{title:"模式",key:"pattern"},{title:"示例",key:"examples",width:"220px"},{title:"置信度",key:"confidence",width:"90px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"90px"}],Ue=_e(()=>N.value.translations.avgCompleteness*100),De=_e(()=>{let r=ke.value;return V.value&&(r=r.filter(e=>e.intent===V.value)),K.value&&(r=r.filter(e=>e.status===K.value)),r}),Le=_e(()=>Y.value?le.value.filter(r=>r.category===Y.value):le.value);function B(r){return{create_component:"创建组件",add_feature:"新增功能",fix_bug:"修复 Bug",refactor:"重构",add_api:"加 API",add_test:"加测试",update_style:"改样式",configure:"配置",general:"通用"}[r]||r}function ee(r){return{create_component:"blue",add_feature:"green",fix_bug:"red",refactor:"purple",add_api:"cyan",add_test:"orange",update_style:"magenta",configure:"gold",general:"default"}[r]||"default"}function G(r){return{draft:"草稿",complete:"已完成",refined:"已精炼"}[r]||r}function Se(r){return{draft:"default",complete:"green",refined:"cyan"}[r]||"default"}function ce(r){return{naming:"命名",architecture:"架构",testing:"测试",style:"样式",imports:"导入",components:"组件"}[r]||r}function Ee(r){return{naming:"blue",architecture:"purple",testing:"cyan",style:"magenta",imports:"orange",components:"green"}[r]||"default"}function pe(r){return r>=.7?"#52c41a":r>=.4?"#faad14":"#ff4d4f"}function Je(r,e){return r?r.length>e?r.slice(0,e)+"...":r:""}function de(r){if(r==null)return"—";if(typeof r=="string")return r;try{return JSON.stringify(r,null,2)}catch{return String(r)}}function Be({key:r}){r==="analyze"?(F.value=null,$.value=null,j.value=null,se.value=!0):r==="translate"?(Z.value={noDb:!1,error:""},Q.value=!0):r==="convention"&&(X.value=!0)}async function U(){s.value=!0;try{const[r,e,y]=await Promise.all([o.execute("nlprog list --limit 200 --json",1e4).catch(()=>({output:""})),o.execute("nlprog conventions --limit 200 --json",1e4).catch(()=>({output:""})),o.execute("nlprog stats --json",8e3).catch(()=>({output:""}))]);ke.value=vt(r.output),le.value=bt(e.output),N.value=St(y.output)}catch(r){v.error("加载 NL 数据失败: "+(r?.message||r))}finally{s.value=!1}}async function Me(){const r=ue.text.trim();if(!r){v.warning("请输入文本");return}_.value=!0,F.value=null,$.value=null,j.value=null;try{const e=r.replace(/"/g,'\\"'),[y,R,D]=await Promise.all([o.execute(`nlprog classify "${e}" --json`,8e3).catch(()=>({output:""})),o.execute(`nlprog extract "${e}" --json`,8e3).catch(()=>({output:""})),o.execute(`nlprog detect-stack "${e}" --json`,8e3).catch(()=>({output:""}))]);F.value=dt(y.output),$.value=ft(R.output),j.value=yt(D.output),!F.value&&!$.value&&!j.value&&v.error("分析失败")}catch(e){v.error("分析失败: "+(e?.message||e))}finally{_.value=!1}}async function Pe(){const r=O.text.trim();if(!r){v.warning("请输入自然语言文本");return}A.value=!0,Z.value={noDb:!1,error:""};try{const e=[`nlprog translate "${r.replace(/"/g,'\\"')}"`];O.intent&&e.push(`--intent ${O.intent}`),e.push("--json");const{output:y}=await o.execute(e.join(" "),12e3),R=_t(y);if(R.noDb){Z.value=R;return}const D=gt(y);if(!D){v.error("翻译失败: "+y.slice(0,120));return}v.success(`翻译完成 (完整度 ${(D.completeness*100).toFixed(0)}%)`),Q.value=!1,ze(),await U()}catch(e){v.error("翻译失败: "+(e?.message||e))}finally{A.value=!1}}async function qe(r,e){if(e!==r.status)try{const{output:y}=await o.execute(`nlprog status ${r.id} ${e} --json`,8e3);if(/error|invalid/i.test(y)&&!/"updated"/.test(y)){v.error("状态转换失败: "+y.slice(0,120));return}v.success(`已更新为 ${G(e)}`),await U()}catch(y){v.error("状态转换失败: "+(y?.message||y))}}async function Ve(r){try{const{output:e}=await o.execute(`nlprog remove ${r.id} --json`,8e3);if(/error/i.test(e)&&!/"removed"/.test(e)){v.error("删除失败: "+e.slice(0,120));return}v.success("已删除"),await U()}catch(e){v.error("删除失败: "+(e?.message||e))}}function Ke(r){z.value=r,ie.value=!0}async function Ge(){const r=b.pattern.trim();if(!r){v.warning("请填写模式");return}if(b.examples.trim())try{JSON.parse(b.examples)}catch{v.warning("示例 JSON 格式错误");return}oe.value=!0;try{const e=[`nlprog convention-add --category ${b.category}`];e.push(`--pattern "${r.replace(/"/g,'\\"')}"`),b.examples.trim()&&e.push(`--examples '${b.examples.trim().replace(/'/g,"'\\''")}'`),b.confidence!=null&&e.push(`--confidence ${b.confidence}`),e.push("--json");const{output:y}=await o.execute(e.join(" "),1e4);if(/error|invalid|失败/i.test(y)&&!/"added"/.test(y)){v.error("添加失败: "+y.slice(0,120));return}v.success("约定已添加"),X.value=!1,Ce(),re.value="conventions",await U()}catch(e){v.error("添加失败: "+(e?.message||e))}finally{oe.value=!1}}async function He(r){try{const{output:e}=await o.execute(`nlprog convention-remove ${r.id} --json`,8e3);if(/error/i.test(e)&&!/"removed"/.test(e)){v.error("删除失败: "+e.slice(0,120));return}v.success("已删除"),await U()}catch(e){v.error("删除失败: "+(e?.message||e))}}function ze(){O.text="",O.intent=null}function Ce(){b.category="naming",b.pattern="",b.examples="",b.confidence=.8}return ct(U),(r,e)=>{const y=p("a-button"),R=p("a-menu-item"),D=p("a-menu"),Ae=p("a-dropdown"),he=p("a-space"),H=p("a-statistic"),L=p("a-card"),W=p("a-col"),We=p("a-row"),h=p("a-tag"),M=p("a-radio-button"),fe=p("a-radio-group"),Te=p("a-progress"),je=p("a-popconfirm"),we=p("a-table"),Ne=p("a-tab-pane"),Ye=p("a-tabs"),ye=p("a-textarea"),E=p("a-form-item"),me=p("a-form"),te=p("a-modal"),Oe=p("a-select-option"),Fe=p("a-select"),Qe=p("a-alert"),Xe=p("a-input"),Ze=p("a-input-number"),P=p("a-descriptions-item"),et=p("a-descriptions");return i(),f("div",null,[x("div",zt,[e[20]||(e[20]=x("div",null,[x("h2",{class:"page-title"},"自然语言编程"),x("p",{class:"page-sub"},"意图识别 · 实体抽取 · 技术栈检测 · 自然语言→规约")],-1)),n(he,null,{default:t(()=>[n(y,{loading:s.value,onClick:U},{icon:t(()=>[n(m(ot))]),default:t(()=>[e[15]||(e[15]=u(" 刷新 ",-1))]),_:1},8,["loading"]),n(Ae,{trigger:["click"]},{overlay:t(()=>[n(D,{onClick:Be},{default:t(()=>[n(R,{key:"analyze"},{default:t(()=>[n(m(rt)),e[17]||(e[17]=u(" 文本分析",-1))]),_:1}),n(R,{key:"translate"},{default:t(()=>[n(m(ve)),e[18]||(e[18]=u(" 翻译为规约",-1))]),_:1}),n(R,{key:"convention"},{default:t(()=>[n(m(ge)),e[19]||(e[19]=u(" 添加约定",-1))]),_:1})]),_:1})]),default:t(()=>[n(y,{type:"primary"},{icon:t(()=>[n(m(lt))]),default:t(()=>[e[16]||(e[16]=u(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),n(We,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[n(W,{xs:12,sm:8,lg:5},{default:t(()=>[n(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(H,{title:"翻译总数",value:N.value.translations.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:t(()=>[n(m(ve))]),_:1},8,["value"])]),_:1})]),_:1}),n(W,{xs:12,sm:8,lg:5},{default:t(()=>[n(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(H,{title:"平均完整度",value:Ue.value,precision:1,suffix:"%","value-style":{color:N.value.translations.avgCompleteness>=.7?"#52c41a":"#faad14",fontSize:"20px"}},{prefix:t(()=>[n(m(st))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),n(W,{xs:12,sm:8,lg:5},{default:t(()=>[n(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(H,{title:"草稿",value:N.value.translations.byStatus.draft,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:t(()=>[n(m(it))]),_:1},8,["value"])]),_:1})]),_:1}),n(W,{xs:12,sm:8,lg:5},{default:t(()=>[n(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(H,{title:"已完成",value:N.value.translations.byStatus.complete,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:t(()=>[n(m(ut))]),_:1},8,["value"])]),_:1})]),_:1}),n(W,{xs:24,sm:8,lg:4},{default:t(()=>[n(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(H,{title:"项目约定",value:N.value.conventions.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:t(()=>[n(m(ge))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),N.value.translations.total>0?(i(),S(L,{key:0,title:"意图分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:t(()=>[n(he,{size:[12,8],wrap:""},{default:t(()=>[(i(!0),f(C,null,w(m(ae),a=>(i(),S(h,{key:a,color:ee(a)},{default:t(()=>[u(c(B(a))+": "+c(N.value.translations.byIntent[a]||0),1)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):g("",!0),n(Ye,{activeKey:re.value,"onUpdate:activeKey":e[3]||(e[3]=a=>re.value=a),class:"nlprog-tabs"},{default:t(()=>[n(Ne,{key:"translations",tab:"翻译"},{default:t(()=>[x("div",Ct,[n(fe,{value:V.value,"onUpdate:value":e[0]||(e[0]=a=>V.value=a),size:"small"},{default:t(()=>[n(M,{value:""},{default:t(()=>[...e[21]||(e[21]=[u("全部意图",-1)])]),_:1}),(i(!0),f(C,null,w(m(ae),a=>(i(),S(M,{key:a,value:a},{default:t(()=>[u(c(B(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),n(fe,{value:K.value,"onUpdate:value":e[1]||(e[1]=a=>K.value=a),size:"small","button-style":"solid"},{default:t(()=>[n(M,{value:""},{default:t(()=>[...e[22]||(e[22]=[u("全部状态",-1)])]),_:1}),(i(!0),f(C,null,w(m($e),a=>(i(),S(M,{key:a,value:a},{default:t(()=>[u(c(G(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),n(we,{columns:Re,"data-source":De.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:s.value,style:{background:"var(--bg-card)"}},{bodyCell:t(({column:a,record:d})=>[a.key==="inputText"?(i(),f("span",At,c(Je(d.inputText,80)),1)):g("",!0),a.key==="intent"?(i(),S(h,{key:1,color:ee(d.intent),style:{"font-size":"11px"}},{default:t(()=>[u(c(B(d.intent)),1)]),_:2},1032,["color"])):g("",!0),a.key==="completeness"?(i(),S(Te,{key:2,percent:Math.round(d.completenessScore*100),size:"small","stroke-color":pe(d.completenessScore),format:()=>(d.completenessScore*100).toFixed(0)+"%"},null,8,["percent","stroke-color","format"])):g("",!0),a.key==="status"?(i(),S(h,{key:3,color:Se(d.status)},{default:t(()=>[u(c(G(d.status)),1)]),_:2},1032,["color"])):g("",!0),a.key==="updatedAt"?(i(),f("span",ht,c(m(ne)(d.updatedAt)),1)):g("",!0),a.key==="action"?(i(),f(C,{key:5},[n(y,{size:"small",type:"link",onClick:T=>Ke(d)},{default:t(()=>[...e[23]||(e[23]=[u("详情",-1)])]),_:1},8,["onClick"]),n(Ae,{trigger:["click"]},{overlay:t(()=>[n(D,{onClick:T=>qe(d,T.key)},{default:t(()=>[(i(!0),f(C,null,w(m($e),T=>(i(),S(R,{key:T,disabled:T===d.status},{default:t(()=>[u(c(G(T)),1)]),_:2},1032,["disabled"]))),128))]),_:2},1032,["onClick"])]),default:t(()=>[n(y,{size:"small",type:"link"},{default:t(()=>[...e[24]||(e[24]=[u("状态 ▼",-1)])]),_:1})]),_:2},1024),n(je,{title:"删除该翻译?","ok-text":"删除","cancel-text":"取消",onConfirm:T=>Ve(d)},{default:t(()=>[n(y,{size:"small",type:"link",danger:""},{default:t(()=>[...e[25]||(e[25]=[u("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])],64)):g("",!0)]),emptyText:t(()=>[x("div",Tt,[n(m(ve),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),u(" "+c(V.value||K.value?"没有符合条件的翻译":'暂无翻译,点"操作 → 翻译为规约"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(Ne,{key:"conventions",tab:"项目约定"},{default:t(()=>[x("div",jt,[n(fe,{value:Y.value,"onUpdate:value":e[2]||(e[2]=a=>Y.value=a),size:"small","button-style":"solid"},{default:t(()=>[n(M,{value:""},{default:t(()=>[...e[26]||(e[26]=[u("全部",-1)])]),_:1}),(i(!0),f(C,null,w(m(be),a=>(i(),S(M,{key:a,value:a},{default:t(()=>[u(c(ce(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),n(we,{columns:Ie,"data-source":Le.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:s.value,style:{background:"var(--bg-card)"}},{bodyCell:t(({column:a,record:d})=>[a.key==="category"?(i(),S(h,{key:0,color:Ee(d.category)},{default:t(()=>[u(c(ce(d.category)),1)]),_:2},1032,["color"])):g("",!0),a.key==="pattern"?(i(),f("span",wt,c(d.pattern),1)):g("",!0),a.key==="examples"?(i(),f(C,{key:2},[(i(!0),f(C,null,w(Array.isArray(d.examples)?d.examples.slice(0,3):[],T=>(i(),S(h,{key:T,color:"default",style:{"font-size":"10px","font-family":"monospace",margin:"1px"}},{default:t(()=>[u(c(T),1)]),_:2},1024))),128)),!Array.isArray(d.examples)||d.examples.length===0?(i(),f("span",Nt,"—")):g("",!0)],64)):g("",!0),a.key==="confidence"?(i(),f("span",{key:3,style:pt({color:pe(d.confidence),fontWeight:500})},c((d.confidence*100).toFixed(0))+"% ",5)):g("",!0),a.key==="createdAt"?(i(),f("span",Ot,c(m(ne)(d.createdAt)),1)):g("",!0),a.key==="action"?(i(),S(je,{key:5,title:"删除该约定?","ok-text":"删除","cancel-text":"取消",onConfirm:T=>He(d)},{default:t(()=>[n(y,{size:"small",type:"link",danger:""},{default:t(()=>[...e[27]||(e[27]=[u("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])):g("",!0)]),emptyText:t(()=>[x("div",Ft,[n(m(ge),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[28]||(e[28]=u(' 暂无约定,点"操作 → 添加约定"创建第一个 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),n(te,{open:se.value,"onUpdate:open":e[5]||(e[5]=a=>se.value=a),title:"文本分析(无状态)","confirm-loading":_.value,width:600,"ok-text":"分析","cancel-text":"关闭",onOk:Me},{default:t(()=>[n(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:t(()=>[n(E,{label:"文本",required:""},{default:t(()=>[n(ye,{value:ue.text,"onUpdate:value":e[4]||(e[4]=a=>ue.text=a),placeholder:"例如: create a login button component using React","auto-size":{minRows:3,maxRows:6}},null,8,["value"])]),_:1})]),_:1}),F.value||$.value||j.value?(i(),S(L,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:t(()=>[F.value?(i(),f("div",$t,[e[29]||(e[29]=x("div",{style:{"font-size":"12px",color:"var(--text-secondary)","margin-bottom":"4px"}},"意图",-1)),n(h,{color:ee(F.value.intent),style:{"margin-right":"6px"}},{default:t(()=>[u(c(B(F.value.intent)),1)]),_:1},8,["color"]),x("span",Rt,"置信度: "+c((F.value.confidence*100).toFixed(0))+"%",1)])):g("",!0),$.value?(i(),f("div",It,[x("div",Ut,"实体("+c($.value.count)+")",1),$.value.entities.length?g("",!0):(i(),f("span",Dt,"未识别到")),(i(!0),f(C,null,w($.value.entities,(a,d)=>(i(),S(h,{key:d,color:"purple",style:{"font-family":"monospace","font-size":"11px",margin:"1px"}},{default:t(()=>[u(" ["+c(a.type)+"] "+c(a.value),1)]),_:2},1024))),128))])):g("",!0),j.value?(i(),f("div",Lt,[e[30]||(e[30]=x("div",{style:{"font-size":"12px",color:"var(--text-secondary)","margin-bottom":"4px"}},"技术栈",-1)),j.value.detected.length?(i(),f(C,{key:1},[n(h,{color:"cyan",style:{"font-family":"monospace"}},{default:t(()=>[u("主: "+c(j.value.primary),1)]),_:1}),(i(!0),f(C,null,w(j.value.detected.filter(a=>a!==j.value.primary),a=>(i(),S(h,{key:a,color:"default",style:{"font-family":"monospace","font-size":"11px"}},{default:t(()=>[u(c(a),1)]),_:2},1024))),128))],64)):(i(),f("span",Et,"未识别到"))])):g("",!0)]),_:1})):g("",!0)]),_:1},8,["open","confirm-loading"]),n(te,{open:Q.value,"onUpdate:open":e[8]||(e[8]=a=>Q.value=a),title:"翻译为规约","confirm-loading":A.value,width:540,"ok-text":"翻译","cancel-text":"取消",onOk:Pe,onCancel:ze},{default:t(()=>[n(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:t(()=>[n(E,{label:"自然语言",required:""},{default:t(()=>[n(ye,{value:O.text,"onUpdate:value":e[6]||(e[6]=a=>O.text=a),placeholder:"例如: create a Vue 3 LoginForm component with email and password fields","auto-size":{minRows:3,maxRows:6}},null,8,["value"])]),_:1}),n(E,{label:"意图覆盖"},{default:t(()=>[n(Fe,{value:O.intent,"onUpdate:value":e[7]||(e[7]=a=>O.intent=a),"allow-clear":"",placeholder:"留空则自动识别"},{default:t(()=>[(i(!0),f(C,null,w(m(ae),a=>(i(),S(Oe,{key:a,value:a},{default:t(()=>[u(c(B(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1})]),_:1}),Z.value.noDb?(i(),S(Qe,{key:0,type:"warning","show-icon":"",message:"该命令需要项目级数据库",description:"`cc nlprog translate` 仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-top":"12px"}})):g("",!0)]),_:1},8,["open","confirm-loading"]),n(te,{open:X.value,"onUpdate:open":e[13]||(e[13]=a=>X.value=a),title:"添加项目约定","confirm-loading":oe.value,width:540,"ok-text":"添加","cancel-text":"取消",onOk:Ge,onCancel:Ce},{default:t(()=>[n(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:t(()=>[n(E,{label:"类别",required:""},{default:t(()=>[n(Fe,{value:b.category,"onUpdate:value":e[9]||(e[9]=a=>b.category=a)},{default:t(()=>[(i(!0),f(C,null,w(m(be),a=>(i(),S(Oe,{key:a,value:a},{default:t(()=>[u(c(ce(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),n(E,{label:"模式",required:""},{default:t(()=>[n(Xe,{value:b.pattern,"onUpdate:value":e[10]||(e[10]=a=>b.pattern=a),placeholder:"例如: kebab-case for file names"},null,8,["value"])]),_:1}),n(E,{label:"示例"},{default:t(()=>[n(ye,{value:b.examples,"onUpdate:value":e[11]||(e[11]=a=>b.examples=a),placeholder:'JSON 数组,例如 ["login-form.vue","user-card.vue"]',"auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),n(E,{label:"置信度"},{default:t(()=>[n(Ze,{value:b.confidence,"onUpdate:value":e[12]||(e[12]=a=>b.confidence=a),min:0,max:1,step:.05,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),n(te,{open:ie.value,"onUpdate:open":e[14]||(e[14]=a=>ie.value=a),title:`翻译详情:${z.value?.id?.slice(0,8)||""}`,width:720,footer:null},{default:t(()=>[z.value?(i(),f("div",Jt,[n(et,{column:2,size:"small",bordered:""},{default:t(()=>[n(P,{label:"意图"},{default:t(()=>[n(h,{color:ee(z.value.intent)},{default:t(()=>[u(c(B(z.value.intent)),1)]),_:1},8,["color"])]),_:1}),n(P,{label:"状态"},{default:t(()=>[n(h,{color:Se(z.value.status)},{default:t(()=>[u(c(G(z.value.status)),1)]),_:1},8,["color"])]),_:1}),n(P,{label:"完整度",span:2},{default:t(()=>[n(Te,{percent:Math.round(z.value.completenessScore*100),"stroke-color":pe(z.value.completenessScore),size:"small"},null,8,["percent","stroke-color"])]),_:1}),n(P,{label:"创建时间"},{default:t(()=>[u(c(m(ne)(z.value.createdAt)),1)]),_:1}),n(P,{label:"更新时间"},{default:t(()=>[u(c(m(ne)(z.value.updatedAt)),1)]),_:1}),n(P,{label:"原文",span:2},{default:t(()=>[x("span",Bt,c(z.value.inputText),1)]),_:1})]),_:1}),x("div",Mt,[e[31]||(e[31]=x("h4",{style:{color:"var(--text-primary)","font-size":"13px","margin-bottom":"8px"}},"实体",-1)),x("pre",Pt,c(de(z.value.entities)),1)]),x("div",null,[e[32]||(e[32]=x("h4",{style:{color:"var(--text-primary)","font-size":"13px","margin-bottom":"8px"}},"技术栈",-1)),x("pre",qt,c(de(z.value.techStack)),1)]),z.value.spec?(i(),f("div",Vt,[e[33]||(e[33]=x("h4",{style:{color:"var(--text-primary)","font-size":"13px","margin-bottom":"8px"}},"规约",-1)),x("pre",Kt,c(de(z.value.spec)),1)])):g("",!0)])):g("",!0)]),_:1},8,["open","title"])])}}},rn=at(Gt,[["__scopeId","data-v-87b8b4dc"]]);export{rn as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as He}from"./ws-Bv7YH0VB.js";import{s as be}from"./community-parser-CO25nZFt.js";import{_ as We}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as O}from"./index-DLcTmwiN.js";import{O as Ye,aa as Qe,j as ye,a7 as Xe,x as Ze,a as et,n as ge,L as K,av as tt,a8 as at,$ as nt,au as lt,i as ot}from"./icons-E3MGhN6s.js";import{l as st,F as _,D as k,c as o,x as n,m as f,G as y,q as g,r as A,v as i,J as c,u as p,H as B,L as N,E as it,I as d,j as rt,a as ut}from"./vendor-BVetwVfk.js";import"./index-DPaLf3-g.js";import"./useConfigInject-DIKG5Y4I.js";import"./transition-atE2sWdv.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function H(e){const s=be(e);if(!s)return null;try{return JSON.parse(s)}catch{}const r=s.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}const ke=Object.freeze(["pending","running","paused","completed","failed","cancelled"]),pt=Object.freeze(["pending","running","gate-waiting","completed","failed","skipped"]),me=Object.freeze(["requirement","architecture","code-generation","testing","code-review","deploy","monitoring"]),te=Object.freeze(["feature","bugfix","refactor","security-audit"]),ct=Object.freeze(["git-pr","docker","npm-publish","local","staging","custom"]),_e=Object.freeze(["code-review","deploy"]);function $(e,s=0){return typeof e=="number"&&Number.isFinite(e)?e:s}function ve(e){if(!e)return{noDb:!1,error:""};const s=be(e),r=/No database/i.test(s);return{noDb:r,error:r?"No database":""}}function dt(e,s=0){if(!e||typeof e!="object")return null;const r=e.id||"";return r?{key:r,id:r,pipelineId:String(e.pipelineId||""),stageIndex:$(e.stageIndex,s),name:String(e.name||""),status:String(e.status||"pending").toLowerCase(),gateRequired:!!e.gateRequired,gateApproved:!!e.gateApproved,gateRejectReason:e.gateRejectReason||"",input:e.input??null,output:e.output??null,errorMessage:e.errorMessage||"",startedAt:e.startedAt??null,completedAt:e.completedAt??null,_idx:s}:null}function ft(e,s=0){if(!e||typeof e!="object")return null;const r=e.id||"";if(!r)return null;const m=Array.isArray(e.stages)?e.stages.map(dt).filter(Boolean):[];return{key:r,id:r,name:e.name||"",template:String(e.template||""),config:e.config??null,status:String(e.status||"pending").toLowerCase(),currentStage:$(e.currentStage,0),result:e.result??null,errorMessage:e.errorMessage||"",createdAt:e.createdAt??null,updatedAt:e.updatedAt??null,startedAt:e.startedAt??null,completedAt:e.completedAt??null,stages:m,_idx:s}}function yt(e){const s=H(e);return Array.isArray(s)?s.map(ft).filter(Boolean):[]}function gt(e,s=0){if(!e||typeof e!="object")return null;const r=e.id||"";return r?{key:r,id:r,pipelineId:String(e.pipelineId||""),strategy:String(e.strategy||"").toLowerCase(),config:e.config??null,status:String(e.status||"pending").toLowerCase(),result:e.result??null,errorMessage:e.errorMessage||"",rolledBackAt:e.rolledBackAt??null,rollbackReason:e.rollbackReason||"",createdAt:e.createdAt??null,completedAt:e.completedAt??null,_idx:s}:null}function mt(e){const s=H(e);return Array.isArray(s)?s.map(gt).filter(Boolean):[]}function _t(e,s=0){if(!e||typeof e!="object")return null;const r=e.name||"";return r?{key:r,name:r,description:String(e.description||""),stages:Array.isArray(e.stages)?e.stages.filter(m=>typeof m=="string"):[],gateStages:Array.isArray(e.gateStages)?e.gateStages.filter(m=>typeof m=="string"):[],_idx:s}:null}function vt(e){const s=H(e);return Array.isArray(s)?s.map(_t).filter(Boolean):[]}const bt={totalPipelines:0,pipelinesByTemplate:{},pipelinesByStatus:{},totalStages:0,stagesByStatus:{},totalArtifacts:0,totalDeploys:0,deploysByStrategy:{}};function kt(e){const s=JSON.parse(JSON.stringify(bt));for(const m of te)s.pipelinesByTemplate[m]=0;for(const m of ke)s.pipelinesByStatus[m]=0;for(const m of pt)s.stagesByStatus[m]=0;for(const m of ct)s.deploysByStrategy[m]=0;const r=H(e);if(!r||typeof r!="object"||Array.isArray(r))return s;if(s.totalPipelines=$(r.totalPipelines,0),s.totalStages=$(r.totalStages,0),s.totalArtifacts=$(r.totalArtifacts,0),s.totalDeploys=$(r.totalDeploys,0),r.pipelinesByTemplate&&typeof r.pipelinesByTemplate=="object")for(const[m,v]of Object.entries(r.pipelinesByTemplate))typeof v=="number"&&Number.isFinite(v)&&(s.pipelinesByTemplate[m]=v);if(r.pipelinesByStatus&&typeof r.pipelinesByStatus=="object")for(const[m,v]of Object.entries(r.pipelinesByStatus))typeof v=="number"&&Number.isFinite(v)&&(s.pipelinesByStatus[m]=v);if(r.stagesByStatus&&typeof r.stagesByStatus=="object")for(const[m,v]of Object.entries(r.stagesByStatus))typeof v=="number"&&Number.isFinite(v)&&(s.stagesByStatus[m]=v);if(r.deploysByStrategy&&typeof r.deploysByStrategy=="object")for(const[m,v]of Object.entries(r.deploysByStrategy))typeof v=="number"&&Number.isFinite(v)&&(s.deploysByStrategy[m]=v);return s}function R(e){if(e==null||e==="")return"—";const s=typeof e=="number"?new Date(e):new Date(String(e));return isNaN(s.getTime())?String(e):s.toLocaleString("zh-CN",{hour12:!1})}const xt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},St={class:"stage-flow"},At={class:"stage-idx"},zt={class:"filter-bar"},Ct={style:{color:"var(--text-primary)","font-weight":"500"}},Bt={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace","margin-top":"2px"}},Ot={key:1,style:{color:"var(--text-muted)"}},Tt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ht={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Pt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},jt={key:3,style:{color:"var(--text-secondary)","font-size":"11px"}},Nt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Dt={style:{color:"var(--text-secondary)","font-size":"12px",margin:"0 0 10px"}},Rt={class:"tpl-stages"},$t={key:0,style:{"padding-top":"8px"}},Et={style:{display:"flex","align-items":"center",gap:"8px","flex-wrap":"wrap"}},Lt={style:{color:"var(--text-primary)","font-weight":"500"}},Jt={key:0,style:{color:"#52c41a","margin-left":"4px"}},Mt={key:0,style:{color:"#ff4d4f","font-size":"11px","margin-top":"4px"}},It={key:1,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},wt={key:0},Ft={__name:"Pipeline",setup(e){const s=He(),r=A(!1),m=A(!1),v=A([]),ae=A([]),ne=A([]),h=A({totalPipelines:0,pipelinesByTemplate:{},pipelinesByStatus:{},totalStages:0,stagesByStatus:{},totalArtifacts:0,totalDeploys:0,deploysByStrategy:{}}),W=A({noDb:!1,error:""}),le=A("pipelines"),E=A(""),L=A(""),w=A(!1),Y=A(!1),b=ut({template:"feature",name:"",configJson:""}),S=A(null),xe=[{title:"名称",key:"name"},{title:"模板",key:"template",width:"110px"},{title:"进度",key:"progress",width:"160px"},{title:"当前阶段",key:"currentStage",width:"140px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"260px"}],Se=[{title:"流水线",key:"pipeline",width:"180px"},{title:"策略",key:"strategy",width:"120px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt"}],Ae=rt(()=>{let t=v.value;return E.value&&(t=t.filter(l=>l.template===E.value)),L.value&&(t=t.filter(l=>l.status===L.value)),t});function J(t){return{feature:"功能开发",bugfix:"缺陷修复",refactor:"重构","security-audit":"安全审计"}[t]||t}function Q(t){return{feature:"green",bugfix:"red",refactor:"purple","security-audit":"volcano"}[t]||"default"}function F(t){return{requirement:"需求",architecture:"架构","code-generation":"代码生成",testing:"测试","code-review":"代码评审",deploy:"部署",monitoring:"监控"}[t]||t}function X(t){return{pending:"待启动",running:"运行中",paused:"已暂停",completed:"已完成",failed:"失败",cancelled:"已取消"}[t]||t}function oe(t){return{pending:"default",running:"processing",paused:"orange",completed:"green",failed:"red",cancelled:"default"}[t]||"default"}function ze(t){return{pending:"待处理",running:"运行中","gate-waiting":"等待审批",completed:"已完成",failed:"失败",skipped:"跳过"}[t]||t}function se(t){return{pending:"default",running:"processing","gate-waiting":"gold",completed:"green",failed:"red",skipped:"default"}[t]||"default"}function Ce(t){return{pending:"待部署",running:"部署中",succeeded:"成功",failed:"失败","rolled-back":"已回滚"}[t]||t}function Be(t){return{pending:"default",running:"processing",succeeded:"green",failed:"red","rolled-back":"orange"}[t]||"default"}function Oe(t){return{"git-pr":"blue",docker:"cyan","npm-publish":"magenta",local:"default",staging:"orange",custom:"purple"}[t]||"default"}function Te(t){return{pending:"gray",running:"blue","gate-waiting":"gold",completed:"green",failed:"red",skipped:"gray"}[t]||"gray"}function ie(t){if(!t.stages.length)return 0;const l=t.stages.filter(x=>x.status==="completed").length;return Math.round(100*l/t.stages.length)}function U(t){if(!t.stages.length)return null;const l=Math.min(t.currentStage,t.stages.length-1);return t.stages[l]||null}function he(t){if(t.status!=="running")return!1;const l=U(t);return l&&l.status==="gate-waiting"&&l.gateRequired&&!l.gateApproved}function Pe(t){return t.status==="pending"||t.status==="running"||t.status==="paused"}async function q(){r.value=!0,W.value={noDb:!1,error:""};try{const[t,l,x,z]=await Promise.all([s.execute("pipeline list",1e4).catch(()=>({output:""})),s.execute("pipeline deploys",1e4).catch(()=>({output:""})),s.execute("pipeline templates",8e3).catch(()=>({output:""})),s.execute("pipeline stats",8e3).catch(()=>({output:""}))]),G=[t,l,z].map(T=>ve(T.output)).find(T=>T.noDb);G&&(W.value=G),v.value=yt(t.output),ae.value=mt(l.output),ne.value=vt(x.output),h.value=kt(z.output)}catch(t){O.error("加载流水线数据失败: "+(t?.message||t))}finally{r.value=!1}}async function je(){if(!b.template){O.warning("请选择模板");return}if(b.configJson.trim())try{JSON.parse(b.configJson)}catch{O.warning("配置 JSON 格式错误");return}m.value=!0;try{const t=[`pipeline create --template ${b.template}`];b.name.trim()&&t.push(`--name "${b.name.trim().replace(/"/g,'\\"')}"`),b.configJson.trim()&&t.push(`--config '${b.configJson.trim().replace(/'/g,"'\\''")}'`);const{output:l}=await s.execute(t.join(" "),1e4);if(ve(l).noDb){O.error("需要先 cc init 初始化项目");return}if(/error|Error|失败/i.test(l)&&!/"id"/.test(l)){O.error("创建失败: "+l.slice(0,120));return}O.success("流水线已创建"),w.value=!1,re(),await q()}catch(t){O.error("创建失败: "+(t?.message||t))}finally{m.value=!1}}async function Ne(t){await M(t,`pipeline start ${t.id}`,"已启动")}async function De(t){await M(t,`pipeline pause ${t.id}`,"已暂停")}async function Re(t){await M(t,`pipeline resume ${t.id}`,"已恢复")}async function $e(t){await M(t,`pipeline approve ${t.id}`,"门已批准")}async function Ee(t){await M(t,`pipeline cancel ${t.id}`,"已取消")}async function M(t,l,x){try{const{output:z}=await s.execute(l,8e3);if(/error|Error|失败/i.test(z)&&!/"id"/.test(z)){O.error("操作失败: "+z.slice(0,120));return}O.success(x),await q()}catch(z){O.error("操作失败: "+(z?.message||z))}}function Le(t){S.value=t,Y.value=!0}function re(){b.template="feature",b.name="",b.configJson=""}return st(q),(t,l)=>{const x=g("a-button"),z=g("a-space"),G=g("a-alert"),T=g("a-statistic"),P=g("a-card"),D=g("a-col"),ue=g("a-row"),V=g("a-radio-button"),pe=g("a-radio-group"),C=g("a-tag"),ce=g("a-progress"),Je=g("a-popconfirm"),de=g("a-table"),Z=g("a-tab-pane"),Me=g("a-tabs"),Ie=g("a-select-option"),we=g("a-select"),ee=g("a-form-item"),Fe=g("a-input"),Ue=g("a-textarea"),qe=g("a-form"),fe=g("a-modal"),I=g("a-descriptions-item"),Ge=g("a-descriptions"),Ve=g("a-timeline-item"),Ke=g("a-timeline");return i(),_("div",null,[k("div",xt,[l[11]||(l[11]=k("div",null,[k("h2",{class:"page-title"},"开发流水线"),k("p",{class:"page-sub"},"7 阶段 AI 开发流水线 · 质量门 · 部署策略")],-1)),o(z,null,{default:n(()=>[o(x,{loading:r.value,onClick:q},{icon:n(()=>[o(p(Ye))]),default:n(()=>[l[9]||(l[9]=c(" 刷新 ",-1))]),_:1},8,["loading"]),o(x,{type:"primary",onClick:l[0]||(l[0]=a=>w.value=!0)},{icon:n(()=>[o(p(Qe))]),default:n(()=>[l[10]||(l[10]=c(" 创建流水线 ",-1))]),_:1})]),_:1})]),W.value.noDb?(i(),f(G,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc pipeline ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):y("",!0),o(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[o(D,{xs:12,sm:8,lg:5},{default:n(()=>[o(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(T,{title:"流水线总数",value:h.value.totalPipelines,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[o(p(ye))]),_:1},8,["value"])]),_:1})]),_:1}),o(D,{xs:12,sm:8,lg:5},{default:n(()=>[o(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(T,{title:"运行中",value:h.value.pipelinesByStatus.running||0,"value-style":{color:(h.value.pipelinesByStatus.running||0)>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:n(()=>[o(p(Xe))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(D,{xs:12,sm:8,lg:5},{default:n(()=>[o(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(T,{title:"阶段总数",value:h.value.totalStages,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:n(()=>[o(p(Ze))]),_:1},8,["value"])]),_:1})]),_:1}),o(D,{xs:12,sm:8,lg:5},{default:n(()=>[o(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(T,{title:"制品",value:h.value.totalArtifacts,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[o(p(et))]),_:1},8,["value"])]),_:1})]),_:1}),o(D,{xs:24,sm:8,lg:4},{default:n(()=>[o(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(T,{title:"部署",value:h.value.totalDeploys,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:n(()=>[o(p(ge))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),o(P,{title:"7 阶段流水线",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[k("div",St,[(i(!0),_(B,null,N(p(me),(a,u)=>(i(),_(B,{key:a},[k("span",{class:it(["stage-pill",{"is-gate":p(_e).includes(a)}])},[k("span",At,d(u+1),1),c(" "+d(F(a))+" ",1),p(_e).includes(a)?(i(),f(p(K),{key:0,class:"gate-icon"})):y("",!0)],2),u<p(me).length-1?(i(),f(p(tt),{key:0,class:"stage-arrow"})):y("",!0)],64))),128))])]),_:1}),o(Me,{activeKey:le.value,"onUpdate:activeKey":l[3]||(l[3]=a=>le.value=a),class:"pipeline-tabs"},{default:n(()=>[o(Z,{key:"pipelines",tab:"流水线"},{default:n(()=>[k("div",zt,[o(pe,{value:E.value,"onUpdate:value":l[1]||(l[1]=a=>E.value=a),size:"small","button-style":"solid"},{default:n(()=>[o(V,{value:""},{default:n(()=>[...l[12]||(l[12]=[c("全部模板",-1)])]),_:1}),(i(!0),_(B,null,N(p(te),a=>(i(),f(V,{key:a,value:a},{default:n(()=>[c(d(J(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(pe,{value:L.value,"onUpdate:value":l[2]||(l[2]=a=>L.value=a),size:"small"},{default:n(()=>[o(V,{value:""},{default:n(()=>[...l[13]||(l[13]=[c("全部状态",-1)])]),_:1}),(i(!0),_(B,null,N(p(ke),a=>(i(),f(V,{key:a,value:a},{default:n(()=>[c(d(X(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(de,{columns:xe,"data-source":Ae.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:u})=>[a.key==="name"?(i(),_(B,{key:0},[k("span",Ct,d(u.name||"(未命名)"),1),k("div",Bt,d(u.id.slice(0,16)),1)],64)):y("",!0),a.key==="template"?(i(),f(C,{key:1,color:Q(u.template)},{default:n(()=>[c(d(J(u.template)),1)]),_:2},1032,["color"])):y("",!0),a.key==="progress"?(i(),f(ce,{key:2,percent:ie(u),size:"small",status:u.status==="failed"?"exception":u.status==="completed"?"success":"active",format:()=>`${u.currentStage}/${u.stages.length}`},null,8,["percent","status","format"])):y("",!0),a.key==="currentStage"?(i(),_(B,{key:3},[U(u)?(i(),f(C,{key:0,color:se(U(u).status)},{default:n(()=>[c(d(F(U(u).name)),1)]),_:2},1032,["color"])):(i(),_("span",Ot,"—"))],64)):y("",!0),a.key==="status"?(i(),f(C,{key:4,color:oe(u.status)},{default:n(()=>[c(d(X(u.status)),1)]),_:2},1032,["color"])):y("",!0),a.key==="createdAt"?(i(),_("span",Tt,d(p(R)(u.createdAt)),1)):y("",!0),a.key==="action"?(i(),_(B,{key:6},[o(x,{size:"small",type:"link",onClick:j=>Le(u)},{default:n(()=>[...l[14]||(l[14]=[c("详情",-1)])]),_:1},8,["onClick"]),u.status==="pending"?(i(),f(x,{key:0,size:"small",type:"link",onClick:j=>Ne(u)},{default:n(()=>[...l[15]||(l[15]=[c("启动",-1)])]),_:1},8,["onClick"])):y("",!0),u.status==="running"?(i(),f(x,{key:1,size:"small",type:"link",onClick:j=>De(u)},{default:n(()=>[...l[16]||(l[16]=[c("暂停",-1)])]),_:1},8,["onClick"])):y("",!0),u.status==="paused"?(i(),f(x,{key:2,size:"small",type:"link",onClick:j=>Re(u)},{default:n(()=>[...l[17]||(l[17]=[c("继续",-1)])]),_:1},8,["onClick"])):y("",!0),he(u)?(i(),f(x,{key:3,size:"small",type:"link",style:{color:"#52c41a"},onClick:j=>$e(u)},{default:n(()=>[...l[18]||(l[18]=[c("批准门",-1)])]),_:1},8,["onClick"])):y("",!0),Pe(u)?(i(),f(Je,{key:4,title:"取消该流水线?","ok-text":"取消","cancel-text":"返回",onConfirm:j=>Ee(u)},{default:n(()=>[o(x,{size:"small",type:"link",danger:""},{default:n(()=>[...l[19]||(l[19]=[c("取消",-1)])]),_:1})]),_:1},8,["onConfirm"])):y("",!0)],64)):y("",!0)]),emptyText:n(()=>[k("div",ht,[o(p(ye),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),c(" "+d(E.value||L.value?"没有符合条件的流水线":'暂无流水线,点"创建流水线"创建第一条'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(Z,{key:"deploys",tab:"部署"},{default:n(()=>[o(de,{columns:Se,"data-source":ae.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:u})=>[a.key==="pipeline"?(i(),_("span",Pt,d(u.pipelineId.slice(0,12)),1)):y("",!0),a.key==="strategy"?(i(),f(C,{key:1,color:Oe(u.strategy),style:{"font-family":"monospace"}},{default:n(()=>[c(d(u.strategy),1)]),_:2},1032,["color"])):y("",!0),a.key==="status"?(i(),f(C,{key:2,color:Be(u.status)},{default:n(()=>[c(d(Ce(u.status)),1)]),_:2},1032,["color"])):y("",!0),a.key==="createdAt"?(i(),_("span",jt,d(p(R)(u.createdAt)),1)):y("",!0)]),emptyText:n(()=>[k("div",Nt,[o(p(ge),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),l[20]||(l[20]=c(" 暂无部署记录 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(Z,{key:"templates",tab:"模板"},{default:n(()=>[o(ue,{gutter:[16,16]},{default:n(()=>[(i(!0),_(B,null,N(ne.value,a=>(i(),f(D,{key:a.name,xs:24,sm:12,lg:12},{default:n(()=>[o(P,{title:J(a.name),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:n(()=>[o(C,{color:Q(a.name)},{default:n(()=>[c(d(a.name),1)]),_:2},1032,["color"])]),default:n(()=>[k("p",Dt,d(a.description),1),k("div",Rt,[(i(!0),_(B,null,N(a.stages,(u,j)=>(i(),f(C,{key:u,color:a.gateStages.includes(u)?"gold":"blue",style:{"font-size":"11px"}},{default:n(()=>[c(d(j+1)+". "+d(F(u))+" ",1),a.gateStages.includes(u)?(i(),f(p(K),{key:0,style:{"font-size":"10px","margin-left":"2px"}})):y("",!0)]),_:2},1032,["color"]))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1})]),_:1},8,["activeKey"]),o(fe,{open:w.value,"onUpdate:open":l[7]||(l[7]=a=>w.value=a),title:"创建流水线","confirm-loading":m.value,width:540,"ok-text":"创建","cancel-text":"取消",onOk:je,onCancel:re},{default:n(()=>[o(qe,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(ee,{label:"模板",required:""},{default:n(()=>[o(we,{value:b.template,"onUpdate:value":l[4]||(l[4]=a=>b.template=a)},{default:n(()=>[(i(!0),_(B,null,N(p(te),a=>(i(),f(Ie,{key:a,value:a},{default:n(()=>[c(d(J(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(ee,{label:"名称"},{default:n(()=>[o(Fe,{value:b.name,"onUpdate:value":l[5]||(l[5]=a=>b.name=a),placeholder:"可选,例如: 修复登录 Bug"},null,8,["value"])]),_:1}),o(ee,{label:"配置 (JSON)"},{default:n(()=>[o(Ue,{value:b.configJson,"onUpdate:value":l[6]||(l[6]=a=>b.configJson=a),placeholder:'例如 {"repo":"web","ticket":"PROJ-123"}',"auto-size":{minRows:2,maxRows:5}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(fe,{open:Y.value,"onUpdate:open":l[8]||(l[8]=a=>Y.value=a),title:`流水线详情:${S.value?.name||S.value?.id?.slice(0,12)||""}`,width:780,footer:null},{default:n(()=>[S.value?(i(),_("div",$t,[o(Ge,{column:2,size:"small",bordered:""},{default:n(()=>[o(I,{label:"模板"},{default:n(()=>[o(C,{color:Q(S.value.template)},{default:n(()=>[c(d(J(S.value.template)),1)]),_:1},8,["color"])]),_:1}),o(I,{label:"状态"},{default:n(()=>[o(C,{color:oe(S.value.status)},{default:n(()=>[c(d(X(S.value.status)),1)]),_:1},8,["color"])]),_:1}),o(I,{label:"进度",span:2},{default:n(()=>[o(ce,{percent:ie(S.value),status:S.value.status==="failed"?"exception":S.value.status==="completed"?"success":"active",size:"small"},null,8,["percent","status"])]),_:1}),o(I,{label:"创建时间"},{default:n(()=>[c(d(p(R)(S.value.createdAt)),1)]),_:1}),o(I,{label:"开始时间"},{default:n(()=>[c(d(p(R)(S.value.startedAt)),1)]),_:1})]),_:1}),l[22]||(l[22]=k("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"20px 0 10px"}},"阶段详情",-1)),o(Ke,{mode:"left"},{default:n(()=>[(i(!0),_(B,null,N(S.value.stages,a=>(i(),f(Ve,{key:a.id,color:Te(a.status)},{dot:n(()=>[a.status==="completed"?(i(),f(p(at),{key:0,style:{color:"#52c41a"}})):a.status==="running"?(i(),f(p(nt),{key:1,style:{color:"#1677ff"}})):a.status==="failed"?(i(),f(p(lt),{key:2,style:{color:"#ff4d4f"}})):a.status==="gate-waiting"?(i(),f(p(K),{key:3,style:{color:"#faad14"}})):(i(),f(p(ot),{key:4,style:{color:"var(--text-muted)"}}))]),default:n(()=>[k("div",Et,[k("span",Lt,d(a.stageIndex+1)+". "+d(F(a.name)),1),o(C,{color:se(a.status),style:{"font-size":"11px"}},{default:n(()=>[c(d(ze(a.status)),1)]),_:2},1032,["color"]),a.gateRequired?(i(),f(C,{key:0,color:"gold",style:{"font-size":"10px"}},{default:n(()=>[o(p(K)),l[21]||(l[21]=c(" 需要审批 ",-1)),a.gateApproved?(i(),_("span",Jt,"(已批准)")):y("",!0)]),_:2},1024)):y("",!0)]),a.errorMessage?(i(),_("div",Mt," 错误: "+d(a.errorMessage),1)):y("",!0),a.startedAt?(i(),_("div",It,[c(d(p(R)(a.startedAt))+" ",1),a.completedAt?(i(),_("span",wt," → "+d(p(R)(a.completedAt)),1)):y("",!0)])):y("",!0)]),_:2},1032,["color"]))),128))]),_:1})])):y("",!0)]),_:1},8,["open","title"])])}}},ta=We(Ft,[["__scopeId","data-v-d34a9ea1"]]);export{ta as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as Ye}from"./ws-Bv7YH0VB.js";import{s as Ze}from"./community-parser-CO25nZFt.js";import{_ as et}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as f}from"./index-DLcTmwiN.js";import{O as tt,aa as at,E as ue,j as pe,L as Re,r as lt,aH as nt}from"./icons-E3MGhN6s.js";import{l as ot,F as c,D as y,c as a,x as l,q as v,r as b,v as s,J as m,u as x,I as p,H as R,L as P,m as C,G as h,N as it,j as Y,a as Z}from"./vendor-BVetwVfk.js";import"./index-DPaLf3-g.js";import"./useConfigInject-DIKG5Y4I.js";import"./transition-atE2sWdv.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function J(n){const i=Ze(n);if(!i)return null;try{return JSON.parse(i)}catch{}const r=i.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}const st=Object.freeze(["initializing","training","aggregating","completed","failed"]),rt=Object.freeze(["pending","computing","completed"]),Ae=Object.freeze(["shamir","beaver","gmw"]),ut=Object.freeze(["laplace","gaussian","exponential"]),pt=Object.freeze(["paillier","bfv","ckks"]),dt=Object.freeze(["sum","product","mean","count"]);function g(n,i=0){return typeof n=="number"&&Number.isFinite(n)?n:i}function ct(n,i=0){if(!n||typeof n!="object")return null;const r=n.id||"";return r?{key:r,id:r,name:String(n.name||r),description:String(n.description||""),_idx:i}:null}function de(n){const i=J(n);return Array.isArray(i)?i.map(ct).filter(Boolean):[]}function mt(n,i=0){if(!n||typeof n!="object")return null;const r=n.id||"";return r?{key:r,id:r,name:String(n.name||""),modelType:n.modelType??n.model_type??"neural_network",architecture:String(n.architecture||""),status:String(n.status||"initializing").toLowerCase(),currentRound:g(n.currentRound??n.current_round,0),totalRounds:g(n.totalRounds??n.total_rounds,0),participantCount:g(n.participantCount??n.participant_count,0),accuracy:g(n.accuracy,0),loss:n.loss==null?null:g(n.loss,null),learningRate:g(n.learningRate??n.learning_rate,0),aggregationStrategy:n.aggregationStrategy??n.aggregation_strategy??"",privacyBudgetSpent:g(n.privacyBudgetSpent??n.privacy_budget_spent,0),createdAt:n.createdAt??n.created_at??null,updatedAt:n.updatedAt??n.updated_at??null,_idx:i}:null}function ft(n){const i=J(n);return Array.isArray(i)?i.map(mt).filter(Boolean):[]}function yt(n,i=0){if(!n||typeof n!="object")return null;const r=n.id||"";if(!r)return null;let A=n.participantIds??n.participant_ids??[];if(typeof A=="string")try{A=JSON.parse(A)}catch{A=[]}return Array.isArray(A)||(A=[]),{key:r,id:r,computationType:n.computationType??n.computation_type??"",protocol:String(n.protocol||"shamir").toLowerCase(),participantCount:g(n.participantCount??n.participant_count,0),participantIds:A,resultHash:n.resultHash??n.result_hash??null,status:String(n.status||"pending").toLowerCase(),sharesReceived:g(n.sharesReceived??n.shares_received,0),sharesRequired:g(n.sharesRequired??n.shares_required,0),computationTimeMs:n.computationTimeMs??n.computation_time_ms??null,errorMessage:n.errorMessage??n.error_message??"",createdAt:n.createdAt??n.created_at??null,completedAt:n.completedAt??n.completed_at??null,_idx:i}}function vt(n){const i=J(n);return Array.isArray(i)?i.map(yt).filter(Boolean):[]}function gt(n){const i=J(n);return!i||typeof i!="object"||Array.isArray(i)?null:{published:!!i.published,reason:i.reason||null,data:i.data??null,epsilon:g(i.epsilon,0),delta:g(i.delta,0),mechanism:String(i.mechanism||""),budgetSpent:g(i.budgetSpent??i.budget_spent,0),budgetRemaining:g(i.budgetRemaining??i.budget_remaining,0)}}function _t(n){const i=J(n);return!i||typeof i!="object"||Array.isArray(i)?null:{result:i.result??null,operation:String(i.operation||""),scheme:String(i.scheme||""),inputCount:g(i.inputCount??i.input_count,0),encrypted:i.encrypted!==!1}}const bt={privacyBudget:{spent:0,limit:0,remaining:0,exhausted:!1},federatedLearning:{totalModels:0,completed:0,training:0,avgAccuracy:0},mpc:{totalComputations:0,completed:0,pending:0,byProtocol:{}}};function xt(n){const i=JSON.parse(JSON.stringify(bt)),r=J(n);if(!r||typeof r!="object"||Array.isArray(r))return i;if(r.privacyBudget&&typeof r.privacyBudget=="object"&&(i.privacyBudget.spent=g(r.privacyBudget.spent,0),i.privacyBudget.limit=g(r.privacyBudget.limit,0),i.privacyBudget.remaining=g(r.privacyBudget.remaining,0),i.privacyBudget.exhausted=!!r.privacyBudget.exhausted),r.federatedLearning&&typeof r.federatedLearning=="object"&&(i.federatedLearning.totalModels=g(r.federatedLearning.totalModels,0),i.federatedLearning.completed=g(r.federatedLearning.completed,0),i.federatedLearning.training=g(r.federatedLearning.training,0),i.federatedLearning.avgAccuracy=g(r.federatedLearning.avgAccuracy,0)),r.mpc&&typeof r.mpc=="object"&&(i.mpc.totalComputations=g(r.mpc.totalComputations,0),i.mpc.completed=g(r.mpc.completed,0),i.mpc.pending=g(r.mpc.pending,0),r.mpc.byProtocol&&typeof r.mpc.byProtocol=="object"))for(const[A,F]of Object.entries(r.mpc.byProtocol))typeof F=="number"&&Number.isFinite(F)&&(i.mpc.byProtocol[A]=F);return i}function Me(n){if(n==null||n==="")return"—";const i=typeof n=="number"?new Date(n):new Date(String(n));return isNaN(i.getTime())?String(n):i.toLocaleString("zh-CN",{hour12:!1})}const ht={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},kt={style:{"font-size":"11px",color:"var(--text-secondary)"}},St={class:"catalog-name"},Ct={class:"catalog-desc"},zt={class:"catalog-name"},Rt={class:"catalog-desc"},At={class:"catalog-name"},Mt={class:"catalog-desc"},jt={class:"filter-bar"},Ot={style:{color:"var(--text-primary)","font-weight":"500"}},Tt={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},Pt={style:{"font-size":"11px",color:"var(--text-secondary)"}},Lt={key:0,style:{"font-size":"11px",color:"var(--text-secondary)"}},$t={key:5,style:{"font-family":"monospace",color:"var(--text-secondary)"}},Bt={key:6,style:{color:"var(--text-secondary)","font-size":"11px"}},Ut={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},wt={class:"filter-bar"},Nt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},Ft={key:0,style:{"font-family":"monospace",color:"var(--text-secondary)","font-size":"12px"}},Et={key:1,style:{color:"var(--text-muted)"}},qt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Ht={key:1,style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Jt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Dt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},It={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Vt={__name:"Privacy",setup(n){const i=Ye(),r=b(!1),A=b(!1),F=b(!1),ee=b(!1),te=b(""),ae=b(""),ce=b([]),me=b([]),fe=b([]),le=b([]),ye=b([]),M=b({privacyBudget:{spent:0,limit:0,remaining:0,exhausted:!1},federatedLearning:{totalModels:0,completed:0,training:0,avgAccuracy:0},mpc:{totalComputations:0,completed:0,pending:0,byProtocol:{}}}),ne=b("models"),D=b(""),V=b(""),K=b(""),G=b(!1),W=b(!1),oe=b(!1),ie=b(!1),d=Z({name:"",modelType:"",architecture:"",rounds:10,lr:.01,participants:0}),k=Z({type:"",protocol:"shamir",participants:"",threshold:null}),S=Z({data:"",mechanism:"laplace",epsilon:.1,delta:1e-5,sensitivity:1}),j=Z({data:"",operation:"sum",scheme:"paillier"}),O=b(null),L=b(null),je=[{title:"名称",key:"name"},{title:"状态",key:"status",width:"120px"},{title:"进度",key:"progress",width:"160px"},{title:"准确度",key:"accuracy",width:"110px"},{title:"参与方",key:"participants",width:"90px"},{title:"预算 ε",key:"budget",width:"100px"},{title:"更新时间",key:"updatedAt",width:"160px"},{title:"操作",key:"action",width:"180px"}],Oe=[{title:"类型",key:"type",width:"160px"},{title:"协议",key:"protocol",width:"100px"},{title:"份额进度",key:"progress"},{title:"状态",key:"status",width:"110px"},{title:"耗时",key:"time",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"160px"}],Te=Y(()=>M.value.federatedLearning.avgAccuracy*100),Pe=Y(()=>{const o=M.value.privacyBudget.remaining,e=M.value.privacyBudget.limit;if(e===0)return"#888";const _=o/e;return _<.2?"#ff4d4f":_<.5?"#faad14":"#52c41a"}),Le=Y(()=>D.value?le.value.filter(o=>o.status===D.value):le.value),$e=Y(()=>{let o=ye.value;return V.value&&(o=o.filter(e=>e.protocol===V.value)),K.value&&(o=o.filter(e=>e.status===K.value)),o});function ve(o){return{initializing:"初始化",training:"训练中",aggregating:"聚合中",completed:"已完成",failed:"失败"}[o]||o}function Be(o){return{initializing:"default",training:"processing",aggregating:"cyan",completed:"green",failed:"red"}[o]||"default"}function ge(o){return{pending:"待处理",computing:"计算中",completed:"已完成"}[o]||o}function Ue(o){return{pending:"default",computing:"processing",completed:"green"}[o]||"default"}function we(o){return o>=.85?"#52c41a":o>=.6?"#faad14":"#ff4d4f"}function Ne(o){return o.status==="initializing"||o.status==="training"||o.status==="aggregating"}function Fe({key:o}){o==="model"?G.value=!0:o==="computation"?W.value=!0:o==="dp"?(O.value=null,oe.value=!0):o==="he"&&(L.value=null,ie.value=!0)}async function B(){r.value=!0;try{const[o,e,_,q,se,re]=await Promise.all([i.execute("privacy protocols --json",8e3).catch(()=>({output:""})),i.execute("privacy dp-mechanisms --json",8e3).catch(()=>({output:""})),i.execute("privacy he-schemes --json",8e3).catch(()=>({output:""})),i.execute("privacy models --limit 100 --json",1e4).catch(()=>({output:""})),i.execute("privacy computations --limit 100 --json",1e4).catch(()=>({output:""})),i.execute("privacy report --json",8e3).catch(()=>({output:""}))]);ce.value=de(o.output),me.value=de(e.output),fe.value=de(_.output),le.value=ft(q.output),ye.value=vt(se.output),M.value=xt(re.output)}catch(o){f.error("加载隐私计算数据失败: "+(o?.message||o))}finally{r.value=!1}}async function Ee(){if(!d.name.trim()){f.warning("请输入模型名称");return}A.value=!0;try{const o=[`privacy create-model "${d.name.trim().replace(/"/g,'\\"')}"`];d.modelType.trim()&&o.push(`--type "${d.modelType.trim().replace(/"/g,'\\"')}"`),d.architecture.trim()&&o.push(`--arch "${d.architecture.trim().replace(/"/g,'\\"')}"`),d.rounds!=null&&o.push(`--rounds ${d.rounds}`),d.lr!=null&&o.push(`--lr ${d.lr}`),d.participants!=null&&o.push(`--participants ${d.participants}`),o.push("--json");const{output:e}=await i.execute(o.join(" "),12e3);if(/error|失败/i.test(e)&&!/"modelId"/.test(e)){f.error("创建失败: "+e.slice(0,120));return}f.success("FL 模型已创建"),G.value=!1,_e(),await B()}catch(o){f.error("创建失败: "+(o?.message||o))}finally{A.value=!1}}async function qe(){if(!k.type.trim()){f.warning("请输入计算类型");return}A.value=!0;try{const o=[`privacy create-computation "${k.type.trim().replace(/"/g,'\\"')}"`];if(o.push(`--protocol ${k.protocol}`),k.participants.trim()){const _=k.participants.split(/[,\s]+/).filter(Boolean).join(",");_&&o.push(`--participants "${_}"`)}k.threshold!=null&&o.push(`--threshold ${k.threshold}`),o.push("--json");const{output:e}=await i.execute(o.join(" "),1e4);if(/error|失败|invalid/i.test(e)&&!/"computationId"/.test(e)){f.error("创建失败: "+e.slice(0,120));return}f.success("MPC 计算已创建"),W.value=!1,be(),ne.value="computations",await B()}catch(o){f.error("创建失败: "+(o?.message||o))}finally{A.value=!1}}async function He(o){te.value=o.id;try{const{output:e}=await i.execute(`privacy train ${o.id} --json`,12e3);if(/error|失败/i.test(e)&&!/"trained"/.test(e)){f.error("训练失败: "+e.slice(0,120));return}f.success("训练一轮完成"),await B()}catch(e){f.error("训练失败: "+(e?.message||e))}finally{te.value=""}}async function Je(o){try{const{output:e}=await i.execute(`privacy fail-model ${o.id} --json`,8e3);if(/error/i.test(e)&&!/"failed"/.test(e)){f.error("标记失败: "+e.slice(0,120));return}f.success("已标记为失败"),await B()}catch(e){f.error("标记失败: "+(e?.message||e))}}async function De(o){ae.value=o.id;try{const{output:e}=await i.execute(`privacy submit-share ${o.id} --json`,1e4);if(/error|失败/i.test(e)&&!/"submitted"/.test(e)){f.error("提交失败: "+e.slice(0,120));return}f.success("份额已提交"),await B()}catch(e){f.error("提交失败: "+(e?.message||e))}finally{ae.value=""}}async function Ie(){if(!S.data.trim()){f.warning("请输入数据");return}F.value=!0,O.value=null;try{const o=["privacy dp-publish"];o.push(`--data ${JSON.stringify(S.data.trim())}`),o.push(`--mechanism ${S.mechanism}`),S.epsilon!=null&&o.push(`--epsilon ${S.epsilon}`),S.delta!=null&&o.push(`--delta ${S.delta}`),S.sensitivity!=null&&o.push(`--sensitivity ${S.sensitivity}`),o.push("--json");const{output:e}=await i.execute(o.join(" "),1e4),_=gt(e);if(!_){f.error("发布失败: "+e.slice(0,120));return}O.value=_,_.published?(f.success("已发布"),await B()):f.warning(`发布拒绝: ${_.reason||"unknown"}`)}catch(o){f.error("发布失败: "+(o?.message||o))}finally{F.value=!1}}async function Ve(){if(!j.data.trim()){f.warning("请输入数据");return}try{JSON.parse(j.data)}catch{f.warning("数据格式错误,请输入合法 JSON 数组");return}ee.value=!0,L.value=null;try{const o=["privacy he-query"];o.push(`--data ${JSON.stringify(j.data.trim())}`),o.push(`--operation ${j.operation}`),o.push(`--scheme ${j.scheme}`),o.push("--json");const{output:e}=await i.execute(o.join(" "),1e4),_=_t(e);if(!_){f.error("查询失败: "+e.slice(0,120));return}L.value=_,f.success(`计算完成 (${_.scheme}/${_.operation})`)}catch(o){f.error("查询失败: "+(o?.message||o))}finally{ee.value=!1}}function _e(){d.name="",d.modelType="",d.architecture="",d.rounds=10,d.lr=.01,d.participants=0}function be(){k.type="",k.protocol="shamir",k.participants="",k.threshold=null}return ot(B),(o,e)=>{const _=v("a-button"),q=v("a-menu-item"),se=v("a-menu"),re=v("a-dropdown"),Ke=v("a-space"),U=v("a-statistic"),T=v("a-card"),w=v("a-col"),xe=v("a-row"),N=v("a-tag"),$=v("a-radio-button"),H=v("a-radio-group"),he=v("a-progress"),Ge=v("a-popconfirm"),ke=v("a-table"),Se=v("a-tab-pane"),We=v("a-tabs"),I=v("a-input"),z=v("a-form-item"),E=v("a-input-number"),Q=v("a-form"),X=v("a-modal"),Qe=v("a-select-option"),Xe=v("a-select"),Ce=v("a-textarea");return s(),c("div",null,[y("div",ht,[e[32]||(e[32]=y("div",null,[y("h2",{class:"page-title"},"隐私计算"),y("p",{class:"page-sub"},"联邦学习 · 多方计算 · 差分隐私 · 同态加密")],-1)),a(Ke,null,{default:l(()=>[a(_,{loading:r.value,onClick:B},{icon:l(()=>[a(x(tt))]),default:l(()=>[e[26]||(e[26]=m(" 刷新 ",-1))]),_:1},8,["loading"]),a(re,{trigger:["click"]},{overlay:l(()=>[a(se,{onClick:Fe},{default:l(()=>[a(q,{key:"model"},{default:l(()=>[a(x(ue)),e[28]||(e[28]=m(" 创建联邦学习模型",-1))]),_:1}),a(q,{key:"computation"},{default:l(()=>[a(x(pe)),e[29]||(e[29]=m(" 创建 MPC 计算",-1))]),_:1}),a(q,{key:"dp"},{default:l(()=>[a(x(Re)),e[30]||(e[30]=m(" 差分隐私发布",-1))]),_:1}),a(q,{key:"he"},{default:l(()=>[a(x(lt)),e[31]||(e[31]=m(" 同态加密查询",-1))]),_:1})]),_:1})]),default:l(()=>[a(_,{type:"primary"},{icon:l(()=>[a(x(at))]),default:l(()=>[e[27]||(e[27]=m(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),a(xe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"FL 模型",value:M.value.federatedLearning.totalModels,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:l(()=>[a(x(ue))]),_:1},8,["value"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"平均准确度",value:Te.value,precision:1,suffix:"%","value-style":{color:M.value.federatedLearning.avgAccuracy>=.8?"#52c41a":"#faad14",fontSize:"20px"}},{prefix:l(()=>[a(x(nt))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"MPC 计算",value:M.value.mpc.totalComputations,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:l(()=>[a(x(pe))]),_:1},8,["value"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"预算余量 ε",value:M.value.privacyBudget.remaining,precision:2,"value-style":{color:Pe.value,fontSize:"20px"}},{prefix:l(()=>[a(x(Re))]),suffix:l(()=>[y("span",kt,"/ "+p(M.value.privacyBudget.limit),1)]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(w,{xs:24,sm:8,lg:4},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"预算状态",value:M.value.privacyBudget.exhausted?"已耗尽":"充足","value-style":{color:M.value.privacyBudget.exhausted?"#ff4d4f":"#52c41a",fontSize:"20px"}},null,8,["value","value-style"])]),_:1})]),_:1})]),_:1}),a(xe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"MPC 协议",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,P(ce.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"purple",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",St,p(t.name),1),y("span",Ct,p(t.description),1)]))),128))]),_:1})]),_:1}),a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"DP 噪声机制",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,P(me.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"orange",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",zt,p(t.name),1),y("span",Rt,p(t.description),1)]))),128))]),_:1})]),_:1}),a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"HE 同态方案",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,P(fe.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"cyan",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",At,p(t.name),1),y("span",Mt,p(t.description),1)]))),128))]),_:1})]),_:1})]),_:1}),a(We,{activeKey:ne.value,"onUpdate:activeKey":e[3]||(e[3]=t=>ne.value=t),class:"privacy-tabs"},{default:l(()=>[a(Se,{key:"models",tab:"联邦学习"},{default:l(()=>[y("div",jt,[a(H,{value:D.value,"onUpdate:value":e[0]||(e[0]=t=>D.value=t),size:"small","button-style":"solid"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[33]||(e[33]=[m("全部",-1)])]),_:1}),(s(!0),c(R,null,P(x(st),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(ve(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ke,{columns:je,"data-source":Le.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:t,record:u})=>[t.key==="name"?(s(),c(R,{key:0},[y("span",Ot,p(u.name),1),y("div",Tt,p(u.modelType)+" / "+p(u.architecture),1)],64)):h("",!0),t.key==="status"?(s(),C(N,{key:1,color:Be(u.status)},{default:l(()=>[m(p(ve(u.status)),1)]),_:2},1032,["color"])):h("",!0),t.key==="progress"?(s(),c(R,{key:2},[a(he,{percent:u.totalRounds?Math.round(100*u.currentRound/u.totalRounds):0,size:"small",status:u.status==="failed"?"exception":u.status==="completed"?"success":"active"},null,8,["percent","status"]),y("div",Pt,p(u.currentRound)+" / "+p(u.totalRounds)+" 轮 ",1)],64)):h("",!0),t.key==="accuracy"?(s(),c(R,{key:3},[y("span",{style:it({color:we(u.accuracy),fontFamily:"monospace"})},p((u.accuracy*100).toFixed(1))+"% ",5),u.loss!=null?(s(),c("div",Lt," loss "+p(u.loss.toFixed(3)),1)):h("",!0)],64)):h("",!0),t.key==="participants"?(s(),C(N,{key:4,color:"blue",style:{"font-size":"11px"}},{default:l(()=>[m(p(u.participantCount),1)]),_:2},1024)):h("",!0),t.key==="budget"?(s(),c("span",$t,p(u.privacyBudgetSpent.toFixed(3)),1)):h("",!0),t.key==="updatedAt"?(s(),c("span",Bt,p(x(Me)(u.updatedAt)),1)):h("",!0),t.key==="action"?(s(),c(R,{key:7},[Ne(u)?(s(),C(_,{key:0,size:"small",type:"link",loading:te.value===u.id,onClick:ze=>He(u)},{default:l(()=>[...e[34]||(e[34]=[m(" 训练一轮 ",-1)])]),_:1},8,["loading","onClick"])):h("",!0),u.status!=="failed"&&u.status!=="completed"?(s(),C(Ge,{key:1,title:"标记该模型为失败?","ok-text":"确认","cancel-text":"取消",onConfirm:ze=>Je(u)},{default:l(()=>[a(_,{size:"small",type:"link",danger:""},{default:l(()=>[...e[35]||(e[35]=[m("标记失败",-1)])]),_:1})]),_:1},8,["onConfirm"])):h("",!0)],64)):h("",!0)]),emptyText:l(()=>[y("div",Ut,[a(x(ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+p(D.value?"没有符合条件的模型":'暂无 FL 模型,点"操作 → 创建联邦学习模型"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(Se,{key:"computations",tab:"MPC 计算"},{default:l(()=>[y("div",wt,[a(H,{value:V.value,"onUpdate:value":e[1]||(e[1]=t=>V.value=t),size:"small"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[36]||(e[36]=[m("全部协议",-1)])]),_:1}),(s(!0),c(R,null,P(x(Ae),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),a(H,{value:K.value,"onUpdate:value":e[2]||(e[2]=t=>K.value=t),size:"small"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[37]||(e[37]=[m("全部状态",-1)])]),_:1}),(s(!0),c(R,null,P(x(rt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ke,{columns:Oe,"data-source":$e.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:t,record:u})=>[t.key==="type"?(s(),c("span",Nt,p(u.computationType),1)):h("",!0),t.key==="protocol"?(s(),C(N,{key:1,color:"purple",style:{"font-family":"monospace"}},{default:l(()=>[m(p(u.protocol),1)]),_:2},1024)):h("",!0),t.key==="progress"?(s(),C(he,{key:2,percent:u.sharesRequired?Math.round(100*u.sharesReceived/u.sharesRequired):0,size:"small",status:u.status==="completed"?"success":"active",format:()=>`${u.sharesReceived}/${u.sharesRequired}`},null,8,["percent","status","format"])):h("",!0),t.key==="status"?(s(),C(N,{key:3,color:Ue(u.status)},{default:l(()=>[m(p(ge(u.status)),1)]),_:2},1032,["color"])):h("",!0),t.key==="time"?(s(),c(R,{key:4},[u.computationTimeMs!=null?(s(),c("span",Ft,p(u.computationTimeMs)+" ms ",1)):(s(),c("span",Et,"—"))],64)):h("",!0),t.key==="createdAt"?(s(),c("span",qt,p(x(Me)(u.createdAt)),1)):h("",!0),t.key==="action"?(s(),c(R,{key:6},[u.status!=="completed"?(s(),C(_,{key:0,size:"small",type:"link",loading:ae.value===u.id,onClick:ze=>De(u)},{default:l(()=>[...e[38]||(e[38]=[m(" 提交份额 ",-1)])]),_:1},8,["loading","onClick"])):(s(),c("span",Ht," hash "+p(u.resultHash?.slice(0,8)||"—"),1))],64)):h("",!0)]),emptyText:l(()=>[y("div",Jt,[a(x(pe),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[39]||(e[39]=m(' 暂无 MPC 计算,点"操作 → 创建 MPC 计算"创建第一个 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(X,{open:G.value,"onUpdate:open":e[10]||(e[10]=t=>G.value=t),title:"创建联邦学习模型","confirm-loading":A.value,width:540,"ok-text":"创建","cancel-text":"取消",onOk:Ee,onCancel:_e},{default:l(()=>[a(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"模型名称",required:""},{default:l(()=>[a(I,{value:d.name,"onUpdate:value":e[4]||(e[4]=t=>d.name=t),placeholder:"例如: fraud-detector"},null,8,["value"])]),_:1}),a(z,{label:"模型类型"},{default:l(()=>[a(I,{value:d.modelType,"onUpdate:value":e[5]||(e[5]=t=>d.modelType=t),placeholder:"neural_network(默认)"},null,8,["value"])]),_:1}),a(z,{label:"架构"},{default:l(()=>[a(I,{value:d.architecture,"onUpdate:value":e[6]||(e[6]=t=>d.architecture=t),placeholder:"mlp(默认)"},null,8,["value"])]),_:1}),a(z,{label:"总轮次"},{default:l(()=>[a(E,{value:d.rounds,"onUpdate:value":e[7]||(e[7]=t=>d.rounds=t),min:1,max:1e3,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"学习率"},{default:l(()=>[a(E,{value:d.lr,"onUpdate:value":e[8]||(e[8]=t=>d.lr=t),min:0,max:1,step:.001,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"参与方数量"},{default:l(()=>[a(E,{value:d.participants,"onUpdate:value":e[9]||(e[9]=t=>d.participants=t),min:0,max:1e3,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:W.value,"onUpdate:open":e[15]||(e[15]=t=>W.value=t),title:"创建 MPC 计算","confirm-loading":A.value,width:520,"ok-text":"创建","cancel-text":"取消",onOk:qe,onCancel:be},{default:l(()=>[a(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"计算类型",required:""},{default:l(()=>[a(I,{value:k.type,"onUpdate:value":e[11]||(e[11]=t=>k.type=t),placeholder:"例如: sum / multiplication"},null,8,["value"])]),_:1}),a(z,{label:"协议"},{default:l(()=>[a(Xe,{value:k.protocol,"onUpdate:value":e[12]||(e[12]=t=>k.protocol=t)},{default:l(()=>[(s(!0),c(R,null,P(x(Ae),t=>(s(),C(Qe,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"参与方 ID"},{default:l(()=>[a(Ce,{value:k.participants,"onUpdate:value":e[13]||(e[13]=t=>k.participants=t),placeholder:"逗号分隔,例如: alice,bob,carol","auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),a(z,{label:"所需份额"},{default:l(()=>[a(E,{value:k.threshold,"onUpdate:value":e[14]||(e[14]=t=>k.threshold=t),min:2,max:100,placeholder:"留空自动取半数",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:oe.value,"onUpdate:open":e[21]||(e[21]=t=>oe.value=t),title:"差分隐私发布","confirm-loading":F.value,width:520,"ok-text":"发布","cancel-text":"关闭",onOk:Ie},{default:l(()=>[a(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"数据",required:""},{default:l(()=>[a(I,{value:S.data,"onUpdate:value":e[16]||(e[16]=t=>S.data=t),placeholder:"数字或 JSON 数组,例如 10 或 [1,2,3]"},null,8,["value"])]),_:1}),a(z,{label:"噪声机制"},{default:l(()=>[a(H,{value:S.mechanism,"onUpdate:value":e[17]||(e[17]=t=>S.mechanism=t)},{default:l(()=>[(s(!0),c(R,null,P(x(ut),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"ε (epsilon)"},{default:l(()=>[a(E,{value:S.epsilon,"onUpdate:value":e[18]||(e[18]=t=>S.epsilon=t),min:0,step:.01,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"δ (delta)"},{default:l(()=>[a(E,{value:S.delta,"onUpdate:value":e[19]||(e[19]=t=>S.delta=t),min:0,step:1e-6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"敏感度"},{default:l(()=>[a(E,{value:S.sensitivity,"onUpdate:value":e[20]||(e[20]=t=>S.sensitivity=t),min:0,step:.1,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),O.value?(s(),C(T,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[O.value.published?(s(),c(R,{key:0},[a(U,{title:"加噪后数据",value:O.value.data,precision:3,"value-style":{color:"#52c41a"}},null,8,["value"]),y("div",Dt,[y("div",null,"消耗预算: "+p(O.value.budgetSpent.toFixed(3)),1),y("div",null,"剩余预算: "+p(O.value.budgetRemaining.toFixed(3)),1),y("div",null,"机制: "+p(O.value.mechanism)+" (ε="+p(O.value.epsilon)+")",1)])],64)):(s(),C(U,{key:1,title:"发布失败",value:O.value.reason||"unknown","value-style":{color:"#ff4d4f"}},null,8,["value"]))]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"]),a(X,{open:ie.value,"onUpdate:open":e[25]||(e[25]=t=>ie.value=t),title:"同态加密查询","confirm-loading":ee.value,width:500,"ok-text":"查询","cancel-text":"关闭",onOk:Ve},{default:l(()=>[a(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"数据",required:""},{default:l(()=>[a(Ce,{value:j.data,"onUpdate:value":e[22]||(e[22]=t=>j.data=t),placeholder:"JSON 数组,例如 [1,2,3,4,5]","auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),a(z,{label:"操作"},{default:l(()=>[a(H,{value:j.operation,"onUpdate:value":e[23]||(e[23]=t=>j.operation=t)},{default:l(()=>[(s(!0),c(R,null,P(x(dt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"同态方案"},{default:l(()=>[a(H,{value:j.scheme,"onUpdate:value":e[24]||(e[24]=t=>j.scheme=t)},{default:l(()=>[(s(!0),c(R,null,P(x(pt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1})]),_:1}),L.value?(s(),C(T,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[a(U,{title:"加密计算结果",value:L.value.result,"value-style":{color:"#1677ff"}},null,8,["value"]),y("div",It,[y("div",null,"方案: "+p(L.value.scheme),1),y("div",null,"操作: "+p(L.value.operation),1),y("div",null,"输入项数: "+p(L.value.inputCount),1),L.value.encrypted?(s(),C(N,{key:0,color:"green",style:{"margin-top":"4px","font-size":"10px"}},{default:l(()=>[...e[40]||(e[40]=[m("已加密",-1)])]),_:1})):h("",!0)])]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"])])}}},oa=et(Vt,[["__scopeId","data-v-70813c86"]]);export{oa as default};
|