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.
Files changed (172) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-DDOyyepP.js → AIOps-D4dNL7oX.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-Du7WNR7z.js → ActionButton-DqMM3fea.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BfgWzxK9.js → Analytics-DMep218S.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-u3psvW1D.js → AppLayout-TdTGCiOR.js} +5 -5
  7. package/src/assets/web-panel/assets/{Audit-CHzFroRa.js → Audit-1Dml711-.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-BxGsrw2B.js → Backup-DbHx9UYj.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-Dbt9fGx6.js → BaseInput-C2ahEcJR.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-D_Q57G4I.js → Chat-5ZjuBfuS.js} +5 -5
  11. package/src/assets/web-panel/assets/ChatBubbleRenderer-B-1BKOW2.js +1 -0
  12. package/src/assets/web-panel/assets/{Checkbox-D1EETx0O.js → Checkbox-Dg6tGe59.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-CbKlHMn4.js → Codegen-CNDPJTao.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-C1CLqeq2.js → Col-DWU7gipF.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-CPRsLFyz.js → Community-5nkmoyvL.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-DpleToCJ.js → Compact-BzCJj8eL.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-CGqa-Ogf.js → Compliance-DbZq8BJH.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-DJk_xDYM.js → Cowork-BK7yKRsT.js} +4 -4
  19. package/src/assets/web-panel/assets/{Cron-M_yDyNBF.js → Cron-BSbTeh9k.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain-D7AojU-F.js → Crosschain-BIyLL_7v.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-BETwaPmP.js → DID-DeLWtwx2.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-BQ78uhsa.js → Dashboard-SGbCH8zO.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-CH1HJZ3n.js → Dropdown-CmsCZDkh.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-ChXV7GIc.js → EmailListRenderer-Tfc7sbeH.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsKuOtrn.js → FamilyGuardDashboard-K2YlYDx7.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-BZLlylg9.js → Federation-kLpstbZZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-DeCMnWLf.js → FormItemContext-BBFI-PfE.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-CH7to4tQ.js → GenericCardRenderer-D0xM21cK.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-C_HcR2op.js → Git-DoRk-Z87.js} +2 -2
  30. package/src/assets/web-panel/assets/Governance-DLpgG6NJ.js +1 -0
  31. package/src/assets/web-panel/assets/{Inference-DtnYaICi.js → Inference-DhXCaVnC.js} +1 -1
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-CdVgxVhJ.js → KnowledgeGraph-DY9bjNvM.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-BieJHWlI.js → Logs-0hjq8gkO.js} +2 -2
  34. package/src/assets/web-panel/assets/{Marketplace-DCz5yk3o.js → Marketplace-BiwZtXvR.js} +1 -1
  35. package/src/assets/web-panel/assets/{McpTools-CZ1xedJY.js → McpTools-FQPVVxpt.js} +5 -5
  36. package/src/assets/web-panel/assets/{Memory-Bz7CQQml.js → Memory-DFx_G11g.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-dJ9Br_56.js → MobileBridge-CffhLXKL.js} +3 -3
  38. package/src/assets/web-panel/assets/MobileProjects-Ch6cai8d.js +1 -0
  39. package/src/assets/web-panel/assets/{Mtc-eeWBcjEL.js → Mtc-CZYjK-51.js} +4 -4
  40. package/src/assets/web-panel/assets/{MtcAudit-C5wyRjHk.js → MtcAudit-Da34fMPk.js} +4 -4
  41. package/src/assets/web-panel/assets/{Multisig-BJRGIqgZ.js → Multisig-Bd_rBnNq.js} +3 -3
  42. package/src/assets/web-panel/assets/{NLProgramming-S07UoipU.js → NLProgramming-C5gqAWjv.js} +1 -1
  43. package/src/assets/web-panel/assets/{Notes-COxSrwZ3.js → Notes-Dhu_Cm2p.js} +4 -4
  44. package/src/assets/web-panel/assets/{NotificationSettings-DfvE_1K3.js → NotificationSettings-DtJcANAI.js} +1 -1
  45. package/src/assets/web-panel/assets/OrderTableRenderer-BSZfBr8T.js +1 -0
  46. package/src/assets/web-panel/assets/{Organization-CcsPrDEP.js → Organization-BUr7Rir7.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-DcYp9yIj.js → Overflow-DWshgXbT.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-a4dzjJXx.js → P2P-CyD_epxc.js} +2 -2
  49. package/src/assets/web-panel/assets/PdhVaultBrowser-5XCiifmp.js +7 -0
  50. package/src/assets/web-panel/assets/{Permissions-Bz9d8JCZ.js → Permissions-7f399Gvr.js} +4 -4
  51. package/src/assets/web-panel/assets/{PersonalDataHub-CsNBmJ7S.js → PersonalDataHub-DxlSJUU3.js} +3 -3
  52. package/src/assets/web-panel/assets/{Pipeline-D-0xA6R_.js → Pipeline-DgEcnlAm.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-X7QLakEK.js → Privacy-zisFH3nX.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-D0AlRjbd.js → ProjectInit-CJoxhT5P.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-DYMl5xmt.js → ProjectSettings-PiZfKRl5.js} +2 -2
  56. package/src/assets/web-panel/assets/{Projects-CHQNv-qk.js → Projects-DsJd6uTW.js} +1 -1
  57. package/src/assets/web-panel/assets/{Providers-TVCjZ2J6.js → Providers-BNZjDnSc.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk--451B-MZ.js → QuickAsk-khmv9SgN.js} +1 -1
  59. package/src/assets/web-panel/assets/{Recommend-BGGOKiGR.js → Recommend-BDY0V36V.js} +1 -1
  60. package/src/assets/web-panel/assets/{Reputation-BH4nds8K.js → Reputation-C4wPt5Hv.js} +1 -1
  61. package/src/assets/web-panel/assets/{Row-D0pT0QQ0.js → Row-B9kpAVZb.js} +1 -1
  62. package/src/assets/web-panel/assets/{RssFeed-DNU6r0C1.js → RssFeed-CiyeJRzB.js} +3 -3
  63. package/src/assets/web-panel/assets/{Search-8pr5NiWu.js → Search-BAJIzXKP.js} +1 -1
  64. package/src/assets/web-panel/assets/{Security-DL3-Rbou.js → Security-_SyGiA39.js} +4 -4
  65. package/src/assets/web-panel/assets/{Services-D0-F3yHP.js → Services-CpCisy2A.js} +2 -2
  66. package/src/assets/web-panel/assets/{Skeleton-BUNukrAi.js → Skeleton-BbgLYFnt.js} +1 -1
  67. package/src/assets/web-panel/assets/{Skills-MeuPy4i2.js → Skills-BetfsfpF.js} +1 -1
  68. package/src/assets/web-panel/assets/{Sla-DRFzpJxS.js → Sla-BXoqLXMq.js} +1 -1
  69. package/src/assets/web-panel/assets/{SpeechSettings-B74NyhKi.js → SpeechSettings-BY9Kooi0.js} +1 -1
  70. package/src/assets/web-panel/assets/{SyncSettings-DWZX4Em2.js → SyncSettings-CcArvVNF.js} +2 -2
  71. package/src/assets/web-panel/assets/{Tasks-zBrdGeRn.js → Tasks-DqLoEIis.js} +1 -1
  72. package/src/assets/web-panel/assets/{Templates-Dp_FFrKZ.js → Templates-C7uVsXry.js} +1 -1
  73. package/src/assets/web-panel/assets/{Tenant-C53QENNf.js → Tenant-YTp4gRv1.js} +1 -1
  74. package/src/assets/web-panel/assets/{Terminal-DnD72zQh.js → Terminal-CVyqc079.js} +2 -2
  75. package/src/assets/web-panel/assets/TimelineRenderer-oJ9q5LkF.js +1 -0
  76. package/src/assets/web-panel/assets/{Tokens-CMLbuZMs.js → Tokens-CDsEqDT7.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trigger-CLYPsW_7.js → Trigger-CpDIhVvj.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trust-D3jxWR77.js → Trust-CjEWMLXs.js} +1 -1
  79. package/src/assets/web-panel/assets/{UkeySign-fNDw_KhV.js → UkeySign-CMuYjFkp.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-D8csuHqj.js → VideoEditing-L76OwoPT.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-Gemx68ru.js → Wallet-CfhcIudB.js} +4 -4
  82. package/src/assets/web-panel/assets/{WebAuthn-Wg6nAGh8.js → WebAuthn-BhxSf50j.js} +4 -4
  83. package/src/assets/web-panel/assets/{WorkflowEditor-BSr0116-.js → WorkflowEditor-CkYQGytv.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-BcwDKrOw.js → chat-Bke-Axcb.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-CRwuUljZ.js → colors-DDm7sxvR.js} +1 -1
  86. package/src/assets/web-panel/assets/{compact-item-BH9-TA7W.js → compact-item-ptIaR2VC.js} +1 -1
  87. package/src/assets/web-panel/assets/{createContext-DHPD7o_2.js → createContext-neR1onYf.js} +1 -1
  88. package/src/assets/web-panel/assets/devWarning-CQxKChUH.js +1 -0
  89. package/src/assets/web-panel/assets/{hasIn-BUiPtAz2.js → hasIn-CdoIzexs.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-BVGXk0kl.js → index-0ZL7FjnB.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Dt9hI0-B.js → index-5mAbzuWz.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CoD_ykaF.js → index-8RY-s8Eq.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-Che8xizE.js → index-9dyEaJ48.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-6sUosvN8.js → index-B22DApaF.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-2MwQ3X6t.js → index-B3RhcGp2.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-UNqiZIfY.js → index-BB8JlhPb.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CJ7N4Kq9.js → index-BEjcGiW_.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CiYqE6r2.js → index-BGAoMIiF.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DDfr0pto.js → index-BN_GcJv-.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DZjfQdtu.js → index-BSrWChEg.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DBwWELfk.js → index-BYVMCbtn.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DSofQ6_z.js → index-BnujNUf1.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CxSHxzVl.js → index-BsReT8kE.js} +3 -3
  104. package/src/assets/web-panel/assets/{index-DnSYxJLa.js → index-Bt8YI0Pg.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DjzesLfN.js → index-C4kWzHqC.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DY6005b1.js → index-C83TTo0Y.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C2i-topE.js → index-CBE4OYiN.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DcjCDs8_.js → index-CLhzHIgs.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CjXX3_MF.js → index-CMk4reDk.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BUZj4TZu.js → index-Cg7TMjLf.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-YGHrRaLk.js → index-Chu6dERk.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CU_cl403.js → index-D5oDZ8S7.js} +1 -1
  113. package/src/assets/web-panel/assets/index-DBA6F-Kp.js +1 -0
  114. package/src/assets/web-panel/assets/{index-BjpXUPEm.js → index-DCmaPYWj.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Ck7VlFKq.js → index-DKJrSY7a.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CTjTueAe.js → index-DL-dAbq1.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D3OP_UGM.js → index-DRA35MTY.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DDyIWF6G.js → index-DUPpvFG3.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CqZvL3PL.js → index-Dl_I2P_E.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-C4HqTPhK.js → index-DpMZQawE.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CnxAcX-8.js → index-DpqA23qT.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B6I9juJW.js → index-DxabeJjC.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DJhRnT33.js → index-KyM68byr.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-SJMQljkQ.js → index-f59BFqsD.js} +1 -1
  125. package/src/assets/web-panel/assets/index-ffyvqxd5.js +1 -0
  126. package/src/assets/web-panel/assets/{index-BX4JG3HI.js → index-li06k0zQ.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-USRQuY0h.js → index-m7gmhBks.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-X925i3Ec.js → index-rZfX7ufl.js} +1 -1
  129. package/src/assets/web-panel/assets/{initDefaultProps-DXCAtRs8.js → initDefaultProps-DoRyafUY.js} +1 -1
  130. package/src/assets/web-panel/assets/{motion-x5-S0MDV.js → motion-CXAFczEQ.js} +1 -1
  131. package/src/assets/web-panel/assets/{move-luyXzjjS.js → move-DNDMmkdZ.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-Dqkw0CTp.js → omit-D2wfCEns.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-BIkNmysd.js → pickAttrs-Dq7W_NtB.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-DuE-e6si.js → placementArrow-CkNHdTmz.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-W8zBp_Wb.js → responsiveObserve-j6LiN9K2.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-VrrEqbsQ.js → slide-BKHHLvp8.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-rEzF15_8.js → statusUtils-B3sdEvM3.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-BIjl0JAf.js → styleChecker-g4UCWzKN.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-BEg-Dj0H.js → useFlexGapSupport-D_0KlvEp.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs-ZdzrfiGS.js → useFs-ePxeifdP.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-CRGBsZ6x.js → usePersonalDataHub-4JoLBqJY.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-uuyVczKn.js → vnode-na-HJjyy.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-CdJXg6jf.js → zoom-Wmkm0KcD.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/commands/browse.js +2 -12
  146. package/src/commands/hub.js +62 -0
  147. package/src/harness/mcp-client.js +17 -0
  148. package/src/lib/checkpoint-store.js +42 -5
  149. package/src/lib/cost-budget.js +14 -1
  150. package/src/lib/cross-chain-mtc.js +17 -0
  151. package/src/lib/did-manager.js +9 -2
  152. package/src/lib/dlp-engine.js +3 -1
  153. package/src/lib/goal-store.js +23 -0
  154. package/src/lib/hook-runner.cjs +35 -6
  155. package/src/lib/loop.js +16 -9
  156. package/src/lib/permission-rules.cjs +6 -2
  157. package/src/lib/skill-loader.js +9 -0
  158. package/src/lib/version-skew.js +82 -0
  159. package/src/lib/web-fetch.js +33 -4
  160. package/src/repl/agent-repl.js +37 -0
  161. package/src/runtime/agent-core.js +19 -3
  162. package/src/runtime/headless-runner.js +14 -0
  163. package/src/runtime/headless-stream.js +45 -0
  164. package/src/assets/web-panel/assets/ChatBubbleRenderer-BJT1bSLa.js +0 -1
  165. package/src/assets/web-panel/assets/Governance-PTau8O3i.js +0 -1
  166. package/src/assets/web-panel/assets/MobileProjects-Bpmjz4V6.js +0 -1
  167. package/src/assets/web-panel/assets/OrderTableRenderer-CeyDa5Ed.js +0 -1
  168. package/src/assets/web-panel/assets/PdhVaultBrowser-DFxZ5o8Q.js +0 -7
  169. package/src/assets/web-panel/assets/TimelineRenderer-Cfb2GB_R.js +0 -1
  170. package/src/assets/web-panel/assets/devWarning--UYULS4h.js +0 -1
  171. package/src/assets/web-panel/assets/index-D-IknxcC.js +0 -1
  172. package/src/assets/web-panel/assets/index-ZfyW2JSr.js +0 -1
@@ -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
+ }
@@ -12,21 +12,50 @@ import { URL } from "url";
12
12
  const DEFAULT_MAX_BYTES = 2_000_000;
13
13
  const DEFAULT_TIMEOUT_MS = 15_000;
14
14
 
15
- // RFC 1918 + loopback + link-local. Blocked by default unless config.allowPrivateHosts.
15
+ // RFC 1918 + loopback + link-local (IPv4 and IPv6). Blocked by default unless
16
+ // config.allowPrivateHosts. Decimal/integer IPv4 forms (http://2130706433,
17
+ // http://0) are normalized to dotted-decimal by `new URL()` before they reach
18
+ // here, so the IPv4 patterns catch them too.
16
19
  const PRIVATE_HOST_PATTERNS = [
17
20
  /^127\./,
18
21
  /^10\./,
19
22
  /^192\.168\./,
20
23
  /^172\.(1[6-9]|2\d|3[01])\./,
21
- /^169\.254\./,
24
+ /^169\.254\./, // link-local incl. cloud metadata 169.254.169.254
22
25
  /^0\.0\.0\.0$/,
23
- /^::1$/,
26
+ /^0$/, // bare 0 → 0.0.0.0
27
+ /^::1$/, // IPv6 loopback
28
+ /^::$/, // IPv6 unspecified (== 0.0.0.0)
29
+ /^f[cd][0-9a-f]{2}:/, // fc00::/7 unique-local (ULA)
30
+ /^fe[89ab][0-9a-f]:/, // fe80::/10 link-local
24
31
  /^localhost$/i,
25
32
  ];
26
33
 
34
+ // Decode the IPv4 embedded in an IPv4-mapped IPv6 address back to dotted form,
35
+ // or null if `h` is not such an address. `new URL()` normalizes the embedded
36
+ // IPv4 to hex (::ffff:127.0.0.1 → ::ffff:7f00:1), so without decoding, a fetch
37
+ // to [::ffff:127.0.0.1] would bypass the IPv4 loopback/private rules.
38
+ function mappedIPv4(h) {
39
+ const m = /^::ffff:(.+)$/.exec(h);
40
+ if (!m) return null;
41
+ const tail = m[1];
42
+ if (/^\d{1,3}(\.\d{1,3}){3}$/.test(tail)) return tail; // already dotted
43
+ const hx = /^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(tail);
44
+ if (!hx) return null;
45
+ const a = parseInt(hx[1], 16);
46
+ const b = parseInt(hx[2], 16);
47
+ return [(a >> 8) & 255, a & 255, (b >> 8) & 255, b & 255].join(".");
48
+ }
49
+
27
50
  export function isPrivateHost(host) {
28
51
  if (!host) return true;
29
- return PRIVATE_HOST_PATTERNS.some((re) => re.test(host));
52
+ let h = String(host).toLowerCase();
53
+ // `new URL().hostname` returns IPv6 hosts bracketed ("[::1]") — strip so the
54
+ // IPv6 patterns (and the previously-dead ::1 rule) actually match.
55
+ if (h.startsWith("[") && h.endsWith("]")) h = h.slice(1, -1);
56
+ const v4 = mappedIPv4(h);
57
+ if (v4) h = v4; // re-check the embedded IPv4 against the IPv4 rules
58
+ return PRIVATE_HOST_PATTERNS.some((re) => re.test(h));
30
59
  }
31
60
 
32
61
  export function checkAllowed(urlStr, config = {}) {
@@ -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};