chainlesschain 0.162.74 → 0.162.76

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 (152) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-C-0Db2rX.js → AIOps-DtoQc98o.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-CMzrHsYE.js → ActionButton-CGWpZPFu.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-7De_11Y4.js → Analytics-CC7XzLk4.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BbTNvwDg.js → AppLayout-CGKmgdbs.js} +4 -4
  6. package/src/assets/web-panel/assets/{Audit-NgkyFEr9.js → Audit-oLflS_MU.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-CZydm333.js → Backup-T_wI6uZE.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-BJwgC2UN.js → BaseInput-BPdSptnN.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-DAR90oE4.js → Chat-BQJThjZV.js} +6 -6
  10. package/src/assets/web-panel/assets/ChatBubbleRenderer-DIgOoly0.js +1 -0
  11. package/src/assets/web-panel/assets/{Checkbox-CJxO-pD5.js → Checkbox-DINID8Xe.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-ClsSgl-P.js → Codegen-BFRqiKXM.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-DfffBuFa.js → Col-Cz1LHthL.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-fPnkVJpl.js → Community-DM2JdVks.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-CP9f3DZt.js → Compact-DDkmTD1-.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-fCITFB2R.js → Compliance-DZ42Jq-9.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-GyZhY5mY.js → Cowork-DLt4MK_F.js} +3 -3
  18. package/src/assets/web-panel/assets/{Cron-toRv3QGW.js → Cron-CDDGkmF4.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-C0ShIRvX.js → Crosschain-DtKTUDfw.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-CB-4ILVF.js → DID-B9IBFVtN.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-DsbaECcP.js → Dashboard-DZWx6KvZ.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-klGzPkCq.js → Dropdown-CxlclJ4x.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DF7bHNgQ.js → EmailListRenderer-CPQkv5Rq.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CoXn37ZA.js → FamilyGuardDashboard-DYaSHW7O.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-CGjH3107.js → Federation-DcANvE_W.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-BbW5tEzw.js → FormItemContext-CnzzQaBo.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-Ed6pit6I.js → GenericCardRenderer-CgfKJg4t.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-wSniJ4nQ.js → Git-Djh6eGK0.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-BEXL8yvz.js → Governance-B_qc24Q5.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-RQRU05O3.js → Inference-DWVRUSsO.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-DcB0jIhB.js → KnowledgeGraph-16EMZ1Gg.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-Dq3ULqtY.js → Logs-ymceok_p.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CMM0PWC-.js → Marketplace-DXExrznt.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-DHtW5q72.js → McpTools-B9Bnym3Q.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-BPNffBX4.js → Memory-V8Ck9ZnV.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-DBduGG-4.js → MobileBridge-B9AE87pq.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileProjects-C7WN944V.js → MobileProjects-Dh7WHpD7.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-BgNC4GSE.js → Mtc-B1EIx3cJ.js} +5 -5
  39. package/src/assets/web-panel/assets/{MtcAudit-BH8w3RJG.js → MtcAudit-BVwqfXEq.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-rqVGkM71.js → Multisig-nymTttRr.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BsQUtVNj.js → NLProgramming-BHYA-EKK.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-C8kfVgBk.js → Notes-D75HMT2_.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-CnkwLmEc.js → NotificationSettings-BCkM1qCh.js} +1 -1
  44. package/src/assets/web-panel/assets/OrderTableRenderer-Bd2_WoCO.js +1 -0
  45. package/src/assets/web-panel/assets/{Organization-Cwo4kTgX.js → Organization-BHJXmWpQ.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-B45Usajd.js → Overflow-Ce6NuRg4.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-C3jEcPvs.js → P2P-ZWkd8aDF.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-CGDVPsiI.js → PdhVaultBrowser-m-R5EU0S.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-B08m9YV_.js → Permissions-tiqBu416.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-C921TFhZ.js → PersonalDataHub-Cp6QTgYQ.js} +3 -3
  51. package/src/assets/web-panel/assets/{Pipeline-AvBEIM1o.js → Pipeline-KkrWj7O7.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-g6QVOyQC.js → Privacy-Dxi4H49p.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-C1L7umfx.js → ProjectInit-D687zx7-.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-1NsCP5Rt.js → ProjectSettings-rMyJinon.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-BDxJtwFv.js → Projects-DTnO0tyd.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-DltXHH7X.js → Providers-CA3qBOIm.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-1Pw54Hz2.js → QuickAsk-cPYwl4UE.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-hB-Jmtl7.js → Recommend-AesrOSgW.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-DkWxzI44.js → Reputation-nmrzajqY.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-CZhFZDZ6.js → Row-CSM-D2YK.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-BK-SqcmK.js → RssFeed-Dg-6lotq.js} +2 -2
  62. package/src/assets/web-panel/assets/{Search-Bf_2YuHL.js → Search-_3uDkwSU.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-CkirTQxl.js → Security-DpqxaMpH.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-B9q0W9nR.js → Services-ygE3fUQq.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-BPDuoXu5.js → Skeleton-BJ8X1lgD.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-B-LPU5PB.js → Skills-DL4ggdgL.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-Clv-rKdc.js → Sla-4QfKVw0v.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-0IZfUTng.js → SpeechSettings-k815pH2S.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-nEJzARVZ.js → SyncSettings-4gpgAxhL.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-CwXHXIkl.js → Tasks-BiIwG2Ag.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-DqjCbx0G.js → Templates-BqG2I16l.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-D9gOurTB.js → Tenant--a1-0GZY.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-B4MCGz06.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-Di3hxrOR.js → TimelineRenderer-BKAOZMPL.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-V_QvhzEW.js → Tokens-C5pMEI9-.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-CzBN5yUT.js → Trigger-BJ5etoUd.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-C_NrVDAW.js → Trust-CAAdDctr.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-leU9ylJd.js → UkeySign-BzKU8nII.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-DwzlNpBk.js → VideoEditing-DmWnsgyf.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-dSIjpeqj.js → Wallet-Dg9UzBAC.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-DAKdy3CS.js → WebAuthn-DaXZGzkp.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-DOif-wp_.js → WorkflowEditor-DmJCC6AW.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-B9CiS_S6.js → chat-CAjZEmlu.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-BlIfHTi3.js → colors-DMWwvv7V.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-BhlUVQn4.js → compact-item-ByqZtPIJ.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-BAKscpCQ.js → createContext-jIGFVHeW.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-DdhKA672.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-Da29JBzS.js → hasIn-DsRtjfTk.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-B_uUznWT.js → index-9J6DqTyW.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-DCMOBmSn.js → index-B-Qnul4F.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-BUjl0ati.js → index-B1270EwF.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-DGRftOr1.js → index-B8V34BaZ.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-Cgp_jQ8s.js → index-BBtZVmOQ.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DcZ_Fb-p.js → index-BMxij0bf.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-VcI9Ml8H.js → index-B_wj_sYT.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BI-BXKcX.js → index-BbGL4FLO.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DJybkYpX.js → index-BnJVeoaZ.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CM1idCUO.js → index-BwGnc020.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-CJobtOqU.js → index-C6T-Xf0U.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DK3w8-wH.js → index-C8BwUNiL.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Boucptjt.js → index-CAKaeMfc.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BJVCQ4u4.js → index-CCnzbOKO.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-FLBlK1Zl.js → index-CGq4pe0E.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-TAakqe_Q.js → index-CKKHpsMs.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-dmxCnT7f.js → index-CScTtcVy.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BhX9Ferp.js → index-CoJswPoV.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C6-66JOV.js → index-Cs2OGp6G.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Btl77NCX.js → index-CyKWJT7j.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CFwvL9Lx.js → index-D84XwMd3.js} +1 -1
  110. package/src/assets/web-panel/assets/index-D9VvPg88.js +1 -0
  111. package/src/assets/web-panel/assets/{index-BRC7HesQ.js → index-DC3_IuqF.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BwrQlS19.js → index-DLG_xLHk.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BcVXBouF.js → index-DMXm2ylP.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DuiRwSJ_.js → index-DPm-L_xW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CUiZfnAi.js → index-D_4cOrLy.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DKggkQGO.js → index-DaP_p8P6.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-z3klVdjk.js → index-DbV45YpH.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CKlBeA-P.js → index-DdYKZY8M.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C5b8LYJi.js → index-DtDCwXJx.js} +1 -1
  120. package/src/assets/web-panel/assets/index-NbQuQzJJ.js +1 -0
  121. package/src/assets/web-panel/assets/{index-B8Jktv0L.js → index-YK9Xug8T.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D8H2a4NL.js → index-_AG9IXm-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CcLdhhVn.js → index-_orsz7Rw.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CxMk5saD.js → index-bqwPPH9S.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DBq6xzDm.js → index-i-EzGrX5.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Brth8YUr.js → index-i2aDnOiW.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BV5N_JGL.js → index-t1-_hEH4.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-DozNsdEE.js → initDefaultProps-DdyD9KAT.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-DHBmFfzK.js → motion-DRrx4PK9.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-BBloskCm.js → move-CHINGURR.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-BMB6RBkL.js → omit-DZflFtLX.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-9cBYsZy-.js → pickAttrs-DPQ6eHEY.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-DphoF2as.js → placementArrow-BJYz53Bf.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-7eccwdTq.js → responsiveObserve-DhzLakk2.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-BAF1i2qq.js → slide-DOvTqAuD.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-Bw7QssM3.js → statusUtils-B92BF_uu.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-C9oBEpYS.js → styleChecker-HRKjxQJT.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-iiGRCohz.js → useFlexGapSupport-D8ZqGK2s.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-1aj0rWmC.js → useFs-ClAmmKr2.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-nF5DnTyb.js → usePersonalDataHub-4G0-eIH3.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-DFx6RVaA.js → vnode-Bj-uyzeX.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-DwIxKwes.js → zoom-DrMI4KzQ.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/hub.js +65 -1
  145. package/src/commands/init.js +4 -6
  146. package/src/lib/downloader.js +10 -12
  147. package/src/assets/web-panel/assets/ChatBubbleRenderer-DfqwfACj.js +0 -1
  148. package/src/assets/web-panel/assets/OrderTableRenderer-DX7--1Qh.js +0 -1
  149. package/src/assets/web-panel/assets/Terminal-CnsQIiHq.js +0 -3
  150. package/src/assets/web-panel/assets/devWarning-DwewKXVi.js +0 -1
  151. package/src/assets/web-panel/assets/index-B9-zs80P.js +0 -1
  152. package/src/assets/web-panel/assets/index-CU0CJgzs.js +0 -1
@@ -795,6 +795,53 @@ async function cmdRunSkill(name, options) {
795
795
  }
796
796
  }
797
797
 
798
+ // ─── salvage ───────────────────────────────────────────────────────────
799
+ //
800
+ // Method B (key-free) decryption capstone: a rooted device dumps a running
801
+ // app's decrypted SQLite pages from /proc/<pid>/mem, then this salvages the
802
+ // message records straight out of the leaf pages (no key, no password) and
803
+ // ingests them through the social-douyin snapshot path. This is the on-device
804
+ // command the Android「一键 root 采集」button calls after the mem scan.
805
+ // See docs/internal/pdh-db-decryption-runbook.md §3.5.
806
+
807
+ async function cmdSalvage(dumpfile, options) {
808
+ const spinner = options.json ? null : ora(`salvaging ${dumpfile}...`).start();
809
+ try {
810
+ const hub = await (options._getHub || getHub)();
811
+ const { salvageAndSync } = options._salvageAndSync
812
+ ? { salvageAndSync: options._salvageAndSync }
813
+ : await import("@chainlesschain/personal-data-hub/adapters/social-douyin-adb");
814
+ const opts = {
815
+ uid: options.uid,
816
+ unaligned: options.unaligned !== false, // default-on: scattered page cache
817
+ stagingDir: options.stagingDir,
818
+ };
819
+ if (options.pageSize) opts.pageSize = Number(options.pageSize);
820
+ if (options.minCols) opts.minCols = Number(options.minCols);
821
+ if (options.columns)
822
+ opts.columns = String(options.columns)
823
+ .split(",")
824
+ .map((s) => s.trim());
825
+ const report = await salvageAndSync(hub.registry, dumpfile, opts);
826
+ if (spinner) spinner.succeed(`salvaged ${dumpfile}`);
827
+ if (options.json) {
828
+ jsonAndExit(report);
829
+ return;
830
+ }
831
+ const dy = report.douyin || {};
832
+ const sv = dy.salvage || {};
833
+ const counts = dy.eventCounts || {};
834
+ logger.log(chalk.green(`✓ salvage succeeded`));
835
+ logger.log(` leaf pages: ${sv.leafPages || 0}`);
836
+ logger.log(` records: ${sv.recordsSalvaged || 0}`);
837
+ logger.log(` messages: ${counts.message || 0}`);
838
+ logger.log(` ingested: ${report.ingested || 0}`);
839
+ process.exit(0);
840
+ } catch (err) {
841
+ fail(spinner, err, options.json);
842
+ }
843
+ }
844
+
798
845
  // ─── Phase 10.3 — cc hub aichat <verb> wizard subcommand surface ─────
799
846
  //
800
847
  // Mirrors the WS topics (personal-data-hub.aichat-*) so scripts and the
@@ -2474,13 +2521,30 @@ export function registerHubCommand(program) {
2474
2521
  hub
2475
2522
  .command("run-skill <name>")
2476
2523
  .description(
2477
- "Run one of the built-in analysis skills (spending/relations/footprint/interests/timeline)",
2524
+ "Run a built-in analysis skill: overview (跨 app 汇聚, 决策依据) / spending / relations / footprint / interests / timeline. 'analysis.overview' aggregates all apps' data into one cross-app snapshot.",
2478
2525
  )
2479
2526
  .option("--since <ms>", "Start of time window")
2480
2527
  .option("--until <ms>", "End of time window")
2481
2528
  .option("--json", "Output JSON")
2482
2529
  .action(cmdRunSkill);
2483
2530
 
2531
+ hub
2532
+ .command("salvage <dumpfile>")
2533
+ .description(
2534
+ "Method B (免密钥): salvage SQLite leaf-page records from a /proc/mem dump → ingest into the vault. Used by the Android root 一键采集 button after a memory scan.",
2535
+ )
2536
+ .option("--uid <id>", "Account uid for the snapshot (default: salvage)")
2537
+ .option(
2538
+ "--columns <list>",
2539
+ "Comma-separated msg column order; else inferred",
2540
+ )
2541
+ .option("--page-size <n>", "SQLite page size (default 4096)")
2542
+ .option("--min-cols <n>", "Drop records with fewer columns (default 3)")
2543
+ .option("--no-unaligned", "Disable the finer (512) stride scan")
2544
+ .option("--staging-dir <path>", "Where to write the intermediate snapshot")
2545
+ .option("--json", "Output JSON")
2546
+ .action(cmdSalvage);
2547
+
2484
2548
  hub
2485
2549
  .command("event-detail <eventId>")
2486
2550
  .description(
@@ -95,7 +95,6 @@ const http = require("http");
95
95
  const https = require("https");
96
96
  const fs = require("fs");
97
97
  const path = require("path");
98
- const url = require("url");
99
98
 
100
99
  const COMFYUI_URL = process.env.COMFYUI_URL || "http://localhost:8188";
101
100
  const POLL_INTERVAL_MS = 2000;
@@ -103,12 +102,12 @@ const POLL_TIMEOUT_MS = 120000;
103
102
 
104
103
  function httpRequest(urlStr, options = {}, body = null) {
105
104
  return new Promise((resolve, reject) => {
106
- const parsed = url.parse(urlStr);
105
+ const parsed = new URL(urlStr);
107
106
  const lib = parsed.protocol === "https:" ? https : http;
108
107
  const reqOpts = {
109
108
  hostname: parsed.hostname,
110
109
  port: parsed.port,
111
- path: parsed.path,
110
+ path: parsed.pathname + parsed.search,
112
111
  method: options.method || "GET",
113
112
  headers: options.headers || {},
114
113
  };
@@ -370,7 +369,6 @@ const http = require("http");
370
369
  const https = require("https");
371
370
  const fs = require("fs");
372
371
  const path = require("path");
373
- const url = require("url");
374
372
 
375
373
  const COMFYUI_URL = process.env.COMFYUI_URL || "http://localhost:8188";
376
374
  const POLL_INTERVAL_MS = 3000;
@@ -378,12 +376,12 @@ const POLL_TIMEOUT_MS = 300000; // 5 min for video
378
376
 
379
377
  function httpRequest(urlStr, options = {}, body = null) {
380
378
  return new Promise((resolve, reject) => {
381
- const parsed = url.parse(urlStr);
379
+ const parsed = new URL(urlStr);
382
380
  const lib = parsed.protocol === "https:" ? https : http;
383
381
  const reqOpts = {
384
382
  hostname: parsed.hostname,
385
383
  port: parsed.port,
386
- path: parsed.path,
384
+ path: parsed.pathname + parsed.search,
387
385
  method: options.method || "GET",
388
386
  headers: options.headers || {},
389
387
  };
@@ -7,7 +7,6 @@ import {
7
7
  } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { pipeline } from "node:stream/promises";
10
- import { Readable } from "node:stream";
11
10
  import { execSync } from "node:child_process";
12
11
  import ora from "ora";
13
12
  import { GITHUB_RELEASES_URL } from "../constants.js";
@@ -59,25 +58,24 @@ export async function downloadRelease(version, options = {}) {
59
58
  );
60
59
  let downloadedBytes = 0;
61
60
 
61
+ // Stream the fetch body to disk via an async generator (stable APIs only —
62
+ // avoids the experimental stream.Readable.fromWeb); `pipeline` keeps the
63
+ // backpressure + error handling. Progress is tracked as chunks flow through.
62
64
  const reader = response.body.getReader();
63
- const stream = new ReadableStream({
64
- async pull(controller) {
65
+ async function* trackProgress() {
66
+ while (true) {
65
67
  const { done, value } = await reader.read();
66
- if (done) {
67
- controller.close();
68
- return;
69
- }
68
+ if (done) return;
70
69
  downloadedBytes += value.byteLength;
71
70
  if (totalBytes > 0) {
72
71
  const pct = ((downloadedBytes / totalBytes) * 100).toFixed(1);
73
72
  spinner.text = `Downloading ${assetName}... ${pct}% (${formatBytes(downloadedBytes)}/${formatBytes(totalBytes)})`;
74
73
  }
75
- controller.enqueue(value);
76
- },
77
- });
74
+ yield value;
75
+ }
76
+ }
78
77
 
79
- const nodeStream = Readable.fromWeb(stream);
80
- await pipeline(nodeStream, createWriteStream(destPath));
78
+ await pipeline(trackProgress(), createWriteStream(destPath));
81
79
 
82
80
  spinner.succeed(
83
81
  `Downloaded ${assetName} (${formatBytes(downloadedBytes)})`,
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as y,U as n,R as a,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-CM1idCUO.js";import"./icons-DP3uiYxy.js";const N={__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}),_}},T={class:"bubble"},q={class:"meta"},M={class:"actor"},R={class:"time"},V={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",q,[n("span",M,a(r.actorLabel),1),n("span",R,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-88syqW/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j 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 y,b as a}from"./vendor-BvqAck49.js";import{_ as S}from"./index-CM1idCUO.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||"—"),g=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),b=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"}),h=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:g,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},q={key:0,class:"row"},A={class:"val mono"},F={key:1,class:"row"};function M(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,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",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",q,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):y("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"])])):y("v-if",!0)])}const K=S(k,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-88syqW/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K 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-CM1idCUO.js";import{I as z,J as x,U as y,Q as q,S as Q,K as T,V as R,c as A,F as Y,Z,R as E,o as G,f as H,w as $,n as D,b as ee,r as S,P as _,_ as ve,a2 as we,a3 as he,a4 as ye}from"./vendor-BvqAck49.js";import{R as _e,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,M=null;async function I(){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 D();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const K of v)m.write(K.data),t.lastSeq=K.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const J=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});J.observe(b);const ue=t.offs;t.offs=()=>{try{J.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,D(()=>{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,()=>{D(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const j={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:X,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:D,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return _e},get useTerminal(){return oe}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},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"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},qe={key:1,class:"terminal-footer"},De={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 _(),x("div",be,[y("div",ke,[y("div",null,[o[3]||(o[3]=y("h2",{class:"page-title"},"远程终端",-1)),y("p",Ce,[o[2]||(o[2]=q(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(_(),Q(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[q(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]=q(" 新会话 ",-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]=q(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(_(),Q(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),y("div",Ae,[y("div",Ee,[(_(!0),x(Y,null,Z(e.sessions,r=>(_(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[y("span",Te,E(r.shell),1),y("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?(_(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),y("div",ze,[(_(!0),x(Y,null,Z(e.sessions,r=>he((_(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[ye,r.id===e.activeId]])),128)),e.sessions.length===0?(_(),x("div",Pe,[...o[6]||(o[6]=[y("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(_(),x("div",qe,[y("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(_(),x("span",De,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-88syqW/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-CM1idCUO.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-CZhFZDZ6.js";import{U as t}from"./index-CM1idCUO.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-7eccwdTq.js";import"./useFlexGapSupport-iiGRCohz.js";import"./styleChecker-C9oBEpYS.js";import"./index-CUiZfnAi.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DfffBuFa.js";import{U as t}from"./index-CM1idCUO.js";import"./vendor-BvqAck49.js";import"./index-CUiZfnAi.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};