chainlesschain 0.162.116 → 0.162.118
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-D4dNL7oX.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Du7WNR7z.js → ActionButton-DqMM3fea.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BfgWzxK9.js → Analytics-DMep218S.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-u3psvW1D.js → AppLayout-TdTGCiOR.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-CHzFroRa.js → Audit-1Dml711-.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BxGsrw2B.js → Backup-DbHx9UYj.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Dbt9fGx6.js → BaseInput-C2ahEcJR.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D_Q57G4I.js → Chat-5ZjuBfuS.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-B-1BKOW2.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-D1EETx0O.js → Checkbox-Dg6tGe59.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CbKlHMn4.js → Codegen-CNDPJTao.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C1CLqeq2.js → Col-DWU7gipF.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CPRsLFyz.js → Community-5nkmoyvL.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DpleToCJ.js → Compact-BzCJj8eL.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CGqa-Ogf.js → Compliance-DbZq8BJH.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DJk_xDYM.js → Cowork-BK7yKRsT.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-M_yDyNBF.js → Cron-BSbTeh9k.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D7AojU-F.js → Crosschain-BIyLL_7v.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BETwaPmP.js → DID-DeLWtwx2.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BQ78uhsa.js → Dashboard-SGbCH8zO.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CH1HJZ3n.js → Dropdown-CmsCZDkh.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ChXV7GIc.js → EmailListRenderer-Tfc7sbeH.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsKuOtrn.js → FamilyGuardDashboard-K2YlYDx7.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BZLlylg9.js → Federation-kLpstbZZ.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DeCMnWLf.js → FormItemContext-BBFI-PfE.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CH7to4tQ.js → GenericCardRenderer-D0xM21cK.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_HcR2op.js → Git-DoRk-Z87.js} +2 -2
- package/src/assets/web-panel/assets/Governance-DLpgG6NJ.js +1 -0
- package/src/assets/web-panel/assets/{Inference-DtnYaICi.js → Inference-DhXCaVnC.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CdVgxVhJ.js → KnowledgeGraph-DY9bjNvM.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BieJHWlI.js → Logs-0hjq8gkO.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DCz5yk3o.js → Marketplace-BiwZtXvR.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZ1xedJY.js → McpTools-FQPVVxpt.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Bz7CQQml.js → Memory-DFx_G11g.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-dJ9Br_56.js → MobileBridge-CffhLXKL.js} +3 -3
- package/src/assets/web-panel/assets/MobileProjects-Ch6cai8d.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-eeWBcjEL.js → Mtc-CZYjK-51.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-C5wyRjHk.js → MtcAudit-Da34fMPk.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BJRGIqgZ.js → Multisig-Bd_rBnNq.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-S07UoipU.js → NLProgramming-C5gqAWjv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-COxSrwZ3.js → Notes-Dhu_Cm2p.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DfvE_1K3.js → NotificationSettings-DtJcANAI.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BSZfBr8T.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CcsPrDEP.js → Organization-BUr7Rir7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DcYp9yIj.js → Overflow-DWshgXbT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-a4dzjJXx.js → P2P-CyD_epxc.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-5XCiifmp.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-Bz9d8JCZ.js → Permissions-7f399Gvr.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CsNBmJ7S.js → PersonalDataHub-DxlSJUU3.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-D-0xA6R_.js → Pipeline-DgEcnlAm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-X7QLakEK.js → Privacy-zisFH3nX.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D0AlRjbd.js → ProjectInit-CJoxhT5P.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DYMl5xmt.js → ProjectSettings-PiZfKRl5.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CHQNv-qk.js → Projects-DsJd6uTW.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-TVCjZ2J6.js → Providers-BNZjDnSc.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk--451B-MZ.js → QuickAsk-khmv9SgN.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BGGOKiGR.js → Recommend-BDY0V36V.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-BH4nds8K.js → Reputation-C4wPt5Hv.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D0pT0QQ0.js → Row-B9kpAVZb.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DNU6r0C1.js → RssFeed-CiyeJRzB.js} +3 -3
- package/src/assets/web-panel/assets/{Search-8pr5NiWu.js → Search-BAJIzXKP.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DL3-Rbou.js → Security-_SyGiA39.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D0-F3yHP.js → Services-CpCisy2A.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BUNukrAi.js → Skeleton-BbgLYFnt.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-MeuPy4i2.js → Skills-BetfsfpF.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DRFzpJxS.js → Sla-BXoqLXMq.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-B74NyhKi.js → SpeechSettings-BY9Kooi0.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DWZX4Em2.js → SyncSettings-CcArvVNF.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-zBrdGeRn.js → Tasks-DqLoEIis.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Dp_FFrKZ.js → Templates-C7uVsXry.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-C53QENNf.js → Tenant-YTp4gRv1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DnD72zQh.js → Terminal-CVyqc079.js} +2 -2
- package/src/assets/web-panel/assets/TimelineRenderer-oJ9q5LkF.js +1 -0
- package/src/assets/web-panel/assets/{Tokens-CMLbuZMs.js → Tokens-CDsEqDT7.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CLYPsW_7.js → Trigger-CpDIhVvj.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D3jxWR77.js → Trust-CjEWMLXs.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-fNDw_KhV.js → UkeySign-CMuYjFkp.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D8csuHqj.js → VideoEditing-L76OwoPT.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Gemx68ru.js → Wallet-CfhcIudB.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Wg6nAGh8.js → WebAuthn-BhxSf50j.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BSr0116-.js → WorkflowEditor-CkYQGytv.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BcwDKrOw.js → chat-Bke-Axcb.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CRwuUljZ.js → colors-DDm7sxvR.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH9-TA7W.js → compact-item-ptIaR2VC.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DHPD7o_2.js → createContext-neR1onYf.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CQxKChUH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BUiPtAz2.js → hasIn-CdoIzexs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVGXk0kl.js → index-0ZL7FjnB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dt9hI0-B.js → index-5mAbzuWz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoD_ykaF.js → index-8RY-s8Eq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Che8xizE.js → index-9dyEaJ48.js} +1 -1
- package/src/assets/web-panel/assets/{index-6sUosvN8.js → index-B22DApaF.js} +1 -1
- package/src/assets/web-panel/assets/{index-2MwQ3X6t.js → index-B3RhcGp2.js} +1 -1
- package/src/assets/web-panel/assets/{index-UNqiZIfY.js → index-BB8JlhPb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJ7N4Kq9.js → index-BEjcGiW_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiYqE6r2.js → index-BGAoMIiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDfr0pto.js → index-BN_GcJv-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZjfQdtu.js → index-BSrWChEg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBwWELfk.js → index-BYVMCbtn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSofQ6_z.js → index-BnujNUf1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxSHxzVl.js → index-BsReT8kE.js} +3 -3
- package/src/assets/web-panel/assets/{index-DnSYxJLa.js → index-Bt8YI0Pg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjzesLfN.js → index-C4kWzHqC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY6005b1.js → index-C83TTo0Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2i-topE.js → index-CBE4OYiN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcjCDs8_.js → index-CLhzHIgs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjXX3_MF.js → index-CMk4reDk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUZj4TZu.js → index-Cg7TMjLf.js} +1 -1
- package/src/assets/web-panel/assets/{index-YGHrRaLk.js → index-Chu6dERk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CU_cl403.js → index-D5oDZ8S7.js} +1 -1
- package/src/assets/web-panel/assets/index-DBA6F-Kp.js +1 -0
- package/src/assets/web-panel/assets/{index-BjpXUPEm.js → index-DCmaPYWj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ck7VlFKq.js → index-DKJrSY7a.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTjTueAe.js → index-DL-dAbq1.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3OP_UGM.js → index-DRA35MTY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDyIWF6G.js → index-DUPpvFG3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqZvL3PL.js → index-Dl_I2P_E.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4HqTPhK.js → index-DpMZQawE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnxAcX-8.js → index-DpqA23qT.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6I9juJW.js → index-DxabeJjC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJhRnT33.js → index-KyM68byr.js} +1 -1
- package/src/assets/web-panel/assets/{index-SJMQljkQ.js → index-f59BFqsD.js} +1 -1
- package/src/assets/web-panel/assets/index-ffyvqxd5.js +1 -0
- package/src/assets/web-panel/assets/{index-BX4JG3HI.js → index-li06k0zQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-USRQuY0h.js → index-m7gmhBks.js} +1 -1
- package/src/assets/web-panel/assets/{index-X925i3Ec.js → index-rZfX7ufl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DXCAtRs8.js → initDefaultProps-DoRyafUY.js} +1 -1
- package/src/assets/web-panel/assets/{motion-x5-S0MDV.js → motion-CXAFczEQ.js} +1 -1
- package/src/assets/web-panel/assets/{move-luyXzjjS.js → move-DNDMmkdZ.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Dqkw0CTp.js → omit-D2wfCEns.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BIkNmysd.js → pickAttrs-Dq7W_NtB.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DuE-e6si.js → placementArrow-CkNHdTmz.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-W8zBp_Wb.js → responsiveObserve-j6LiN9K2.js} +1 -1
- package/src/assets/web-panel/assets/{slide-VrrEqbsQ.js → slide-BKHHLvp8.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-rEzF15_8.js → statusUtils-B3sdEvM3.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BIjl0JAf.js → styleChecker-g4UCWzKN.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BEg-Dj0H.js → useFlexGapSupport-D_0KlvEp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-ZdzrfiGS.js → useFs-ePxeifdP.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRGBsZ6x.js → usePersonalDataHub-4JoLBqJY.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-uuyVczKn.js → vnode-na-HJjyy.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CdJXg6jf.js → zoom-Wmkm0KcD.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/browse.js +2 -12
- package/src/commands/hub.js +62 -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/did-manager.js +9 -2
- package/src/lib/dlp-engine.js +3 -1
- package/src/lib/goal-store.js +23 -0
- 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/version-skew.js +82 -0
- package/src/lib/web-fetch.js +33 -4
- package/src/repl/agent-repl.js +37 -0
- package/src/runtime/agent-core.js +19 -3
- package/src/runtime/headless-runner.js +14 -0
- package/src/runtime/headless-stream.js +45 -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/MobileProjects-Bpmjz4V6.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CeyDa5Ed.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DFxZ5o8Q.js +0 -7
- package/src/assets/web-panel/assets/TimelineRenderer-Cfb2GB_R.js +0 -1
- 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
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
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect when the cc package was updated on disk AFTER this process spawned.
|
|
3
|
+
*
|
|
4
|
+
* A long-lived cc process — an IDE chat-panel `cc agent --input-format
|
|
5
|
+
* stream-json` session, or an interactive REPL — loads its JavaScript into
|
|
6
|
+
* memory at spawn time. `npm i -g chainlesschain@latest` only rewrites the
|
|
7
|
+
* files on disk; it does NOT reload an already-running process. So after an
|
|
8
|
+
* update the still-running session keeps executing the OLD in-memory code.
|
|
9
|
+
*
|
|
10
|
+
* This is exactly how a fixed bug looks "not fixed": the user updates cc, but
|
|
11
|
+
* the IDE panel's persistent agent process never restarted, so it keeps the old
|
|
12
|
+
* behaviour (e.g. the provider-auth-hijack → haiku). We surface a friendly,
|
|
13
|
+
* one-time notice telling them to reload the IDE window / restart the session.
|
|
14
|
+
*
|
|
15
|
+
* `VERSION` (constants.js) is baked at module load (a cached `require()` of
|
|
16
|
+
* package.json) → the SPAWN-TIME version. A FRESH read of package.json from
|
|
17
|
+
* disk → the CURRENTLY-INSTALLED version. Disk strictly newer ⇒ skew.
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
import semver from "semver";
|
|
23
|
+
import { VERSION } from "../constants.js";
|
|
24
|
+
|
|
25
|
+
const PKG_PATH = join(
|
|
26
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
27
|
+
"..",
|
|
28
|
+
"..",
|
|
29
|
+
"package.json",
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Currently-installed version — a FRESH read of package.json from disk that
|
|
34
|
+
* bypasses the require cache (so it reflects a post-update file). Returns null
|
|
35
|
+
* on any error (missing/unreadable/invalid file → "no skew, stay quiet").
|
|
36
|
+
*
|
|
37
|
+
* @param {(p: string) => string} [readFile] injectable for tests
|
|
38
|
+
*/
|
|
39
|
+
export function readDiskVersion(readFile = (p) => fs.readFileSync(p, "utf-8")) {
|
|
40
|
+
try {
|
|
41
|
+
const v = JSON.parse(readFile(PKG_PATH))?.version;
|
|
42
|
+
return typeof v === "string" && v.trim() ? v.trim() : null;
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Pure skew check. Returns `{ loaded, installed }` ONLY when `installed` is a
|
|
50
|
+
* valid semver STRICTLY GREATER than `loaded` (an update landed under a running
|
|
51
|
+
* process). Returns null otherwise — same version, a downgrade, or anything
|
|
52
|
+
* unparseable — so we never nag spuriously.
|
|
53
|
+
*
|
|
54
|
+
* @param {object} [o]
|
|
55
|
+
* @param {string} [o.loaded] version this process is running (default: VERSION)
|
|
56
|
+
* @param {string} [o.installed] version on disk now (default: fresh disk read)
|
|
57
|
+
*/
|
|
58
|
+
export function detectVersionSkew({
|
|
59
|
+
loaded = VERSION,
|
|
60
|
+
installed = readDiskVersion(),
|
|
61
|
+
} = {}) {
|
|
62
|
+
if (!loaded || !installed || loaded === installed) return null;
|
|
63
|
+
let newer = false;
|
|
64
|
+
try {
|
|
65
|
+
newer =
|
|
66
|
+
semver.valid(installed) != null &&
|
|
67
|
+
semver.valid(loaded) != null &&
|
|
68
|
+
semver.gt(installed, loaded);
|
|
69
|
+
} catch {
|
|
70
|
+
newer = false;
|
|
71
|
+
}
|
|
72
|
+
return newer ? { loaded, installed } : null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Friendly one-line notice (Chinese) for a detected skew. */
|
|
76
|
+
export function versionSkewMessage({ loaded, installed } = {}) {
|
|
77
|
+
return (
|
|
78
|
+
`cc 已更新到 ${installed}(当前会话仍在运行 ${loaded})。` +
|
|
79
|
+
`请重新加载 IDE 窗口(VS Code: 命令面板 → Developer: Reload Window)` +
|
|
80
|
+
`或重启此会话,以应用更新。`
|
|
81
|
+
);
|
|
82
|
+
}
|
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
|
@@ -186,12 +186,25 @@ async function executeTool(name, args) {
|
|
|
186
186
|
*/
|
|
187
187
|
async function agentLoop(messages, options) {
|
|
188
188
|
const usageEvents = [];
|
|
189
|
+
// Visible cross-vendor fallback notice: a silent switch from the configured
|
|
190
|
+
// provider onto another vendor (or a baseUrl relabel) is surfaced as a yellow
|
|
191
|
+
// line, so "configured X but it ran Y" never happens quietly. Callers may
|
|
192
|
+
// override; default prints to the REPL.
|
|
193
|
+
const onProviderFallback =
|
|
194
|
+
options.onProviderFallback ||
|
|
195
|
+
((info) =>
|
|
196
|
+
process.stdout.write(
|
|
197
|
+
chalk.yellow(
|
|
198
|
+
`\n ⚠️ ${info.message || `已从 "${info.from}" 切换到 "${info.to}"`}\n`,
|
|
199
|
+
),
|
|
200
|
+
));
|
|
189
201
|
// The REPL runs its own auto-compaction (after each turn, with metrics +
|
|
190
202
|
// persisted compact events), so opt out of the agent loop's in-loop
|
|
191
203
|
// compaction to avoid compacting the same history twice.
|
|
192
204
|
for await (const event of coreAgentLoop(messages, {
|
|
193
205
|
autoCompact: false,
|
|
194
206
|
...options,
|
|
207
|
+
onProviderFallback,
|
|
195
208
|
})) {
|
|
196
209
|
if (event.type === "checkpoint") {
|
|
197
210
|
// Remember which file snapshot lines up with the live conversation so
|
|
@@ -1161,6 +1174,18 @@ export async function startAgentRepl(options = {}) {
|
|
|
1161
1174
|
);
|
|
1162
1175
|
logger.log(chalk.gray("Type /exit to quit, /help for commands\n"));
|
|
1163
1176
|
|
|
1177
|
+
// Version-skew reminder: if cc was updated on disk after this REPL spawned, it
|
|
1178
|
+
// is still running the old in-memory code (a fixed bug then looks "not fixed").
|
|
1179
|
+
// Tell the user to restart so the update takes effect. Best-effort.
|
|
1180
|
+
try {
|
|
1181
|
+
const { detectVersionSkew, versionSkewMessage } =
|
|
1182
|
+
await import("../lib/version-skew.js");
|
|
1183
|
+
const skew = detectVersionSkew();
|
|
1184
|
+
if (skew) logger.log(chalk.yellow(`⚠️ ${versionSkewMessage(skew)}\n`));
|
|
1185
|
+
} catch {
|
|
1186
|
+
/* version-skew notice is best-effort */
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1164
1189
|
// statusLine (Claude-Code parity): a line above the prompt each turn.
|
|
1165
1190
|
// - A user-configured `.claude/settings.json` `statusLine` command wins
|
|
1166
1191
|
// (model / branch / cost / … — first stdout line; best-effort, sync).
|
|
@@ -1562,6 +1587,18 @@ export async function startAgentRepl(options = {}) {
|
|
|
1562
1587
|
model = arg;
|
|
1563
1588
|
_curModel = model; // keep the status-line readout in sync
|
|
1564
1589
|
logger.info(`Model: ${chalk.cyan(model)}`);
|
|
1590
|
+
// Claude-Code 2.1.183 parity: warn when the newly-selected model is a
|
|
1591
|
+
// provider-retired/deprecated snapshot. Headless paths already warn via
|
|
1592
|
+
// maybeWarnDeprecatedModel; the interactive /model switch did not, so a
|
|
1593
|
+
// user could silently switch to a retired id and only learn of it when
|
|
1594
|
+
// the next turn fails with an opaque "model not found".
|
|
1595
|
+
try {
|
|
1596
|
+
const { maybeWarnDeprecatedModel } =
|
|
1597
|
+
await import("../lib/model-deprecation.js");
|
|
1598
|
+
maybeWarnDeprecatedModel({ model });
|
|
1599
|
+
} catch {
|
|
1600
|
+
// deprecation notice is best-effort
|
|
1601
|
+
}
|
|
1565
1602
|
} else {
|
|
1566
1603
|
logger.info(`Current model: ${chalk.cyan(model)}`);
|
|
1567
1604
|
}
|
|
@@ -4294,10 +4294,26 @@ export async function* agentLoop(messages, options) {
|
|
|
4294
4294
|
await import("../lib/runnable-provider.js");
|
|
4295
4295
|
llmCall = makeRunnableProviderFallback(llmCall, {
|
|
4296
4296
|
onFallback: ({ from, to, reason }) => {
|
|
4297
|
+
// Switching VENDORS (or relabelling via baseUrl) must NEVER be silent —
|
|
4298
|
+
// a user who configured volcengine deserves to know it ran on another
|
|
4299
|
+
// provider/model. Build a human message and hand it to the driver's
|
|
4300
|
+
// visible surfacer (IDE panel → a rendered `raw` line; REPL → a yellow
|
|
4301
|
+
// line) when provided; otherwise fall back to a clear stderr notice.
|
|
4302
|
+
const message =
|
|
4303
|
+
reason === "env-key"
|
|
4304
|
+
? `"${from}" 鉴权失败,已临时切换到不同厂商 "${to}"(请检查 ${from} 的 API key:cc config set llm.apiKey …)。`
|
|
4305
|
+
: `provider 配置与 baseUrl 不一致,已按 baseUrl 切换到 "${to}"。`;
|
|
4306
|
+
const info = { from, to, reason, message };
|
|
4307
|
+
if (typeof options.onProviderFallback === "function") {
|
|
4308
|
+
try {
|
|
4309
|
+
options.onProviderFallback(info);
|
|
4310
|
+
} catch {
|
|
4311
|
+
/* surfacing is best-effort */
|
|
4312
|
+
}
|
|
4313
|
+
return;
|
|
4314
|
+
}
|
|
4297
4315
|
try {
|
|
4298
|
-
process.stderr.write(
|
|
4299
|
-
`\x1b[2m[provider] "${from}" auth failed (${reason}) — retrying with "${to}"\x1b[0m\n`,
|
|
4300
|
-
);
|
|
4316
|
+
process.stderr.write(`\x1b[33m[provider] ${message}\x1b[0m\n`);
|
|
4301
4317
|
} catch {
|
|
4302
4318
|
/* notice is best-effort */
|
|
4303
4319
|
}
|
|
@@ -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`
|
|
@@ -21,6 +21,7 @@ import { buildSystemPrompt, agentLoop as coreAgentLoop } from "./agent-core.js";
|
|
|
21
21
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
22
22
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
23
23
|
import { detectImagePaths } from "../lib/image-input.js";
|
|
24
|
+
import { detectVersionSkew, versionSkewMessage } from "../lib/version-skew.js";
|
|
24
25
|
import {
|
|
25
26
|
resolveAgentMcp,
|
|
26
27
|
resolvePermissionPromptTool,
|
|
@@ -821,6 +822,20 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
821
822
|
attempt,
|
|
822
823
|
message: "API connection dropped — retrying",
|
|
823
824
|
}),
|
|
825
|
+
// Visible cross-vendor fallback notice: when the configured provider hits an
|
|
826
|
+
// auth error and the loop falls back to another vendor (or relabels via
|
|
827
|
+
// baseUrl), surface it as a `raw` info line the panel renders instead of a
|
|
828
|
+
// silent vendor switch. Structured fields carry the machine-readable detail.
|
|
829
|
+
onProviderFallback: (info) =>
|
|
830
|
+
emit({
|
|
831
|
+
type: "raw",
|
|
832
|
+
subtype: "provider_fallback",
|
|
833
|
+
text: `⚠️ ${info.message || `已从 "${info.from}" 切换到 "${info.to}"`}`,
|
|
834
|
+
from: info.from,
|
|
835
|
+
to: info.to,
|
|
836
|
+
reason: info.reason,
|
|
837
|
+
session_id: sessionId,
|
|
838
|
+
}),
|
|
824
839
|
};
|
|
825
840
|
|
|
826
841
|
// --max-budget-usd: a SESSION-WIDE USD spend cap across all turns. Folded
|
|
@@ -835,6 +850,12 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
835
850
|
|
|
836
851
|
let turns = 0;
|
|
837
852
|
let sawError = false;
|
|
853
|
+
// Version-skew notice (friendly reminder): a chat-panel agent process is
|
|
854
|
+
// long-lived, so if cc was updated on disk while it kept running, it's still
|
|
855
|
+
// executing stale in-memory code (a fixed bug then looks "not fixed"). Checked
|
|
856
|
+
// each turn until detected so a mid-session `npm i -g` is caught on the next
|
|
857
|
+
// message; emitted ONCE as a `raw` line the panel already renders.
|
|
858
|
+
let versionSkewNotified = false;
|
|
838
859
|
// Once any turn attaches an image, the image stays in the conversation
|
|
839
860
|
// history — so every later turn (even a text-only follow-up like "what colour
|
|
840
861
|
// is it?") must keep using the vision LLM, otherwise a text-only default model
|
|
@@ -915,6 +936,30 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
915
936
|
for (;;) {
|
|
916
937
|
const parsed = await nextEvent();
|
|
917
938
|
if (parsed == null) break; // stdin closed
|
|
939
|
+
|
|
940
|
+
// One-time version-skew reminder (see flag declaration above). Best-effort;
|
|
941
|
+
// never blocks a turn. detectVersionSkew() returns null when this process is
|
|
942
|
+
// running the currently-installed version, so a fresh/up-to-date session
|
|
943
|
+
// stays quiet.
|
|
944
|
+
if (!versionSkewNotified) {
|
|
945
|
+
try {
|
|
946
|
+
const skew = detectVersionSkew();
|
|
947
|
+
if (skew) {
|
|
948
|
+
versionSkewNotified = true;
|
|
949
|
+
emit({
|
|
950
|
+
type: "raw",
|
|
951
|
+
subtype: "version_skew",
|
|
952
|
+
text: `⚠️ ${versionSkewMessage(skew)}`,
|
|
953
|
+
running_version: skew.loaded,
|
|
954
|
+
installed_version: skew.installed,
|
|
955
|
+
session_id: sessionId,
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
} catch {
|
|
959
|
+
/* version-skew notice is best-effort */
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
918
963
|
if (parsed.error) {
|
|
919
964
|
emit({
|
|
920
965
|
type: "result",
|
|
@@ -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 n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-BvqAck49.js";import{_ as v,b as m}from"./index-CxSHxzVl.js";import{a7 as M,M as y}from"./icons-DP3uiYxy.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return y},get FolderOutlined(){return M}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),j=n("a-empty"),P=n("a-card");return h(),g("div",x,[l(P,null,{default:r(()=>[l(j,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-BvqAck49.js";import{_ as S}from"./index-CxSHxzVl.js";import"./icons-DP3uiYxy.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),h=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),b=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:h,formattedTime:b,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},V={class:"time"},O={class:"row"},R={class:"val"},j={class:"row"},B={class:"val"},D={class:"row amount-row"},I={class:"val amount"},M={key:0,class:"row"},A={class:"val mono"},F={key:1,class:"row"};function P(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",V,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",O,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",j,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",B,n(e.itemText),1)]),s("div",D,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",I,n(e.amountText),1)]),e.orderNo?(l(),u("div",M,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const K=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-BJT1bSLa.js","./vendor-BvqAck49.js","./index-CxSHxzVl.js","./icons-DP3uiYxy.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-CeyDa5Ed.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-Cfb2GB_R.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-ChXV7GIc.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-CH7to4tQ.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as R,b as w,I as y,P as u,J as O,U as v,c,S as C,V as E,_ as N,F as B,Z as se,a0 as ae,R as j,K as m,Q as b,W as L,o as J}from"./vendor-BvqAck49.js";import{u as U}from"./usePersonalDataHub-CRGBsZ6x.js";import{_ as D,e as F,d as P}from"./index-CxSHxzVl.js";import{a9 as V,af as z,M as Q,aH as G,u as H,aG as K,ap as W,ab as Y,e as de,d as fe,k as pe,ah as me,az as _e,R as ge}from"./icons-DP3uiYxy.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),q=50,Z=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),a=R(null),l=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const x=w(()=>t.value.length>0),A=w(()=>n.value!=null);function h(S={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...S}}async function g(){const S=++d;e.value=!0,a.value=null;const p=U();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:q})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(S!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,l.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(S!==d)return;a.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,a.value=null;const S=U();try{const p=await S.searchEvents(h({cursor:n.value,limit:q}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,l.value=p.mode||l.value}catch(p){a.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function le(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,g()},Z)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),g()}function ce(){r.value={...I},t.value=[],n.value=null,a.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:a,mode:l,shortQuery:s,facets:i,hasResults:x,canLoadMore:A,search:g,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:q,SEARCH_DEBOUNCE_MS:Z}}),ye=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function M(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["vscode","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["local-files","system"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:K,shopping:H,travel:G,system:Q,"ai-chat":z,other:V};function a(i){return o[i]||V}function l(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:a,badgeStyle:l,computed:w,get AppstoreOutlined(){return V},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return G},get MobileOutlined(){return Q},get RobotOutlined(){return z},get CATEGORIES(){return ye},get categoryLabel(){return M}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Se={class:"pdh-sidebar"},Oe=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,a){const l=y("a-badge");return u(),O("div",Se,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:N(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(l,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],2),(u(!0),O(B,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:N(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(ae(e.iconFor(s)),{class:"icon"})),v("span",we,j(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(l,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],10,Oe))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),Ee={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,a=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),l=w(()=>Object.entries(e.facets.byAdapter||{}).sort((g,k)=>k[1]-g[1]).map(([g,k])=>({value:g,label:`${g} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function x(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[g,k]=h;o("set-filter","since",g?+g:null),o("set-filter","until",k?+k:null)}const A={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:x,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},Re={class:"pdh-filter-bar"},je={key:1,class:"hint"},xe={key:2,class:"hint"};function Ae(r,t,n,e,o,a){const l=y("a-input-search"),s=y("a-select"),i=y("a-range-picker"),d=y("a-button");return u(),O("div",Re,[c(l,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>r.$emit("set-filter","adapter",_||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=_=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):E("v-if",!0),n.shortQuery?(u(),O("span",je,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",xe,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):E("v-if",!0)])}const Le=D(Ee,[["render",Ae],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Fe={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=L(()=>F(()=>import("./ChatBubbleRenderer-BJT1bSLa.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-CeyDa5Ed.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-Cfb2GB_R.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=L(()=>F(()=>import("./EmailListRenderer-ChXV7GIc.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=L(()=>F(()=>import("./GenericCardRenderer-CH7to4tQ.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const _=d&&d.source&&d.source.adapter;switch($(_)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return a;default:return l}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:a,GenericCardRenderer:l,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const a=Number.isFinite(o.occurredAt)?o.occurredAt:null,l=a?new Date(a).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",a!=null?String(a):"",l,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
|
|
5
|
-
`)+`
|
|
6
|
-
`}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
|
|
7
|
-
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),a=document.createElement("a");return a.href=o,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),a=String(n.getDate()).padStart(2,"0"),l=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${a}${s}.${l}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function a(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function l({key:i}){try{const d=a(i),_=oe(i,n.category);re(d,_,o[i]),P.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:a,onClick:l,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function Ve(r,t,n,e,o,a){const l=y("a-button"),s=y("a-menu-item"),i=y("a-menu"),d=y("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(l,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+j(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const qe=D(Pe,[["render",Ve],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Be={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${M(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function a(s,i){n.setFilter(s,i)}J(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:J,computed:w,get ReloadOutlined(){return ge},get usePdhBrowserStore(){return X},get categoryLabel(){return M},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:qe};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Me={class:"pdh-browser-page"},Ne={class:"page-header"},Je={class:"main-pane"},Ue={class:"results-summary"},ze={key:0},Qe={key:0},Ge={key:1},He={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,a){const l=y("a-tag"),s=y("a-button"),i=y("a-space"),d=y("a-col"),_=y("a-spin"),x=y("a-alert"),A=y("a-empty"),h=y("a-row");return u(),O("div",Me,[v("div",Ne,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(l,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(l,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):E("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=g=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",Je,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=g=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Ue,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",ze,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(B,{key:1},[v("strong",null,j(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",Qe,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,j(e.categoryLabel(e.store.filters.category)),1),v("strong",null,j(e.store.facets.byCategory[e.store.filters.category]||0),1)])):E("v-if",!0),e.store.filters.q?(u(),O("span",Ge,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,j(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):E("v-if",!0),v("span",He," / 已显示 "+j(e.store.results.length),1)],64))]),e.store.error?(u(),C(x,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):E("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(A,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):E("v-if",!0),v("div",Ke,[(u(!0),O(B,null,se(e.store.results,(g,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${g.id}`,event:g},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=g=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):E("v-if",!0)])]),_:1})]),_:1})])}const tt=D(Be,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{tt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as S,P as n,J as i,U as l,S as h,R as o,c,K as d,Q as u,V as g,b as a}from"./vendor-BvqAck49.js";import{_ as b}from"./index-CxSHxzVl.js";import{aD as O,aH as D}from"./icons-DP3uiYxy.js";const C={__name:"TimelineRenderer",props:{event:{type:Object,required:!0}},setup(v,{expose:_}){_();const r=v,e=a(()=>r.event.content||{}),p=a(()=>{const t=r.event.source.adapter||"";return t.startsWith("travel-12306")||t.startsWith("travel-ctrip")}),m=a(()=>e.value.from&&e.value.to?`${e.value.from} → ${e.value.to}`:e.value.origin&&e.value.destination?`${e.value.origin} → ${e.value.destination}`:null),s=a(()=>r.event.place||e.value.placeName||e.value.poi),N=a(()=>e.value.trainNo),T=a(()=>e.value.flightNo),k=a(()=>e.value.title||e.value.text||e.value.description||"—"),x=a(()=>{const t=[];return e.value.departureTime&&t.push(`出发 ${e.value.departureTime}`),e.value.arrivalTime&&t.push(`到达 ${e.value.arrivalTime}`),e.value.duration&&t.push(`${e.value.duration}`),e.value.distance&&t.push(`${e.value.distance}`),t.length?t.join(" · "):null}),y=a(()=>{if(!r.event.occurredAt)return"";const t=new Date(r.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),f={props:r,c:e,isTravel:p,route:m,placeName:s,trainNo:N,flightNo:T,fallbackText:k,extraDetail:x,formattedTime:y,computed:a,get CarOutlined(){return D},get EnvironmentOutlined(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},V={class:"timeline-event"},j={class:"dot"},w={class:"card"},B={class:"head"},E={class:"time"},R={class:"primary"},M={key:0},A={key:1},H={key:2},I={key:0,class:"trip-no"},P={key:1,class:"extra"};function W(v,_,r,e,p,m){const s=S("a-tag");return n(),i("div",V,[l("div",j,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",w,[l("div",B,[l("span",E,o(e.formattedTime),1),c(s,{color:"cyan"},{default:d(()=>[u(o(r.event.source.adapter),1)]),_:1}),c(s,null,{default:d(()=>[u(o(r.event.subtype),1)]),_:1})]),l("div",R,[e.route?(n(),i("span",M,o(e.route),1)):e.placeName?(n(),i("span",A,"📍 "+o(e.placeName),1)):(n(),i("span",H,o(e.fallbackText),1))]),e.trainNo||e.flightNo?(n(),i("div",I,[c(s,{color:"blue"},{default:d(()=>[u(o(e.trainNo||e.flightNo),1)]),_:1})])):g("v-if",!0),e.extraDetail?(n(),i("div",P,o(e.extraDetail),1)):g("v-if",!0)])])}const K=b(C,[["render",W],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-5VjahM/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{K 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};
|