chainlesschain 0.162.116 → 0.162.117

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 (164) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-DDOyyepP.js → AIOps-D1_eyrEP.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-Du7WNR7z.js → ActionButton-tnrMeU0Q.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BfgWzxK9.js → Analytics-SmbOMqoN.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-u3psvW1D.js → AppLayout-B4m4Ic3a.js} +4 -4
  7. package/src/assets/web-panel/assets/{Audit-CHzFroRa.js → Audit-DTC34Qp6.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-BxGsrw2B.js → Backup-CU_llIBF.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-Dbt9fGx6.js → BaseInput-vP66eF17.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-D_Q57G4I.js → Chat-B8-4iHVJ.js} +6 -6
  11. package/src/assets/web-panel/assets/ChatBubbleRenderer-CFD0Xh5e.js +1 -0
  12. package/src/assets/web-panel/assets/{Checkbox-D1EETx0O.js → Checkbox-zV2Jzmv8.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-CbKlHMn4.js → Codegen-C7kfk-rY.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-C1CLqeq2.js → Col-t_vUszuS.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-CPRsLFyz.js → Community-pRCzzaCc.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-DpleToCJ.js → Compact-7IgSGjnW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-CGqa-Ogf.js → Compliance-BqDi7iuY.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-DJk_xDYM.js → Cowork-BL84ZaWT.js} +4 -4
  19. package/src/assets/web-panel/assets/{Cron-M_yDyNBF.js → Cron-yzv32Scr.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain-D7AojU-F.js → Crosschain-6DTzS8P5.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-BETwaPmP.js → DID-CKP63O4a.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-BQ78uhsa.js → Dashboard-CsV3eP9F.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-CH1HJZ3n.js → Dropdown-CByjFKzJ.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-ChXV7GIc.js → EmailListRenderer-C6Hn7n75.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsKuOtrn.js → FamilyGuardDashboard-e1c1vXTT.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-BZLlylg9.js → Federation-D9oejCYY.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-DeCMnWLf.js → FormItemContext-DZ4d_-AT.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-CH7to4tQ.js → GenericCardRenderer-QoGFWBcP.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-C_HcR2op.js → Git-DVZHPXw8.js} +2 -2
  30. package/src/assets/web-panel/assets/Governance-NwdvDPTB.js +1 -0
  31. package/src/assets/web-panel/assets/{Inference-DtnYaICi.js → Inference-BYz9MiEu.js} +1 -1
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-CdVgxVhJ.js → KnowledgeGraph-BUdGIZKt.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-BieJHWlI.js → Logs-CPGewhlD.js} +2 -2
  34. package/src/assets/web-panel/assets/{Marketplace-DCz5yk3o.js → Marketplace-BgRk4ZMW.js} +1 -1
  35. package/src/assets/web-panel/assets/{McpTools-CZ1xedJY.js → McpTools-DLY9Fd7m.js} +5 -5
  36. package/src/assets/web-panel/assets/{Memory-Bz7CQQml.js → Memory-B2QishHE.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-dJ9Br_56.js → MobileBridge-DXMQwB_y.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileProjects-Bpmjz4V6.js → MobileProjects-4uY4YbFm.js} +1 -1
  39. package/src/assets/web-panel/assets/{Mtc-eeWBcjEL.js → Mtc-BVASCKUv.js} +4 -4
  40. package/src/assets/web-panel/assets/{MtcAudit-C5wyRjHk.js → MtcAudit-ByLFJ4Zu.js} +2 -2
  41. package/src/assets/web-panel/assets/{Multisig-BJRGIqgZ.js → Multisig-DRAZYcC6.js} +3 -3
  42. package/src/assets/web-panel/assets/{NLProgramming-S07UoipU.js → NLProgramming-EiptSKn1.js} +1 -1
  43. package/src/assets/web-panel/assets/{Notes-COxSrwZ3.js → Notes-BHh5Akqh.js} +4 -4
  44. package/src/assets/web-panel/assets/{NotificationSettings-DfvE_1K3.js → NotificationSettings-XWFl4_3j.js} +1 -1
  45. package/src/assets/web-panel/assets/{OrderTableRenderer-CeyDa5Ed.js → OrderTableRenderer-Bdc_O7wT.js} +1 -1
  46. package/src/assets/web-panel/assets/{Organization-CcsPrDEP.js → Organization--VWlMdKp.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-DcYp9yIj.js → Overflow-DuYUvyh7.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-a4dzjJXx.js → P2P-BnHaPvFP.js} +2 -2
  49. package/src/assets/web-panel/assets/{PdhVaultBrowser-DFxZ5o8Q.js → PdhVaultBrowser-WfbjffWL.js} +4 -4
  50. package/src/assets/web-panel/assets/{Permissions-Bz9d8JCZ.js → Permissions-BIFhAsZO.js} +4 -4
  51. package/src/assets/web-panel/assets/{PersonalDataHub-CsNBmJ7S.js → PersonalDataHub-Dt_m7YZ6.js} +2 -2
  52. package/src/assets/web-panel/assets/{Pipeline-D-0xA6R_.js → Pipeline-BsNDbhs7.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-X7QLakEK.js → Privacy-C1SJp30I.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-D0AlRjbd.js → ProjectInit-DIOkwlK-.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-DYMl5xmt.js → ProjectSettings-BZIL8hvl.js} +2 -2
  56. package/src/assets/web-panel/assets/Projects-LHqWtiu2.js +1 -0
  57. package/src/assets/web-panel/assets/{Providers-TVCjZ2J6.js → Providers-DlC7SSJT.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk--451B-MZ.js → QuickAsk-DeaVcEma.js} +1 -1
  59. package/src/assets/web-panel/assets/{Recommend-BGGOKiGR.js → Recommend-BbQI1g_u.js} +1 -1
  60. package/src/assets/web-panel/assets/{Reputation-BH4nds8K.js → Reputation-Cro6z2uR.js} +1 -1
  61. package/src/assets/web-panel/assets/{Row-D0pT0QQ0.js → Row-D7LuPQVP.js} +1 -1
  62. package/src/assets/web-panel/assets/{RssFeed-DNU6r0C1.js → RssFeed-BowXZJOX.js} +3 -3
  63. package/src/assets/web-panel/assets/{Search-8pr5NiWu.js → Search-8oufqOmB.js} +1 -1
  64. package/src/assets/web-panel/assets/{Security-DL3-Rbou.js → Security-CRKFB58y.js} +3 -3
  65. package/src/assets/web-panel/assets/{Services-D0-F3yHP.js → Services-DzRJ4Kus.js} +2 -2
  66. package/src/assets/web-panel/assets/{Skeleton-BUNukrAi.js → Skeleton-DtZmLaQr.js} +1 -1
  67. package/src/assets/web-panel/assets/{Skills-MeuPy4i2.js → Skills-CPQFZvJ3.js} +1 -1
  68. package/src/assets/web-panel/assets/{Sla-DRFzpJxS.js → Sla-C599OilU.js} +1 -1
  69. package/src/assets/web-panel/assets/{SpeechSettings-B74NyhKi.js → SpeechSettings-VdhwHyYN.js} +1 -1
  70. package/src/assets/web-panel/assets/{SyncSettings-DWZX4Em2.js → SyncSettings-BvX8fTlf.js} +2 -2
  71. package/src/assets/web-panel/assets/{Tasks-zBrdGeRn.js → Tasks-B63Y5zWj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Templates-Dp_FFrKZ.js → Templates-DZtjohnP.js} +1 -1
  73. package/src/assets/web-panel/assets/{Tenant-C53QENNf.js → Tenant-C8WHv74j.js} +1 -1
  74. package/src/assets/web-panel/assets/Terminal-D0IC-PsM.js +3 -0
  75. package/src/assets/web-panel/assets/{TimelineRenderer-Cfb2GB_R.js → TimelineRenderer-C392mTJ7.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tokens-CMLbuZMs.js → Tokens-BnmIK-7p.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trigger-CLYPsW_7.js → Trigger-CLYUm45n.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trust-D3jxWR77.js → Trust-DmKkB9n0.js} +1 -1
  79. package/src/assets/web-panel/assets/{UkeySign-fNDw_KhV.js → UkeySign-Btsb1cq9.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-D8csuHqj.js → VideoEditing-KbSQiQ31.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-Gemx68ru.js → Wallet-C7T1JpB8.js} +4 -4
  82. package/src/assets/web-panel/assets/{WebAuthn-Wg6nAGh8.js → WebAuthn-B7fk675F.js} +5 -5
  83. package/src/assets/web-panel/assets/{WorkflowEditor-BSr0116-.js → WorkflowEditor-BFEqg2-F.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-BcwDKrOw.js → chat-CCONImPU.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-CRwuUljZ.js → colors-BO_usQco.js} +1 -1
  86. package/src/assets/web-panel/assets/{compact-item-BH9-TA7W.js → compact-item-DPYH8VmY.js} +1 -1
  87. package/src/assets/web-panel/assets/{createContext-DHPD7o_2.js → createContext-DuzinRx4.js} +1 -1
  88. package/src/assets/web-panel/assets/devWarning-BJYFLmEO.js +1 -0
  89. package/src/assets/web-panel/assets/{hasIn-BUiPtAz2.js → hasIn-CGE1laax.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-CiYqE6r2.js → index-B5edbioK.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-D3OP_UGM.js → index-B6faWLbM.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-X925i3Ec.js → index-BBdlh4S9.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-YGHrRaLk.js → index-BJrz4R1Q.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-UNqiZIfY.js → index-BMvB7bwt.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C2i-topE.js → index-BOrH71r5.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DcjCDs8_.js → index-BQieJh3P.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-6sUosvN8.js → index-BhhReyyv.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-USRQuY0h.js → index-BoiTovAz.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-SJMQljkQ.js → index-BxSrpYMm.js} +1 -1
  100. package/src/assets/web-panel/assets/index-BznL1yIS.js +1 -0
  101. package/src/assets/web-panel/assets/{index-CjXX3_MF.js → index-C0J2olcT.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Dt9hI0-B.js → index-C4OJtXb2.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BVGXk0kl.js → index-C6ORJpUJ.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CnxAcX-8.js → index-C8E575em.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CxSHxzVl.js → index-C9a-SDrB.js} +3 -3
  106. package/src/assets/web-panel/assets/{index-DDfr0pto.js → index-CCFBPPL3.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BX4JG3HI.js → index-CFMqyOfS.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DjzesLfN.js → index-CHBCKhGQ.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DBwWELfk.js → index-CLevxAAl.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DJhRnT33.js → index-CiJrDiUF.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Ck7VlFKq.js → index-Cjl3wd7u.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CoD_ykaF.js → index-CsWempjh.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BjpXUPEm.js → index-CyNkEBra.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DSofQ6_z.js → index-CzJpaaYk.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DZjfQdtu.js → index-D7PjxVkg.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-2MwQ3X6t.js → index-DEsKGcgq.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DnSYxJLa.js → index-DFeaJhkI.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BUZj4TZu.js → index-DPLKoezy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DY6005b1.js → index-DcDzDXuF.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B6I9juJW.js → index-DhWFRGxq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DDyIWF6G.js → index-Djr_9TsG.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CJ7N4Kq9.js → index-Dr_bswHZ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C4HqTPhK.js → index-Njlbk8o6.js} +1 -1
  124. package/src/assets/web-panel/assets/index-SDk3qvNU.js +1 -0
  125. package/src/assets/web-panel/assets/{index-Che8xizE.js → index-VjWPHPNA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CqZvL3PL.js → index-WNRdmI1g.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CTjTueAe.js → index-_6PfzLBb.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CU_cl403.js → index-k_kmmJE3.js} +1 -1
  129. package/src/assets/web-panel/assets/{initDefaultProps-DXCAtRs8.js → initDefaultProps-V7_xvS9N.js} +1 -1
  130. package/src/assets/web-panel/assets/{motion-x5-S0MDV.js → motion-DRGZ-HPK.js} +1 -1
  131. package/src/assets/web-panel/assets/{move-luyXzjjS.js → move-CZrcQSMV.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-Dqkw0CTp.js → omit-pd-_NH99.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-BIkNmysd.js → pickAttrs-CTupbn-v.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-DuE-e6si.js → placementArrow-Bn7FYxHg.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-W8zBp_Wb.js → responsiveObserve-WfzZR_7N.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-VrrEqbsQ.js → slide-CYH80N3q.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-rEzF15_8.js → statusUtils-C4hqTJzV.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-BIjl0JAf.js → styleChecker-BQyUObAw.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-BEg-Dj0H.js → useFlexGapSupport-BGDH_gNt.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs-ZdzrfiGS.js → useFs-D_3Y1Yh6.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-CRGBsZ6x.js → usePersonalDataHub-vnU0oI0p.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-uuyVczKn.js → vnode-DnTqtAMj.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-CdJXg6jf.js → zoom-ChHcZlUk.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/commands/hub.js +138 -0
  146. package/src/harness/mcp-client.js +17 -0
  147. package/src/lib/checkpoint-store.js +42 -5
  148. package/src/lib/cost-budget.js +14 -1
  149. package/src/lib/cross-chain-mtc.js +17 -0
  150. package/src/lib/dlp-engine.js +3 -1
  151. package/src/lib/hook-runner.cjs +35 -6
  152. package/src/lib/loop.js +16 -9
  153. package/src/lib/permission-rules.cjs +6 -2
  154. package/src/lib/skill-loader.js +9 -0
  155. package/src/lib/web-fetch.js +33 -4
  156. package/src/repl/agent-repl.js +12 -0
  157. package/src/runtime/headless-runner.js +14 -0
  158. package/src/assets/web-panel/assets/ChatBubbleRenderer-BJT1bSLa.js +0 -1
  159. package/src/assets/web-panel/assets/Governance-PTau8O3i.js +0 -1
  160. package/src/assets/web-panel/assets/Projects-CHQNv-qk.js +0 -1
  161. package/src/assets/web-panel/assets/Terminal-DnD72zQh.js +0 -3
  162. package/src/assets/web-panel/assets/devWarning--UYULS4h.js +0 -1
  163. package/src/assets/web-panel/assets/index-D-IknxcC.js +0 -1
  164. package/src/assets/web-panel/assets/index-ZfyW2JSr.js +0 -1
@@ -347,6 +347,23 @@ export class MCPClient extends EventEmitter {
347
347
  };
348
348
  } catch (err) {
349
349
  entry.state = ServerState.ERROR;
350
+ // A stdio child spawned above but failed to initialize (handshake
351
+ // timeout / broken pipe / non-MCP command) would otherwise leak: we
352
+ // delete the entry from `this.servers` below, so disconnect() can never
353
+ // reach it, and an alive-but-unresponsive process fires neither `close`
354
+ // nor `error` — it would run orphaned with its stdio listeners bound for
355
+ // the lifetime of the CLI. Tear it down on the way out (best-effort;
356
+ // never mask the original connect error).
357
+ if (entry.process) {
358
+ try {
359
+ entry.process.stdout?.removeAllListeners();
360
+ entry.process.stderr?.removeAllListeners();
361
+ entry.process.removeAllListeners();
362
+ entry.process.kill();
363
+ } catch {
364
+ // teardown is best-effort — the connect error is what matters
365
+ }
366
+ }
350
367
  this.servers.delete(name);
351
368
  throw err;
352
369
  }
@@ -91,6 +91,36 @@ function tempIndexPath(dir) {
91
91
  return path.join(dir, `cc-checkpoint-index-${process.pid}-${Date.now()}`);
92
92
  }
93
93
 
94
+ /**
95
+ * rmSync that never throws. Used for best-effort teardown (temp index files,
96
+ * created-since files) so a transient unlink failure — e.g. a Windows file
97
+ * lock (EBUSY/EPERM) on the temp index — can't mask the operation's real
98
+ * result. Without this, a `finally { rmSync(tmpIndex) }` could turn a
99
+ * *successful* checkpoint into a thrown error, or replace the original git
100
+ * error with the cleanup error.
101
+ */
102
+ function rmQuiet(target) {
103
+ try {
104
+ rmSync(target, { force: true });
105
+ } catch {
106
+ /* best-effort cleanup — the operation's real result is what matters */
107
+ }
108
+ }
109
+
110
+ /**
111
+ * True if `abs` is the repo root or lives inside it (containment guard).
112
+ * Both sides go through path.resolve so the comparison is robust to separator
113
+ * style — `repoRoot()` comes from `git rev-parse --show-toplevel` with forward
114
+ * slashes, while path.resolve yields native (backslash) paths on Windows.
115
+ */
116
+ export function withinRoot(root, abs) {
117
+ const r = path.resolve(root);
118
+ const a = path.resolve(abs);
119
+ if (a === r) return true;
120
+ const prefix = r.endsWith(path.sep) ? r : r + path.sep;
121
+ return a.startsWith(prefix);
122
+ }
123
+
94
124
  /**
95
125
  * Snapshot the current working tree to a git tree object WITHOUT creating a
96
126
  * commit and WITHOUT touching the real index. Returns the tree sha.
@@ -107,7 +137,7 @@ function snapshotTree(root, dir) {
107
137
  git(["add", "-A"], { cwd: root, env });
108
138
  return git(["write-tree"], { cwd: root, env });
109
139
  } finally {
110
- rmSync(tmpIndex, { force: true });
140
+ rmQuiet(tmpIndex);
111
141
  }
112
142
  }
113
143
 
@@ -228,7 +258,7 @@ export function createCheckpoint(cwd = process.cwd(), opts = {}) {
228
258
 
229
259
  return { id, ref, commit, tree, parent, label, session, createdAt, files };
230
260
  } finally {
231
- rmSync(tmpIndex, { force: true });
261
+ rmQuiet(tmpIndex);
232
262
  }
233
263
  }
234
264
 
@@ -380,12 +410,19 @@ export function rewindTo(cwd = process.cwd(), idOrRef, opts = {}) {
380
410
  git(["read-tree", targetTree], { cwd: root, env });
381
411
  git(["checkout-index", "-a", "-f"], { cwd: root, env });
382
412
  } finally {
383
- rmSync(tmpIndex, { force: true });
413
+ rmQuiet(tmpIndex);
384
414
  }
385
415
 
386
- // Remove files the target snapshot does not contain (created since).
416
+ // Remove files the target snapshot does not contain (created since). These
417
+ // paths come from git's tree diff (repo-relative, git rejects `..` in tree
418
+ // entries), but this is a force-delete over the user's working tree — guard
419
+ // each resolved path against the repo root before unlinking, as
420
+ // defense-in-depth, and keep it best-effort so one locked file can't abort
421
+ // the whole rewind.
387
422
  for (const rel of added) {
388
- rmSync(path.resolve(root, rel), { force: true });
423
+ const abs = path.resolve(root, rel);
424
+ if (!withinRoot(root, abs)) continue; // never delete outside the repo
425
+ rmQuiet(abs);
389
426
  }
390
427
 
391
428
  return {
@@ -62,14 +62,27 @@ export class CostBudget {
62
62
  * @returns {object} the estimateCost() result for this record
63
63
  */
64
64
  add({ provider, model, usage } = {}) {
65
+ // Prompt-cache tokens are billed too — cache CREATION at ~125% of the input
66
+ // rate (Anthropic), cache READ at 10–50%. The usage events carry
67
+ // cache_read_input_tokens / cache_creation_input_tokens, and `cc cost`
68
+ // already prices them; the hard --max-budget-usd cap must count them as well
69
+ // or it undercounts real spend on a cached Anthropic run and stops too late.
70
+ const cacheReadTokens = usage?.cache_read_input_tokens || 0;
71
+ const cacheCreationTokens = usage?.cache_creation_input_tokens || 0;
65
72
  const est = estimateCost({
66
73
  provider,
67
74
  model,
68
75
  inputTokens: usage?.input_tokens || 0,
69
76
  outputTokens: usage?.output_tokens || 0,
77
+ cacheReadTokens,
78
+ cacheCreationTokens,
70
79
  table: this.table,
71
80
  });
72
- const tokens = (usage?.input_tokens || 0) + (usage?.output_tokens || 0);
81
+ const tokens =
82
+ (usage?.input_tokens || 0) +
83
+ (usage?.output_tokens || 0) +
84
+ cacheReadTokens +
85
+ cacheCreationTokens;
73
86
  if (est.free) {
74
87
  this.sawFree = true;
75
88
  } else if (est.matched) {
@@ -749,6 +749,16 @@ export function verifyMultisigProvenance(envelope, policy) {
749
749
  if (prov.signers.length !== prov.partial_sigs.length) {
750
750
  return { ok: false, code: "SIGNERS_SIGS_LENGTH_MISMATCH" };
751
751
  }
752
+ // A group of N members cannot produce more than N distinct signers; a
753
+ // provenance that lists more is self-inconsistent (and, without a
754
+ // policy.members roster below, would otherwise pass).
755
+ if (prov.signers.length > prov.member_count_n) {
756
+ return {
757
+ ok: false,
758
+ code: "TOO_MANY_SIGNERS",
759
+ detail: `${prov.signers.length} > ${prov.member_count_n}`,
760
+ };
761
+ }
752
762
  const requiredM =
753
763
  policy && Number.isInteger(policy.m) ? policy.m : prov.threshold_m;
754
764
  if (prov.partial_sigs.length < requiredM) {
@@ -764,6 +774,13 @@ export function verifyMultisigProvenance(envelope, policy) {
764
774
  return { ok: false, code: "SIGNERS_NOT_SORTED" };
765
775
  }
766
776
  }
777
+ // Signers must be distinct: duplicates (e.g. ["a","a","a"]) would otherwise
778
+ // let a single member meet an M-of-N threshold by repeating themselves.
779
+ for (let i = 1; i < sorted.length; i++) {
780
+ if (sorted[i] === sorted[i - 1]) {
781
+ return { ok: false, code: "DUPLICATE_SIGNER", detail: sorted[i] };
782
+ }
783
+ }
767
784
  const allowed =
768
785
  policy && Array.isArray(policy.members)
769
786
  ? new Set(policy.members.map((m) => m.did))
@@ -193,7 +193,9 @@ export function listIncidents(filter = {}) {
193
193
  if (filter.severity) {
194
194
  incidents = incidents.filter((i) => i.severity === filter.severity);
195
195
  }
196
- if (filter.resolved === false) {
196
+ if (filter.resolved === true) {
197
+ incidents = incidents.filter((i) => !!i.resolvedAt);
198
+ } else if (filter.resolved === false) {
197
199
  incidents = incidents.filter((i) => !i.resolvedAt);
198
200
  }
199
201
  const limit = filter.limit || 50;
@@ -31,16 +31,30 @@ const HOOK_DECISIONS = Object.freeze({
31
31
  CONTINUE: "continue",
32
32
  });
33
33
 
34
+ /** JSON.parse that returns undefined (not throws) on failure. */
35
+ function tryJson(text) {
36
+ try {
37
+ return JSON.parse(text);
38
+ } catch {
39
+ return undefined;
40
+ }
41
+ }
42
+
34
43
  /** Parse a hook's stdout JSON into a normalized decision, or null if not JSON. */
35
44
  function tryParseDecision(stdout) {
36
45
  const text = String(stdout || "").trim();
37
46
  if (!text || text[0] !== "{") return null;
38
- let obj;
39
- try {
40
- obj = JSON.parse(text);
41
- } catch {
42
- return null;
47
+ let obj = tryJson(text);
48
+ if (obj === undefined) {
49
+ // A hook that emits its decision as a JSON line followed by diagnostics
50
+ // (`{"decision":"block"}\n…log lines…`) would fail a whole-text parse, so
51
+ // the documented JSON-to-block pattern would be silently dropped and the
52
+ // tool would proceed. Recover the decision from the first line. (Pure
53
+ // pretty-printed JSON still parses via the whole-text attempt above.)
54
+ const firstLine = text.split("\n", 1)[0].trim();
55
+ if (firstLine && firstLine[0] === "{") obj = tryJson(firstLine);
43
56
  }
57
+ if (obj === undefined || obj === null || typeof obj !== "object") return null;
44
58
  // PreToolUse-specific permission decision
45
59
  const hso = obj.hookSpecificOutput;
46
60
  if (hso && hso.permissionDecision) {
@@ -148,7 +162,22 @@ function runCommandHook(command, input = {}, opts = {}) {
148
162
  if (exitCode === 0) {
149
163
  const parsed = tryParseDecision(stdout);
150
164
  if (parsed) return { ...parsed, exitCode, stdout, stderr };
151
- return { decision: HOOK_DECISIONS.CONTINUE, reason: null, exitCode, stdout, stderr };
165
+ // stdout that *looks* like a decision (`{`-leading) but parses as neither
166
+ // whole-text nor first-line JSON is most likely a corrupt/truncated
167
+ // decision — don't swallow it silently (a block hook could be neutered).
168
+ // The exit code (0) still governs the flow (continue), but flag it so the
169
+ // caller/logs can surface the misconfiguration.
170
+ const looksLikeDecision = stdout.trim()[0] === "{";
171
+ return {
172
+ decision: HOOK_DECISIONS.CONTINUE,
173
+ reason: looksLikeDecision
174
+ ? "hook stdout looked like a decision but did not parse as JSON"
175
+ : null,
176
+ exitCode,
177
+ stdout,
178
+ stderr,
179
+ ...(looksLikeDecision ? { malformedDecision: true } : {}),
180
+ };
152
181
  }
153
182
  // Other non-zero → non-blocking error.
154
183
  return {
package/src/lib/loop.js CHANGED
@@ -108,15 +108,22 @@ export function makeSleep(signal) {
108
108
  // process alive between rounds. Under a TTY the active stdin would mask
109
109
  // an unref'd timer, but headless (piped stdin / CI / cron) the loop would
110
110
  // exit after the first round. SIGINT aborts the wait via the signal.
111
- const t = setTimeout(resolve, ms);
112
- signal?.addEventListener(
113
- "abort",
114
- () => {
115
- clearTimeout(t);
116
- resolve();
117
- },
118
- { once: true },
119
- );
111
+ let t;
112
+ const onAbort = () => {
113
+ clearTimeout(t);
114
+ resolve();
115
+ };
116
+ t = setTimeout(() => {
117
+ // Normal completion: drop the abort listener so it can't accumulate on
118
+ // a shared signal across rounds. A long `cc loop` reuses one
119
+ // AbortController for the whole run, and `{once:true}` only removes the
120
+ // listener if it FIRES — a sleep that completes normally never aborts,
121
+ // so without this each round would leak a dangling listener (N rounds →
122
+ // N retained closures + a MaxListenersExceededWarning past 10).
123
+ signal?.removeEventListener("abort", onAbort);
124
+ resolve();
125
+ }, ms);
126
+ signal?.addEventListener("abort", onAbort, { once: true });
120
127
  });
121
128
  }
122
129
 
@@ -206,10 +206,14 @@ function matchCommand(pattern, command) {
206
206
  function matchUrl(pattern, url) {
207
207
  const u = String(url || "");
208
208
  if (pattern.startsWith("domain:")) {
209
- const host = pattern.slice("domain:".length).trim();
209
+ // Domains are case-insensitive (and `new URL().host` already lowercases the
210
+ // host), so lowercase the pattern too — otherwise a rule with any uppercase
211
+ // (`domain:Example.com`) silently never matches, turning a deny rule into a
212
+ // bypass and an allow rule into a no-op.
213
+ const host = pattern.slice("domain:".length).trim().toLowerCase();
210
214
  let actualHost = "";
211
215
  try {
212
- actualHost = new URL(u).host;
216
+ actualHost = new URL(u).host.toLowerCase();
213
217
  } catch {
214
218
  return false;
215
219
  }
@@ -120,6 +120,15 @@ export function parseSkillMd(content) {
120
120
  .slice(2)
121
121
  .trim()
122
122
  .replace(/^['"]|['"]$/g, "");
123
+ // Lazily start a block array on the first item under an empty-value key
124
+ // (`tools:\n - Read\n - Write`). Without this, currentArray was never
125
+ // assigned anywhere, so block-style YAML lists were silently dropped —
126
+ // e.g. an `allowed-tools:` list would vanish and its restriction be lost.
127
+ // Only create when the key carried no inline value (data[key] still
128
+ // undefined) so a scalar isn't clobbered by a stray dash.
129
+ if (!currentArray && currentKey && data[currentKey] === undefined) {
130
+ currentArray = data[currentKey] = [];
131
+ }
123
132
  if (currentArray) currentArray.push(value);
124
133
  continue;
125
134
  }
@@ -12,21 +12,50 @@ import { URL } from "url";
12
12
  const DEFAULT_MAX_BYTES = 2_000_000;
13
13
  const DEFAULT_TIMEOUT_MS = 15_000;
14
14
 
15
- // RFC 1918 + loopback + link-local. Blocked by default unless config.allowPrivateHosts.
15
+ // RFC 1918 + loopback + link-local (IPv4 and IPv6). Blocked by default unless
16
+ // config.allowPrivateHosts. Decimal/integer IPv4 forms (http://2130706433,
17
+ // http://0) are normalized to dotted-decimal by `new URL()` before they reach
18
+ // here, so the IPv4 patterns catch them too.
16
19
  const PRIVATE_HOST_PATTERNS = [
17
20
  /^127\./,
18
21
  /^10\./,
19
22
  /^192\.168\./,
20
23
  /^172\.(1[6-9]|2\d|3[01])\./,
21
- /^169\.254\./,
24
+ /^169\.254\./, // link-local incl. cloud metadata 169.254.169.254
22
25
  /^0\.0\.0\.0$/,
23
- /^::1$/,
26
+ /^0$/, // bare 0 → 0.0.0.0
27
+ /^::1$/, // IPv6 loopback
28
+ /^::$/, // IPv6 unspecified (== 0.0.0.0)
29
+ /^f[cd][0-9a-f]{2}:/, // fc00::/7 unique-local (ULA)
30
+ /^fe[89ab][0-9a-f]:/, // fe80::/10 link-local
24
31
  /^localhost$/i,
25
32
  ];
26
33
 
34
+ // Decode the IPv4 embedded in an IPv4-mapped IPv6 address back to dotted form,
35
+ // or null if `h` is not such an address. `new URL()` normalizes the embedded
36
+ // IPv4 to hex (::ffff:127.0.0.1 → ::ffff:7f00:1), so without decoding, a fetch
37
+ // to [::ffff:127.0.0.1] would bypass the IPv4 loopback/private rules.
38
+ function mappedIPv4(h) {
39
+ const m = /^::ffff:(.+)$/.exec(h);
40
+ if (!m) return null;
41
+ const tail = m[1];
42
+ if (/^\d{1,3}(\.\d{1,3}){3}$/.test(tail)) return tail; // already dotted
43
+ const hx = /^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(tail);
44
+ if (!hx) return null;
45
+ const a = parseInt(hx[1], 16);
46
+ const b = parseInt(hx[2], 16);
47
+ return [(a >> 8) & 255, a & 255, (b >> 8) & 255, b & 255].join(".");
48
+ }
49
+
27
50
  export function isPrivateHost(host) {
28
51
  if (!host) return true;
29
- return PRIVATE_HOST_PATTERNS.some((re) => re.test(host));
52
+ let h = String(host).toLowerCase();
53
+ // `new URL().hostname` returns IPv6 hosts bracketed ("[::1]") — strip so the
54
+ // IPv6 patterns (and the previously-dead ::1 rule) actually match.
55
+ if (h.startsWith("[") && h.endsWith("]")) h = h.slice(1, -1);
56
+ const v4 = mappedIPv4(h);
57
+ if (v4) h = v4; // re-check the embedded IPv4 against the IPv4 rules
58
+ return PRIVATE_HOST_PATTERNS.some((re) => re.test(h));
30
59
  }
31
60
 
32
61
  export function checkAllowed(urlStr, config = {}) {
@@ -1562,6 +1562,18 @@ export async function startAgentRepl(options = {}) {
1562
1562
  model = arg;
1563
1563
  _curModel = model; // keep the status-line readout in sync
1564
1564
  logger.info(`Model: ${chalk.cyan(model)}`);
1565
+ // Claude-Code 2.1.183 parity: warn when the newly-selected model is a
1566
+ // provider-retired/deprecated snapshot. Headless paths already warn via
1567
+ // maybeWarnDeprecatedModel; the interactive /model switch did not, so a
1568
+ // user could silently switch to a retired id and only learn of it when
1569
+ // the next turn fails with an opaque "model not found".
1570
+ try {
1571
+ const { maybeWarnDeprecatedModel } =
1572
+ await import("../lib/model-deprecation.js");
1573
+ maybeWarnDeprecatedModel({ model });
1574
+ } catch {
1575
+ // deprecation notice is best-effort
1576
+ }
1565
1577
  } else {
1566
1578
  logger.info(`Current model: ${chalk.cyan(model)}`);
1567
1579
  }
@@ -768,6 +768,20 @@ export async function runAgentHeadless(options = {}, deps = {}) {
768
768
  // chatFn passthrough lets tests drive the loop deterministically.
769
769
  chatFn: deps.chatFn || options.chatFn || undefined,
770
770
  signal: options.signal || undefined,
771
+ // Stream-stall hint (Claude-Code 2.1.185): when the connection is alive but
772
+ // the API has gone silent mid-response, a headless run would otherwise look
773
+ // frozen with no feedback. The REPL already surfaces this; mirror it here to
774
+ // stderr — out-of-band for every output format (text answer / json envelope
775
+ // / stream-json NDJSON all go to stdout) so machine consumers are unaffected
776
+ // while a human watching a long `cc agent -p` run learns we're still waiting
777
+ // and, when a hard inactivity timeout is set, when it will auto-retry. Plain
778
+ // text (no chalk) since headless stderr is frequently piped/non-TTY.
779
+ onStall: (ms, timeoutMs) => {
780
+ const silent = Math.round(ms / 1000);
781
+ const retryIn = timeoutMs > ms ? Math.round((timeoutMs - ms) / 1000) : 0;
782
+ const suffix = retryIn > 0 ? ` · will retry in ${retryIn}s` : "";
783
+ writeErr(` ⏳ waiting for API response (silent ${silent}s)${suffix}…\n`);
784
+ },
771
785
  };
772
786
 
773
787
  // Goal binding (cc goal, Phase 1). `--goal <id>` binds explicitly; `--goal`
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as a,R as n,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-CxSHxzVl.js";import"./icons-DP3uiYxy.js";const M={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},N={class:"bubble"},T={class:"meta"},V={class:"actor"},R={class:"time"},j={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[a("div",N,[a("div",T,[a("span",V,n(r.actorLabel),1),a("span",R,n(r.formattedTime),1)]),a("div",j,n(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(n(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(M,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1 +0,0 @@
1
- import{I as y,J as g,U as f,R as s,c as o,K as a,V as p,S as k,o as ue,a as se,b as ie,r as P,P as d,Q as u,F,Z as U,$ as Ue}from"./vendor-BvqAck49.js";import{_ as Ie,u as pe,b as ve,E as fe,d as b}from"./index-CxSHxzVl.js";import{s as Pe}from"./community-parser-CO25nZFt.js";import{aU as Ne,aT as Ve,d as Ye,f as Ge,ap as Be,a4 as qe,as as Je,R as Ke}from"./icons-DP3uiYxy.js";function B(t){const n=Pe(t);if(!n)return null;try{return JSON.parse(n)}catch{}const c=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!c)return null;try{return JSON.parse(c[0])}catch{return null}}const Se=Object.freeze(["draft","active","passed","rejected","expired"]),he=Object.freeze(["parameter_change","feature_request","policy_update","budget_allocation"]),He=Object.freeze(["yes","no","abstain"]);function w(t,n=0){return typeof t=="number"&&Number.isFinite(t)?t:n}function I(t){if(!t)return{noDb:!1,error:""};const n=Pe(t),c=/Database not available/i.test(n);return{noDb:c,error:c?"Database not available":""}}function We(t,n=0){if(!t||typeof t!="object")return null;const c=t.id||"";return c?{key:c,id:c,name:String(t.name||""),description:String(t.description||""),_idx:n}:null}function me(t){const n=B(t);return Array.isArray(n)?n.map(We).filter(Boolean):[]}function Qe(t,n=0){if(!t||typeof t!="object")return null;const c=t.id||"";return c?{key:c,id:c,title:String(t.title||""),description:t.description??"",type:String(t.type||"feature_request"),proposerDid:t.proposerDid??"",status:String(t.status||"draft").toLowerCase(),impactLevel:t.impactLevel??"",impactAnalysis:t.impactAnalysis??null,voteYes:w(t.voteYes,0),voteNo:w(t.voteNo,0),voteAbstain:w(t.voteAbstain,0),votingStartsAt:t.votingStartsAt??null,votingEndsAt:t.votingEndsAt??null,metadata:t.metadata??null,createdAt:t.createdAt??null,_idx:n}:null}function ye(t){const n=B(t);return Array.isArray(n)?n.map(Qe).filter(Boolean):[]}function Ze(t,n=0){if(!t||typeof t!="object")return null;const c=t.id||"";if(!c)return null;const e=String(t.vote||"").toLowerCase();return{key:c,id:c,proposalId:String(t.proposalId||""),voterDid:String(t.voterDid||""),vote:(He.includes(e),e),reason:t.reason??"",weight:w(t.weight,1),createdAt:t.createdAt??null,_idx:n}}function ge(t){const n=B(t);return Array.isArray(n)?n.map(Ze).filter(Boolean):[]}function be(t){const n=B(t);return!n||typeof n!="object"||Array.isArray(n)?null:{impactLevel:String(n.impactLevel||""),affectedComponents:Array.isArray(n.affectedComponents)?n.affectedComponents.filter(c=>typeof c=="string"):[],riskScore:w(n.riskScore,0),benefitScore:w(n.benefitScore,0),estimatedEffort:String(n.estimatedEffort||""),communitySentiment:String(n.communitySentiment||""),recommendations:Array.isArray(n.recommendations)?n.recommendations.filter(c=>typeof c=="string"):[],analyzedAt:n.analyzedAt??null}}function _e(t){const n=B(t);return!n||typeof n!="object"||Array.isArray(n)?null:{proposalId:String(n.proposalId||""),predictedOutcome:String(n.predictedOutcome||""),confidence:w(n.confidence,0),yesProb:w(n.yesProb,0),noProb:w(n.noProb,0),abstainProb:w(n.abstainProb,0),basedOn:String(n.basedOn||""),sampleSize:w(n.sampleSize,0)}}const Xe={proposalCount:0,voteCount:0,byStatus:{},byType:{}};function ke(t){const n=JSON.parse(JSON.stringify(Xe));for(const e of Se)n.byStatus[e]=0;for(const e of he)n.byType[e]=0;const c=B(t);if(!c||typeof c!="object"||Array.isArray(c))return n;if(n.proposalCount=w(c.proposalCount,0),n.voteCount=w(c.voteCount,0),c.byStatus&&typeof c.byStatus=="object")for(const[e,D]of Object.entries(c.byStatus))typeof D=="number"&&Number.isFinite(D)&&(n.byStatus[e]=D);if(c.byType&&typeof c.byType=="object")for(const[e,D]of Object.entries(c.byType))typeof D=="number"&&Number.isFinite(D)&&(n.byType[e]=D);return n}function $e(t){if(t==null||t==="")return"—";const n=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(n.getTime())?String(t):n.toLocaleString("zh-CN",{hour12:!1})}const et={__name:"Governance",setup(t,{expose:n}){n();const c=pe(),{t:e}=ve(),D=fe.PRESENTED_IMAGE_SIMPLE,Q=P(!1),L=P(!1),N=P(!1),q=P([]),T=P([]),O=P({proposalCount:0,voteCount:0,byStatus:{},byType:{}}),C=P({noDb:!1,error:""}),V=P("proposals"),_=P(""),x=P(""),Y=P(!1),E=P(!1),Z=P(!1),X=P(!1),J=P(!1),z=se({title:"",type:"feature_request",proposerDid:"",description:""}),A=se({voterDid:"",value:"yes",weight:1,reason:""}),h=P(null),K=P([]),H=P(null),G=P(null),$=ie(()=>[{title:e("governance.cols.title"),key:"title"},{title:e("governance.cols.type"),key:"type",width:"130px"},{title:e("governance.cols.status"),key:"status",width:"100px"},{title:e("governance.cols.tally"),key:"tally",width:"180px"},{title:e("governance.cols.impact"),key:"impact",width:"100px"},{title:e("governance.cols.createdAt"),key:"createdAt",width:"160px"},{title:e("governance.cols.action"),key:"action",width:"320px"}]),M=ie(()=>{let l=q.value;return _.value&&(l=l.filter(i=>i.status===_.value)),x.value&&(l=l.filter(i=>i.type===x.value)),l});function ae(l){const i=`governance.statusLabels.${l}`,v=e(i);return v===i?l:v}function S(l){return{draft:"default",active:"processing",passed:"green",rejected:"red",expired:"default"}[l]||"default"}function ee(l){return{draft:"#888",active:"#1677ff",passed:"#52c41a",rejected:"#ff4d4f",expired:"#888"}[l]||"#888"}function ne(l){const i=`governance.typeLabels.${l}`,v=e(i);return v===i?l:v}function te(l){return{parameter_change:"cyan",feature_request:"blue",policy_update:"purple",budget_allocation:"gold"}[l]||"default"}function oe(l){return{parameter_change:"#13c2c2",feature_request:"#1677ff",policy_update:"#722ed1",budget_allocation:"#faad14"}[l]||"#888"}function r(l){const i=`governance.impactLabels.${l}`,v=e(i);return v===i?l:v}function m(l){return{low:"default",medium:"blue",high:"orange",critical:"red"}[l]||"default"}function R(l){return{low:"#888",medium:"#1677ff",high:"#faad14",critical:"#ff4d4f"}[l]||"#888"}function Ce(l){const i=`governance.voteLabels.${l}`,v=e(i);return v===i?l:v}function Ae(l){return{yes:"green",no:"red",abstain:"default"}[l]||"default"}function Oe(l){if(!l)return"—";const i=`governance.effortLabels.${l}`,v=e(i);return v===i?l:v}function ze(l){if(!l)return"—";const i=`governance.sentimentLabels.${l}`,v=e(i);return v===i?l:v}function we(l){const i=l.voteYes+l.voteNo;return i?Math.round(l.voteYes/i*100):0}function Le(l,i){return i?Math.round(l/i*100):0}async function W(){Q.value=!0,C.value={noDb:!1,error:""};try{const[l,i,v]=await Promise.all([c.execute("governance types --json",8e3).catch(()=>({output:""})),c.execute("governance list --json",1e4).catch(()=>({output:""})),c.execute("governance stats --json",8e3).catch(()=>({output:""}))]),j=[i,v].map(le=>I(le.output)).find(le=>le.noDb);j&&(C.value=j),T.value=me(l.output),q.value=ye(i.output),O.value=ke(v.output)}catch(l){b.error(e("governance.msg.loadFailed")+": "+(l?.message||l))}finally{Q.value=!1}}async function Te(){if(!z.title.trim()){b.warning(e("governance.msg.titleEmpty"));return}L.value=!0;try{const l=[`governance create "${z.title.trim().replace(/"/g,'\\"')}"`];l.push(`-t ${z.type}`),z.proposerDid.trim()&&l.push(`-p "${z.proposerDid.trim().replace(/"/g,'\\"')}"`),z.description.trim()&&l.push(`-d "${z.description.trim().replace(/"/g,'\\"')}"`),l.push("--json");const{output:i}=await c.execute(l.join(" "),1e4);if(I(i).noDb){b.error(e("governance.msg.needCcInit"));return}if(!/"id"/.test(i)){b.error(e("governance.msg.createFailed")+": "+i.slice(0,120));return}b.success(e("governance.msg.createSuccess")),Y.value=!1,ce(),await W()}catch(l){b.error(e("governance.msg.createFailed")+": "+(l?.message||l))}finally{L.value=!1}}async function xe(l){await re(`governance activate ${l.id} --json`,e("governance.msg.activated"))}async function Fe(l){await re(`governance close ${l.id} --json`,e("governance.msg.closed"))}async function re(l,i){try{const{output:v}=await c.execute(l,1e4);if(I(v).noDb){b.error(e("governance.msg.needCcInit"));return}if(!/"id"|"proposalId"|"passed"/.test(v)){b.error(e("governance.msg.actionFailed")+": "+v.slice(0,120));return}b.success(i),await W()}catch(v){b.error(e("governance.msg.actionFailed")+": "+(v?.message||v))}}function De(l){h.value=l,A.voterDid="",A.value="yes",A.weight=1,A.reason="",E.value=!0}async function Ee(){if(h.value){if(!A.voterDid.trim()){b.warning(e("governance.msg.voterEmpty"));return}N.value=!0;try{const l=[`governance vote ${h.value.id}`,`"${A.voterDid.trim().replace(/"/g,'\\"')}"`,A.value,`-w ${A.weight}`];A.reason.trim()&&l.push(`-r "${A.reason.trim().replace(/"/g,'\\"')}"`),l.push("--json");const{output:i}=await c.execute(l.join(" "),8e3);if(I(i).noDb){b.error(e("governance.msg.needCcInit"));return}if(!/"id"/.test(i)){b.error(e("governance.msg.voteFailed")+": "+i.slice(0,120));return}b.success(e("governance.msg.voteSuccess")),E.value=!1,await W()}catch(l){b.error(e("governance.msg.voteFailed")+": "+(l?.message||l))}finally{N.value=!1}}}async function je(l){h.value=l,K.value=[],Z.value=!0;try{const{output:i}=await c.execute(`governance votes ${l.id} --json`,8e3);K.value=ge(i)}catch{}}async function Me(l){h.value=l,H.value=null;try{const{output:i}=await c.execute(`governance analyze ${l.id} --json`,8e3);if(I(i).noDb){b.error(e("governance.msg.needCcInit"));return}const j=be(i);if(!j){b.error(e("governance.msg.analyzeFailed")+": "+i.slice(0,120));return}H.value=j,X.value=!0}catch(i){b.error(e("governance.msg.analyzeFailed")+": "+(i?.message||i))}}async function Re(l){h.value=l,G.value=null;try{const{output:i}=await c.execute(`governance predict ${l.id} --json`,8e3);if(I(i).noDb){b.error(e("governance.msg.needCcInit"));return}const j=_e(i);if(!j){b.error(e("governance.msg.predictFailed")+": "+i.slice(0,120));return}G.value=j,J.value=!0}catch(i){b.error(e("governance.msg.predictFailed")+": "+(i?.message||i))}}function ce(){z.title="",z.type="feature_request",z.proposerDid="",z.description=""}ue(W);const de={ws:c,t:e,EMPTY_IMG:D,loading:Q,creating:L,voting:N,proposals:q,proposalTypes:T,stats:O,errorState:C,activeTab:V,statusFilter:_,typeFilter:x,showCreateModal:Y,showVoteModal:E,showDetailsModal:Z,showAnalysisModal:X,showPredictionModal:J,createForm:z,voteForm:A,currentProposal:h,detailVotes:K,currentAnalysis:H,currentPrediction:G,proposalColumns:$,filteredProposals:M,statusLabel:ae,statusColor:S,statusBarColor:ee,typeLabel:ne,typeColor:te,typeBarColor:oe,impactLabel:r,impactColor:m,impactBarColor:R,voteLabel:Ce,voteColor:Ae,effortLabel:Oe,sentimentLabel:ze,yesPct:we,pctOfTotal:Le,loadAll:W,createProposal:Te,activateProposal:xe,closeProposal:Fe,runProposalAction:re,openVoteModal:De,submitVote:Ee,viewProposalDetails:je,runAnalyze:Me,runPredict:Re,resetCreateForm:ce,ref:P,computed:ie,onMounted:ue,reactive:se,get ReloadOutlined(){return Ke},get PlusOutlined(){return Je},get FileTextOutlined(){return qe},get PlayCircleOutlined(){return Be},get CheckCircleOutlined(){return Ge},get CloseCircleOutlined(){return Ye},get LikeOutlined(){return Ve},get ArrowRightOutlined(){return Ne},get message(){return b},get Empty(){return fe},get useI18n(){return ve},get useWsStore(){return pe},get parseTypes(){return me},get parseProposals(){return ye},get parseVotes(){return ge},get parseAnalysis(){return be},get parsePrediction(){return _e},get parseStats(){return ke},get detectGovernanceError(){return I},get formatGovernanceTime(){return $e},get PROPOSAL_STATUSES(){return Se},get PROPOSAL_TYPE_IDS(){return he}};return Object.defineProperty(de,"__isScriptSetup",{enumerable:!1,value:!0}),de}},tt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ot={class:"page-title"},at={class:"page-sub"},nt={class:"type-head"},rt={class:"type-count"},lt={class:"type-name"},st={class:"type-desc"},it={class:"filter-bar"},ct={style:{color:"var(--text-primary)","font-weight":"500"}},dt={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace","margin-top":"2px"}},ut={style:{"font-family":"monospace","font-size":"12px"}},pt={style:{color:"#52c41a"}},vt={style:{color:"#ff4d4f"}},ft={style:{color:"var(--text-muted)"}},mt={key:1,style:{color:"var(--text-muted)"}},yt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},gt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},bt={style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},_t={key:0,style:{"padding-top":"8px"}},kt={style:{"font-family":"monospace","font-size":"12px"}},Pt={key:0,style:{"font-family":"monospace","font-size":"12px"}},St={key:1,style:{color:"var(--text-muted)"}},ht={key:0,style:{"white-space":"pre-wrap"}},Ct={key:1,style:{color:"var(--text-muted)"}},At={style:{color:"var(--text-primary)","font-size":"13px",margin:"20px 0 10px"}},Ot={style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"11px"}},zt={style:{"margin-left":"8px","font-family":"monospace","font-size":"11px",color:"var(--text-secondary)"}},wt={key:0,style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},Lt={style:{"margin-left":"auto",color:"var(--text-muted)","font-size":"11px"}},Tt={key:0,style:{"padding-top":"8px"}},xt={style:{"margin-bottom":"8px"}},Ft={style:{color:"var(--text-secondary)","font-size":"12px"}},Dt={style:{color:"var(--text-secondary)","font-size":"12px"}},Et={key:0,style:{"padding-top":"8px"}},jt={style:{"text-align":"center","margin-bottom":"20px"}},Mt={style:{color:"#52c41a"}},Rt={style:{color:"#ff4d4f"}},Ut={style:{color:"var(--text-muted)"}};function It(t,n,c,e,D,Q){const L=y("a-button"),N=y("a-space"),q=y("a-alert"),T=y("a-statistic"),O=y("a-card"),C=y("a-col"),V=y("a-row"),_=y("a-tag"),x=y("a-radio-button"),Y=y("a-radio-group"),E=y("a-progress"),Z=y("a-popconfirm"),X=y("a-table"),J=y("a-tab-pane"),z=y("a-tabs"),A=y("a-input"),h=y("a-form-item"),K=y("a-select-option"),H=y("a-select"),G=y("a-textarea"),$=y("a-form"),M=y("a-modal"),ae=y("a-input-number"),S=y("a-descriptions-item"),ee=y("a-descriptions"),ne=y("a-empty"),te=y("a-list-item"),oe=y("a-list");return d(),g("div",null,[f("div",tt,[f("div",null,[f("h2",ot,s(t.$t("governance.title")),1),f("p",at,s(t.$t("governance.subtitle")),1)]),o(N,null,{default:a(()=>[o(L,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[o(e.ReloadOutlined)]),default:a(()=>[u(" "+s(t.$t("governance.refresh")),1)]),_:1},8,["loading"]),o(L,{type:"primary",onClick:n[0]||(n[0]=r=>e.showCreateModal=!0)},{icon:a(()=>[o(e.PlusOutlined)]),default:a(()=>[u(" "+s(t.$t("governance.create")),1)]),_:1})]),_:1})]),p(" noDb banner "),e.errorState.noDb?(d(),k(q,{key:0,type:"info","show-icon":"",message:t.$t("governance.noDb.message"),description:t.$t("governance.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):p("v-if",!0),p(" Stat cards "),o(V,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(C,{xs:12,sm:8,lg:5},{default:a(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(T,{title:t.$t("governance.stats.total"),value:e.stats.proposalCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(e.FileTextOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(C,{xs:12,sm:8,lg:5},{default:a(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(T,{title:t.$t("governance.stats.active"),value:e.stats.byStatus.active||0,"value-style":{color:(e.stats.byStatus.active||0)>0?"#1677ff":"#888",fontSize:"20px"}},{prefix:a(()=>[o(e.PlayCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),o(C,{xs:12,sm:8,lg:5},{default:a(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(T,{title:t.$t("governance.stats.passed"),value:e.stats.byStatus.passed||0,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[o(e.CheckCircleOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(C,{xs:12,sm:8,lg:5},{default:a(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(T,{title:t.$t("governance.stats.rejected"),value:e.stats.byStatus.rejected||0,"value-style":{color:"#ff4d4f",fontSize:"20px"}},{prefix:a(()=>[o(e.CloseCircleOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(C,{xs:24,sm:8,lg:4},{default:a(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(T,{title:t.$t("governance.stats.votes"),value:e.stats.voteCount,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[o(e.LikeOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1})]),_:1}),p(" Type catalogue "),o(O,{title:t.$t("governance.typesCard"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[o(V,{gutter:[12,12]},{default:a(()=>[(d(!0),g(F,null,U(e.proposalTypes,r=>(d(),k(C,{key:r.id,xs:12,sm:12,lg:6},{default:a(()=>[f("div",{class:"type-pill",style:Ue({borderLeftColor:e.typeColor(r.id)})},[f("div",nt,[o(_,{color:e.typeColor(r.id),style:{"font-family":"monospace"}},{default:a(()=>[u(s(r.id),1)]),_:2},1032,["color"]),f("span",rt,s(e.stats.byType[r.id]||0),1)]),f("div",lt,s(r.name),1),f("div",st,s(r.description),1)],4)]),_:2},1024))),128))]),_:1})]),_:1},8,["title"]),p(" Tabs "),o(z,{activeKey:e.activeTab,"onUpdate:activeKey":n[3]||(n[3]=r=>e.activeTab=r),class:"governance-tabs"},{default:a(()=>[p(" ── Proposals tab ────────────────────────────────────────── "),o(J,{key:"proposals",tab:t.$t("governance.tabs.proposals")},{default:a(()=>[f("div",it,[o(Y,{value:e.statusFilter,"onUpdate:value":n[1]||(n[1]=r=>e.statusFilter=r),size:"small","button-style":"solid"},{default:a(()=>[o(x,{value:""},{default:a(()=>[u(s(t.$t("governance.filter.allStatuses")),1)]),_:1}),(d(!0),g(F,null,U(e.PROPOSAL_STATUSES,r=>(d(),k(x,{key:r,value:r},{default:a(()=>[u(s(e.statusLabel(r)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(Y,{value:e.typeFilter,"onUpdate:value":n[2]||(n[2]=r=>e.typeFilter=r),size:"small"},{default:a(()=>[o(x,{value:""},{default:a(()=>[u(s(t.$t("governance.filter.allTypes")),1)]),_:1}),(d(!0),g(F,null,U(e.PROPOSAL_TYPE_IDS,r=>(d(),k(x,{key:r,value:r},{default:a(()=>[u(s(e.typeLabel(r)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(X,{columns:e.proposalColumns,"data-source":e.filteredProposals,pagination:{pageSize:20,showTotal:r=>t.$t("governance.table.totalSuffix",{n:r})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:r,record:m})=>[r.key==="title"?(d(),g(F,{key:0},[f("span",ct,s(m.title||t.$t("governance.table.unnamed")),1),f("div",dt,s(m.id.slice(0,16)),1)],64)):p("v-if",!0),r.key==="type"?(d(),k(_,{key:1,color:e.typeColor(m.type),style:{"font-family":"monospace"}},{default:a(()=>[u(s(e.typeLabel(m.type)),1)]),_:2},1032,["color"])):p("v-if",!0),r.key==="status"?(d(),k(_,{key:2,color:e.statusColor(m.status)},{default:a(()=>[u(s(e.statusLabel(m.status)),1)]),_:2},1032,["color"])):p("v-if",!0),r.key==="tally"?(d(),g(F,{key:3},[f("span",ut,[f("span",pt,"+"+s(m.voteYes),1),n[17]||(n[17]=u(" / ",-1)),f("span",vt,"-"+s(m.voteNo),1),n[18]||(n[18]=u(" / ",-1)),f("span",ft,"~"+s(m.voteAbstain),1)]),m.voteYes+m.voteNo>0?(d(),k(E,{key:0,percent:e.yesPct(m),size:"small","show-info":!1,"stroke-color":m.voteYes>=m.voteNo?"#52c41a":"#ff4d4f",style:{"margin-top":"4px"}},null,8,["percent","stroke-color"])):p("v-if",!0)],64)):p("v-if",!0),r.key==="impact"?(d(),g(F,{key:4},[m.impactLevel?(d(),k(_,{key:0,color:e.impactColor(m.impactLevel)},{default:a(()=>[u(s(e.impactLabel(m.impactLevel)),1)]),_:2},1032,["color"])):(d(),g("span",mt,"—"))],64)):p("v-if",!0),r.key==="createdAt"?(d(),g("span",yt,s(e.formatGovernanceTime(m.createdAt)),1)):p("v-if",!0),r.key==="action"?(d(),g(F,{key:6},[o(L,{size:"small",type:"link",onClick:R=>e.viewProposalDetails(m)},{default:a(()=>[u(s(t.$t("governance.actions.details")),1)]),_:1},8,["onClick"]),m.status==="draft"?(d(),k(L,{key:0,size:"small",type:"link",onClick:R=>e.activateProposal(m)},{default:a(()=>[u(s(t.$t("governance.actions.activate")),1)]),_:1},8,["onClick"])):p("v-if",!0),m.status==="active"?(d(),k(L,{key:1,size:"small",type:"link",style:{color:"#52c41a"},onClick:R=>e.openVoteModal(m)},{default:a(()=>[u(s(t.$t("governance.actions.vote")),1)]),_:1},8,["onClick"])):p("v-if",!0),m.status==="active"?(d(),k(Z,{key:2,title:t.$t("governance.closeConfirm.title"),"ok-text":t.$t("governance.closeConfirm.ok"),"cancel-text":t.$t("governance.closeConfirm.cancel"),onConfirm:R=>e.closeProposal(m)},{default:a(()=>[o(L,{size:"small",type:"link",danger:""},{default:a(()=>[u(s(t.$t("governance.actions.close")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):p("v-if",!0),o(L,{size:"small",type:"link",onClick:R=>e.runAnalyze(m)},{default:a(()=>[u(s(t.$t("governance.actions.analyze")),1)]),_:1},8,["onClick"]),o(L,{size:"small",type:"link",onClick:R=>e.runPredict(m)},{default:a(()=>[u(s(t.$t("governance.actions.predict")),1)]),_:1},8,["onClick"])],64)):p("v-if",!0)]),emptyText:a(()=>[f("div",gt,[o(e.FileTextOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),u(" "+s(e.statusFilter||e.typeFilter?t.$t("governance.table.emptyFiltered"):t.$t("governance.table.empty")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),p(" ── Status & type breakdown tab ──────────────────────────── "),o(J,{key:"breakdown",tab:t.$t("governance.tabs.breakdown")},{default:a(()=>[o(V,{gutter:[16,16]},{default:a(()=>[o(C,{xs:24,lg:12},{default:a(()=>[o(O,{title:t.$t("governance.breakdown.byStatus"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(d(!0),g(F,null,U(e.PROPOSAL_STATUSES,r=>(d(),g("div",{key:r,class:"bd-row"},[o(_,{color:e.statusColor(r),style:{"min-width":"60px","text-align":"center"}},{default:a(()=>[u(s(e.statusLabel(r)),1)]),_:2},1032,["color"]),o(E,{percent:e.pctOfTotal(e.stats.byStatus[r]||0,e.stats.proposalCount),"stroke-color":e.statusBarColor(r),format:()=>`${e.stats.byStatus[r]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1},8,["title"])]),_:1}),o(C,{xs:24,lg:12},{default:a(()=>[o(O,{title:t.$t("governance.breakdown.byType"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(d(!0),g(F,null,U(e.PROPOSAL_TYPE_IDS,r=>(d(),g("div",{key:r,class:"bd-row"},[o(_,{color:e.typeColor(r),style:{"min-width":"90px","text-align":"center"}},{default:a(()=>[u(s(e.typeLabel(r)),1)]),_:2},1032,["color"]),o(E,{percent:e.pctOfTotal(e.stats.byType[r]||0,e.stats.proposalCount),"stroke-color":e.typeBarColor(r),format:()=>`${e.stats.byType[r]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1},8,["title"])]),_:1})]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),p(" ── Create proposal modal ───────────────────────────────── "),o(M,{open:e.showCreateModal,"onUpdate:open":n[8]||(n[8]=r=>e.showCreateModal=r),title:t.$t("governance.create_modal.title"),"confirm-loading":e.creating,width:560,"ok-text":t.$t("governance.create_modal.ok"),"cancel-text":t.$t("governance.create_modal.cancel"),onOk:e.createProposal,onCancel:e.resetCreateForm},{default:a(()=>[o($,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(h,{label:t.$t("governance.create_modal.titleLabel"),required:""},{default:a(()=>[o(A,{value:e.createForm.title,"onUpdate:value":n[4]||(n[4]=r=>e.createForm.title=r),placeholder:t.$t("governance.create_modal.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(h,{label:t.$t("governance.create_modal.typeLabel"),required:""},{default:a(()=>[o(H,{value:e.createForm.type,"onUpdate:value":n[5]||(n[5]=r=>e.createForm.type=r)},{default:a(()=>[(d(!0),g(F,null,U(e.PROPOSAL_TYPE_IDS,r=>(d(),k(K,{key:r,value:r},{default:a(()=>[u(s(e.typeLabel(r)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(h,{label:t.$t("governance.create_modal.proposerLabel")},{default:a(()=>[o(A,{value:e.createForm.proposerDid,"onUpdate:value":n[6]||(n[6]=r=>e.createForm.proposerDid=r),placeholder:t.$t("governance.create_modal.proposerPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(h,{label:t.$t("governance.create_modal.descLabel")},{default:a(()=>[o(G,{value:e.createForm.description,"onUpdate:value":n[7]||(n[7]=r=>e.createForm.description=r),placeholder:t.$t("governance.create_modal.descPlaceholder"),"auto-size":{minRows:3,maxRows:8}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),p(" ── Vote modal ───────────────────────────────────────────── "),o(M,{open:e.showVoteModal,"onUpdate:open":n[13]||(n[13]=r=>e.showVoteModal=r),title:t.$t("governance.vote_modal.title",{title:e.currentProposal?.title||""}),"confirm-loading":e.voting,width:540,"ok-text":t.$t("governance.vote_modal.ok"),"cancel-text":t.$t("governance.vote_modal.cancel"),onOk:e.submitVote},{default:a(()=>[o($,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(h,{label:t.$t("governance.vote_modal.voterLabel"),required:""},{default:a(()=>[o(A,{value:e.voteForm.voterDid,"onUpdate:value":n[9]||(n[9]=r=>e.voteForm.voterDid=r),placeholder:"did:key:..."},null,8,["value"])]),_:1},8,["label"]),o(h,{label:t.$t("governance.vote_modal.valueLabel"),required:""},{default:a(()=>[o(Y,{value:e.voteForm.value,"onUpdate:value":n[10]||(n[10]=r=>e.voteForm.value=r),"button-style":"solid"},{default:a(()=>[o(x,{value:"yes",style:{color:"#52c41a"}},{default:a(()=>[u(s(t.$t("governance.vote_modal.yes")),1)]),_:1}),o(x,{value:"no",style:{color:"#ff4d4f"}},{default:a(()=>[u(s(t.$t("governance.vote_modal.no")),1)]),_:1}),o(x,{value:"abstain"},{default:a(()=>[u(s(t.$t("governance.vote_modal.abstain")),1)]),_:1})]),_:1},8,["value"])]),_:1},8,["label"]),o(h,{label:t.$t("governance.vote_modal.weightLabel")},{default:a(()=>[o(ae,{value:e.voteForm.weight,"onUpdate:value":n[11]||(n[11]=r=>e.voteForm.weight=r),min:.1,step:.1,style:{width:"120px"}},null,8,["value"]),f("span",bt,s(t.$t("governance.vote_modal.weightHint")),1)]),_:1},8,["label"]),o(h,{label:t.$t("governance.vote_modal.reasonLabel")},{default:a(()=>[o(G,{value:e.voteForm.reason,"onUpdate:value":n[12]||(n[12]=r=>e.voteForm.reason=r),placeholder:t.$t("governance.vote_modal.reasonPlaceholder"),"auto-size":{minRows:2,maxRows:5}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),p(" ── Proposal details modal ──────────────────────────────── "),o(M,{open:e.showDetailsModal,"onUpdate:open":n[14]||(n[14]=r=>e.showDetailsModal=r),title:t.$t("governance.details.title",{title:e.currentProposal?.title||""}),width:780,footer:null},{default:a(()=>[e.currentProposal?(d(),g("div",_t,[o(ee,{column:2,size:"small",bordered:""},{default:a(()=>[o(S,{label:t.$t("governance.details.id"),span:2},{default:a(()=>[f("span",kt,s(e.currentProposal.id),1)]),_:1},8,["label"]),o(S,{label:t.$t("governance.details.type")},{default:a(()=>[o(_,{color:e.typeColor(e.currentProposal.type)},{default:a(()=>[u(s(e.typeLabel(e.currentProposal.type)),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(S,{label:t.$t("governance.details.status")},{default:a(()=>[o(_,{color:e.statusColor(e.currentProposal.status)},{default:a(()=>[u(s(e.statusLabel(e.currentProposal.status)),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(S,{label:t.$t("governance.details.proposer"),span:2},{default:a(()=>[e.currentProposal.proposerDid?(d(),g("span",Pt,s(e.currentProposal.proposerDid),1)):(d(),g("span",St,s(t.$t("governance.details.proposerUnset")),1))]),_:1},8,["label"]),o(S,{label:t.$t("governance.details.description"),span:2},{default:a(()=>[e.currentProposal.description?(d(),g("div",ht,s(e.currentProposal.description),1)):(d(),g("span",Ct,"—"))]),_:1},8,["label"]),o(S,{label:t.$t("governance.details.tally"),span:2},{default:a(()=>[o(N,null,{default:a(()=>[o(_,{color:"green"},{default:a(()=>[u(s(t.$t("governance.details.tallyYes",{n:e.currentProposal.voteYes})),1)]),_:1}),o(_,{color:"red"},{default:a(()=>[u(s(t.$t("governance.details.tallyNo",{n:e.currentProposal.voteNo})),1)]),_:1}),o(_,null,{default:a(()=>[u(s(t.$t("governance.details.tallyAbstain",{n:e.currentProposal.voteAbstain})),1)]),_:1})]),_:1})]),_:1},8,["label"]),e.currentProposal.impactLevel?(d(),k(S,{key:0,label:t.$t("governance.details.impact")},{default:a(()=>[o(_,{color:e.impactColor(e.currentProposal.impactLevel)},{default:a(()=>[u(s(e.impactLabel(e.currentProposal.impactLevel)),1)]),_:1},8,["color"])]),_:1},8,["label"])):p("v-if",!0),o(S,{label:t.$t("governance.details.createdAt")},{default:a(()=>[u(s(e.formatGovernanceTime(e.currentProposal.createdAt)),1)]),_:1},8,["label"]),e.currentProposal.votingStartsAt?(d(),k(S,{key:1,label:t.$t("governance.details.votingStartsAt")},{default:a(()=>[u(s(e.formatGovernanceTime(e.currentProposal.votingStartsAt)),1)]),_:1},8,["label"])):p("v-if",!0),e.currentProposal.votingEndsAt?(d(),k(S,{key:2,label:t.$t("governance.details.votingEndsAt")},{default:a(()=>[u(s(e.formatGovernanceTime(e.currentProposal.votingEndsAt)),1)]),_:1},8,["label"])):p("v-if",!0)]),_:1}),p(" Votes list "),f("h4",At,s(t.$t("governance.details.votesHeader")),1),e.detailVotes.length?(d(),k(oe,{key:1,size:"small","data-source":e.detailVotes,pagination:{pageSize:8}},{renderItem:a(({item:r})=>[o(te,null,{default:a(()=>[o(_,{color:e.voteColor(r.vote),style:{"min-width":"50px","text-align":"center"}},{default:a(()=>[u(s(e.voteLabel(r.vote)),1)]),_:2},1032,["color"]),f("span",Ot,"w="+s(r.weight),1),f("span",zt,s(r.voterDid),1),r.reason?(d(),g("span",wt,"— "+s(r.reason),1)):p("v-if",!0),f("span",Lt,s(e.formatGovernanceTime(r.createdAt)),1)]),_:2},1024)]),_:1},8,["data-source"])):(d(),k(ne,{key:0,description:t.$t("governance.details.votesEmpty"),image:e.EMPTY_IMG},null,8,["description","image"]))])):p("v-if",!0)]),_:1},8,["open","title"]),p(" ── Analysis modal ──────────────────────────────────────── "),o(M,{open:e.showAnalysisModal,"onUpdate:open":n[15]||(n[15]=r=>e.showAnalysisModal=r),title:t.$t("governance.analysis.title",{title:e.currentProposal?.title||""}),width:640,footer:null},{default:a(()=>[e.currentAnalysis?(d(),g("div",Tt,[o(V,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:a(()=>[o(C,{span:8},{default:a(()=>[o(T,{title:t.$t("governance.analysis.impactLevel"),value:e.impactLabel(e.currentAnalysis.impactLevel),"value-style":{color:e.impactBarColor(e.currentAnalysis.impactLevel),fontSize:"16px"}},null,8,["title","value","value-style"])]),_:1}),o(C,{span:8},{default:a(()=>[o(T,{title:t.$t("governance.analysis.effort"),value:e.effortLabel(e.currentAnalysis.estimatedEffort),"value-style":{fontSize:"16px"}},null,8,["title","value"])]),_:1}),o(C,{span:8},{default:a(()=>[o(T,{title:t.$t("governance.analysis.sentiment"),value:e.sentimentLabel(e.currentAnalysis.communitySentiment),"value-style":{fontSize:"16px"}},null,8,["title","value"])]),_:1})]),_:1}),o(O,{title:t.$t("governance.analysis.riskBenefit"),size:"small",style:{"margin-bottom":"12px"}},{default:a(()=>[f("div",xt,[f("span",Ft,s(t.$t("governance.analysis.riskScore")),1),o(E,{percent:Math.round(e.currentAnalysis.riskScore*100),"stroke-color":"#ff4d4f"},null,8,["percent"])]),f("div",null,[f("span",Dt,s(t.$t("governance.analysis.benefitScore")),1),o(E,{percent:Math.round(e.currentAnalysis.benefitScore*100),"stroke-color":"#52c41a"},null,8,["percent"])])]),_:1},8,["title"]),e.currentAnalysis.affectedComponents.length?(d(),k(O,{key:0,title:t.$t("governance.analysis.components"),size:"small",style:{"margin-bottom":"12px"}},{default:a(()=>[(d(!0),g(F,null,U(e.currentAnalysis.affectedComponents,r=>(d(),k(_,{key:r,color:"blue"},{default:a(()=>[u(s(r),1)]),_:2},1024))),128))]),_:1},8,["title"])):p("v-if",!0),e.currentAnalysis.recommendations.length?(d(),k(O,{key:1,title:t.$t("governance.analysis.recommendations"),size:"small"},{default:a(()=>[o(oe,{size:"small","data-source":e.currentAnalysis.recommendations},{renderItem:a(({item:r})=>[o(te,null,{default:a(()=>[o(e.ArrowRightOutlined,{style:{color:"#faad14","margin-right":"8px"}}),u(" "+s(r),1)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["title"])):p("v-if",!0)])):p("v-if",!0)]),_:1},8,["open","title"]),p(" ── Prediction modal ────────────────────────────────────── "),o(M,{open:e.showPredictionModal,"onUpdate:open":n[16]||(n[16]=r=>e.showPredictionModal=r),title:t.$t("governance.prediction.title",{title:e.currentProposal?.title||""}),width:540,footer:null},{default:a(()=>[e.currentPrediction?(d(),g("div",Et,[f("div",jt,[o(_,{color:e.currentPrediction.predictedOutcome==="pass"?"green":"red",style:{"font-size":"16px",padding:"6px 14px"}},{default:a(()=>[u(s(e.currentPrediction.predictedOutcome==="pass"?t.$t("governance.prediction.outcomePass"):t.$t("governance.prediction.outcomeReject")),1)]),_:1},8,["color"])]),o(ee,{column:2,size:"small",bordered:""},{default:a(()=>[o(S,{label:t.$t("governance.prediction.confidence"),span:2},{default:a(()=>[o(E,{percent:Math.round(e.currentPrediction.confidence*100),"stroke-color":e.currentPrediction.confidence>=.6?"#52c41a":"#faad14"},null,8,["percent","stroke-color"])]),_:1},8,["label"]),o(S,{label:t.$t("governance.prediction.basedOn")},{default:a(()=>[o(_,{color:e.currentPrediction.basedOn==="votes"?"blue":"orange"},{default:a(()=>[u(s(e.currentPrediction.basedOn==="votes"?t.$t("governance.prediction.basedOnVotes"):t.$t("governance.prediction.basedOnHeuristic")),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(S,{label:t.$t("governance.prediction.sampleSize")},{default:a(()=>[u(s(e.currentPrediction.sampleSize),1)]),_:1},8,["label"]),o(S,{label:t.$t("governance.prediction.yesProb")},{default:a(()=>[f("span",Mt,s((e.currentPrediction.yesProb*100).toFixed(1))+"%",1)]),_:1},8,["label"]),o(S,{label:t.$t("governance.prediction.noProb")},{default:a(()=>[f("span",Rt,s((e.currentPrediction.noProb*100).toFixed(1))+"%",1)]),_:1},8,["label"]),o(S,{label:t.$t("governance.prediction.abstainProb"),span:2},{default:a(()=>[f("span",Ut,s((e.currentPrediction.abstainProb*100).toFixed(1))+"%",1)]),_:1},8,["label"])]),_:1})])):p("v-if",!0)]),_:1},8,["open","title"])])}const Bt=Ie(et,[["render",It],["__scopeId","data-v-3a4a41f3"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/views/Governance.vue"]]);export{Bt as default};
@@ -1 +0,0 @@
1
- import{I as i,J as A,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-BvqAck49.js";import{_ as we,b as re,u as ie,d}from"./index-CxSHxzVl.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aM as ke,aN as Fe,aO as be,f as je,a4 as Ce,a7 as xe,as as Oe,R as Se}from"./icons-DP3uiYxy.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),U=u([]),k=u(!1),E=u(!1),L=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],N=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function G(o){return{onClick:()=>V(o)}}async function V(o){v.value=o,P.value=!0,k.value=!0,U.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);U.value=Array.isArray(f?.files)?f.files:[]}catch{U.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),h=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},h.value=!0}async function M(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);U.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await M(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),h.value=!1,await M(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await M(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await M()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:U,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:N,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:V,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:h,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:M,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},he={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},Ue={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),U=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),N=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),V=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),h=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",he,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(U,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",Ue,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(N,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(V,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(N,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(h,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(h,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(h,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(h,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{u as fe,_ as me,d as V,e as U}from"./index-CxSHxzVl.js";import{I as z,J as x,U as _,Q as D,S as Q,K as T,V as M,c as A,F as Y,Z,R as E,o as G,f as H,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,R=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:R};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),R=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:R}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const K of v)m.write(K.data),t.lastSeq=K.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const J=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});J.observe(b);const ue=t.offs;t.offs=()=>{try{J.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function j(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}G(async()=>{await j()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const X={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return R},set fitAddonMod(t){R=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:j,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Me={class:"session-id"},Re={key:0,class:"session-empty"},ze={class:"xterm-host"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},De={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),Q(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[D(E(e.warning),1)]),_:1})):M("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=D(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),Q(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):M("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Y,null,Z(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Me,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Re,' 点击 "新会话" 创建第一个终端 ')):M("v-if",!0)]),_("div",ze,[(y(!0),x(Y,null,Z(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):M("v-if",!0)])]),e.active?(y(),x("div",De,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?M("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):M("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-CxSHxzVl.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-D0pT0QQ0.js";import{U as t}from"./index-CxSHxzVl.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-W8zBp_Wb.js";import"./useFlexGapSupport-BEg-Dj0H.js";import"./styleChecker-BIjl0JAf.js";import"./index-BVGXk0kl.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-C1CLqeq2.js";import{U as t}from"./index-CxSHxzVl.js";import"./vendor-BvqAck49.js";import"./index-BVGXk0kl.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};