chainlesschain 0.162.105 → 0.162.107

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 (159) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DYaOYjxA.js → AIOps-B7Hz-sMT.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BRnLVtON.js → ActionButton-tIqg_ue9.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-Bi5dt6xG.js → Analytics-B6DbVy_b.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-FdAkPhdh.js → AppLayout-Cm_hOXV8.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-huJ-2mSb.js → Audit-Crc94mKO.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-CTAFMoyw.js → Backup-DIZVZXve.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-DNh66xG2.js → BaseInput-BZWHuJyu.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-xLRQDs5G.js → Chat-BOCsYs8k.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BFRpdxeW.js → ChatBubbleRenderer-BK6OX-J4.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-BEZRITX8.js → Checkbox-_bsZN_Td.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-BD6xBApN.js → Codegen-Cu-YIxg5.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-B_Xqx3Ul.js → Col-BMM77pN6.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-Bu4rj14W.js → Community-B4uw3_sc.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-B17uNB4p.js → Compact-RxrnL4Ql.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-DjaCMltJ.js → Compliance-CKEfGRFH.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-BdE44Hek.js → Cowork-jS0AVJjh.js} +4 -4
  18. package/src/assets/web-panel/assets/{Cron-DZyVpxse.js → Cron-DNyVTsuS.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-BeSoFHpQ.js → Crosschain-DRaSmfQP.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-D8GTLlQ5.js → DID-B5UTlNum.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-vAKXjb1o.js → Dashboard-OVoPMtcA.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-BvgPRTyP.js → Dropdown-5OA2sbK9.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-CtXq_Ttt.js → EmailListRenderer-DUJPUE_n.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-oG2LekBb.js → FamilyGuardDashboard-BKFSlqTB.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-C-oMwAUG.js → Federation-BAhgrKK6.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-rj-oMGta.js → FormItemContext-CZ8wh8ZQ.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-UeOKM5KJ.js → GenericCardRenderer-Cnsg9gY4.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-BOjLMgD-.js → Git-EY6xhhH-.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-DVlgF083.js → Governance-CKGWi2hF.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-BzpCtSRm.js → Inference-Bibz4dcl.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-5sFDbZKo.js → KnowledgeGraph-B1GhH4Rh.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-BagEqu7D.js → Logs-Ce6yjdqa.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-za352FZT.js → Marketplace-0dFzmO9J.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-CEavmaZU.js → McpTools-crttKADW.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-Dp0d39Y-.js → Memory-BjtmouRu.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-BljVPikC.js → MobileBridge-Djm8NKL7.js} +2 -2
  37. package/src/assets/web-panel/assets/MobileProjects-CuWSdENU.js +1 -0
  38. package/src/assets/web-panel/assets/{Mtc-CO80_dbI.js → Mtc-UvDcNKPe.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-ByH4suVc.js → MtcAudit-CCUvaVsw.js} +4 -4
  40. package/src/assets/web-panel/assets/{Multisig-CvQ373Kp.js → Multisig-CltVDZII.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-DSugxBwU.js → NLProgramming-nVqmxQ1N.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-BN_R_-qG.js → Notes-gyIOnFru.js} +4 -4
  43. package/src/assets/web-panel/assets/{NotificationSettings-x3Ipb8KF.js → NotificationSettings-C7VByx8y.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-CJCW-n1E.js → OrderTableRenderer-DopvBK5x.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-CUo9tpab.js → Organization-VxnADtjw.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-Cm1ok3yr.js → Overflow-Du67ZgzE.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-BPXfkljx.js → P2P-CXK6FzZK.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-bB_pMcWV.js → PdhVaultBrowser-BH6PhZwi.js} +4 -4
  49. package/src/assets/web-panel/assets/{Permissions-bUj1KcNM.js → Permissions-B23k4uT8.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DODkpqmo.js → PersonalDataHub-CjiMy8De.js} +4 -4
  51. package/src/assets/web-panel/assets/{Pipeline-DEqfqfHT.js → Pipeline-Z1KmgqP5.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-C5b_6Np-.js → Privacy-CmxIvTR1.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-DSnPoDLm.js → ProjectInit-Bts__Qz3.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-DjDz4FBi.js → ProjectSettings-Bd_lhQgg.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-9chbQyJR.js → Projects-DR-bmuRQ.js} +1 -1
  56. package/src/assets/web-panel/assets/Providers-kaD-Hp-Y.js +1 -0
  57. package/src/assets/web-panel/assets/{QuickAsk-BwBKTclE.js → QuickAsk-qy3iXhzr.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-mQMxq3Xc.js → Recommend-DONp9kRc.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-CL6wmEN-.js → Reputation-DDyL2Aeq.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-CVXQQg_a.js → Row-D8YcGPf4.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-CfoKWtqq.js → RssFeed-DXUODZiL.js} +3 -3
  62. package/src/assets/web-panel/assets/Search-DEdHYWFg.js +1 -0
  63. package/src/assets/web-panel/assets/{Security-DuVGdvLC.js → Security-H-o6s5e0.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-vfsS-hHM.js → Services-UuIWNe9h.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-UODCxnzg.js → Skeleton-DYtxZPtS.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-DVHtahH_.js → Skills-DDifBlN4.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-DSoODBCc.js → Sla-D1ZAkzmU.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-DiaqTk_e.js → SpeechSettings-CKjGGj0q.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-BQcVBcLi.js → SyncSettings-BGg86vP1.js} +2 -2
  70. package/src/assets/web-panel/assets/Tasks-VxIkYJmg.js +1 -0
  71. package/src/assets/web-panel/assets/{Templates-BpnfhFKX.js → Templates-DFRL3OpQ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-l6EIK9VO.js → Tenant-CmYigIMz.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-DjjQrZtn.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-6dWgzU5T.js → TimelineRenderer-B75R5MPw.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-CmTEa0qE.js → Tokens-BQjcUYi2.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-DrfC7Hb-.js → Trigger-B87osPjr.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-9SSsKJ67.js → Trust-BMNsPMGf.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-_4fg9FZz.js → UkeySign-Dh8aq9A5.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-XBXv_ieG.js → VideoEditing-BrW9UYwd.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-0eP1nq2A.js → Wallet-rVZaz6JO.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-BWs4GCCZ.js → WebAuthn-BaQ7s6Rr.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-BFSo4kVo.js → WorkflowEditor-DFo5Ff-W.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-DJSs4Z3h.js → chat-BhGtd3vF.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-DyNgmHM2.js → colors-C_Hs-0Q_.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-M3CZ-i2H.js → compact-item-Cxku8C7o.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-lNMonv_i.js → createContext-v6jUmogl.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-BnANFH7b.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-B91aXEzF.js → hasIn-BKhLdwbQ.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-BMG7MAgn.js → index-51MhKb2G.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-CJsTosBw.js → index-B2IZIcKV.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-CKiGfsRP.js → index-B3pkWuB9.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-DQIBwi9k.js → index-BDW_6hBP.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DRJ_Lszr.js → index-BElj4Od7.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DyOBjEUA.js → index-BLJ91vZT.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BzaXBB1A.js → index-BMCT14Fw.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DAd-oQMK.js → index-Bgtv4PNS.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BTzUzcRX.js → index-BnYbnWuX.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-HcSrdXIY.js → index-BolB2BAg.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BDOOE70-.js → index-C2PkAyeB.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-IHn9LQeI.js → index-C2rsPZun.js} +3 -3
  101. package/src/assets/web-panel/assets/{index-Be_FDJks.js → index-CARZxqzf.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-KSwJzeqG.js → index-CBL2DZwT.js} +1 -1
  103. package/src/assets/web-panel/assets/index-CEJN-vG4.js +1 -0
  104. package/src/assets/web-panel/assets/{index-Bsl-sRNN.js → index-CVAVApRf.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DMUkAgqR.js → index-CYz9sJYb.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BVeeHE1i.js → index-CZDVxpam.js} +1 -1
  107. package/src/assets/web-panel/assets/index-CeJCYDPn.js +1 -0
  108. package/src/assets/web-panel/assets/{index-Dz-UTFho.js → index-CfTpPsv6.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CmtXAPQT.js → index-CmhCbfio.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-HIF1H3Qi.js → index-CwKGHmaT.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BfRRIydd.js → index-D7aePQoD.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CkpZNnfb.js → index-D8-PVIyz.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-eLphHYgM.js → index-DMiUs7VJ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C4tKStAX.js → index-D_vs8HEm.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BxhgIY1j.js → index-DaDs425R.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Do3iJlSY.js → index-DfD0hdcw.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DV9i6LzE.js → index-DfjaeiC1.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-_kFxj8Iv.js → index-Dfnrfw8C.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-dW5CK84B.js → index-DgpKinbP.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-C2oG0D9w.js → index-DkFQKhAE.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DWuMyZbA.js → index-DpO44b89.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-vb_z80lH.js → index-GoxGMHvm.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-De6_AYb4.js → index-Ha3xv10h.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C51tOSTU.js → index-Hmuq7HiU.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cvj5N5SK.js → index-ITysWrpU.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CXoioS1t.js → index-Mloutg2P.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CVCoAsQq.js → index-gjdcCPuc.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-BKCFkUwh.js → initDefaultProps-3JYk3XrB.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-CuYmQtOE.js → motion-DnWevrJa.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-DlPzxPAW.js → move-9bW2GZpH.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-Ds3kQlyN.js → omit-D8ydPKdj.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-RUYRa-vv.js → pickAttrs-l5iG1eRA.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-jYZCPIVc.js → placementArrow-Bp1b6Ucy.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-BsNIdQzh.js → responsiveObserve-ChTuOCcn.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-IDA11Awb.js → slide-Ck7EHmbe.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-D-dVqEII.js → statusUtils-Beih7s__.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-qHsriHs9.js → styleChecker-Dddg8IJR.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-Bf1CATNE.js → useFlexGapSupport-DU6cxKQF.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-BaqG_--5.js → useFs-BISbGmgC.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-DsEBdplG.js → usePersonalDataHub-CuO7bBz3.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-AvKcICeL.js → vnode-Cq3NWQzC.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-ClicurwO.js → zoom-BTh_EbRh.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/hub.js +13 -4
  145. package/src/gateways/ws/personal-data-hub-protocol.js +2 -1
  146. package/src/lib/__tests__/pdh-load-error.test.js +87 -0
  147. package/src/lib/pdh-egress.js +210 -0
  148. package/src/lib/pdh-load-error.js +58 -0
  149. package/src/lib/personal-data-hub-wiring.js +4 -38
  150. package/src/runtime/diagnostics.js +48 -0
  151. package/src/runtime/headless-stream.js +37 -1
  152. package/src/assets/web-panel/assets/MobileProjects-dR-6L-xU.js +0 -1
  153. package/src/assets/web-panel/assets/Providers-CrtYhXe4.js +0 -1
  154. package/src/assets/web-panel/assets/Search-BXBraFwH.js +0 -1
  155. package/src/assets/web-panel/assets/Tasks-w5vOQG7_.js +0 -1
  156. package/src/assets/web-panel/assets/Terminal-2wTdm-Qz.js +0 -3
  157. package/src/assets/web-panel/assets/devWarning-D7oeO7SY.js +0 -1
  158. package/src/assets/web-panel/assets/index-BIPYc_9M.js +0 -1
  159. package/src/assets/web-panel/assets/index-BRXyk-mT.js +0 -1
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared helper for loading the personal-data-hub package with an actionable
3
+ * error when the install is incomplete.
4
+ *
5
+ * pdh is imported lazily from several places (the hub wiring, the ws
6
+ * personal-data-hub protocol's system-data ingest, and the `cc hub
7
+ * collect-*` / `salvage` forensics commands). When a global
8
+ * `npm i -g chainlesschain` is interrupted mid-extraction — commonly a
9
+ * running `cc` / node process holding a lock on a native .node file →
10
+ * EBUSY/EPERM — the pdh package is left partially written. The default Node
11
+ * error ("Cannot find module .../personal-data-hub/lib/...") reads like a bug
12
+ * in the package rather than a local-install problem, so users can't
13
+ * self-fix. Centralizing the rewrite here keeps that guidance identical
14
+ * across every pdh load site.
15
+ */
16
+
17
+ /**
18
+ * Turn a raw ESM module-resolution failure for the personal-data-hub package
19
+ * into an actionable "your install is incomplete — repair it" error. Real
20
+ * bugs inside pdh (a TypeError) and unrelated missing modules pass through
21
+ * unchanged.
22
+ */
23
+ export function rewritePdhLoadError(err) {
24
+ const isMissingModule =
25
+ err &&
26
+ (err.code === "ERR_MODULE_NOT_FOUND" ||
27
+ /Cannot find (module|package)/.test(err.message || ""));
28
+ const mentionsPdh = /personal-data-hub/.test(
29
+ (err && (err.url || err.message)) || "",
30
+ );
31
+ if (!isMissingModule || !mentionsPdh) return err;
32
+ const wrapped = new Error(
33
+ "Personal Data Hub package is missing files — your install looks " +
34
+ "incomplete.\n" +
35
+ "This usually means a global install was interrupted (often a running " +
36
+ "`cc`/node process locking a native file).\n" +
37
+ "Repair it with: npm i -g chainlesschain@latest\n" +
38
+ "(close any running `cc` sessions first so the install isn't blocked).\n" +
39
+ `Original error: ${err.message}`,
40
+ );
41
+ wrapped.code = "PDH_INSTALL_INCOMPLETE";
42
+ wrapped.cause = err;
43
+ return wrapped;
44
+ }
45
+
46
+ /**
47
+ * `await import()` a pdh package/subpath specifier, rewriting an
48
+ * incomplete-install resolution failure into the actionable error above.
49
+ * Returns the raw module namespace (caller does its own .default / named
50
+ * destructure, exactly like a bare dynamic import).
51
+ */
52
+ export async function importPdh(spec) {
53
+ try {
54
+ return await import(spec);
55
+ } catch (err) {
56
+ throw rewritePdhLoadError(err);
57
+ }
58
+ }
@@ -26,6 +26,10 @@
26
26
 
27
27
  import { join } from "node:path";
28
28
  import { mkdirSync } from "node:fs";
29
+ import { rewritePdhLoadError } from "./pdh-load-error.js";
30
+ // Test seam (mirrors _atomicWriteJson600): re-exported so the existing
31
+ // pdh-wiring-load-error suite can keep importing it from here.
32
+ export { rewritePdhLoadError as _rewritePdhLoadError } from "./pdh-load-error.js";
29
33
  // Hub package is CJS; in ESM we default-import then destructure (Node 22
30
34
  // won't let us name-import a CJS module unless it ships a separate ESM
31
35
  // shim, which we don't).
@@ -137,44 +141,6 @@ let LocalVault,
137
141
 
138
142
  let _pdhLoadPromise = null;
139
143
 
140
- /**
141
- * Turn a raw ESM module-resolution failure for the personal-data-hub package
142
- * into an actionable "your install is incomplete — repair it" error.
143
- *
144
- * Today this happens when a global `npm i -g chainlesschain` is interrupted
145
- * mid-extraction (commonly a running `cc` / node process holding a lock on a
146
- * native .node file → EBUSY/EPERM), leaving the pdh package partially
147
- * written. The default Node error ("Cannot find module
148
- * .../personal-data-hub/lib/adapters/wechat/index.js") reads like a bug in
149
- * the package rather than a local-install problem, so users can't self-fix.
150
- * Non-resolution errors (a real bug inside pdh) pass through unchanged.
151
- */
152
- function rewritePdhLoadError(err) {
153
- const isMissingModule =
154
- err &&
155
- (err.code === "ERR_MODULE_NOT_FOUND" ||
156
- /Cannot find (module|package)/.test(err.message || ""));
157
- const mentionsPdh = /personal-data-hub/.test(
158
- (err && (err.url || err.message)) || "",
159
- );
160
- if (!isMissingModule || !mentionsPdh) return err;
161
- const wrapped = new Error(
162
- "Personal Data Hub package is missing files — your install looks " +
163
- "incomplete.\n" +
164
- "This usually means a global install was interrupted (often a running " +
165
- "`cc`/node process locking a native file).\n" +
166
- "Repair it with: npm i -g chainlesschain@latest\n" +
167
- "(close any running `cc` sessions first so the install isn't blocked).\n" +
168
- `Original error: ${err.message}`,
169
- );
170
- wrapped.code = "PDH_INSTALL_INCOMPLETE";
171
- wrapped.cause = err;
172
- return wrapped;
173
- }
174
- // Test seam (mirrors _atomicWriteJson600): unit-test the error rewrite
175
- // without provoking a real partial-install.
176
- export { rewritePdhLoadError as _rewritePdhLoadError };
177
-
178
144
  /**
179
145
  * Lazily import the personal-data-hub package + wechat adapter and populate
180
146
  * the module-level binding holders above. Memoized so concurrent
@@ -14,6 +14,7 @@
14
14
 
15
15
  import { execSync } from "node:child_process";
16
16
  import { existsSync, readdirSync } from "node:fs";
17
+ import { createRequire } from "node:module";
17
18
  import { createConnection } from "node:net";
18
19
  import semver from "semver";
19
20
 
@@ -62,6 +63,41 @@ function safeExec(cmd) {
62
63
  }
63
64
  }
64
65
 
66
+ /**
67
+ * Verify the personal-data-hub package (lazily loaded by every `cc hub …`
68
+ * command) is fully present on disk.
69
+ *
70
+ * A partial global install — most commonly an interrupted `npm i -g
71
+ * chainlesschain` whose extraction was blocked by a running `cc` process
72
+ * locking a native file (EBUSY) — leaves pdh files unwritten. The hub
73
+ * commands then fail at runtime with a raw ERR_MODULE_NOT_FOUND. Because pdh
74
+ * is lazy-loaded, `cc doctor` itself still starts and can surface this
75
+ * proactively with a one-line repair hint instead of leaving the user to
76
+ * decode a stack trace.
77
+ *
78
+ * Probes the two exported entry points (main + the wechat adapter); CJS
79
+ * require.resolve verifies the target file exists, so a missing file throws.
80
+ * Deps are injectable for unit tests.
81
+ */
82
+ export function checkPdhPackageIntegrity(deps = {}) {
83
+ const resolve =
84
+ deps.resolve || ((spec) => createRequire(import.meta.url).resolve(spec));
85
+ const exists = deps.existsSync || existsSync;
86
+ const repair = "Repair: npm i -g chainlesschain@latest";
87
+ const probes = [
88
+ "@chainlesschain/personal-data-hub",
89
+ "@chainlesschain/personal-data-hub/adapters/wechat",
90
+ ];
91
+ try {
92
+ const paths = probes.map((spec) => resolve(spec));
93
+ const missing = paths.filter((p) => !exists(p));
94
+ if (missing.length === 0) return { ok: true, detail: "" };
95
+ return { ok: false, detail: `Incomplete install — ${repair}` };
96
+ } catch {
97
+ return { ok: false, detail: `Missing/unresolvable — ${repair}` };
98
+ }
99
+ }
100
+
65
101
  /**
66
102
  * Collect a machine-readable doctor report.
67
103
  *
@@ -179,6 +215,18 @@ export async function collectDoctorReport() {
179
215
  detail: setupCompleted ? "" : 'Run "chainlesschain setup"',
180
216
  });
181
217
 
218
+ // Personal Data Hub package integrity (catches partial/EBUSY-corrupted
219
+ // global installs before the user hits a raw ERR_MODULE_NOT_FOUND from a
220
+ // `cc hub …` command). Optional: non-hub usage works without it.
221
+ const pdh = checkPdhPackageIntegrity();
222
+ checks.push({
223
+ id: "pdh-package",
224
+ name: "Personal Data Hub package",
225
+ ok: pdh.ok,
226
+ optional: true,
227
+ detail: pdh.detail,
228
+ });
229
+
182
230
  // Port scan
183
231
  const ports = [];
184
232
  for (const [name, port] of Object.entries(DEFAULT_PORTS)) {
@@ -582,9 +582,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
582
582
  // the very first turn — the read side of pdh-feedback-ledger.js. Gated to PDH
583
583
  // context (the in-APK chat sets CHAINLESSCHAIN_PDH_PORT; `--pdh` forces,
584
584
  // `--no-pdh` opts out) so IDE/coding sessions are never polluted. Best-effort.
585
+ // PDH context gate — reused by the §3.5.13 flywheel injection below and the
586
+ // §3.5.18 egress reporting after each turn (in-APK chat sets
587
+ // CHAINLESSCHAIN_PDH_PORT; `--pdh` forces, `--no-pdh` opts out).
588
+ let pdhContext = false;
585
589
  try {
586
590
  const { isInPdhTerminal } = await import("../lib/pdh-bridge.js");
587
- const pdhContext =
591
+ pdhContext =
588
592
  options.pdh === true ||
589
593
  (options.pdh !== false && isInPdhTerminal(process.env));
590
594
  if (pdhContext) {
@@ -1275,6 +1279,38 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1275
1279
  }
1276
1280
  currentAbort = null;
1277
1281
 
1282
+ // §3.5.18 出境台账: report what left the device this turn (the cloud-LLM
1283
+ // call + any egress-classed tool) so the Android transparency ledger —
1284
+ // which cannot see the cc subprocess's cloud call — records it. PDH-gated
1285
+ // and emit-only (cc never keeps its own ledger; it stays a single on-device
1286
+ // encrypted store). A local-only turn emits nothing — the honest "0 条出境".
1287
+ // Uses the EFFECTIVE per-turn LLM (a §3.5.10 privacy-tier / vision override
1288
+ // is exactly the egress-relevant decision).
1289
+ if (pdhContext) {
1290
+ try {
1291
+ const { turnEgressEvents } = await import("../lib/pdh-egress.js");
1292
+ const effProvider =
1293
+ turnVisionLlm?.provider || turnLlmOverride?.provider || provider;
1294
+ const effModel =
1295
+ turnVisionLlm?.model || turnLlmOverride?.model || model;
1296
+ const effBaseUrl =
1297
+ turnVisionLlm?.baseUrl || turnLlmOverride?.baseUrl || baseUrl;
1298
+ for (const ev of turnEgressEvents({
1299
+ provider: effProvider,
1300
+ baseUrl: effBaseUrl,
1301
+ model: effModel,
1302
+ toolCalls: outcome.toolCalls,
1303
+ usage: outcome.usage,
1304
+ sessionId,
1305
+ turn: turns,
1306
+ })) {
1307
+ emit(ev);
1308
+ }
1309
+ } catch {
1310
+ /* egress reporting is best-effort — never break the chat */
1311
+ }
1312
+ }
1313
+
1278
1314
  // Grow the conversation so the next turn has context.
1279
1315
  messages.push({ role: "assistant", content: outcome.finalText });
1280
1316
  if (persist) {
@@ -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-IHn9LQeI.js";import{a7 as y,M}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 M},get FolderOutlined(){return y}};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"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{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-WaICZP/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{E as N,r as k,I as m,J as F,U as d,c as i,K as l,V as u,S,F as R,Z as q,o as I,a as A,P as g,Q as x,R as C,_ as E}from"./vendor-BvqAck49.js";import{u as M,_ as H,d as _}from"./index-IHn9LQeI.js";import{a as W,b as D,c as j}from"./parsers-UEvh_ShA.js";import{R as Z}from"./icons-DP3uiYxy.js";const B=N("providers",()=>{const K=k(!1),o=k(null),v=k([]),e=k([]),w=k(null);async function U(){const s=M();K.value=!0;try{const{output:f}=await s.execute("llm providers",15e3);v.value=W(f);const p=v.value.find(h=>h.active);p&&(w.value=p.name);const{output:b}=await s.execute("llm models",15e3);e.value=D(b)}catch(f){console.error("Failed to load providers:",f)}finally{K.value=!1}}async function y(s){await M().execute(`llm switch ${s}`,1e4),v.value.forEach(p=>p.active=p.name===s),w.value=s}async function a(s){const f=M();o.value=s;try{const{output:p,exitCode:b}=await f.execute("llm test",3e4),h=v.value.find(L=>L.name===s);return h&&(h.status=b===0?"ok":"error"),b===0}catch{const p=v.value.find(b=>b.name===s);return p&&(p.status="error"),!1}finally{o.value=null}}return{loading:K,testing:o,providers:v,localModels:e,activeProvider:w,loadProviders:U,switchProvider:y,testProvider:a}}),J={__name:"Providers",setup(K,{expose:o}){o();const v=B(),e=M(),w=k(!1),U=k(!1),y=k(!1),a=A({provider:void 0,model:"",apiKey:"",baseUrl:"",temperature:.7,maxTokens:4096});let s={};const f=["ollama","openai","anthropic","volcengine","deepseek","gemini","groq","mistral","custom","zhipu"],p={ollama:"Ollama(本地)",openai:"OpenAI",anthropic:"Anthropic",volcengine:"火山引擎(豆包)",deepseek:"DeepSeek",gemini:"Google Gemini",groq:"Groq",mistral:"Mistral",custom:"Custom(自定义)",zhipu:"智谱 AI"},b=f.map(n=>({value:n,label:p[n]||n}));async function h(n){try{await v.switchProvider(n),_.success(`已切换到 ${n}`)}catch(t){_.error(`切换失败: ${t.message}`)}}async function L(n){await v.testProvider(n)?_.success(`${n} 连接正常`):_.warning(`${n} 连接失败,请检查配置`)}async function z(){w.value=!0;try{const{output:n}=await e.execute("config list",15e3),t=j(n);t.provider&&(a.provider=t.provider),t.model&&(a.model=t.model),t.apiKey&&(a.apiKey=t.apiKey),t.baseUrl&&(a.baseUrl=t.baseUrl),t.temperature!==void 0&&(a.temperature=t.temperature),t.maxTokens!==void 0&&(a.maxTokens=t.maxTokens),s={provider:t.provider??"",model:t.model??"",apiKey:t.apiKey??"",baseUrl:t.baseUrl??"",temperature:t.temperature??a.temperature,maxTokens:t.maxTokens??a.maxTokens},_.success("配置已加载")}catch(n){_.error(`加载配置失败: ${n.message}`)}finally{w.value=!1}}async function O(){U.value=!0;const n=[],t=[];try{if(a.provider&&a.provider!==s.provider)try{await e.execute(`config set llm.provider ${a.provider}`,1e4),t.push("provider")}catch(c){n.push(`provider: ${c.message}`)}if(a.model&&a.model!==s.model)try{await e.execute(`config set llm.model ${a.model}`,1e4),t.push("model")}catch(c){n.push(`model: ${c.message}`)}if(a.apiKey&&a.apiKey!==s.apiKey)try{await e.execute(`config set llm.apiKey ${a.apiKey}`,1e4),t.push("apiKey")}catch(c){n.push(`apiKey: ${c.message}`)}if(a.baseUrl!==void 0&&a.baseUrl!==s.baseUrl)try{await e.execute(`config set llm.baseUrl ${a.baseUrl}`,1e4),t.push("baseUrl")}catch(c){n.push(`baseUrl: ${c.message}`)}if(a.temperature!==s.temperature)try{await e.execute(`config set llm.temperature ${a.temperature}`,1e4),t.push("temperature")}catch(c){n.push(`temperature: ${c.message}`)}if(a.maxTokens!==s.maxTokens)try{await e.execute(`config set llm.maxTokens ${a.maxTokens}`,1e4),t.push("maxTokens")}catch(c){n.push(`maxTokens: ${c.message}`)}n.length>0?_.warning(`部分配置保存失败: ${n.join("; ")}`):t.length>0?(_.success(`已保存 ${t.length} 项配置`),s={...a},(t.includes("apiKey")||t.includes("provider")||t.includes("baseUrl")||t.includes("model"))&&(y.value=!0),t.includes("provider")&&v.loadProviders()):_.info("没有检测到配置变更")}catch(c){_.error(`保存配置失败: ${c.message}`)}finally{U.value=!1}}function P(){a.provider=s.provider||void 0,a.model=s.model||"",a.apiKey=s.apiKey||"",a.baseUrl=s.baseUrl||"",a.temperature=s.temperature??.7,a.maxTokens=s.maxTokens??4096}I(()=>{v.loadProviders(),z()});const T={providersStore:v,ws:e,configLoading:w,configSaving:U,showRestartHint:y,configForm:a,get loadedConfig(){return s},set loadedConfig(n){s=n},knownProviders:f,providerLabels:p,providerOptions:b,switchProvider:h,test:L,loadConfig:z,saveConfig:O,resetForm:P,onMounted:I,reactive:A,ref:k,get ReloadOutlined(){return Z},get message(){return _},get useProvidersStore(){return B},get useWsStore(){return M},get parseLlmConfigOutput(){return j}};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},X={key:1,style:{"text-align":"center",padding:"60px"}},Y={class:"providers-grid"},$={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},ee={style:{"font-size":"24px"}},oe={style:{flex:"1"}},ae={style:{color:"#e0e0e0","font-weight":"500"}},te={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},re={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},se={key:0,style:{"margin-top":"24px"}},ne={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"16px"}},le={class:"config-grid"},de={style:{display:"flex","align-items":"center",gap:"12px"}},ce={style:{display:"flex",gap:"12px","justify-content":"flex-end","margin-top":"16px"}};function me(K,o,v,e,w,U){const y=m("a-button"),a=m("a-alert"),s=m("a-spin"),f=m("a-tag"),p=m("a-badge"),b=m("a-card"),h=m("a-list-item"),L=m("a-list"),z=m("a-divider"),O=m("a-select"),P=m("a-form-item"),T=m("a-input"),n=m("a-input-password"),t=m("a-slider"),c=m("a-input-number"),V=m("a-form");return g(),F("div",null,[d("div",Q,[o[10]||(o[10]=d("div",null,[d("h2",{class:"page-title"},"LLM 配置"),d("p",{class:"page-sub"},"管理 AI 服务提供商")],-1)),i(y,{type:"primary",ghost:"",loading:e.providersStore.loading,onClick:o[0]||(o[0]=r=>e.providersStore.loadProviders())},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[9]||(o[9]=x(" 刷新 ",-1))]),_:1},8,["loading"])]),u(" Active Provider Banner "),e.providersStore.activeProvider?(g(),S(a,{key:0,type:"success",style:{"margin-bottom":"20px",background:"rgba(41,162,112,.08)","border-color":"rgba(41,162,112,.3)"},"show-icon":""},{message:l(()=>[d("span",null,[o[11]||(o[11]=x("当前激活:",-1)),d("strong",null,C(e.providersStore.activeProvider),1)])]),_:1})):u("v-if",!0),u(" Loading "),e.providersStore.loading?(g(),F("div",X,[i(s,{size:"large"}),o[12]||(o[12]=d("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载 LLM 信息中...",-1))])):(g(),F(R,{key:2},[u(" Providers Grid "),d("div",null,[d("div",Y,[(g(!0),F(R,null,q(e.providersStore.providers,r=>(g(),S(b,{key:r.name,class:E(["provider-card",{active:r.active}]),style:{background:"var(--bg-card)"},size:"small"},{default:l(()=>[d("div",$,[d("span",ee,C(r.icon),1),d("div",oe,[d("div",ae,C(r.label),1),d("div",te,C(r.name),1)]),d("div",null,[r.active?(g(),S(f,{key:0,color:"green"},{default:l(()=>[...o[13]||(o[13]=[x("活跃",-1)])]),_:1})):r.status==="ok"?(g(),S(p,{key:1,status:"success",text:""})):r.status==="error"?(g(),S(p,{key:2,status:"error",text:""})):u("v-if",!0)])]),d("div",re,[i(y,{size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"},loading:e.providersStore.testing===r.name,onClick:G=>e.test(r.name)},{default:l(()=>[...o[14]||(o[14]=[x(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),r.active?(g(),S(f,{key:1,color:"green",style:{margin:"0","line-height":"24px"}},{default:l(()=>[...o[16]||(o[16]=[x("当前",-1)])]),_:1})):(g(),S(y,{key:0,size:"small",type:"primary",ghost:"",onClick:G=>e.switchProvider(r.name)},{default:l(()=>[...o[15]||(o[15]=[x(" 切换 ",-1)])]),_:1},8,["onClick"]))])]),_:2},1032,["class"]))),128))]),u(" Local Models (Ollama) "),e.providersStore.localModels.length?(g(),F("div",se,[o[17]||(o[17]=d("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}}," 本地模型(Ollama) ",-1)),i(L,{"data-source":e.providersStore.localModels,size:"small",style:{background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)"}},{renderItem:l(({item:r})=>[i(h,{style:{padding:"10px 16px","border-color":"#252525"}},{actions:l(()=>[i(f,{color:"cyan",style:{"font-size":"10px"}},{default:l(()=>[x(C(r.size||"local"),1)]),_:2},1024)]),default:l(()=>[d("span",ne,C(r.name),1)]),_:2},1024)]),_:1},8,["data-source"])])):u("v-if",!0),u(" LLM Parameter Settings "),i(z,{style:{"border-color":"var(--border-color)",margin:"32px 0 24px"}}),e.showRestartHint?(g(),S(a,{key:1,type:"warning","show-icon":"",closable:"",style:{"margin-bottom":"16px"},message:"配置已保存,但当前聊天会话仍在用旧 key",description:"桌面端的 LLM 会话只在新建会话时重读配置。请新建一个 Chat,或重启应用,新 key/Provider 才会生效。",onClose:o[1]||(o[1]=r=>e.showRestartHint=!1)})):u("v-if",!0),d("div",ie,[o[19]||(o[19]=d("h3",{class:"section-title"},"LLM 参数设置",-1)),i(y,{size:"small",loading:e.configLoading,onClick:e.loadConfig,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[18]||(o[18]=x(" 加载配置 ",-1))]),_:1},8,["loading"])]),i(b,{class:"config-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[i(V,{model:e.configForm,layout:"vertical",class:"config-form"},{default:l(()=>[d("div",le,[u(" Provider "),i(P,{label:"Provider(提供商)"},{default:l(()=>[i(O,{value:e.configForm.provider,"onUpdate:value":o[2]||(o[2]=r=>e.configForm.provider=r),placeholder:"选择 LLM 提供商",options:e.providerOptions,style:{width:"100%"},disabled:e.configSaving},null,8,["value","options","disabled"])]),_:1}),u(" Model "),i(P,{label:"Model(模型名称)"},{default:l(()=>[i(T,{value:e.configForm.model,"onUpdate:value":o[3]||(o[3]=r=>e.configForm.model=r),placeholder:"例如 doubao-seed-1-6-251015","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" API Key "),i(P,{label:"API Key"},{default:l(()=>[i(n,{value:e.configForm.apiKey,"onUpdate:value":o[4]||(o[4]=r=>e.configForm.apiKey=r),placeholder:"输入 API Key",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Base URL "),i(P,{label:"Base URL"},{default:l(()=>[i(T,{value:e.configForm.baseUrl,"onUpdate:value":o[5]||(o[5]=r=>e.configForm.baseUrl=r),placeholder:"例如 https://ark.cn-beijing.volces.com/api/v3","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Temperature "),i(P,{label:"Temperature(温度)"},{default:l(()=>[d("div",de,[i(t,{value:e.configForm.temperature,"onUpdate:value":o[6]||(o[6]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,style:{flex:"1"},disabled:e.configSaving},null,8,["value","disabled"]),i(c,{value:e.configForm.temperature,"onUpdate:value":o[7]||(o[7]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,precision:1,style:{width:"80px"},disabled:e.configSaving},null,8,["value","disabled"])])]),_:1}),u(" Max Tokens "),i(P,{label:"Max Tokens(最大输出长度)"},{default:l(()=>[i(c,{value:e.configForm.maxTokens,"onUpdate:value":o[8]||(o[8]=r=>e.configForm.maxTokens=r),min:256,max:128e3,step:256,style:{width:"100%"},placeholder:"4096",disabled:e.configSaving},null,8,["value","disabled"])]),_:1})]),d("div",ce,[i(y,{onClick:e.resetForm,disabled:e.configSaving,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:l(()=>[...o[20]||(o[20]=[x(" 重置 ",-1)])]),_:1},8,["disabled"]),i(y,{type:"primary",loading:e.configSaving,onClick:e.saveConfig},{default:l(()=>[...o[21]||(o[21]=[x(" 保存配置 ",-1)])]),_:1},8,["loading"])])]),_:1},8,["model"])]),_:1})])],2112))])}const ge=H(J,[["render",me],["__scopeId","data-v-64155d06"],["__file","/tmp/cc-web-panel-WaICZP/repo/packages/web-panel/src/views/Providers.vue"]]);export{ge as default};
@@ -1 +0,0 @@
1
- import{I as u,J as g,U as m,R as c,c as r,K as t,V as f,S as k,r as v,o as se,a as ie,b as j,P as d,Q as _,a2 as ke,F as O,Z as L}from"./vendor-BvqAck49.js";import{_ as Se,b as ce,u as de,E as ue,d as F}from"./index-IHn9LQeI.js";import{s as ye}from"./community-parser-CO25nZFt.js";import{at as Ce,l as Te,a4 as Ne,a_ as Ae,a9 as Oe,a2 as ze,$ as we,k as Ee,R as Me}from"./icons-DP3uiYxy.js";function ae(n){const o=ye(n);if(!o)return null;try{return JSON.parse(o)}catch{}const s=o.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const Ie=Object.freeze(["bm25","vector","hybrid"]);function Fe(n,o=0){return typeof n=="number"&&Number.isFinite(n)?n:o}function Re(n){if(Array.isArray(n))return n.filter(o=>typeof o=="string");if(typeof n!="string")return[];try{const o=JSON.parse(n);if(Array.isArray(o))return o.filter(s=>typeof s=="string")}catch{}return[]}function J(n){if(!n)return{noDb:!1,error:""};const o=ye(n),s=/Database not available/i.test(o);return{noDb:s,error:s?"Database not available":""}}function De(n,o=0){if(!n||typeof n!="object")return null;const s=n.id||"";return s?{key:s,id:s,score:Fe(n.score,0),title:String(n.title||""),category:String(n.category||"general"),createdAt:n.created_at??n.createdAt??"",snippet:String(n.snippet||""),_idx:o}:null}function fe(n){const o=ae(n);return Array.isArray(o)?o.map(De).filter(Boolean):[]}function he(n,o=0){if(!n||typeof n!="object")return null;const s=n.id||"";return s?{key:s,id:s,title:String(n.title||""),content:n.content??"",tags:Re(n.tags),category:String(n.category||"general"),createdAt:n.created_at??n.createdAt??"",updatedAt:n.updated_at??n.updatedAt??"",_idx:o}:null}function ge(n){const o=ae(n);return Array.isArray(o)?o.map(he).filter(Boolean):[]}function me(n){const o=ae(n);return!o||typeof o!="object"||Array.isArray(o)?null:he(o,0)}function _e(n){if(!Array.isArray(n)||n.length===0)return{total:0,categories:[],tags:[]};const o=new Map,s=new Map;for(const e of n){o.set(e.category,(o.get(e.category)||0)+1);for(const x of e.tags)s.set(x,(s.get(x)||0)+1)}return{total:n.length,categories:[...o.entries()].map(([e,x])=>({name:e,count:x})).sort((e,x)=>x.count-e.count),tags:[...s.entries()].map(([e,x])=>({name:e,count:x})).sort((e,x)=>x.count-e.count)}}function Le(n){if(n==null||n==="")return"—";const o=String(n),s=o.includes(" ")&&!o.includes("T")?o.replace(" ","T")+"Z":o,e=new Date(s);return isNaN(e.getTime())?o:e.toLocaleString("zh-CN",{hour12:!1})}const G="cc.web-panel.search.recent",re=8,Pe={__name:"Search",setup(n,{expose:o}){o();const{t:s}=ce(),e=de(),x=ue.PRESENTED_IMAGE_SIMPLE,q=v(!1),C=v(!1),P=v(!1),B=v(!1),z=v([]),h=v([]),A=v({noDb:!1,error:""}),T=ie({query:"",mode:"hybrid",topK:10}),Q=v(""),w=v(U()),K=v("results"),S=v(""),N=v(""),E=v(!1),M=v(null),V=j(()=>_e(z.value)),Y=j(()=>h.value.length?Math.max(...h.value.map(l=>l.score)):0),W=j(()=>[{title:s("search.noteColumns.title"),key:"title"},{title:s("search.noteColumns.category"),key:"category",width:"120px"},{title:s("search.noteColumns.tags"),key:"tags",width:"240px"},{title:s("search.noteColumns.createdAt"),key:"createdAt",width:"180px"},{title:s("search.noteColumns.action"),key:"action",width:"180px"}]),Z=j(()=>{let l=z.value;if(S.value&&(l=l.filter(i=>i.category===S.value)),N.value.trim()){const i=N.value.trim().toLowerCase();l=l.filter(y=>y.tags.some(b=>b.toLowerCase().includes(i)))}return l});function H(l){const i=`search.mode.${l}`,y=s(i);return y===i?l:y}function X(l){const i=["blue","green","purple","orange","cyan","magenta","gold","volcano"];let y=0;for(let b=0;b<(l||"").length;b++)y=y*31+l.charCodeAt(b)>>>0;return i[y%i.length]}function $(l){return l>=.7?"#52c41a":l>=.5?"#1677ff":l>=.3?"#faad14":"#ff4d4f"}function R(l){return String(l).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function I(l,i){if(!i||!l)return R(l);const y=i.split(/\s+/).filter(Boolean);let b=R(l);for(const be of y){const xe=new RegExp(`(${be.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")})`,"gi");b=b.replace(xe,"<mark>$1</mark>")}return b}function ee(l,i){return i?I(l,i):R(l)}function U(){try{const l=localStorage.getItem(G);if(l){const i=JSON.parse(l);if(Array.isArray(i))return i.filter(y=>typeof y=="string").slice(0,re)}}catch{}return[]}function a(l){const i=l.trim();if(!i)return;const y=[i,...w.value.filter(b=>b!==i)];w.value=y.slice(0,re);try{localStorage.setItem(G,JSON.stringify(w.value))}catch{}}function p(){w.value=[];try{localStorage.removeItem(G)}catch{}}function D(l){T.query=l,te()}async function oe(){q.value=!0,A.value={noDb:!1,error:""};try{const{output:l}=await e.execute("note list -n 500 --json",12e3).catch(()=>({output:""})),i=J(l);if(i.noDb){A.value=i,z.value=[];return}z.value=ge(l)}catch(l){F.error(s("search.messages.loadIndexFailed",{err:l?.message||l}))}finally{q.value=!1}}async function te(){const l=T.query.trim();if(!l){F.warning(s("search.messages.queryRequired"));return}P.value=!0,A.value={noDb:!1,error:""};try{const i=[`search ${ne(l)}`,`--mode ${T.mode}`,`--top-k ${T.topK||10}`,"--json"],{output:y}=await e.execute(i.join(" "),15e3),b=J(y);if(b.noDb){A.value=b,h.value=[],B.value=!0,Q.value=l;return}h.value=fe(y),Q.value=l,B.value=!0,a(l),K.value="results"}catch(i){F.error(s("search.messages.searchFailed",{err:i?.message||i}))}finally{P.value=!1}}function ne(l){return`"${String(l).replace(/"/g,'\\"')}"`}function pe(l){T.query=l.title,T.mode="vector",te()}async function ve(l){E.value=!0,C.value=!0,M.value=null;try{const{output:i}=await e.execute(`note show ${l} --json`,8e3);if(J(i).noDb){F.error(s("search.messages.needInit"));return}M.value=me(i),M.value||F.error(s("search.messages.noteLoadFailed"))}catch(i){F.error(s("search.messages.loadFailed",{err:i?.message||i}))}finally{C.value=!1}}se(oe);const le={t:s,ws:e,EMPTY_IMG:x,RECENT_LS:G,RECENT_MAX:re,loadingIndex:q,loadingNote:C,searching:P,searched:B,notes:z,results:h,errorState:A,form:T,currentQuery:Q,recentQueries:w,activeTab:K,indexCategoryFilter:S,indexTagFilter:N,showNoteModal:E,currentNote:M,indexSummary:V,topScore:Y,noteColumns:W,filteredNotes:Z,modeLabel:H,categoryColor:X,scoreColor:$,escapeHtml:R,highlightSnippet:I,highlightContent:ee,loadRecent:U,pushRecent:a,clearRecent:p,rerunQuery:D,loadIndex:oe,runSearch:te,shellQuote:ne,searchSimilar:pe,viewNote:ve,ref:v,computed:j,onMounted:se,reactive:ie,get useI18n(){return ce},get ReloadOutlined(){return Me},get SearchOutlined(){return Ee},get ThunderboltOutlined(){return we},get BookOutlined(){return ze},get AppstoreOutlined(){return Oe},get TagsOutlined(){return Ae},get FileTextOutlined(){return Ne},get TrophyOutlined(){return Te},get EyeOutlined(){return Ce},get message(){return F},get Empty(){return ue},get useWsStore(){return de},get parseSearchResults(){return fe},get parseNotes(){return ge},get parseNote(){return me},get buildIndexSummary(){return _e},get detectSearchError(){return J},get formatSearchTime(){return Le},get SEARCH_MODES(){return Ie}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},Be={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Qe={class:"page-title"},je={class:"page-sub"},qe={key:0,class:"recent-row"},Ke={class:"recent-label"},He={class:"score-block"},Ue={class:"result-title"},Je={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Ge={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"11px"}},Ve={key:0,class:"result-snippet"},Ye=["innerHTML"],We={class:"filter-bar"},Ze={key:0,class:"tag-row"},Xe={class:"tag-row-label"},$e={class:"tag-count"},et={style:{color:"var(--text-primary)","font-weight":"500"}},tt={style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace","margin-top":"2px"}},rt={key:0,style:{color:"var(--text-muted)","font-size":"11px"}},at={key:3,style:{color:"var(--text-secondary)","font-size":"11px"}},ot={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},nt={key:0,style:{padding:"40px","text-align":"center"}},lt={key:1,style:{"padding-top":"8px"}},st={style:{"font-family":"monospace","font-size":"12px"}},it={key:0,style:{color:"var(--text-muted)"}},ct={style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},dt={key:0,class:"note-content"},ut=["innerHTML"];function ft(n,o,s,e,x,q){const C=u("a-button"),P=u("a-space"),B=u("a-alert"),z=u("a-input"),h=u("a-col"),A=u("a-radio-button"),T=u("a-radio-group"),Q=u("a-input-number"),w=u("a-row"),K=u("a-form"),S=u("a-tag"),N=u("a-card"),E=u("a-statistic"),M=u("a-empty"),V=u("a-progress"),Y=u("a-list-item-meta"),W=u("a-list-item"),Z=u("a-list"),H=u("a-tab-pane"),X=u("a-table"),$=u("a-tabs"),R=u("a-spin"),I=u("a-descriptions-item"),ee=u("a-descriptions"),U=u("a-modal");return d(),g("div",null,[m("div",Be,[m("div",null,[m("h2",Qe,c(e.t("search.title")),1),m("p",je,c(e.t("search.subtitle")),1)]),r(P,null,{default:t(()=>[r(C,{loading:e.loadingIndex,onClick:e.loadIndex},{icon:t(()=>[r(e.ReloadOutlined)]),default:t(()=>[_(" "+c(e.t("search.refreshIndex")),1)]),_:1},8,["loading"])]),_:1})]),f(" noDb banner "),e.errorState.noDb?(d(),k(B,{key:0,type:"info","show-icon":"",message:e.t("search.noDb.message"),description:e.t("search.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):f("v-if",!0),f(" Search bar "),r(N,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},"body-style":{padding:"14px 16px"}},{default:t(()=>[r(K,{layout:"vertical",model:e.form,onSubmit:ke(e.runSearch,["prevent"])},{default:t(()=>[r(w,{gutter:12},{default:t(()=>[r(h,{span:14},{default:t(()=>[r(z,{value:e.form.query,"onUpdate:value":o[0]||(o[0]=a=>e.form.query=a),size:"large",placeholder:e.t("search.form.queryPlaceholder"),"allow-clear":"",onPressEnter:e.runSearch},{prefix:t(()=>[r(e.SearchOutlined)]),_:1},8,["value","placeholder"])]),_:1}),r(h,{span:4},{default:t(()=>[r(T,{value:e.form.mode,"onUpdate:value":o[1]||(o[1]=a=>e.form.mode=a),size:"large","button-style":"solid"},{default:t(()=>[(d(!0),g(O,null,L(e.SEARCH_MODES,a=>(d(),k(A,{key:a,value:a},{default:t(()=>[_(c(e.modeLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),r(h,{span:3},{default:t(()=>[r(Q,{value:e.form.topK,"onUpdate:value":o[2]||(o[2]=a=>e.form.topK=a),min:1,max:50,placeholder:e.t("search.form.topKPlaceholder"),size:"large",style:{width:"100%"}},null,8,["value","placeholder"])]),_:1}),r(h,{span:3},{default:t(()=>[r(C,{type:"primary",size:"large",loading:e.searching,block:"",onClick:e.runSearch},{icon:t(()=>[r(e.ThunderboltOutlined)]),default:t(()=>[_(" "+c(e.t("search.form.submit")),1)]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["model"]),f(" Recent queries chips "),e.recentQueries.length?(d(),g("div",qe,[m("span",Ke,c(e.t("search.recent.label")),1),(d(!0),g(O,null,L(e.recentQueries,a=>(d(),k(S,{key:a,color:"blue",class:"recent-chip",onClick:p=>e.rerunQuery(a)},{default:t(()=>[_(c(a),1)]),_:2},1032,["onClick"]))),128)),r(C,{size:"small",type:"link",danger:"",onClick:e.clearRecent},{default:t(()=>[_(c(e.t("search.recent.clear")),1)]),_:1})])):f("v-if",!0)]),_:1}),f(" Stat cards "),r(w,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[r(h,{xs:12,sm:8,lg:5},{default:t(()=>[r(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[r(E,{title:e.t("search.stats.indexedNotes"),value:e.indexSummary.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:t(()=>[r(e.BookOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),r(h,{xs:12,sm:8,lg:5},{default:t(()=>[r(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[r(E,{title:e.t("search.stats.categories"),value:e.indexSummary.categories.length,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:t(()=>[r(e.AppstoreOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),r(h,{xs:12,sm:8,lg:5},{default:t(()=>[r(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[r(E,{title:e.t("search.stats.tags"),value:e.indexSummary.tags.length,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:t(()=>[r(e.TagsOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),r(h,{xs:12,sm:8,lg:5},{default:t(()=>[r(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[r(E,{title:e.t("search.stats.results"),value:e.results.length,"value-style":{color:e.results.length>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:t(()=>[r(e.FileTextOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),r(h,{xs:24,sm:8,lg:4},{default:t(()=>[r(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[r(E,{title:e.t("search.stats.topScore"),value:e.topScore,precision:3,"value-style":{color:e.scoreColor(e.topScore),fontSize:"20px"}},{prefix:t(()=>[r(e.TrophyOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1})]),_:1}),f(" Tabs "),r($,{activeKey:e.activeTab,"onUpdate:activeKey":o[5]||(o[5]=a=>e.activeTab=a),class:"search-tabs"},{default:t(()=>[f(" ── Results tab ───────────────────────────────────────── "),r(H,{key:"results",tab:e.t("search.tabs.results")},{default:t(()=>[e.searched?e.results.length?(d(),k(Z,{key:2,"data-source":e.results,"item-layout":"vertical",size:"large"},{renderItem:t(({item:a})=>[r(W,{class:"result-row"},{actions:t(()=>[r(C,{type:"link",size:"small",onClick:p=>e.viewNote(a.id)},{icon:t(()=>[r(e.EyeOutlined)]),default:t(()=>[_(" "+c(e.t("search.results.viewFull")),1)]),_:1},8,["onClick"])]),extra:t(()=>[m("div",He,[r(V,{type:"circle",percent:Math.round(Math.min(1,a.score)*100),"stroke-color":e.scoreColor(a.score),format:()=>a.score.toFixed(3),width:60},null,8,["percent","stroke-color","format"])])]),default:t(()=>[r(Y,null,{title:t(()=>[m("span",Ue,c(a.title||e.t("search.results.noTitle")),1),r(S,{color:e.categoryColor(a.category),style:{"margin-left":"8px"}},{default:t(()=>[_(c(a.category),1)]),_:2},1032,["color"])]),description:t(()=>[m("span",Je,c(a.id.slice(0,16)),1),m("span",Ge,c(e.formatSearchTime(a.createdAt)),1)]),_:2},1024),a.snippet?(d(),g("div",Ve,[m("span",{innerHTML:e.highlightSnippet(a.snippet,e.currentQuery)},null,8,Ye)])):f("v-if",!0)]),_:2},1024)]),_:1},8,["data-source"])):(d(),k(M,{key:1,description:e.t("search.results.noMatch",{query:e.currentQuery}),image:e.EMPTY_IMG,style:{padding:"40px 0"}},null,8,["description","image"])):(d(),k(M,{key:0,description:e.t("search.results.promptEmpty"),image:e.EMPTY_IMG,style:{padding:"40px 0"}},null,8,["description","image"]))]),_:1},8,["tab"]),f(" ── Index browser tab ────────────────────────────────── "),r(H,{key:"index",tab:e.t("search.tabs.index")},{default:t(()=>[m("div",We,[r(T,{value:e.indexCategoryFilter,"onUpdate:value":o[3]||(o[3]=a=>e.indexCategoryFilter=a),size:"small","button-style":"solid"},{default:t(()=>[r(A,{value:""},{default:t(()=>[_(c(e.t("search.index.allCategories")),1)]),_:1}),(d(!0),g(O,null,L(e.indexSummary.categories.slice(0,6),a=>(d(),k(A,{key:a.name,value:a.name},{default:t(()=>[_(c(a.name)+" ("+c(a.count)+") ",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),r(z,{value:e.indexTagFilter,"onUpdate:value":o[4]||(o[4]=a=>e.indexTagFilter=a),placeholder:e.t("search.index.tagFilterPlaceholder"),"allow-clear":"",size:"small",style:{"max-width":"180px"}},null,8,["value","placeholder"])]),f(" Top tags chips "),e.indexSummary.tags.length?(d(),g("div",Ze,[m("span",Xe,c(e.t("search.index.topTagsLabel")),1),(d(!0),g(O,null,L(e.indexSummary.tags.slice(0,12),a=>(d(),k(S,{key:a.name,color:e.indexTagFilter===a.name?"blue":"default",class:"tag-chip",onClick:p=>e.indexTagFilter=e.indexTagFilter===a.name?"":a.name},{default:t(()=>[_(c(a.name)+" ",1),m("span",$e,c(a.count),1)]),_:2},1032,["color","onClick"]))),128))])):f("v-if",!0),r(X,{columns:e.noteColumns,"data-source":e.filteredNotes,pagination:{pageSize:20,showTotal:a=>e.t("search.totals.rows",{count:a})},size:"small",loading:e.loadingIndex,style:{background:"var(--bg-card)"}},{bodyCell:t(({column:a,record:p})=>[a.key==="title"?(d(),g(O,{key:0},[m("span",et,c(p.title||e.t("search.results.noTitle")),1),m("div",tt,c(p.id.slice(0,16)),1)],64)):f("v-if",!0),a.key==="category"?(d(),k(S,{key:1,color:e.categoryColor(p.category)},{default:t(()=>[_(c(p.category),1)]),_:2},1032,["color"])):f("v-if",!0),a.key==="tags"?(d(),g(O,{key:2},[(d(!0),g(O,null,L(p.tags.slice(0,4),D=>(d(),k(S,{key:D,color:"default",style:{"font-size":"11px"}},{default:t(()=>[_(c(D),1)]),_:2},1024))),128)),p.tags.length>4?(d(),g("span",rt,"+"+c(p.tags.length-4),1)):f("v-if",!0)],64)):f("v-if",!0),a.key==="createdAt"?(d(),g("span",at,c(e.formatSearchTime(p.createdAt)),1)):f("v-if",!0),a.key==="action"?(d(),g(O,{key:4},[r(C,{size:"small",type:"link",onClick:D=>e.viewNote(p.id)},{default:t(()=>[_(c(e.t("search.index.rowAction.view")),1)]),_:1},8,["onClick"]),r(C,{size:"small",type:"link",onClick:D=>e.searchSimilar(p)},{default:t(()=>[_(c(e.t("search.index.rowAction.similar")),1)]),_:1},8,["onClick"])],64)):f("v-if",!0)]),emptyText:t(()=>[m("div",ot,[r(e.BookOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),_(" "+c(e.indexCategoryFilter||e.indexTagFilter?e.t("search.empty.filtered"):e.t("search.empty.noNotes")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"])]),_:1},8,["activeKey"]),f(" ── Note detail modal ─────────────────────────────────── "),r(U,{open:e.showNoteModal,"onUpdate:open":o[6]||(o[6]=a=>e.showNoteModal=a),title:e.t("search.note.title",{title:e.currentNote?.title||""}),width:780,footer:null},{default:t(()=>[e.loadingNote?(d(),g("div",nt,[r(R)])):e.currentNote?(d(),g("div",lt,[r(ee,{column:2,size:"small",bordered:""},{default:t(()=>[r(I,{label:e.t("search.note.id"),span:2},{default:t(()=>[m("span",st,c(e.currentNote.id),1)]),_:1},8,["label"]),r(I,{label:e.t("search.note.category")},{default:t(()=>[r(S,{color:e.categoryColor(e.currentNote.category)},{default:t(()=>[_(c(e.currentNote.category),1)]),_:1},8,["color"])]),_:1},8,["label"]),r(I,{label:e.t("search.note.tags")},{default:t(()=>[(d(!0),g(O,null,L(e.currentNote.tags,a=>(d(),k(S,{key:a,color:"default"},{default:t(()=>[_(c(a),1)]),_:2},1024))),128)),e.currentNote.tags.length?f("v-if",!0):(d(),g("span",it,"—"))]),_:1},8,["label"]),r(I,{label:e.t("search.note.createdAt")},{default:t(()=>[_(c(e.formatSearchTime(e.currentNote.createdAt)),1)]),_:1},8,["label"]),r(I,{label:e.t("search.note.updatedAt")},{default:t(()=>[_(c(e.formatSearchTime(e.currentNote.updatedAt)),1)]),_:1},8,["label"])]),_:1}),m("h4",ct,c(e.t("search.note.content")),1),e.currentNote.content?(d(),g("div",dt,[m("span",{innerHTML:e.highlightContent(e.currentNote.content,e.currentQuery)},null,8,ut)])):(d(),k(M,{key:1,description:e.t("search.note.emptyContent"),image:e.EMPTY_IMG},null,8,["description","image"]))])):f("v-if",!0)]),_:1},8,["open","title"])])}const ht=Se(Pe,[["render",ft],["__scopeId","data-v-d2b94ce3"],["__file","/tmp/cc-web-panel-WaICZP/repo/packages/web-panel/src/views/Search.vue"]]);export{ht as default};
@@ -1 +0,0 @@
1
- import{E as F,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S,V as x,o as I,x as V,P as i,Q as k,R as r,F as T,Z as O}from"./vendor-BvqAck49.js";import{u as P,_ as E}from"./index-IHn9LQeI.js";import{R as U}from"./icons-DP3uiYxy.js";const B=F("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),C()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function C(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return U},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},W={class:"page-header"},Z={key:0,class:"error-text"},j={key:1},J={class:"task-header"},K={class:"task-desc"},M={class:"task-id"},Q={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),C=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",W,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),S(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",Z,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",j,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),S(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(T,null,O(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",J,[n(C,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",K,r(o.description),1),_("span",M,r(o.id.slice(0,16)),1)]),_("div",Q,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):x("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),S(C,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,q)):o.key==="duration"?(i(),c(T,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(T,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(T,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(T,{key:5},[e.status==="running"?(i(),S(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=E(L,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-WaICZP/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{u as fe,_ as me,d as V,e as U}from"./index-IHn9LQeI.js";import{I as z,J as x,U as _,Q as D,S as K,K as T,V as R,c as A,F as Q,Z as Y,R as E,o as G,f as H,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,I=new Set,N=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),I.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),N.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(P=>({seq:P.seq,data:ae(P.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(I.add(a),()=>I.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(N.add(a),()=>N.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function P(t){return t?t.slice(0,8):""}let O=null,M=null;async function F(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:M}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await F(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),L=new p.FitAddon;m.loadAddon(L),m.open(b);try{L.fit()}catch{}t.xterm=m,t.fitAddon=L;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const j=new ResizeObserver(()=>{try{L.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});j.observe(b);const ue=t.offs;t.offs=()=>{try{j.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function X(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}G(async()=>{await X()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const Z={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:P,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:F,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:X,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(Z,"__isScriptSetup",{enumerable:!1,value:!0}),Z}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},Pe=["data-session-id"],Le={key:0,class:"xterm-placeholder"},De={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),K(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[D(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=D(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),K(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Q,null,Y(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Q,null,Y(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Pe)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Le,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",De,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Ne=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-WaICZP/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Ne as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-IHn9LQeI.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-B_Xqx3Ul.js";import{U as t}from"./index-IHn9LQeI.js";import"./vendor-BvqAck49.js";import"./index-eLphHYgM.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-CVXQQg_a.js";import{U as t}from"./index-IHn9LQeI.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-BsNIdQzh.js";import"./useFlexGapSupport-Bf1CATNE.js";import"./styleChecker-qHsriHs9.js";import"./index-eLphHYgM.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};