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.
- package/package.json +2 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DDOyyepP.js → AIOps-D1_eyrEP.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Du7WNR7z.js → ActionButton-tnrMeU0Q.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BfgWzxK9.js → Analytics-SmbOMqoN.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-u3psvW1D.js → AppLayout-B4m4Ic3a.js} +4 -4
- package/src/assets/web-panel/assets/{Audit-CHzFroRa.js → Audit-DTC34Qp6.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BxGsrw2B.js → Backup-CU_llIBF.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Dbt9fGx6.js → BaseInput-vP66eF17.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D_Q57G4I.js → Chat-B8-4iHVJ.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CFD0Xh5e.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-D1EETx0O.js → Checkbox-zV2Jzmv8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CbKlHMn4.js → Codegen-C7kfk-rY.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C1CLqeq2.js → Col-t_vUszuS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CPRsLFyz.js → Community-pRCzzaCc.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DpleToCJ.js → Compact-7IgSGjnW.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CGqa-Ogf.js → Compliance-BqDi7iuY.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DJk_xDYM.js → Cowork-BL84ZaWT.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-M_yDyNBF.js → Cron-yzv32Scr.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D7AojU-F.js → Crosschain-6DTzS8P5.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BETwaPmP.js → DID-CKP63O4a.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BQ78uhsa.js → Dashboard-CsV3eP9F.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CH1HJZ3n.js → Dropdown-CByjFKzJ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ChXV7GIc.js → EmailListRenderer-C6Hn7n75.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsKuOtrn.js → FamilyGuardDashboard-e1c1vXTT.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BZLlylg9.js → Federation-D9oejCYY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DeCMnWLf.js → FormItemContext-DZ4d_-AT.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CH7to4tQ.js → GenericCardRenderer-QoGFWBcP.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_HcR2op.js → Git-DVZHPXw8.js} +2 -2
- package/src/assets/web-panel/assets/Governance-NwdvDPTB.js +1 -0
- package/src/assets/web-panel/assets/{Inference-DtnYaICi.js → Inference-BYz9MiEu.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CdVgxVhJ.js → KnowledgeGraph-BUdGIZKt.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BieJHWlI.js → Logs-CPGewhlD.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DCz5yk3o.js → Marketplace-BgRk4ZMW.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZ1xedJY.js → McpTools-DLY9Fd7m.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Bz7CQQml.js → Memory-B2QishHE.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-dJ9Br_56.js → MobileBridge-DXMQwB_y.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-Bpmjz4V6.js → MobileProjects-4uY4YbFm.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-eeWBcjEL.js → Mtc-BVASCKUv.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-C5wyRjHk.js → MtcAudit-ByLFJ4Zu.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BJRGIqgZ.js → Multisig-DRAZYcC6.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-S07UoipU.js → NLProgramming-EiptSKn1.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-COxSrwZ3.js → Notes-BHh5Akqh.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DfvE_1K3.js → NotificationSettings-XWFl4_3j.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CeyDa5Ed.js → OrderTableRenderer-Bdc_O7wT.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CcsPrDEP.js → Organization--VWlMdKp.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DcYp9yIj.js → Overflow-DuYUvyh7.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-a4dzjJXx.js → P2P-BnHaPvFP.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DFxZ5o8Q.js → PdhVaultBrowser-WfbjffWL.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-Bz9d8JCZ.js → Permissions-BIFhAsZO.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CsNBmJ7S.js → PersonalDataHub-Dt_m7YZ6.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-D-0xA6R_.js → Pipeline-BsNDbhs7.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-X7QLakEK.js → Privacy-C1SJp30I.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D0AlRjbd.js → ProjectInit-DIOkwlK-.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DYMl5xmt.js → ProjectSettings-BZIL8hvl.js} +2 -2
- package/src/assets/web-panel/assets/Projects-LHqWtiu2.js +1 -0
- package/src/assets/web-panel/assets/{Providers-TVCjZ2J6.js → Providers-DlC7SSJT.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk--451B-MZ.js → QuickAsk-DeaVcEma.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BGGOKiGR.js → Recommend-BbQI1g_u.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-BH4nds8K.js → Reputation-Cro6z2uR.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D0pT0QQ0.js → Row-D7LuPQVP.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DNU6r0C1.js → RssFeed-BowXZJOX.js} +3 -3
- package/src/assets/web-panel/assets/{Search-8pr5NiWu.js → Search-8oufqOmB.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DL3-Rbou.js → Security-CRKFB58y.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D0-F3yHP.js → Services-DzRJ4Kus.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BUNukrAi.js → Skeleton-DtZmLaQr.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-MeuPy4i2.js → Skills-CPQFZvJ3.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DRFzpJxS.js → Sla-C599OilU.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-B74NyhKi.js → SpeechSettings-VdhwHyYN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DWZX4Em2.js → SyncSettings-BvX8fTlf.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-zBrdGeRn.js → Tasks-B63Y5zWj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Dp_FFrKZ.js → Templates-DZtjohnP.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-C53QENNf.js → Tenant-C8WHv74j.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-D0IC-PsM.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-Cfb2GB_R.js → TimelineRenderer-C392mTJ7.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CMLbuZMs.js → Tokens-BnmIK-7p.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CLYPsW_7.js → Trigger-CLYUm45n.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D3jxWR77.js → Trust-DmKkB9n0.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-fNDw_KhV.js → UkeySign-Btsb1cq9.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D8csuHqj.js → VideoEditing-KbSQiQ31.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Gemx68ru.js → Wallet-C7T1JpB8.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Wg6nAGh8.js → WebAuthn-B7fk675F.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BSr0116-.js → WorkflowEditor-BFEqg2-F.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BcwDKrOw.js → chat-CCONImPU.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CRwuUljZ.js → colors-BO_usQco.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH9-TA7W.js → compact-item-DPYH8VmY.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DHPD7o_2.js → createContext-DuzinRx4.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BJYFLmEO.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BUiPtAz2.js → hasIn-CGE1laax.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiYqE6r2.js → index-B5edbioK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3OP_UGM.js → index-B6faWLbM.js} +1 -1
- package/src/assets/web-panel/assets/{index-X925i3Ec.js → index-BBdlh4S9.js} +1 -1
- package/src/assets/web-panel/assets/{index-YGHrRaLk.js → index-BJrz4R1Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-UNqiZIfY.js → index-BMvB7bwt.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2i-topE.js → index-BOrH71r5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcjCDs8_.js → index-BQieJh3P.js} +1 -1
- package/src/assets/web-panel/assets/{index-6sUosvN8.js → index-BhhReyyv.js} +1 -1
- package/src/assets/web-panel/assets/{index-USRQuY0h.js → index-BoiTovAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-SJMQljkQ.js → index-BxSrpYMm.js} +1 -1
- package/src/assets/web-panel/assets/index-BznL1yIS.js +1 -0
- package/src/assets/web-panel/assets/{index-CjXX3_MF.js → index-C0J2olcT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dt9hI0-B.js → index-C4OJtXb2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVGXk0kl.js → index-C6ORJpUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnxAcX-8.js → index-C8E575em.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxSHxzVl.js → index-C9a-SDrB.js} +3 -3
- package/src/assets/web-panel/assets/{index-DDfr0pto.js → index-CCFBPPL3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX4JG3HI.js → index-CFMqyOfS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjzesLfN.js → index-CHBCKhGQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBwWELfk.js → index-CLevxAAl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJhRnT33.js → index-CiJrDiUF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ck7VlFKq.js → index-Cjl3wd7u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoD_ykaF.js → index-CsWempjh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjpXUPEm.js → index-CyNkEBra.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSofQ6_z.js → index-CzJpaaYk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZjfQdtu.js → index-D7PjxVkg.js} +1 -1
- package/src/assets/web-panel/assets/{index-2MwQ3X6t.js → index-DEsKGcgq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnSYxJLa.js → index-DFeaJhkI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUZj4TZu.js → index-DPLKoezy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY6005b1.js → index-DcDzDXuF.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6I9juJW.js → index-DhWFRGxq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDyIWF6G.js → index-Djr_9TsG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJ7N4Kq9.js → index-Dr_bswHZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4HqTPhK.js → index-Njlbk8o6.js} +1 -1
- package/src/assets/web-panel/assets/index-SDk3qvNU.js +1 -0
- package/src/assets/web-panel/assets/{index-Che8xizE.js → index-VjWPHPNA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqZvL3PL.js → index-WNRdmI1g.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTjTueAe.js → index-_6PfzLBb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CU_cl403.js → index-k_kmmJE3.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DXCAtRs8.js → initDefaultProps-V7_xvS9N.js} +1 -1
- package/src/assets/web-panel/assets/{motion-x5-S0MDV.js → motion-DRGZ-HPK.js} +1 -1
- package/src/assets/web-panel/assets/{move-luyXzjjS.js → move-CZrcQSMV.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Dqkw0CTp.js → omit-pd-_NH99.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BIkNmysd.js → pickAttrs-CTupbn-v.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DuE-e6si.js → placementArrow-Bn7FYxHg.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-W8zBp_Wb.js → responsiveObserve-WfzZR_7N.js} +1 -1
- package/src/assets/web-panel/assets/{slide-VrrEqbsQ.js → slide-CYH80N3q.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-rEzF15_8.js → statusUtils-C4hqTJzV.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BIjl0JAf.js → styleChecker-BQyUObAw.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BEg-Dj0H.js → useFlexGapSupport-BGDH_gNt.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-ZdzrfiGS.js → useFs-D_3Y1Yh6.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRGBsZ6x.js → usePersonalDataHub-vnU0oI0p.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-uuyVczKn.js → vnode-DnTqtAMj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CdJXg6jf.js → zoom-ChHcZlUk.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/hub.js +138 -0
- package/src/harness/mcp-client.js +17 -0
- package/src/lib/checkpoint-store.js +42 -5
- package/src/lib/cost-budget.js +14 -1
- package/src/lib/cross-chain-mtc.js +17 -0
- package/src/lib/dlp-engine.js +3 -1
- package/src/lib/hook-runner.cjs +35 -6
- package/src/lib/loop.js +16 -9
- package/src/lib/permission-rules.cjs +6 -2
- package/src/lib/skill-loader.js +9 -0
- package/src/lib/web-fetch.js +33 -4
- package/src/repl/agent-repl.js +12 -0
- package/src/runtime/headless-runner.js +14 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BJT1bSLa.js +0 -1
- package/src/assets/web-panel/assets/Governance-PTau8O3i.js +0 -1
- package/src/assets/web-panel/assets/Projects-CHQNv-qk.js +0 -1
- package/src/assets/web-panel/assets/Terminal-DnD72zQh.js +0 -3
- package/src/assets/web-panel/assets/devWarning--UYULS4h.js +0 -1
- package/src/assets/web-panel/assets/index-D-IknxcC.js +0 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
package/src/lib/cost-budget.js
CHANGED
|
@@ -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 =
|
|
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))
|
package/src/lib/dlp-engine.js
CHANGED
|
@@ -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 ===
|
|
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;
|
package/src/lib/hook-runner.cjs
CHANGED
|
@@ -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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
()
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/lib/skill-loader.js
CHANGED
|
@@ -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
|
}
|
package/src/lib/web-fetch.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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 = {}) {
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -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};
|