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.
Files changed (119) hide show
  1. package/bin/chainlesschain.js +0 -0
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-C4XQxptM.js → AIOps-9QEKGr43.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CvKbykKA.js → ActionButton-BQElVBgD.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DFMAWKUR.js → Analytics-DbZbFR_a.js} +1 -1
  7. package/src/assets/web-panel/assets/{AppLayout-BkNdtTbn.js → AppLayout-BbfBwVfE.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Bw7KSJD_.js → Audit-DzddAZVx.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-CvAa9Hm_.js → BaseInput-60t9IMEz.js} +1 -1
  10. package/src/assets/web-panel/assets/{Checkbox-YsCNWg9S.js → Checkbox-Ba1Rf2Ea.js} +1 -1
  11. package/src/assets/web-panel/assets/{Codegen-DDiVk21N.js → Codegen-WiYmL3oB.js} +1 -1
  12. package/src/assets/web-panel/assets/{Col-Dpb7Eik4.js → Col-D2zhpSqE.js} +1 -1
  13. package/src/assets/web-panel/assets/{Community-Bglv8oIv.js → Community-DgqmUGwT.js} +1 -1
  14. package/src/assets/web-panel/assets/{Compact-DC8UsEAe.js → Compact-D_dbJDbi.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compliance-DzVghx7L.js → Compliance-BVcVb-e2.js} +1 -1
  16. package/src/assets/web-panel/assets/{Cron-I81HiCa1.js → Cron-Cs5QaKTP.js} +1 -1
  17. package/src/assets/web-panel/assets/{Crosschain-48CdkgQf.js → Crosschain-pjWfIM8s.js} +1 -1
  18. package/src/assets/web-panel/assets/{DID-CVYxjLQn.js → DID-DQtsjz3X.js} +1 -1
  19. package/src/assets/web-panel/assets/{Dropdown-DBfZJHBI.js → Dropdown-BM_ljd87.js} +1 -1
  20. package/src/assets/web-panel/assets/{Federation-BT-pF1wN.js → Federation-CId-3zn6.js} +1 -1
  21. package/src/assets/web-panel/assets/{FormItemContext-B-sn9E_W.js → FormItemContext-CnzbixSE.js} +1 -1
  22. package/src/assets/web-panel/assets/{Git-DTh2i-Qk.js → Git-B38QeOPF.js} +1 -1
  23. package/src/assets/web-panel/assets/{Governance-D788Lws6.js → Governance-DrGkAjd1.js} +1 -1
  24. package/src/assets/web-panel/assets/{Inference-CnFa6Se9.js → Inference-BjkHB4sD.js} +1 -1
  25. package/src/assets/web-panel/assets/{KnowledgeGraph-DHaMxawn.js → KnowledgeGraph-Trs1XJFK.js} +1 -1
  26. package/src/assets/web-panel/assets/{Marketplace-BdOCF2RA.js → Marketplace-BnpOoITi.js} +1 -1
  27. package/src/assets/web-panel/assets/{Memory-Vl_lYCs2.js → Memory-BHXHpldt.js} +1 -1
  28. package/src/assets/web-panel/assets/NLProgramming-B3BALajs.js +1 -0
  29. package/src/assets/web-panel/assets/{Notes-BvC5_V2H.js → Notes-u6lLTv0t.js} +1 -1
  30. package/src/assets/web-panel/assets/{Organization-Cxhhw4aD.js → Organization-CQ1X722j.js} +1 -1
  31. package/src/assets/web-panel/assets/{Overflow-L_28D41_.js → Overflow-DHKu8e8g.js} +1 -1
  32. package/src/assets/web-panel/assets/{Permissions-ByLhEAbz.js → Permissions-B2XrAUBW.js} +1 -1
  33. package/src/assets/web-panel/assets/{Pipeline-CnZJNdgt.js → Pipeline-C0K9-DnR.js} +1 -1
  34. package/src/assets/web-panel/assets/{Privacy-BJIajCGG.js → Privacy-BKPoZngH.js} +1 -1
  35. package/src/assets/web-panel/assets/{ProjectSettings-N0r_mtec.js → ProjectSettings-C34C7hFt.js} +1 -1
  36. package/src/assets/web-panel/assets/{Providers-B2A35VhD.js → Providers-BFiMVWaM.js} +1 -1
  37. package/src/assets/web-panel/assets/{Recommend-DYb61WNp.js → Recommend-BmUhysGC.js} +1 -1
  38. package/src/assets/web-panel/assets/{Reputation-C9BfnI0z.js → Reputation-BlfSvJww.js} +1 -1
  39. package/src/assets/web-panel/assets/{Row-CpPHVi7H.js → Row-Dl74576S.js} +1 -1
  40. package/src/assets/web-panel/assets/{RssFeed-CbqJDErh.js → RssFeed-9_MkDUxZ.js} +1 -1
  41. package/src/assets/web-panel/assets/{Search-C0gd765-.js → Search-CSRY_TYa.js} +1 -1
  42. package/src/assets/web-panel/assets/{Security-DsYWAhpE.js → Security-DfDoKfkl.js} +1 -1
  43. package/src/assets/web-panel/assets/{Skeleton-TzxE-JJt.js → Skeleton-6CF_3QUY.js} +1 -1
  44. package/src/assets/web-panel/assets/Skills-DowQcRe1.js +1 -0
  45. package/src/assets/web-panel/assets/{Sla-mftEtvGn.js → Sla-B93c8j92.js} +1 -1
  46. package/src/assets/web-panel/assets/{Templates-DgonVRQJ.js → Templates-DJ_hvs5c.js} +1 -1
  47. package/src/assets/web-panel/assets/{Tenant-BB-LLJMZ.js → Tenant-BXS8s6vl.js} +1 -1
  48. package/src/assets/web-panel/assets/{Tokens-DHOkHNur.js → Tokens-CvmTVU7E.js} +1 -1
  49. package/src/assets/web-panel/assets/{Trigger-BV4JPD3z.js → Trigger-BenSsaoN.js} +1 -1
  50. package/src/assets/web-panel/assets/{Trust-BpC4gDis.js → Trust-HMz40LfZ.js} +1 -1
  51. package/src/assets/web-panel/assets/{VideoEditing-CeDFfKrq.js → VideoEditing-DEhH42sI.js} +1 -1
  52. package/src/assets/web-panel/assets/{Wallet-CcNCVaor.js → Wallet-AGwfOdTM.js} +1 -1
  53. package/src/assets/web-panel/assets/{WebAuthn-BbIPA6Ca.js → WebAuthn-DK5tKWul.js} +1 -1
  54. package/src/assets/web-panel/assets/{WorkflowEditor-DxkitXpf.js → WorkflowEditor-vlujdL6I.js} +1 -1
  55. package/src/assets/web-panel/assets/{colors-2MPUdPu2.js → colors-BiB5aDao.js} +1 -1
  56. package/src/assets/web-panel/assets/{compact-item-B4vcKR0x.js → compact-item-CHderV9n.js} +1 -1
  57. package/src/assets/web-panel/assets/{createContext-Div8Cl0F.js → createContext-DMZ-5dy2.js} +1 -1
  58. package/src/assets/web-panel/assets/{hasIn-9c9xldOR.js → hasIn-BKDBYP3s.js} +1 -1
  59. package/src/assets/web-panel/assets/{index-BuVNDnn8.js → index-7fxCGMoL.js} +1 -1
  60. package/src/assets/web-panel/assets/{index-ZW72ov7W.js → index-7pqZqPD2.js} +1 -1
  61. package/src/assets/web-panel/assets/{index-CIE6ht2b.js → index-A4RpHMOa.js} +1 -1
  62. package/src/assets/web-panel/assets/{index-dV8k_pMc.js → index-AIdelwOe.js} +1 -1
  63. package/src/assets/web-panel/assets/index-B5oebI6W.js +1 -0
  64. package/src/assets/web-panel/assets/{index-COJ-mQYg.js → index-B7fivpG2.js} +1 -1
  65. package/src/assets/web-panel/assets/{index-BntG0RJO.js → index-BBWUR4u4.js} +1 -1
  66. package/src/assets/web-panel/assets/{index-BCfVA9mJ.js → index-BBk2e7vJ.js} +1 -1
  67. package/src/assets/web-panel/assets/{index-BfoYep3e.js → index-BRRFK-im.js} +1 -1
  68. package/src/assets/web-panel/assets/{index-CVYrm1az.js → index-BVOI707f.js} +1 -1
  69. package/src/assets/web-panel/assets/{index-C1GXp5YD.js → index-BadelvSE.js} +1 -1
  70. package/src/assets/web-panel/assets/{index-BbqCdQXU.js → index-BfKFNptm.js} +1 -1
  71. package/src/assets/web-panel/assets/{index-OhUZFfxQ.js → index-BgDX-tzO.js} +1 -1
  72. package/src/assets/web-panel/assets/{index-B58J4NxK.js → index-BjSojphX.js} +1 -1
  73. package/src/assets/web-panel/assets/{index-DJAPu9VF.js → index-BlXskar6.js} +1 -1
  74. package/src/assets/web-panel/assets/{index-B65KFSc3.js → index-BryAkWUJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{index-D0GALIQZ.js → index-C1p_dZw0.js} +1 -1
  76. package/src/assets/web-panel/assets/{index-CtM3tjRj.js → index-CBYNsy51.js} +1 -1
  77. package/src/assets/web-panel/assets/{index-IzAqu_OK.js → index-CEpcKl17.js} +1 -1
  78. package/src/assets/web-panel/assets/{index--tOLU2ID.js → index-CUT3Nmzx.js} +1 -1
  79. package/src/assets/web-panel/assets/{index-Ca3iTiXs.js → index-CbpCY2ch.js} +1 -1
  80. package/src/assets/web-panel/assets/{index-DgWftysw.js → index-D3PGpBPm.js} +1 -1
  81. package/src/assets/web-panel/assets/{index-C-CTCrAH.js → index-D3lD9wgX.js} +1 -1
  82. package/src/assets/web-panel/assets/index-D5Beu9ZA.js +1 -0
  83. package/src/assets/web-panel/assets/{index-CIWKlZ1X.js → index-DRRzH4Ge.js} +1 -1
  84. package/src/assets/web-panel/assets/{index-BcnQrVVZ.js → index-DRcTAUJA.js} +1 -1
  85. package/src/assets/web-panel/assets/{index-COdKVelL.js → index-DZ8MjPLC.js} +1 -1
  86. package/src/assets/web-panel/assets/{index-ZZ_4A9um.js → index-DfcXDy2A.js} +3 -3
  87. package/src/assets/web-panel/assets/{index-B4hcllQg.js → index-DtDFSCfE.js} +1 -1
  88. package/src/assets/web-panel/assets/{index-D1JeOKve.js → index-DvI8Xtzv.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-D-0g6tCK.js → index-DvfAkHw8.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-D--EKCHy.js → index-DyXslU_B.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Dk3ZySO2.js → index-MoLxDrkb.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-DogHNcyC.js → index-Ncxqj2UN.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DdHPswKn.js → index-YgC7QI1N.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-3KbT-bG7.js → index-_sntSncx.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BjGOthNv.js → index-uujjC_4g.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DIe3dY84.js → index-yMt4C1Gh.js} +1 -1
  97. package/src/assets/web-panel/assets/{initDefaultProps--L8bzddm.js → initDefaultProps-B2vQoQga.js} +1 -1
  98. package/src/assets/web-panel/assets/{motion-BR7NF0vx.js → motion-D2eluOJu.js} +1 -1
  99. package/src/assets/web-panel/assets/{move-BpyQMRtF.js → move-CgcvSoZ7.js} +1 -1
  100. package/src/assets/web-panel/assets/{omit-RkKN6uqw.js → omit-DvLh7wH1.js} +1 -1
  101. package/src/assets/web-panel/assets/{pickAttrs-Bk8_mKGY.js → pickAttrs-BsseBclw.js} +1 -1
  102. package/src/assets/web-panel/assets/{placementArrow-CBAaXBxj.js → placementArrow-XLLtr9qD.js} +1 -1
  103. package/src/assets/web-panel/assets/{responsiveObserve-BzrPInK7.js → responsiveObserve-ByCb5zZK.js} +1 -1
  104. package/src/assets/web-panel/assets/{slide-CXFBsLyp.js → slide-CeP5JCiZ.js} +1 -1
  105. package/src/assets/web-panel/assets/{statusUtils-6TeOuUzQ.js → statusUtils-DMVoo96t.js} +1 -1
  106. package/src/assets/web-panel/assets/{styleChecker-CQt4HHRm.js → styleChecker-Cz5mJgc8.js} +1 -1
  107. package/src/assets/web-panel/assets/{transition-CGYDOK3N.js → transition-DSe9CgZe.js} +1 -1
  108. package/src/assets/web-panel/assets/{useConfigInject-BKqJUQaF.js → useConfigInject-DCcT0grw.js} +1 -1
  109. package/src/assets/web-panel/assets/{useFlexGapSupport--RuYYIc6.js → useFlexGapSupport-BZkoDuF3.js} +1 -1
  110. package/src/assets/web-panel/assets/{vnode-I9keNa_U.js → vnode-Dexy2NN9.js} +1 -1
  111. package/src/assets/web-panel/assets/{zoom-BNV3xYvt.js → zoom-CDfM_sRk.js} +1 -1
  112. package/src/assets/web-panel/index.html +1 -1
  113. package/src/commands/nlprog.js +25 -15
  114. package/src/gateways/ws/ws-server.js +12 -1
  115. package/src/lib/web-ui-server.js +33 -0
  116. package/src/assets/web-panel/assets/NLProgramming-CgD2H0Pc.js +0 -1
  117. package/src/assets/web-panel/assets/Skills-DfaRaffm.js +0 -1
  118. package/src/assets/web-panel/assets/index-BzBaZFuT.js +0 -1
  119. package/src/assets/web-panel/assets/index-CDoxJ9Cl.js +0 -1
@@ -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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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 = _dbFromCtx(nlp);
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
- this.port = options.port || 18800;
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,
@@ -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};