chainlesschain 0.162.65 → 0.162.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-DjJf_QIn.js → AIOps-DUdh61OE.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BT45g-KL.js → ActionButton-DkIwLnBD.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CRaTHble.js → Analytics-D-iPmzfz.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-72r5TM1u.js → AppLayout-kHttiFUZ.js} +3 -3
- package/src/assets/web-panel/assets/{Audit-BNlvJ3Yc.js → Audit-DstzaQFj.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Kuj0-vBg.js → Backup-COQb9n1n.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-_pKOPRf4.js → BaseInput-BzOSEUx9.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CMNhGWK5.js → Chat-CCnsErT6.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DVQnqmLx.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-B5R2TdAI.js → Checkbox-CGEGTeL3.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-69RAQ0Gi.js → Codegen-DhdKOsrH.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DlbssQEY.js → Col-DTaHrzPc.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DU3SAZIS.js → Community-hmabC5TC.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BqdNnAZv.js → Compact-DF1kuYEV.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-D9a9-ihS.js → Compliance-gGsJ0l1f.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DWBtOBbU.js → Cowork-xzH66HkJ.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-ClSuf90k.js → Cron-D-E1fiyr.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BFjRKvpa.js → Crosschain-CAxzKuw_.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BwBGRlMm.js → DID-CG3AoeWL.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CHrXGmQ3.js → Dashboard-Dd5371Pn.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-C24B5sk2.js → Dropdown-CniUpxUk.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DaXTSK5p.js → EmailListRenderer-CqkhyNVa.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-65d89G5t.js → FamilyGuardDashboard-D8PGYrZS.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CkWdqmVs.js → Federation-C6PQ0D0v.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BV4W2nrT.js → FormItemContext-Ce0Kjapm.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D60KJ0_b.js → GenericCardRenderer-DTSx1uxu.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BIKuoGvW.js → Git-CjIKQPwh.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CKnJpq5X.js → Governance-CQ6ensk6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C7G3YGeg.js → Inference-ZhEZeJBX.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D7fCUd4B.js → KnowledgeGraph-ClRD7Ny9.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C0unjcbC.js → Logs-BRxYBrqs.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-BzLlnyI8.js → Marketplace-wC7vePL2.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DSKFRB1-.js → McpTools-CbZ7EZCS.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-C_QrLAnt.js → Memory-DX48TSrr.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DBeaFERD.js → MobileBridge-C8YXsY-I.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-C2L_RttC.js → MobileProjects-D42PKdIA.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B3Tdh6-l.js → Mtc-Bq73thQS.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-B3O_EUvt.js → MtcAudit-CgxcxR8Q.js} +6 -6
- package/src/assets/web-panel/assets/{Multisig--60rVmDj.js → Multisig-C7KNb6_o.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D60vxATf.js → NLProgramming-CVzm6Kax.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D2gj2uFI.js → Notes-E962LwaY.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-D0DWHNlF.js → NotificationSettings-r5gwao_d.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CNi1B7fH.js → OrderTableRenderer-5RHLJQ7W.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BRcdFgAd.js → Organization-518E-wDo.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C3_Oap7v.js → Overflow-C6IG4Y8V.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DEbZ93QW.js → P2P-BmrkH4JM.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BmTXbyXR.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-CPj3C9o2.js → Permissions-DqtYyQ_n.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BZGupZzh.js → PersonalDataHub-CrBAGe6w.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-SMLW1BG7.js → Pipeline-Cq9nvUtI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-o24SJ2no.js → Privacy-BHS8ULGU.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DxjAXD8f.js → ProjectInit-B5GZXX6Z.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DipynlqL.js → ProjectSettings-Bgq9qhzU.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CZ9egQ8r.js → Projects-DQtd5Z3I.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-x3p-wcab.js → Providers-BC1YU1b4.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CZ7beKFC.js → QuickAsk-9v1Sc4sD.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-VJCd2i9_.js → Recommend-BJ1Mk9tH.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-pl12NmBF.js → Reputation-D_6Q_ApA.js} +1 -1
- package/src/assets/web-panel/assets/{Row-NkSeo4Tb.js → Row-B9q6bn8K.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B17vp67R.js → RssFeed-OBUMDtGN.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Dij0_m6W.js → Search-CduYF1wK.js} +1 -1
- package/src/assets/web-panel/assets/{Security-n9CSBX-9.js → Security-Cr-I8Oz7.js} +3 -3
- package/src/assets/web-panel/assets/{Services-bZOzqHdK.js → Services-C1qVm4kB.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-B23D5vJ-.js → Skeleton-Ww1MhByn.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-IXh-0mk0.js → Skills-MdBisytD.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-QEofxmdK.js → Sla-B_y_VqaO.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-u68R59ft.js → SpeechSettings-BFTJeQjg.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B3tc986U.js → SyncSettings-D6OUnG6a.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cp2QxGrr.js → Tasks-CIFAHI0I.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CMWiWxiH.js → Templates-Chm6LnIA.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-M8aPJ3C7.js → Tenant-C8uT7TxF.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CgMzHdbj.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-DF6aIS-d.js → TimelineRenderer-DCv-s6ME.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BcfMMw_e.js → Tokens-Dbp_wE8i.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-jIbNmxvm.js → Trigger-Bcm94QVz.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-ChLil6CZ.js → Trust-DWUByLU4.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B1WzYAon.js → UkeySign-gadPtraM.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Dwm0LyCc.js → VideoEditing-BWAd8rH5.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DVyxsX-O.js → Wallet-O10l9J3d.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-WYPNy2Q7.js → WebAuthn-BL59D-AQ.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Br3dCsmv.js → WorkflowEditor-B0GK1YYA.js} +1 -1
- package/src/assets/web-panel/assets/{chat-fAKHY2HK.js → chat-rxMjzdi6.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BXqS-Bwi.js → colors-MGsVs63X.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BgCQhtW3.js → compact-item-B99MX2Sj.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-weZBwqHy.js → createContext-D-UE372V.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-yudSIew_.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Dx68UNFL.js → hasIn-BTwO4423.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCYJDUab.js → index--o4IljwP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNF3aCJF.js → index-BC5oUiWa.js} +1 -1
- package/src/assets/web-panel/assets/{index-LxcdLeFj.js → index-BCo1fFG4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgUC575c.js → index-BDDFilGb.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqcH_mKR.js → index-BITfpivm.js} +1 -1
- package/src/assets/web-panel/assets/{index-HIN85jl7.js → index-BhXE09CC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXuz90bX.js → index-Bq8J_BJr.js} +1 -1
- package/src/assets/web-panel/assets/index-BsuHZ7he.js +1 -0
- package/src/assets/web-panel/assets/{index-G_wPnPoA.js → index-Bw7OfNf0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbv5btEU.js → index-C-104k0S.js} +1 -1
- package/src/assets/web-panel/assets/{index-BawcE_zG.js → index-C-wDGsps.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bwv_UrNF.js → index-C1M9EJTY.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0ZjD3Ac.js → index-C1V4w_cy.js} +1 -1
- package/src/assets/web-panel/assets/index-C5yXj1wd.js +1 -0
- package/src/assets/web-panel/assets/{index-BjsidvP5.js → index-C7AbKc5A.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC-4la9j.js → index-CJh-sOln.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8-2rQdr.js → index-CNVDW7m4.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChdeuOni.js → index-CO-buu4K.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEjLe8FJ.js → index-COL6Py19.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bo4UTTla.js → index-CgLTxhj8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DG2KCc8h.js → index-CnPf5EHZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJXZDwkf.js → index-Cqf3vqmJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxfVwfub.js → index-CtBHvTvK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSQEQCft.js → index-DGBEzFa6.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9NeNwHP.js → index-DGd9fYgP.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0rgvjX8.js → index-DOA-2IBx.js} +1 -1
- package/src/assets/web-panel/assets/{index-ohVNy7ua.js → index-DSWGJvOb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cxsfc5Ou.js → index-DdweEw7u.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bazltj8w.js → index-DfQrgIGE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfqzwaAV.js → index-DkQN4c_n.js} +1 -1
- package/src/assets/web-panel/assets/{index-5e-OAZOb.js → index-DlHo7h2D.js} +1 -1
- package/src/assets/web-panel/assets/{index-BehvfmYd.js → index-Ds58gvvD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co5cQnlv.js → index-DvMa-5Zw.js} +1 -1
- package/src/assets/web-panel/assets/{index-u2U9t07r.js → index-DyaKy5hU.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClfP1Yax.js → index-YDbokOUC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX9cxRnU.js → index-eMKPU-8h.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8zNZ_oH.js → index-fwIj9Ew1.js} +1 -1
- package/src/assets/web-panel/assets/{index-qUBHSW_3.js → index-mJP_zO6_.js} +3 -3
- package/src/assets/web-panel/assets/{index-loaP_41H.js → index-qHtF3rlV.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-M7xH4eUK.js → initDefaultProps-DT6c9bjH.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BrJP4mFE.js → motion-Bd91G2kX.js} +1 -1
- package/src/assets/web-panel/assets/{move-BufxEuU9.js → move-B8frVtgu.js} +1 -1
- package/src/assets/web-panel/assets/{omit-s6dtQtFP.js → omit-Df9R5myu.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BcYdIZqz.js → pickAttrs-C-XUO3g1.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Ds-3Hw3n.js → placementArrow-BbgfnB12.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BRtrRTxl.js → responsiveObserve-CjuJL75b.js} +1 -1
- package/src/assets/web-panel/assets/{slide-RJzqMQM4.js → slide-_AVhS93T.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BuBhJXvr.js → statusUtils-CexyzTkp.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-so8acGHq.js → styleChecker-BQGZefM3.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BpkV467K.js → useFlexGapSupport-DheJEFqe.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-lES1RctZ.js → useFs-2PJHnfsw.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DdCNi4bA.js → usePersonalDataHub-eHN-CciG.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-nAeEg_3h.js → vnode-BFGaUmOy.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BWjRAfRy.js → zoom-BtGezWHW.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/insights.js +137 -0
- package/src/commands/review.js +392 -48
- package/src/index.js +2 -0
- package/src/lib/ide-context.js +62 -5
- package/src/lib/personal-data-hub-wiring.js +36 -0
- package/src/lib/session-insights.js +145 -0
- package/src/lib/skill-loader.js +18 -3
- package/src/repl/agent-repl.js +1 -3
- package/src/skills-bundled/run/SKILL.md +49 -0
- package/src/skills-bundled/verify/SKILL.md +49 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DxJmwLv8.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DN_pmo2N.js +0 -7
- package/src/assets/web-panel/assets/Terminal-CK3zKjIE.js +0 -3
- package/src/assets/web-panel/assets/devWarning-BpXdFCJ4.js +0 -1
- package/src/assets/web-panel/assets/index-BrPKR2RZ.js +0 -1
- package/src/assets/web-panel/assets/index-CMEfvACO.js +0 -1
|
@@ -55,6 +55,7 @@ const {
|
|
|
55
55
|
BilibiliAdapter,
|
|
56
56
|
WeiboAdapter,
|
|
57
57
|
ZhihuAdapter,
|
|
58
|
+
DoubanAdapter,
|
|
58
59
|
BossZhipinAdapter,
|
|
59
60
|
CsdnAdapter,
|
|
60
61
|
DongchediAdapter,
|
|
@@ -74,6 +75,14 @@ const {
|
|
|
74
75
|
AppleHealthAdapter,
|
|
75
76
|
NeteaseMusicAdapter,
|
|
76
77
|
KugouMusicAdapter,
|
|
78
|
+
QQMusicAdapter,
|
|
79
|
+
XimalayaAdapter,
|
|
80
|
+
FanqieReadingAdapter,
|
|
81
|
+
QimaoReadingAdapter,
|
|
82
|
+
JoyrunAdapter,
|
|
83
|
+
KeepAdapter,
|
|
84
|
+
DidiConsumerAdapter,
|
|
85
|
+
MercedesMeAdapter,
|
|
77
86
|
IqiyiVideoAdapter,
|
|
78
87
|
TencentVideoAdapter,
|
|
79
88
|
XiguaVideoAdapter,
|
|
@@ -85,6 +94,12 @@ const {
|
|
|
85
94
|
IXiamenAdapter,
|
|
86
95
|
MeiyouAdapter,
|
|
87
96
|
TaxAdapter,
|
|
97
|
+
CmbcBankAdapter,
|
|
98
|
+
BocBankAdapter,
|
|
99
|
+
BankcommBankAdapter,
|
|
100
|
+
IcbcBankAdapter,
|
|
101
|
+
DcepAdapter,
|
|
102
|
+
Tmri12123Adapter,
|
|
88
103
|
DingTalkPcAdapter,
|
|
89
104
|
FeishuPcAdapter,
|
|
90
105
|
WeWorkPcAdapter,
|
|
@@ -92,8 +107,11 @@ const {
|
|
|
92
107
|
TencentMapAdapter,
|
|
93
108
|
JdAdapter,
|
|
94
109
|
MeituanAdapter,
|
|
110
|
+
ElemeAdapter,
|
|
95
111
|
PinduoduoAdapter,
|
|
96
112
|
DianpingAdapter,
|
|
113
|
+
XianyuAdapter,
|
|
114
|
+
VipshopAdapter,
|
|
97
115
|
Train12306Adapter,
|
|
98
116
|
TaobaoAdapter,
|
|
99
117
|
CtripAdapter,
|
|
@@ -535,6 +553,7 @@ async function initHub() {
|
|
|
535
553
|
for (const Cls of [
|
|
536
554
|
WeiboAdapter,
|
|
537
555
|
ZhihuAdapter,
|
|
556
|
+
DoubanAdapter,
|
|
538
557
|
BossZhipinAdapter,
|
|
539
558
|
CsdnAdapter,
|
|
540
559
|
DongchediAdapter,
|
|
@@ -554,6 +573,14 @@ async function initHub() {
|
|
|
554
573
|
AppleHealthAdapter,
|
|
555
574
|
NeteaseMusicAdapter,
|
|
556
575
|
KugouMusicAdapter,
|
|
576
|
+
QQMusicAdapter,
|
|
577
|
+
XimalayaAdapter,
|
|
578
|
+
FanqieReadingAdapter,
|
|
579
|
+
QimaoReadingAdapter,
|
|
580
|
+
JoyrunAdapter,
|
|
581
|
+
KeepAdapter,
|
|
582
|
+
DidiConsumerAdapter,
|
|
583
|
+
MercedesMeAdapter,
|
|
557
584
|
IqiyiVideoAdapter,
|
|
558
585
|
TencentVideoAdapter,
|
|
559
586
|
XiguaVideoAdapter,
|
|
@@ -565,6 +592,12 @@ async function initHub() {
|
|
|
565
592
|
IXiamenAdapter,
|
|
566
593
|
MeiyouAdapter,
|
|
567
594
|
TaxAdapter,
|
|
595
|
+
CmbcBankAdapter,
|
|
596
|
+
BocBankAdapter,
|
|
597
|
+
BankcommBankAdapter,
|
|
598
|
+
IcbcBankAdapter,
|
|
599
|
+
DcepAdapter,
|
|
600
|
+
Tmri12123Adapter,
|
|
568
601
|
DingTalkPcAdapter,
|
|
569
602
|
FeishuPcAdapter,
|
|
570
603
|
WeWorkPcAdapter,
|
|
@@ -572,8 +605,11 @@ async function initHub() {
|
|
|
572
605
|
TencentMapAdapter,
|
|
573
606
|
JdAdapter,
|
|
574
607
|
MeituanAdapter,
|
|
608
|
+
ElemeAdapter,
|
|
575
609
|
PinduoduoAdapter,
|
|
576
610
|
DianpingAdapter,
|
|
611
|
+
XianyuAdapter,
|
|
612
|
+
VipshopAdapter,
|
|
577
613
|
Train12306Adapter,
|
|
578
614
|
TaobaoAdapter,
|
|
579
615
|
CtripAdapter,
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* session-insights — turn a JSONL session's events into an analysis report
|
|
3
|
+
* (Claude-Code `/insights` parity). Pure: takes the already-read event array
|
|
4
|
+
* and returns a structured summary. No new data is collected — this reads the
|
|
5
|
+
* same `token_usage` / `tool_call` / message events the session already wrote,
|
|
6
|
+
* and layers on top of `aggregateUsage` (session-usage.js) for tokens.
|
|
7
|
+
*
|
|
8
|
+
* Note: headless runs persist user/assistant/token_usage but not necessarily
|
|
9
|
+
* tool_call/tool_result, so the tools section degrades gracefully to zero when
|
|
10
|
+
* those events aren't present (the REPL records them).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { aggregateUsage } from "./session-usage.js";
|
|
14
|
+
|
|
15
|
+
/** Human-readable duration from milliseconds. */
|
|
16
|
+
export function formatDuration(ms) {
|
|
17
|
+
const n = Number(ms);
|
|
18
|
+
if (!Number.isFinite(n) || n <= 0) return "0s";
|
|
19
|
+
const s = Math.round(n / 1000);
|
|
20
|
+
if (s < 60) return `${s}s`;
|
|
21
|
+
const m = Math.floor(s / 60);
|
|
22
|
+
const rs = s % 60;
|
|
23
|
+
if (m < 60) return rs ? `${m}m ${rs}s` : `${m}m`;
|
|
24
|
+
const h = Math.floor(m / 60);
|
|
25
|
+
const rm = m % 60;
|
|
26
|
+
return rm ? `${h}h ${rm}m` : `${h}h`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Detect whether a tool_result event represents an error (lenient). */
|
|
30
|
+
function isToolError(event) {
|
|
31
|
+
const r = event?.data?.result;
|
|
32
|
+
return Boolean(
|
|
33
|
+
event?.data?.error ||
|
|
34
|
+
(r && typeof r === "object" && (r.error || r.is_error || r.isError)),
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Analyze a session's events into a structured insights object. Pure.
|
|
40
|
+
*
|
|
41
|
+
* @param {object[]} events JSONL events ({type, timestamp, data})
|
|
42
|
+
* @param {string} [sessionId]
|
|
43
|
+
* @returns {object}
|
|
44
|
+
*/
|
|
45
|
+
export function analyzeSession(events, sessionId) {
|
|
46
|
+
const evs = Array.isArray(events) ? events : [];
|
|
47
|
+
const start = evs.find((e) => e && e.type === "session_start");
|
|
48
|
+
|
|
49
|
+
const stamps = evs
|
|
50
|
+
.map((e) => Number(e?.timestamp))
|
|
51
|
+
.filter((t) => Number.isFinite(t) && t > 0);
|
|
52
|
+
const startedAt = stamps.length ? Math.min(...stamps) : null;
|
|
53
|
+
const endedAt = stamps.length ? Math.max(...stamps) : null;
|
|
54
|
+
const durationMs =
|
|
55
|
+
startedAt != null && endedAt != null ? endedAt - startedAt : 0;
|
|
56
|
+
|
|
57
|
+
let userMsgs = 0;
|
|
58
|
+
let assistantMsgs = 0;
|
|
59
|
+
let compactions = 0;
|
|
60
|
+
let toolCalls = 0;
|
|
61
|
+
let toolErrors = 0;
|
|
62
|
+
const toolByName = new Map();
|
|
63
|
+
|
|
64
|
+
const bump = (name) => {
|
|
65
|
+
const t = toolByName.get(name) || { tool: name, count: 0, errors: 0 };
|
|
66
|
+
toolByName.set(name, t);
|
|
67
|
+
return t;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
for (const e of evs) {
|
|
71
|
+
if (!e || typeof e !== "object") continue;
|
|
72
|
+
switch (e.type) {
|
|
73
|
+
case "user_message":
|
|
74
|
+
userMsgs++;
|
|
75
|
+
break;
|
|
76
|
+
case "assistant_message":
|
|
77
|
+
assistantMsgs++;
|
|
78
|
+
break;
|
|
79
|
+
case "compact":
|
|
80
|
+
compactions++;
|
|
81
|
+
break;
|
|
82
|
+
case "tool_call": {
|
|
83
|
+
toolCalls++;
|
|
84
|
+
bump(e.data?.tool || "?").count++;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case "tool_result": {
|
|
88
|
+
if (isToolError(e)) {
|
|
89
|
+
toolErrors++;
|
|
90
|
+
bump(e.data?.tool || "?").errors++;
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
default:
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Headless persistence writes token_usage with only {input_tokens,
|
|
100
|
+
// output_tokens} — no model/provider — so the raw aggregate can't be priced.
|
|
101
|
+
// Backfill the session's recorded model/provider (from session_start) onto
|
|
102
|
+
// those events so cost estimation works (cc cost lacks this, so insights cost
|
|
103
|
+
// is strictly better for headless sessions).
|
|
104
|
+
const sessModel = start?.data?.model || null;
|
|
105
|
+
const sessProvider = start?.data?.provider || null;
|
|
106
|
+
const usageEvents =
|
|
107
|
+
sessModel || sessProvider
|
|
108
|
+
? evs.map((e) => {
|
|
109
|
+
if (e?.type !== "token_usage") return e;
|
|
110
|
+
const d = e.data || {};
|
|
111
|
+
if (d.provider || d.model) return e;
|
|
112
|
+
return {
|
|
113
|
+
...e,
|
|
114
|
+
data: { ...d, provider: sessProvider, model: sessModel },
|
|
115
|
+
};
|
|
116
|
+
})
|
|
117
|
+
: evs;
|
|
118
|
+
const usage = aggregateUsage(usageEvents);
|
|
119
|
+
const iso = (t) => (t != null ? new Date(t).toISOString() : null);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
sessionId: sessionId || null,
|
|
123
|
+
meta: {
|
|
124
|
+
title: start?.data?.title || null,
|
|
125
|
+
model: start?.data?.model || usage.byModel[0]?.model || null,
|
|
126
|
+
provider: start?.data?.provider || usage.byModel[0]?.provider || null,
|
|
127
|
+
startedAt: iso(startedAt),
|
|
128
|
+
endedAt: iso(endedAt),
|
|
129
|
+
durationMs,
|
|
130
|
+
},
|
|
131
|
+
events: evs.length,
|
|
132
|
+
messages: {
|
|
133
|
+
user: userMsgs,
|
|
134
|
+
assistant: assistantMsgs,
|
|
135
|
+
total: userMsgs + assistantMsgs,
|
|
136
|
+
},
|
|
137
|
+
tools: {
|
|
138
|
+
calls: toolCalls,
|
|
139
|
+
errors: toolErrors,
|
|
140
|
+
byTool: Array.from(toolByName.values()).sort((a, b) => b.count - a.count),
|
|
141
|
+
},
|
|
142
|
+
compactions,
|
|
143
|
+
usage,
|
|
144
|
+
};
|
|
145
|
+
}
|
package/src/lib/skill-loader.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Multi-layer skill loader for CLI
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 0 (lowest) bundled — desktop-app-vue/.../skills/builtin/
|
|
4
|
+
* 7-layer priority system (highest wins on name collision):
|
|
5
|
+
* 0 (lowest) bundled — desktop-app-vue/.../skills/builtin/ (monorepo only)
|
|
6
|
+
* 0b cli-bundled — packages/cli/src/skills-bundled/ (ships with cc)
|
|
6
7
|
* 1 marketplace — <userData>/marketplace/skills/
|
|
7
8
|
* 2 managed — <userData>/skills/
|
|
8
9
|
* 3 claude-user — ~/.claude/skills/ (Claude-Code 可移植)
|
|
@@ -69,6 +70,7 @@ export function bundledSkillsDisabled(opts = {}) {
|
|
|
69
70
|
/** Layer names in priority order (lowest → highest) */
|
|
70
71
|
export const LAYER_NAMES = [
|
|
71
72
|
"bundled",
|
|
73
|
+
"cli-bundled",
|
|
72
74
|
"marketplace",
|
|
73
75
|
"managed",
|
|
74
76
|
"claude-user",
|
|
@@ -269,6 +271,18 @@ export class CLISkillLoader {
|
|
|
269
271
|
exists: bundledPath !== null,
|
|
270
272
|
});
|
|
271
273
|
|
|
274
|
+
// Layer 0b: cli-bundled — skills shipped INSIDE the cc package
|
|
275
|
+
// (packages/cli/src/skills-bundled). Unlike the desktop `bundled` layer
|
|
276
|
+
// above (absent in a published cc install), this is always present, so
|
|
277
|
+
// CLI-owned global skills (run / verify) work everywhere cc runs without
|
|
278
|
+
// touching the desktop app's version-counted skill set.
|
|
279
|
+
const cliBundledPath = path.resolve(__dirname, "../skills-bundled");
|
|
280
|
+
layers.push({
|
|
281
|
+
layer: "cli-bundled",
|
|
282
|
+
path: cliBundledPath,
|
|
283
|
+
exists: fs.existsSync(cliBundledPath),
|
|
284
|
+
});
|
|
285
|
+
|
|
272
286
|
// Layer 1: marketplace — <userData>/marketplace/skills/
|
|
273
287
|
const userData = getElectronUserDataDir();
|
|
274
288
|
const marketplacePath = path.join(userData, "marketplace", "skills");
|
|
@@ -399,7 +413,8 @@ export class CLISkillLoader {
|
|
|
399
413
|
// Process in priority order (lowest first, so higher layers overwrite)
|
|
400
414
|
for (const { layer, path: layerPath, exists } of layers) {
|
|
401
415
|
if (!exists) continue;
|
|
402
|
-
if (dropBundled && layer === "bundled")
|
|
416
|
+
if (dropBundled && (layer === "bundled" || layer === "cli-bundled"))
|
|
417
|
+
continue;
|
|
403
418
|
const skills = this._loadFromDir(layerPath, layer);
|
|
404
419
|
for (const skill of skills) {
|
|
405
420
|
skillMap.set(skill.id, skill);
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -1319,9 +1319,7 @@ export async function startAgentRepl(options = {}) {
|
|
|
1319
1319
|
logger.log(chalk.dim("Usage: /tasks kill <id> · /tasks kill-all"));
|
|
1320
1320
|
} else {
|
|
1321
1321
|
logger.log(
|
|
1322
|
-
"
|
|
1323
|
-
" + formatBackgroundTasks(listBackgroundShellTasks()) + "
|
|
1324
|
-
",
|
|
1322
|
+
"\n" + formatBackgroundTasks(listBackgroundShellTasks()) + "\n",
|
|
1325
1323
|
);
|
|
1326
1324
|
}
|
|
1327
1325
|
prompt();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: run
|
|
3
|
+
description: Launch and drive this project's app to see a change actually working — not just passing tests. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real running app. Detects the project type (CLI, server, TUI, Electron, browser app, or library) and uses the right launch pattern.
|
|
4
|
+
category: development
|
|
5
|
+
activation: manual
|
|
6
|
+
tags: [run, launch, app, dev, smoke-test]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Run the app
|
|
10
|
+
|
|
11
|
+
Goal: actually launch this project and exercise the change, so "it works" means
|
|
12
|
+
observed behavior — not a green test suite. $ARGUMENTS may name what to run or
|
|
13
|
+
which change to exercise; if empty, infer from the recent work.
|
|
14
|
+
|
|
15
|
+
## 1. Find how this project is meant to run (in priority order)
|
|
16
|
+
|
|
17
|
+
1. **A project skill/command** that already launches it — check `.chainlesschain/`,
|
|
18
|
+
`.claude/`, `package.json` `scripts` (`dev`, `start`, `serve`), `Makefile`,
|
|
19
|
+
`Procfile`, `docker-compose.yml`, README "Quick Start".
|
|
20
|
+
2. **The dev command** for the detected stack. Prefer the one a human would use
|
|
21
|
+
locally, not the production/CI one.
|
|
22
|
+
|
|
23
|
+
## 2. Launch pattern by project type
|
|
24
|
+
|
|
25
|
+
- **CLI tool**: run the binary with a realistic subcommand + flags (e.g.
|
|
26
|
+
`node bin/<cli>.js <cmd> --help`, then a real invocation). Read stdout/stderr.
|
|
27
|
+
- **HTTP/API server**: start it in the background, poll the health/route until it
|
|
28
|
+
responds, hit the relevant endpoint with `curl`, then stop it. Never leave a
|
|
29
|
+
server running — capture its task id and kill it when done.
|
|
30
|
+
- **TUI**: launch with a scripted/non-interactive path if one exists; otherwise
|
|
31
|
+
describe the exact keystrokes and capture the first screen.
|
|
32
|
+
- **Electron / desktop**: use the project's `dev` script (e.g. `npm run dev`);
|
|
33
|
+
if there's no display, say so and fall back to building + smoke-importing the
|
|
34
|
+
changed module.
|
|
35
|
+
- **Browser/web app**: start the dev server, open the route that exercises the
|
|
36
|
+
change, take a screenshot or read the rendered DOM/console.
|
|
37
|
+
- **Library (no app)**: there's nothing to "launch" — write a tiny throwaway
|
|
38
|
+
script that imports the changed API and runs the new path, then run it.
|
|
39
|
+
|
|
40
|
+
## 3. Drive the change, then report
|
|
41
|
+
|
|
42
|
+
- Exercise the specific path the change touched (the new flag, route, screen,
|
|
43
|
+
function) with realistic input.
|
|
44
|
+
- Report what you OBSERVED: the actual output / status code / screenshot / log
|
|
45
|
+
line — quoting it. Distinguish "ran and behaved correctly" from "started but I
|
|
46
|
+
couldn't reach the changed path".
|
|
47
|
+
- Clean up: stop any background process you started. If you couldn't run it
|
|
48
|
+
(no display, missing service, needs a device), say exactly what's blocking and
|
|
49
|
+
what you'd run once unblocked — don't claim success you didn't observe.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verify
|
|
3
|
+
description: Verify that a code change actually does what it's supposed to by running the app and observing behavior. Use when asked to verify a PR, confirm a fix works, test a change manually, check that a feature works, or validate local changes before pushing — beyond just unit tests.
|
|
4
|
+
category: development
|
|
5
|
+
activation: manual
|
|
6
|
+
tags: [verify, validate, confirm, qa, smoke-test]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Verify the change
|
|
10
|
+
|
|
11
|
+
Goal: confirm a specific change does what it claims, by observing real behavior —
|
|
12
|
+
not by trusting the diff or a passing test alone. $ARGUMENTS may name the change /
|
|
13
|
+
PR / expected behavior to verify; if empty, infer it from the recent work or the
|
|
14
|
+
current diff.
|
|
15
|
+
|
|
16
|
+
## 1. State the claim precisely
|
|
17
|
+
|
|
18
|
+
Write down, in one line, what the change is supposed to do and how you'd know it
|
|
19
|
+
worked ("after the fix, `avg([1,2,3])` returns 2, not NaN"). If you can't state a
|
|
20
|
+
checkable claim, ask for one rather than guessing.
|
|
21
|
+
|
|
22
|
+
## 2. Establish the before/after when feasible
|
|
23
|
+
|
|
24
|
+
- If practical and safe, observe the BUGGY behavior first (e.g. on the base
|
|
25
|
+
revision, or by reverting the change in a scratch copy / `cc checkpoint`), then
|
|
26
|
+
the FIXED behavior — so the verification is differential, not just "it ran".
|
|
27
|
+
- For a pure feature add, exercising the new path is enough.
|
|
28
|
+
|
|
29
|
+
## 3. Exercise it for real
|
|
30
|
+
|
|
31
|
+
- Use the `run` skill's launch patterns to start the app and drive the exact path
|
|
32
|
+
the change touches (the new flag / route / screen / function) with realistic
|
|
33
|
+
input — including an edge case the change was meant to handle.
|
|
34
|
+
- Prefer observing the running app; fall back to a focused script or a targeted
|
|
35
|
+
test ONLY if the app genuinely can't be launched here (say which and why).
|
|
36
|
+
- Run the existing tests too if they're relevant, but treat them as supporting
|
|
37
|
+
evidence, not the verification itself.
|
|
38
|
+
|
|
39
|
+
## 4. Verdict
|
|
40
|
+
|
|
41
|
+
Give a clear verdict with evidence:
|
|
42
|
+
|
|
43
|
+
- **VERIFIED** — quote the observed output/behavior that proves the claim, and
|
|
44
|
+
note any edge case you checked.
|
|
45
|
+
- **NOT VERIFIED** — show what you observed that contradicts the claim (the bug
|
|
46
|
+
still reproduces, an error, wrong output).
|
|
47
|
+
- **BLOCKED** — state exactly what stopped you (no display, missing service,
|
|
48
|
+
needs a device/credentials) and the precise command/steps you'd run once
|
|
49
|
+
unblocked. Never report VERIFIED for something you did not actually observe.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as y,U as n,R as a,S,K as x,Q as C,V as w,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-qUBHSW_3.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"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={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",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:x(()=>[C(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-Hyfxs5/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-DxJmwLv8.js","./vendor-BvqAck49.js","./index-qUBHSW_3.js","./icons-DP3uiYxy.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-CNi1B7fH.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-DF6aIS-d.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-DaXTSK5p.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-D60KJ0_b.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as E,b as w,I as g,P as u,J as O,U as v,c,S as C,V as x,_ as M,F as V,Z as se,a0 as le,R,K as m,Q as b,W as L,o as J}from"./vendor-BvqAck49.js";import{u as U}from"./usePersonalDataHub-DdCNi4bA.js";import{_ as D,e as F,d as P}from"./index-qUBHSW_3.js";import{a9 as q,af as H,M as z,aH as Q,u as G,aG as K,ap as W,ab as Y,e as de,d as fe,k as pe,ah as me,az as _e,R as ye}from"./icons-DP3uiYxy.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=E({...I}),t=E([]),n=E(null),e=E(!1),o=E(!1),l=E(null),a=E(null),s=E(!1),i=E({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const j=w(()=>t.value.length>0),A=w(()=>n.value!=null);function h(S={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...S}}async function y(){const S=++d;e.value=!0,l.value=null;const p=U();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:B})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(S!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,a.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(S!==d)return;l.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,l.value=null;const S=U();try{const p=await S.searchEvents(h({cursor:n.value,limit:B}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,a.value=p.mode||a.value}catch(p){l.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function ae(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,y()},Z)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),y()}function ce(){r.value={...I},t.value=[],n.value=null,l.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:l,mode:a,shortQuery:s,facets:i,hasResults:j,canLoadMore:A,search:y,loadMore:k,setFilter:ae,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ge=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["vscode","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["local-files","system"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:K,shopping:G,travel:Q,system:z,"ai-chat":H,other:q};function l(i){return o[i]||q}function a(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:l,badgeStyle:a,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return G},get CarOutlined(){return Q},get MobileOutlined(){return z},get RobotOutlined(){return H},get CATEGORIES(){return ge},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Se={class:"pdh-sidebar"},Oe=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,l){const a=g("a-badge");return u(),O("div",Se,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:M(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(a,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):x("v-if",!0)],2),(u(!0),O(V,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(le(e.iconFor(s)),{class:"icon"})),v("span",we,R(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(a,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):x("v-if",!0)],10,Oe))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-Hyfxs5/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),xe={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,l=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),a=w(()=>Object.entries(e.facets.byAdapter||{}).sort((y,k)=>k[1]-y[1]).map(([y,k])=>({value:y,label:`${y} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function j(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[y,k]=h;o("set-filter","since",y?+y:null),o("set-filter","until",k?+k:null)}const A={props:e,emit:o,placeholderText:l,adapterOptions:a,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:j,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},Ee={class:"pdh-filter-bar"},Re={key:1,class:"hint"},je={key:2,class:"hint"};function Ae(r,t,n,e,o,l){const a=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),O("div",Ee,[c(a,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>r.$emit("set-filter","adapter",_||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=_=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):x("v-if",!0),n.shortQuery?(u(),O("span",Re,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",je,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):x("v-if",!0)])}const Le=D(xe,[["render",Ae],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-Hyfxs5/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Fe={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=L(()=>F(()=>import("./ChatBubbleRenderer-DxJmwLv8.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-CNi1B7fH.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-DF6aIS-d.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),l=L(()=>F(()=>import("./EmailListRenderer-DaXTSK5p.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),a=L(()=>F(()=>import("./GenericCardRenderer-D60KJ0_b.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const _=d&&d.source&&d.source.adapter;switch($(_)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return l;default:return a}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:l,GenericCardRenderer:a,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,l){return u(),C(le(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-Hyfxs5/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const l=Number.isFinite(o.occurredAt)?o.occurredAt:null,a=l?new Date(l).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",l!=null?String(l):"",a,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
|
|
5
|
-
`)+`
|
|
6
|
-
`}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
|
|
7
|
-
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),l=document.createElement("a");return l.href=o,l.download=t,document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),l=String(n.getDate()).padStart(2,"0"),a=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${l}${s}.${a}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function l(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function a({key:i}){try{const d=l(i),_=oe(i,n.category);re(d,_,o[i]),P.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:l,onClick:a,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function qe(r,t,n,e,o,l){const a=g("a-button"),s=g("a-menu-item"),i=g("a-menu"),d=g("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(a,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+R(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=D(Pe,[["render",qe],["__file","/tmp/cc-web-panel-Hyfxs5/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function l(s,i){n.setFilter(s,i)}J(()=>{!n.hasResults&&!n.isLoading&&n.search()});const a={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:l,onMounted:J,computed:w,get ReloadOutlined(){return ye},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Je={class:"main-pane"},Ue={class:"results-summary"},He={key:0},ze={key:0},Qe={key:1},Ge={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,l){const a=g("a-tag"),s=g("a-button"),i=g("a-space"),d=g("a-col"),_=g("a-spin"),j=g("a-alert"),A=g("a-empty"),h=g("a-row");return u(),O("div",Ne,[v("div",Me,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(a,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(a,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):x("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=y=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",Je,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=y=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Ue,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",He,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(V,{key:1},[v("strong",null,R(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",ze,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,R(e.categoryLabel(e.store.filters.category)),1),v("strong",null,R(e.store.facets.byCategory[e.store.filters.category]||0),1)])):x("v-if",!0),e.store.filters.q?(u(),O("span",Qe,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,R(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):x("v-if",!0),v("span",Ge," / 已显示 "+R(e.store.results.length),1)],64))]),e.store.error?(u(),C(j,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):x("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(A,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):x("v-if",!0),v("div",Ke,[(u(!0),O(V,null,se(e.store.results,(y,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${y.id}`,event:y},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=y=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):x("v-if",!0)])]),_:1})]),_:1})])}const tt=D(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-Hyfxs5/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{tt 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-qUBHSW_3.js";import{I as z,J as x,U as y,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 Z,f as G,w as $,n as q,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 q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
|
|
3
|
-
\x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const 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 H=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});H.observe(b);const ue=t.offs;t.offs=()=>{try{H.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}}Z(async()=>{await X()}),G(()=>{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 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:Z,onBeforeUnmount:G,nextTick:q,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"},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 _(),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]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(_(),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?(_(),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),y("div",Ae,[y("div",Ee,[(_(!0),x(Q,null,Y(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(Q,null,Y(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",De,[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",qe,"已退出 (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-Hyfxs5/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as r}from"./index-qUBHSW_3.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-NkSeo4Tb.js";import{U as t}from"./index-qUBHSW_3.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-BRtrRTxl.js";import"./useFlexGapSupport-BpkV467K.js";import"./styleChecker-so8acGHq.js";import"./index-Dbv5btEU.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DlbssQEY.js";import{U as t}from"./index-qUBHSW_3.js";import"./vendor-BvqAck49.js";import"./index-Dbv5btEU.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|