chainlesschain 0.157.9 → 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-C4XQxptM.js → AIOps-9QEKGr43.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CvKbykKA.js → ActionButton-BQElVBgD.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DFMAWKUR.js → Analytics-DbZbFR_a.js} +1 -1
- package/src/assets/web-panel/assets/{AppLayout-BkNdtTbn.js → AppLayout-BbfBwVfE.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bw7KSJD_.js → Audit-DzddAZVx.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CvAa9Hm_.js → BaseInput-60t9IMEz.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-YsCNWg9S.js → Checkbox-Ba1Rf2Ea.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DDiVk21N.js → Codegen-WiYmL3oB.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Dpb7Eik4.js → Col-D2zhpSqE.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Bglv8oIv.js → Community-DgqmUGwT.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DC8UsEAe.js → Compact-D_dbJDbi.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DzVghx7L.js → Compliance-BVcVb-e2.js} +1 -1
- package/src/assets/web-panel/assets/{Cron-I81HiCa1.js → Cron-Cs5QaKTP.js} +1 -1
- package/src/assets/web-panel/assets/{Crosschain-48CdkgQf.js → Crosschain-pjWfIM8s.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CVYxjLQn.js → DID-DQtsjz3X.js} +1 -1
- package/src/assets/web-panel/assets/{Dropdown-DBfZJHBI.js → Dropdown-BM_ljd87.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BT-pF1wN.js → Federation-CId-3zn6.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-B-sn9E_W.js → FormItemContext-CnzbixSE.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DTh2i-Qk.js → Git-B38QeOPF.js} +1 -1
- package/src/assets/web-panel/assets/{Governance-D788Lws6.js → Governance-DrGkAjd1.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CnFa6Se9.js → Inference-BjkHB4sD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DHaMxawn.js → KnowledgeGraph-Trs1XJFK.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BdOCF2RA.js → Marketplace-BnpOoITi.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-Vl_lYCs2.js → Memory-BHXHpldt.js} +1 -1
- package/src/assets/web-panel/assets/NLProgramming-B3BALajs.js +1 -0
- package/src/assets/web-panel/assets/{Notes-BvC5_V2H.js → Notes-u6lLTv0t.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Cxhhw4aD.js → Organization-CQ1X722j.js} +1 -1
- package/src/assets/web-panel/assets/{Overflow-L_28D41_.js → Overflow-DHKu8e8g.js} +1 -1
- package/src/assets/web-panel/assets/{Permissions-ByLhEAbz.js → Permissions-B2XrAUBW.js} +1 -1
- package/src/assets/web-panel/assets/{Pipeline-CnZJNdgt.js → Pipeline-C0K9-DnR.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BJIajCGG.js → Privacy-BKPoZngH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectSettings-N0r_mtec.js → ProjectSettings-C34C7hFt.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B2A35VhD.js → Providers-BFiMVWaM.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DYb61WNp.js → Recommend-BmUhysGC.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-C9BfnI0z.js → Reputation-BlfSvJww.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CpPHVi7H.js → Row-Dl74576S.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CbqJDErh.js → RssFeed-9_MkDUxZ.js} +1 -1
- package/src/assets/web-panel/assets/{Search-C0gd765-.js → Search-CSRY_TYa.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DsYWAhpE.js → Security-DfDoKfkl.js} +1 -1
- package/src/assets/web-panel/assets/{Skeleton-TzxE-JJt.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-mftEtvGn.js → Sla-B93c8j92.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DgonVRQJ.js → Templates-DJ_hvs5c.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BB-LLJMZ.js → Tenant-BXS8s6vl.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DHOkHNur.js → Tokens-CvmTVU7E.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BV4JPD3z.js → Trigger-BenSsaoN.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BpC4gDis.js → Trust-HMz40LfZ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CeDFfKrq.js → VideoEditing-DEhH42sI.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CcNCVaor.js → Wallet-AGwfOdTM.js} +1 -1
- package/src/assets/web-panel/assets/{WebAuthn-BbIPA6Ca.js → WebAuthn-DK5tKWul.js} +1 -1
- package/src/assets/web-panel/assets/{WorkflowEditor-DxkitXpf.js → WorkflowEditor-vlujdL6I.js} +1 -1
- package/src/assets/web-panel/assets/{colors-2MPUdPu2.js → colors-BiB5aDao.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B4vcKR0x.js → compact-item-CHderV9n.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Div8Cl0F.js → createContext-DMZ-5dy2.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-9c9xldOR.js → hasIn-BKDBYP3s.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuVNDnn8.js → index-7fxCGMoL.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZW72ov7W.js → index-7pqZqPD2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIE6ht2b.js → index-A4RpHMOa.js} +1 -1
- package/src/assets/web-panel/assets/{index-dV8k_pMc.js → index-AIdelwOe.js} +1 -1
- package/src/assets/web-panel/assets/index-B5oebI6W.js +1 -0
- package/src/assets/web-panel/assets/{index-COJ-mQYg.js → index-B7fivpG2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BntG0RJO.js → index-BBWUR4u4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCfVA9mJ.js → index-BBk2e7vJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfoYep3e.js → index-BRRFK-im.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVYrm1az.js → index-BVOI707f.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1GXp5YD.js → index-BadelvSE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbqCdQXU.js → index-BfKFNptm.js} +1 -1
- package/src/assets/web-panel/assets/{index-OhUZFfxQ.js → index-BgDX-tzO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B58J4NxK.js → index-BjSojphX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJAPu9VF.js → index-BlXskar6.js} +1 -1
- package/src/assets/web-panel/assets/{index-B65KFSc3.js → index-BryAkWUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0GALIQZ.js → index-C1p_dZw0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtM3tjRj.js → index-CBYNsy51.js} +1 -1
- package/src/assets/web-panel/assets/{index-IzAqu_OK.js → index-CEpcKl17.js} +1 -1
- package/src/assets/web-panel/assets/{index--tOLU2ID.js → index-CUT3Nmzx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ca3iTiXs.js → index-CbpCY2ch.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgWftysw.js → index-D3PGpBPm.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-CTCrAH.js → index-D3lD9wgX.js} +1 -1
- package/src/assets/web-panel/assets/index-D5Beu9ZA.js +1 -0
- package/src/assets/web-panel/assets/{index-CIWKlZ1X.js → index-DRRzH4Ge.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcnQrVVZ.js → index-DRcTAUJA.js} +1 -1
- package/src/assets/web-panel/assets/{index-COdKVelL.js → index-DZ8MjPLC.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZZ_4A9um.js → index-DfcXDy2A.js} +3 -3
- package/src/assets/web-panel/assets/{index-B4hcllQg.js → index-DtDFSCfE.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1JeOKve.js → index-DvI8Xtzv.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-0g6tCK.js → index-DvfAkHw8.js} +1 -1
- package/src/assets/web-panel/assets/{index-D--EKCHy.js → index-DyXslU_B.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dk3ZySO2.js → index-MoLxDrkb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DogHNcyC.js → index-Ncxqj2UN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdHPswKn.js → index-YgC7QI1N.js} +1 -1
- package/src/assets/web-panel/assets/{index-3KbT-bG7.js → index-_sntSncx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjGOthNv.js → index-uujjC_4g.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIe3dY84.js → index-yMt4C1Gh.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps--L8bzddm.js → initDefaultProps-B2vQoQga.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BR7NF0vx.js → motion-D2eluOJu.js} +1 -1
- package/src/assets/web-panel/assets/{move-BpyQMRtF.js → move-CgcvSoZ7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-RkKN6uqw.js → omit-DvLh7wH1.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Bk8_mKGY.js → pickAttrs-BsseBclw.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CBAaXBxj.js → placementArrow-XLLtr9qD.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BzrPInK7.js → responsiveObserve-ByCb5zZK.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CXFBsLyp.js → slide-CeP5JCiZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-6TeOuUzQ.js → statusUtils-DMVoo96t.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CQt4HHRm.js → styleChecker-Cz5mJgc8.js} +1 -1
- package/src/assets/web-panel/assets/{transition-CGYDOK3N.js → transition-DSe9CgZe.js} +1 -1
- package/src/assets/web-panel/assets/{useConfigInject-BKqJUQaF.js → useConfigInject-DCcT0grw.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport--RuYYIc6.js → useFlexGapSupport-BZkoDuF3.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-I9keNa_U.js → vnode-Dexy2NN9.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BNV3xYvt.js → zoom-CDfM_sRk.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- 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/NLProgramming-CgD2H0Pc.js +0 -1
- package/src/assets/web-panel/assets/Skills-DfaRaffm.js +0 -1
- package/src/assets/web-panel/assets/index-BzBaZFuT.js +0 -1
- package/src/assets/web-panel/assets/index-CDoxJ9Cl.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
|
-
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-BbqCdQXU.js";import{Y as ot,ac as lt,B as rt,e as ve,a as ge,aL as st,as as it,aa as ut}from"./icons-ukMaZ3tx.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-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.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"}},Lt={key:0,style:{color:"var(--text-muted)"}},Dt={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(""),H=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),Le=_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}),De=_e(()=>H.value?le.value.filter(r=>r.category===H.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,L]=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(L.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 L=gt(y);if(!L){v.error("翻译失败: "+y.slice(0,120));return}v.success(`翻译完成 (完整度 ${(L.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 We(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"),L=p("a-menu"),Ae=p("a-dropdown"),he=p("a-space"),W=p("a-statistic"),D=p("a-card"),Y=p("a-col"),Ye=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"),He=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(L,{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(Ye,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[n(Y,{xs:12,sm:8,lg:5},{default:t(()=>[n(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(W,{title:"翻译总数",value:N.value.translations.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:t(()=>[n(m(ve))]),_:1},8,["value"])]),_:1})]),_:1}),n(Y,{xs:12,sm:8,lg:5},{default:t(()=>[n(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(W,{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(Y,{xs:12,sm:8,lg:5},{default:t(()=>[n(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(W,{title:"草稿",value:N.value.translations.byStatus.draft,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:t(()=>[n(m(it))]),_:1},8,["value"])]),_:1})]),_:1}),n(Y,{xs:12,sm:8,lg:5},{default:t(()=>[n(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(W,{title:"已完成",value:N.value.translations.byStatus.complete,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:t(()=>[n(m(ut))]),_:1},8,["value"])]),_:1})]),_:1}),n(Y,{xs:24,sm:8,lg:4},{default:t(()=>[n(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[n(W,{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(D,{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(He,{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":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==="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(L,{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:H.value,"onUpdate:value":e[2]||(e[2]=a=>H.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":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==="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=>We(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(D,{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",Lt,"未识别到")),(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",Dt,[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{k as O,r as v,j as h,l as A,F as f,D as i,I as y,u as s,c as r,x as d,H as C,L,q as p,B as F,v as u,J as g,m as M}from"./vendor-BVetwVfk.js";import{u as N}from"./ws-Bv7YH0VB.js";import{p as Q}from"./parsers-DftYMnlk.js";import{u as V}from"./chat-CVn-r3oV.js";import{_ as $}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{b as D,Y as E,a9 as R}from"./icons-ukMaZ3tx.js";const T=O("skills",()=>{const _=v(!1),e=v([]),c=v(""),m=v("all"),x=h(()=>{const n=new Set(["all"]);return e.value.forEach(l=>{l.category&&n.add(l.category),l.executionMode&&n.add(l.executionMode)}),[...n]}),k=h(()=>{let n=e.value;if(m.value!=="all"&&(n=n.filter(l=>l.category===m.value||l.executionMode===m.value)),c.value){const l=c.value.toLowerCase();n=n.filter(o=>o.name?.toLowerCase().includes(l)||o.description?.toLowerCase().includes(l)||o.title?.toLowerCase().includes(l))}return n});async function b(){const n=N();_.value=!0;try{const{output:l}=await n.execute("skill list",2e4),o=Q(l);e.value=o}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:e,searchQuery:c,selectedCategory:m,categories:x,filteredSkills:k,loadSkills:b}}),U={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},H={class:"page-sub"},J={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},P={key:0,style:{"text-align":"center",padding:"60px"}},W={key:1,class:"skills-grid"},Y={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},G={style:{flex:"1","min-width":"0"}},K={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},X={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Z={style:{"margin-left":"12px","flex-shrink":"0"}},ee={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},te={key:2,style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}},oe={__name:"Skills",setup(_){const e=T(),c=V(),m=F(),x=h(()=>e.categories.filter(o=>o!=="all").slice(0,6));function k(o){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[o]||o}function b(o){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[o]||o||"未知"}function n(o){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[o]||"default"}async function l(o){await c.createSession("agent"),m.push("/chat"),setTimeout(()=>{c.currentSessionId&&c.sendMessage(c.currentSessionId,`/skill run ${o}`)},300)}return A(()=>{e.allSkills.length||e.loadSkills()}),(o,t)=>{const S=p("a-button"),z=p("a-input-search"),w=p("a-radio-button"),I=p("a-radio-group"),q=p("a-spin"),B=p("a-tag"),j=p("a-card");return u(),f("div",null,[i("div",U,[i("div",null,[t[3]||(t[3]=i("h2",{class:"page-title"},"技能管理",-1)),i("p",H,y(s(e).allSkills.length)+" 个可用技能",1)]),r(S,{type:"primary",ghost:"",loading:s(e).loading,onClick:t[0]||(t[0]=a=>s(e).loadSkills())},{icon:d(()=>[r(s(E))]),default:d(()=>[t[4]||(t[4]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),i("div",J,[r(z,{value:s(e).searchQuery,"onUpdate:value":t[1]||(t[1]=a=>s(e).searchQuery=a),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),r(I,{value:s(e).selectedCategory,"onUpdate:value":t[2]||(t[2]=a=>s(e).selectedCategory=a),"button-style":"solid"},{default:d(()=>[r(w,{value:"all"},{default:d(()=>[...t[5]||(t[5]=[g("全部",-1)])]),_:1}),(u(!0),f(C,null,L(x.value,a=>(u(),M(w,{key:a,value:a},{default:d(()=>[g(y(k(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),s(e).loading?(u(),f("div",P,[r(q,{size:"large"}),t[6]||(t[6]=i("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):s(e).filteredSkills.length?(u(),f("div",W,[(u(!0),f(C,null,L(s(e).filteredSkills,a=>(u(),M(j,{key:a.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:d(()=>[i("div",Y,[i("div",G,[i("div",K,y(a.name),1),i("div",X,y(a.description||"暂无描述"),1)]),i("div",Z,[r(B,{color:n(a.executionMode),style:{"font-size":"10px"}},{default:d(()=>[g(y(b(a.executionMode)),1)]),_:2},1032,["color"])])]),i("div",ee,[r(S,{size:"small",type:"primary",ghost:"",onClick:le=>l(a.name)},{icon:d(()=>[r(s(R))]),default:d(()=>[t[7]||(t[7]=g(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])):(u(),f("div",te,[r(s(D),{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),i("div",null,y(s(e).allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)]))])}}},ce=$(oe,[["__scopeId","data-v-a1cd8dd9"]]);export{ce as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-CpPHVi7H.js";import{w as t}from"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./vendor-BVetwVfk.js";import"./icons-ukMaZ3tx.js";import"./responsiveObserve-BzrPInK7.js";import"./useFlexGapSupport--RuYYIc6.js";import"./styleChecker-CQt4HHRm.js";import"./index-D-0g6tCK.js";const n=t(o);export{n as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-Dpb7Eik4.js";import{w as t}from"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./vendor-BVetwVfk.js";import"./icons-ukMaZ3tx.js";import"./index-D-0g6tCK.js";const l=t(o);export{l as default};
|