chainlesschain 0.162.166 → 0.162.167
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 +1 -1
- package/src/assets/web-panel/assets/{AIOps-LbDx7jL6.js → AIOps-BZJrchIA.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DnurtK34.js → ActionButton-Bhlrylt7.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DXSsV1am.js → Analytics-pHtXVQYs.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-dqRpzNuD.js → AppLayout-ORpuri4R.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-BwdmYepK.js → Artifacts-eC77yr1_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-oSX0kOUG.js → Audit-B2dZIiqz.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C2KxJahT.js → BackgroundAgents-COZiTiwP.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B4TkxWkC.js → Backup-vY_Srl5d.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CX5-KxeU.js → BaseInput-Dili5BdM.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-O_HzD-PL.js → Chat-EzKBf0XL.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Br8saHQA.js → ChatBubbleRenderer-D1CtRAyy.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-ChepDpC1.js → Checkbox-Beh6BmuW.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D9z8kc7q.js → Codegen-C3fA6kBU.js} +1 -1
- package/src/assets/web-panel/assets/{Col-B-H5eoNw.js → Col-CefMqONH.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Ccyp_Kk5.js → Community-CBAxFJtB.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BNvBznp_.js → Compact--flHc-sM.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-D1FjRd8n.js → Compliance-CPeNLvA6.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CV9B9u-8.js → Cowork-Bv5yv4BU.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BowJ4VIx.js → Cron-C22yMEas.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BJc6jzRF.js → Crosschain-Dsb2bcpu.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BEp8NV6D.js → DID-DAxei4w0.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Dls0B3YB.js → Dashboard-DEUwuVZ8.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DQ7zXVtD.js → Dropdown-BVp4si2j.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-B9q79tOl.js → EmailListRenderer-CyFkybOG.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CD8Ie-88.js → FamilyGuardDashboard-BWmmsbVx.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-5o7XU5Vf.js → Federation-Cxw27A5d.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DeKbMvOs.js → FormItemContext-Q9XthzL1.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CZiQvz_z.js → GenericCardRenderer-DS5DIdsW.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CTvFxVV8.js → Git-BOliHfxP.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DwzFIjHt.js → Governance-CD4oxa-W.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CJBk59c-.js → Inference-CMlcivo8.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DfsaXN2z.js → KnowledgeGraph-BwhERcC4.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DVRYf18S.js → Logs-BjVcZR5P.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BfRhXdyG.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BuIwyE4t.js → Marketplace-DQLU3E2w.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D3U0o78E.js → McpTools-CeK0XkpB.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-QYVmyb3b.js → Memory-DLFkgwaz.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BFgrj6eZ.js → MobileBridge-Bh6ymXyj.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bp5QB-46.js → MobileProjects-D950tUIe.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BZQu8TcH.js → Mtc-Bx5x9_2m.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BnFfEkLo.js → MtcAudit-a1-Fexsq.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-iUnNS9Cm.js → Multisig-eaw0X8X1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DNNz1y9Y.js → NLProgramming-BaNsPV4k.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CZezNYRU.js → Notes-C7pevN2X.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DBvrplIR.js → NotificationSettings-HDqeoP0r.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CTDtee49.js → OrderTableRenderer-DvzVl5T3.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CCOUJX1R.js → Organization-D_xHDlGW.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DcZghdk0.js → Overflow-B5sRnueL.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jmddWX9q.js → P2P-C-IRjOPW.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-wfjMcczl.js → PdhVaultBrowser-BqgUPlcU.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DU1GJjca.js → Permissions-Bm_T1uWw.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BzTMzDF9.js → PersonalDataHub-DujDllye.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DPmjlpVc.js → Pipeline-DyNPOLIG.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B6HRLpfK.js → Privacy-CYKTW3iK.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Cyy86AsN.js → ProjectInit-CGf03uZ0.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Bl_WQxJ5.js → ProjectSettings-DIec4bTI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Co9yKThA.js → Projects-BY43-bmi.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DLa4NlIs.js → Providers-RrnUmgPk.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BvzM7q5f.js → QrScannerModal-BBWfqd4y.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BN8yyyUj.js → QuickAsk-BsICSrFp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-QsVN4w0i.js → Recommend-B8y0b4ys.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-tkDXw-TY.js → RemoteSession-0QgdB1Oe.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DAifkGsy.js → Reputation-DBJGM0YO.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D7dZEyak.js → Row-DtWQ5otv.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DB5sImTA.js → RssFeed-2zBxHd5H.js} +3 -3
- package/src/assets/web-panel/assets/{Search-3py3TO9V.js → Search-BofliSkZ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DhNUfT_k.js → Security-ockRBBEL.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DjJAA_5D.js → Services-QyvG7Vd0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-u95JjK3n.js → Skeleton-DwbOndX3.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DPo3L0Tz.js → Skills-cHWa63sZ.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DWhkAZV1.js → Sla-BHnTEydQ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-PUegMtqV.js → SpeechSettings-DE2hrrLb.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BMNYrnrU.js → SyncSettings-CZ9vnbJH.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DWgoAHvM.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Dw9Er5DN.js → Templates-DiR3ad4X.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-7P3QIBSo.js → Tenant-NqcW3frV.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-ClPrfWW7.js → Terminal-iYeqRQZ0.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DbCd1bDH.js → TimelineRenderer-C5GOoxFz.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-EQofpA0t.js → Tokens-82dz0XdU.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ChNLLypd.js → Trigger-B3JCNrOi.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-dlVGUKs5.js → Trust-BehFYsN_.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BXyBUhNF.js → UkeySign-BfOxJjVf.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BE8-68ge.js → VideoEditing-DdITCCPz.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-7ZIJOwNg.js → Wallet-B0EhkCmD.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DgNd2Amr.js → WebAuthn-DJ4i1f3-.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-Z-Un-9l5.js → WorkflowEditor-Dr9XTqIT.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CtVDEkUc.js → chat-Dc2nFyOj.js} +1 -1
- package/src/assets/web-panel/assets/{colors-PXtJ2f1B.js → colors-Drw9djBR.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-oN96nuBi.js → compact-item-BdLXbU52.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-okCJXQXa.js → createContext-BpQMZiWY.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CnfpDzMr.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-pcHm--4o.js → hasIn-CbYwawHf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZKk4Lnm.js → index-B1ANzVc6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQYes2mk.js → index-B3uRI8_y.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cc_MkksW.js → index-B5KboakZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ1ZzJjN.js → index-B9_u4Qhe.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bht9n8Sm.js → index-BAq-4KqY.js} +1 -1
- package/src/assets/web-panel/assets/{index-_SaFHNsG.js → index-BBueKSTR.js} +1 -1
- package/src/assets/web-panel/assets/{index-jAY55MSx.js → index-BIcEW07n.js} +1 -1
- package/src/assets/web-panel/assets/{index-nMqLdwao.js → index-BWUoc9-s.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHJIfdCV.js → index-BZxzdAI0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAQktO-6.js → index-BiGDrEt4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjVIZfdA.js → index-Blv7c80V.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEtzqJw3.js → index-BmQlot_u.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0bfypsF.js → index-Bo_KwJTF.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0rfJBU3.js → index-Bu8Vy-mj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuME9k4Y.js → index-C1eo1Qkd.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1efSh1X.js → index-C3Alz2QD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBcKBb1E.js → index-CBwQwtsE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4ravjdv.js → index-CJQiSQw7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs1fGk1Z.js → index-CKmz3Is-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUUJ2WfG.js → index-COoIIMbO.js} +1 -1
- package/src/assets/web-panel/assets/index-CYTEB0tb.js +1 -0
- package/src/assets/web-panel/assets/index-CgsEp5bm.js +1 -0
- package/src/assets/web-panel/assets/{index-DC0bqrqV.js → index-CpmlTfpv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bl6N7ZyX.js → index-D7Ipfs4F.js} +1 -1
- package/src/assets/web-panel/assets/{index-vW0lwj0Y.js → index-DHMeEu-P.js} +1 -1
- package/src/assets/web-panel/assets/{index-mB1UV7wA.js → index-DKQlF7Pw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDR2mi1p.js → index-DO7LD_1t.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK0H3pQW.js → index-DSmZjrFy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtsyPnF5.js → index-DTeqWdAS.js} +1 -1
- package/src/assets/web-panel/assets/{index-T3QE8LuV.js → index-DWUN8c01.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUTyx-Lk.js → index-D_lkTnZ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-5aO2V0V4.js → index-DyU21xVi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWUJlCvK.js → index-GG_MXjSL.js} +3 -3
- package/src/assets/web-panel/assets/{index-CopGaCI_.js → index-IG3__pGj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnhHxZul.js → index-UX_Mfyfv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXhezK4d.js → index-VIyNlXPX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Rk0X8lVz.js → index-XYe6kBmi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfL10EcN.js → index-_vVucYqC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeAWCGEK.js → index-aHrUfrv1.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CG1jyiI7.js → initDefaultProps-DybC85E4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C8BYa98D.js → motion-BNNuyDg7.js} +1 -1
- package/src/assets/web-panel/assets/{move-D1hqwitW.js → move-Bm8gSjEN.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C2lol8rp.js → mtc-parser-CuHQvzzr.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Ct6Zghfi.js → omit-lv4NO7Ng.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CSYbYfdc.js → pickAttrs-BoSMfjHq.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-WCk8di0z.js → placementArrow-BOMDSvgz.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CEC8CZ-3.js → responsiveObserve-C064Ubmu.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BsXyd7Lq.js → slide-CeqhbKoG.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-tDKldiUT.js → statusUtils-CunFoYww.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BIS2unhx.js → styleChecker-Cxz3wPL7.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-yFTVMDUv.js → useFlexGapSupport-DJsIaU2S.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CZYbJwkO.js → useFs-DnAygceJ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-sbEHRLAM.js → usePersonalDataHub-CrEUY7ta.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BVjeSEQK.js → vnode-Cq3rN2eT.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BZKVvEZ6.js → zoom-TMzcOx__.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +75 -0
- package/src/commands/session.js +132 -0
- package/src/data/changelog.json +7 -2
- package/src/harness/jsonl-session-store.js +9 -0
- package/src/harness/session-mirror.js +212 -6
- package/src/lib/async-hook-queue.cjs +288 -0
- package/src/lib/async-hook-supervisor.cjs +52 -0
- package/src/lib/doctor-checkup.js +184 -4
- package/src/lib/install-command-policy.js +333 -0
- package/src/lib/jsonl-session-store.js +1 -0
- package/src/lib/lsp/__tests__/lsp-server-registry.test.js +27 -0
- package/src/lib/lsp/lsp-server-registry.js +14 -0
- package/src/lib/runtime-checkup.js +33 -0
- package/src/lib/settings-hook-events.cjs +157 -0
- package/src/lib/settings-hooks.cjs +4 -0
- package/src/lib/shell-approval.js +47 -1
- package/src/repl/add-dir.js +59 -1
- package/src/repl/agent-repl.js +85 -3
- package/src/runtime/headless-runner.js +69 -1
- package/src/runtime/headless-stream.js +22 -0
- package/src/runtime/system-prompt.js +39 -12
- package/src/assets/web-panel/assets/MarkdownRenderer-BL_WsWZM.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CYm_oTJC.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BzV6dk1B.js +0 -1
- package/src/assets/web-panel/assets/index-BFrAwXHp.js +0 -1
- package/src/assets/web-panel/assets/index-DJQFP47u.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as n}from"./index-
|
|
1
|
+
import{K as n}from"./index-GG_MXjSL.js";import{i as e}from"./motion-BNNuyDg7.js";const m=new n("antSlideUpIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1}}),f=new n("antSlideUpOut",{"0%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0}}),c=new n("antSlideDownIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1}}),l=new n("antSlideDownOut",{"0%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0}}),y=new n("antSlideLeftIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1}}),p=new n("antSlideLeftOut",{"0%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0}}),O=new n("antSlideRightIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1}}),d=new n("antSlideRightOut",{"0%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0}}),g={"slide-up":{inKeyframes:m,outKeyframes:f},"slide-down":{inKeyframes:c,outKeyframes:l},"slide-left":{inKeyframes:y,outKeyframes:p},"slide-right":{inKeyframes:O,outKeyframes:d}},K=(t,r)=>{const{antCls:a}=t,i=`${a}-${r}`,{inKeyframes:s,outKeyframes:o}=g[r];return[e(i,s,o,t.motionDurationMid),{[`
|
|
2
2
|
${i}-enter,
|
|
3
3
|
${i}-appear
|
|
4
4
|
`]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:t.motionEaseOutQuint},[`${i}-leave`]:{animationTimingFunction:t.motionEaseInQuint}}]};export{f as a,c as b,m as c,K as i,l as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-GG_MXjSL.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as d}from"./index-
|
|
1
|
+
import{B as d}from"./index-GG_MXjSL.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
|
package/src/assets/web-panel/assets/{useFlexGapSupport-yFTVMDUv.js → useFlexGapSupport-DJsIaU2S.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-
|
|
1
|
+
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-Cxz3wPL7.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-GG_MXjSL.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as f}from"./index-
|
|
1
|
+
import{u as f}from"./index-GG_MXjSL.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-GG_MXjSL.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-GG_MXjSL.js";import{i as f}from"./motion-BNNuyDg7.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-GG_MXjSL.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
package/src/commands/agent.js
CHANGED
|
@@ -506,6 +506,11 @@ export function registerAgentCommand(program) {
|
|
|
506
506
|
let _worktree = null;
|
|
507
507
|
let _worktreeFinished = false;
|
|
508
508
|
let _finishAgentWorktreeFn = null;
|
|
509
|
+
// Settings hooks loaded once at worktree setup, reused by both the
|
|
510
|
+
// WorktreeCreate producer and the WorktreeRemove producer in
|
|
511
|
+
// _finishWorktree(). Null unless --worktree is active + hooks loaded.
|
|
512
|
+
let _worktreeSettingsHooks = null;
|
|
513
|
+
let _worktreeAsyncSupervisor = null;
|
|
509
514
|
if (options.worktree) {
|
|
510
515
|
try {
|
|
511
516
|
const { setupAgentWorktree, finishAgentWorktree } =
|
|
@@ -516,6 +521,43 @@ export function registerAgentCommand(program) {
|
|
|
516
521
|
process.stderr.write(
|
|
517
522
|
`worktree: ${_worktree.path} (branch ${_worktree.branch})\n`,
|
|
518
523
|
);
|
|
524
|
+
// WorktreeCreate lifecycle hook (observe-only, best-effort): a fresh
|
|
525
|
+
// isolated worktree just appeared — let automation react (register it
|
|
526
|
+
// with a tracker, seed per-branch tooling). Loaded from the REPO ROOT
|
|
527
|
+
// (its committed/user-level .claude hooks apply). No-op & byte-unchanged
|
|
528
|
+
// without a registered WorktreeCreate hook; never blocks the session.
|
|
529
|
+
try {
|
|
530
|
+
const { loadHooks } = await import("../lib/settings-hooks.cjs");
|
|
531
|
+
_worktreeSettingsHooks =
|
|
532
|
+
loadHooks({ cwd: _worktree.repoRoot }).hooks || null;
|
|
533
|
+
const { runWorktreeCreateHooks, dispatchAsyncHooks } =
|
|
534
|
+
await import("../lib/settings-hook-events.cjs");
|
|
535
|
+
runWorktreeCreateHooks(_worktreeSettingsHooks, {
|
|
536
|
+
worktreePath: _worktree.path,
|
|
537
|
+
branch: _worktree.branch,
|
|
538
|
+
baseSha: _worktree.baseSha,
|
|
539
|
+
cwd: _worktree.path,
|
|
540
|
+
});
|
|
541
|
+
if (!_worktreeAsyncSupervisor) {
|
|
542
|
+
const { AsyncHookSupervisor } =
|
|
543
|
+
await import("../lib/async-hook-supervisor.cjs");
|
|
544
|
+
_worktreeAsyncSupervisor = new AsyncHookSupervisor({
|
|
545
|
+
persistStats: true,
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
dispatchAsyncHooks(
|
|
549
|
+
_worktreeSettingsHooks,
|
|
550
|
+
"WorktreeCreate",
|
|
551
|
+
{
|
|
552
|
+
worktree_path: _worktree.path,
|
|
553
|
+
branch: _worktree.branch,
|
|
554
|
+
base_sha: _worktree.baseSha,
|
|
555
|
+
},
|
|
556
|
+
{ cwd: _worktree.path, supervisor: _worktreeAsyncSupervisor },
|
|
557
|
+
);
|
|
558
|
+
} catch {
|
|
559
|
+
/* worktree lifecycle hooks are best-effort — never block */
|
|
560
|
+
}
|
|
519
561
|
// The worktree is created BEFORE flag validation, and several
|
|
520
562
|
// `process.exit(1)` guards below (plus any future ones) would skip the
|
|
521
563
|
// normal cleanup and orphan an empty worktree + branch on disk. A sync
|
|
@@ -548,6 +590,39 @@ export function registerAgentCommand(program) {
|
|
|
548
590
|
? `worktree removed (${fin.reason}).\n`
|
|
549
591
|
: `worktree kept (${fin.reason}): ${_worktree.path}\n${fin.mergeHint ? ` merge: ${fin.mergeHint}\n` : ""}`,
|
|
550
592
|
);
|
|
593
|
+
// WorktreeRemove lifecycle hook (observe-only, best-effort): teardown
|
|
594
|
+
// just resolved — fire with `removed` distinguishing an auto-removed
|
|
595
|
+
// empty worktree from one kept for its changes. Reuses the hooks loaded
|
|
596
|
+
// at setup; no-op & byte-unchanged without a registered hook.
|
|
597
|
+
if (_worktreeSettingsHooks) {
|
|
598
|
+
try {
|
|
599
|
+
const { runWorktreeRemoveHooks, dispatchAsyncHooks } =
|
|
600
|
+
await import("../lib/settings-hook-events.cjs");
|
|
601
|
+
runWorktreeRemoveHooks(_worktreeSettingsHooks, {
|
|
602
|
+
worktreePath: _worktree.path,
|
|
603
|
+
branch: _worktree.branch,
|
|
604
|
+
removed: fin.removed === true,
|
|
605
|
+
reason: fin.reason,
|
|
606
|
+
cwd: _worktree.repoRoot,
|
|
607
|
+
});
|
|
608
|
+
dispatchAsyncHooks(
|
|
609
|
+
_worktreeSettingsHooks,
|
|
610
|
+
"WorktreeRemove",
|
|
611
|
+
{
|
|
612
|
+
worktree_path: _worktree.path,
|
|
613
|
+
branch: _worktree.branch,
|
|
614
|
+
removed: fin.removed === true,
|
|
615
|
+
reason: fin.reason,
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
cwd: _worktree.repoRoot,
|
|
619
|
+
supervisor: _worktreeAsyncSupervisor,
|
|
620
|
+
},
|
|
621
|
+
);
|
|
622
|
+
} catch {
|
|
623
|
+
/* WorktreeRemove firing is best-effort */
|
|
624
|
+
}
|
|
625
|
+
}
|
|
551
626
|
} catch {
|
|
552
627
|
/* keep silently — never block exit */
|
|
553
628
|
}
|
package/src/commands/session.js
CHANGED
|
@@ -967,6 +967,18 @@ export function registerSessionCommand(program) {
|
|
|
967
967
|
.option("--rebuild", "Force a full re-index (ignore mtime cache)")
|
|
968
968
|
.option("--stats", "Show index-wide counters")
|
|
969
969
|
.option("--mirror <ids...>", "Push session id(s) to the configured mirror")
|
|
970
|
+
.option(
|
|
971
|
+
"--mirror-delete <ids...>",
|
|
972
|
+
"Delete session id(s) from the configured mirror",
|
|
973
|
+
)
|
|
974
|
+
.option(
|
|
975
|
+
"--mirror-prune",
|
|
976
|
+
"Delete mirror entries whose session no longer exists locally (retention)",
|
|
977
|
+
)
|
|
978
|
+
.option(
|
|
979
|
+
"--mirror-rotate",
|
|
980
|
+
"Re-encrypt all mirrored sessions from session.mirror.encryptionPrevious to session.mirror.encryption (key rotation)",
|
|
981
|
+
)
|
|
970
982
|
.option(
|
|
971
983
|
"--limit <n>",
|
|
972
984
|
"Max rows for search/list",
|
|
@@ -996,6 +1008,48 @@ export function registerSessionCommand(program) {
|
|
|
996
1008
|
return;
|
|
997
1009
|
}
|
|
998
1010
|
|
|
1011
|
+
if (options.mirrorDelete && options.mirrorDelete.length) {
|
|
1012
|
+
const result = await mirrorDeleteSessions(options.mirrorDelete);
|
|
1013
|
+
if (options.json) return console.log(JSON.stringify(result, null, 2));
|
|
1014
|
+
if (!result.target)
|
|
1015
|
+
return logger.log(chalk.yellow("No mirror configured."));
|
|
1016
|
+
for (const id of result.deleted)
|
|
1017
|
+
logger.log(chalk.green(` deleted ${id} from mirror`));
|
|
1018
|
+
for (const r of result.errors) logger.error(` ${r.id}: ${r.error}`);
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
if (options.mirrorPrune) {
|
|
1023
|
+
const result = await mirrorPruneSessions();
|
|
1024
|
+
if (options.json) return console.log(JSON.stringify(result, null, 2));
|
|
1025
|
+
if (!result.target)
|
|
1026
|
+
return logger.log(chalk.yellow("No mirror configured."));
|
|
1027
|
+
logger.log(
|
|
1028
|
+
chalk.green(
|
|
1029
|
+
` pruned ${result.deleted.length} orphaned mirror entr${
|
|
1030
|
+
result.deleted.length === 1 ? "y" : "ies"
|
|
1031
|
+
} (${result.kept.length} kept)`,
|
|
1032
|
+
),
|
|
1033
|
+
);
|
|
1034
|
+
return;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
if (options.mirrorRotate) {
|
|
1038
|
+
const result = await mirrorRotateKey();
|
|
1039
|
+
if (options.json) return console.log(JSON.stringify(result, null, 2));
|
|
1040
|
+
if (!result.target)
|
|
1041
|
+
return logger.log(chalk.yellow("No mirror configured."));
|
|
1042
|
+
if (result.error) return logger.error(` ${result.error}`);
|
|
1043
|
+
logger.log(
|
|
1044
|
+
chalk.green(
|
|
1045
|
+
` rotated ${result.rotated.length} session(s) to key "${result.keyId}"` +
|
|
1046
|
+
` (${result.skipped.length} already current)`,
|
|
1047
|
+
),
|
|
1048
|
+
);
|
|
1049
|
+
for (const r of result.failed) logger.error(` ${r.id}: ${r.error}`);
|
|
1050
|
+
return;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
999
1053
|
if (options.stats) {
|
|
1000
1054
|
const st = idx.indexStats(db);
|
|
1001
1055
|
if (options.json) return console.log(JSON.stringify(st, null, 2));
|
|
@@ -1781,6 +1835,84 @@ async function mirrorSessions(ids) {
|
|
|
1781
1835
|
return { target: mirror.target, pushed, errors };
|
|
1782
1836
|
}
|
|
1783
1837
|
|
|
1838
|
+
/** Load the configured mirror (or null). Shared by every mirror subcommand. */
|
|
1839
|
+
async function loadConfiguredMirror() {
|
|
1840
|
+
const { createMirror } = await import("../harness/session-mirror.js");
|
|
1841
|
+
let cfg = {};
|
|
1842
|
+
try {
|
|
1843
|
+
cfg =
|
|
1844
|
+
(await import("../lib/config-manager.js")).loadConfig()?.session
|
|
1845
|
+
?.mirror || {};
|
|
1846
|
+
} catch {
|
|
1847
|
+
cfg = {};
|
|
1848
|
+
}
|
|
1849
|
+
return { mirror: createMirror(cfg), cfg };
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
/** Delete session id(s) from the configured off-box mirror. */
|
|
1853
|
+
async function mirrorDeleteSessions(ids) {
|
|
1854
|
+
const store = await import("../harness/jsonl-session-store.js");
|
|
1855
|
+
const { mirror } = await loadConfiguredMirror();
|
|
1856
|
+
if (!mirror) return { target: null, deleted: [], errors: [] };
|
|
1857
|
+
const deleted = [];
|
|
1858
|
+
const errors = [];
|
|
1859
|
+
for (const id of ids) {
|
|
1860
|
+
try {
|
|
1861
|
+
if (store.isUnsafeSessionId(id)) throw new Error("unsafe session id");
|
|
1862
|
+
await mirror.delete(id);
|
|
1863
|
+
deleted.push(id);
|
|
1864
|
+
} catch (err) {
|
|
1865
|
+
errors.push({ id, error: err.message });
|
|
1866
|
+
}
|
|
1867
|
+
}
|
|
1868
|
+
return { target: mirror.target, deleted, errors };
|
|
1869
|
+
}
|
|
1870
|
+
|
|
1871
|
+
/**
|
|
1872
|
+
* Retention prune: delete mirror entries whose session no longer exists in the
|
|
1873
|
+
* local store (the mirror is one-way derived, so local is the source of truth).
|
|
1874
|
+
*/
|
|
1875
|
+
async function mirrorPruneSessions() {
|
|
1876
|
+
const store = await import("../harness/jsonl-session-store.js");
|
|
1877
|
+
const { pruneMirror } = await import("../harness/session-mirror.js");
|
|
1878
|
+
const { mirror } = await loadConfiguredMirror();
|
|
1879
|
+
if (!mirror) return { target: null, deleted: [], kept: [] };
|
|
1880
|
+
const keep = store.listSessionIds();
|
|
1881
|
+
const res = await pruneMirror(mirror, { keep });
|
|
1882
|
+
return { target: mirror.target, ...res };
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
/**
|
|
1886
|
+
* Key rotation: re-encrypt every mirrored session from the PREVIOUS key
|
|
1887
|
+
* (`session.mirror.encryptionPrevious`) to the CURRENT key
|
|
1888
|
+
* (`session.mirror.encryption`). Requires both to be configured.
|
|
1889
|
+
*/
|
|
1890
|
+
async function mirrorRotateKey() {
|
|
1891
|
+
const { createMirror, createMirrorCipher, rotateMirrorKey } =
|
|
1892
|
+
await import("../harness/session-mirror.js");
|
|
1893
|
+
const { cfg } = await loadConfiguredMirror();
|
|
1894
|
+
if (!cfg || !cfg.kind || cfg.kind === "none") {
|
|
1895
|
+
return { target: null };
|
|
1896
|
+
}
|
|
1897
|
+
const prev = cfg.encryptionPrevious || cfg.encryptionOld;
|
|
1898
|
+
const next = cfg.encryption;
|
|
1899
|
+
if (!prev?.passphrase || !next?.passphrase) {
|
|
1900
|
+
return {
|
|
1901
|
+
target: cfg.dir || cfg.baseUrl || cfg.url || null,
|
|
1902
|
+
error:
|
|
1903
|
+
"rotation needs both session.mirror.encryptionPrevious and session.mirror.encryption passphrases",
|
|
1904
|
+
};
|
|
1905
|
+
}
|
|
1906
|
+
// Drive the RAW driver (createMirror without encryption) so rotation manages
|
|
1907
|
+
// the ciphertext itself with the two explicit ciphers.
|
|
1908
|
+
const raw = createMirror({ ...cfg, encryption: undefined });
|
|
1909
|
+
const res = await rotateMirrorKey(raw, {
|
|
1910
|
+
from: createMirrorCipher(prev),
|
|
1911
|
+
to: createMirrorCipher(next),
|
|
1912
|
+
});
|
|
1913
|
+
return { target: raw.target, ...res };
|
|
1914
|
+
}
|
|
1915
|
+
|
|
1784
1916
|
// === Iter21 V2 governance overlay ===
|
|
1785
1917
|
export function registerSesgovV2Commands(program) {
|
|
1786
1918
|
const parent = program.commands.find((c) => c.name() === "session");
|
package/src/data/changelog.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"releases": [
|
|
4
4
|
{
|
|
5
5
|
"productVersion": "Unreleased",
|
|
6
|
-
"cliVersion": "0.162.
|
|
6
|
+
"cliVersion": "0.162.167",
|
|
7
7
|
"cliVersions": [
|
|
8
8
|
"0.4.46",
|
|
9
9
|
"0.4.51",
|
|
@@ -24,11 +24,16 @@
|
|
|
24
24
|
"0.162.163",
|
|
25
25
|
"0.162.164",
|
|
26
26
|
"0.162.165",
|
|
27
|
-
"0.162.166"
|
|
27
|
+
"0.162.166",
|
|
28
|
+
"0.162.167"
|
|
28
29
|
],
|
|
29
30
|
"date": null,
|
|
30
31
|
"title": "",
|
|
31
32
|
"sections": [
|
|
33
|
+
{
|
|
34
|
+
"heading": "Added — cc CLI 0.162.167:增量 gap-analysis 收尾——P0 沙箱远程脚本执行检测 + 4 个生命周期事件钩子生产者(CwdChanged / Worktree\\* / InstructionsLoaded)+ doctor 孤儿子进程 + 4 项杂项 gap 接线(CLI-only npm 发版)",
|
|
35
|
+
"body": "> `chainlesschain` 0.162.166 → **0.162.167** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量(+ 测试 + gap-analysis 文档状态更新);未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。**无新增顶层命令,命令数 175 不变**;所有改动 opt-in / 默认路径字节不变。本版把 `docs/CLAUDE_CODE_CLI_INCREMENTAL_GAP_ANALYSIS_2026-07-12.md` 的多个可 Windows 落地「仍欠」项整批接线。\n\n- **P0 沙箱:run_shell 远程脚本执行检测**:新增统一「代码获取」分类器——把 20+ 包管理器安装命令(npm/pip/cargo/gem/go/apt/…)与 `curl … | sh` / `wget -O- | bash` 一类**下载即执行**的远程脚本归为一类,在 shell 审批时抬高风险地板并落审计(记录带 `remoteExec` 标记);`cat script.sh | sh`(本地文件)与 `curl -O file`(仅下载不执行)不误报。默认路径字节不变。\n- **P2 生命周期事件钩子——4 个命令层生产者**:为新的 settings.json 生命周期事件类型接上真实触发点(此前它们只在事件总线注册、无生产者、loader 不认、`cc doctor` 还会当 unknown-event 告警用户配的钩子):`CwdChanged`(REPL `/cd` 改工作目录后)、`WorktreeCreate`/`WorktreeRemove`(`cc agent --worktree` 会话 create/finish 一对,payload 含 branch/base_sha,remove 带 `removed`/`reason` 区分自动删与保留)、`InstructionsLoaded`(会话启动组装完项目指令块后,携本会话权威指令文件清单 `{path,scope,truncated}`,**绝不含文件内容**)。全部 observe-only、无注册 hook 时字节不变;`InstructionsLoaded` 经 `composeSystemPrompt` 可选回调拿**真正注入**的那份文件集(零漂移,非另行 re-discover)。三处会话入口(headless / stream / REPL)与 SessionStart 同点触发。\n- **P2 Doctor:孤儿 agent 子进程检测**:`cc doctor` 现从持久化的后台 agent 记录探活,标出「worker 已死但子进程仍在」或「会话已消失」的泄漏进程为 error 并给对应 `taskkill`/`kill` 修复命令(进程起始时间锚定,防 PID 复用误判;仅喂持久记录不做启发式全机扫描 → 零误报)。\n- **4 项杂项 gap 接线**:①async-hook 持久重唤队列 + 崩溃恢复(失败的 async-hook 重唤按会话落盘,`--resume` 时作「Recovery notice」系统消息恢复);②monorepo 附加根变更时向连接的 MCP 服务器广播 roots/list_changed(`/add-dir` + 启动 `--add-dir`);③`cc doctor` LSP 就绪安装缺口检查(源文件在但对应语言服务器未装 → 代码智能静默降级为文本搜索时告警);④Session Mirror at-rest 加密/删除/保留/密钥轮换(scrypt+AES-256-GCM,`cc session index --mirror-delete` / `--mirror-prune` / `--mirror-rotate`)。"
|
|
36
|
+
},
|
|
32
37
|
{
|
|
33
38
|
"heading": "Added — cc CLI 0.162.166:P1-9「Capability Manifest 与脱敏诊断包」收官——协议文档 CI byte-diff / 离线协议回放 / 治理覆盖率指标(CLI-only npm 发版)",
|
|
34
39
|
"body": "> `chainlesschain` 0.162.165 → **0.162.166** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量(新增 3 个 `src/lib` 纯逻辑模块 + 3 个 `scripts/` 离线工具 + 测试);未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。**只加 npm 脚本 + 离线工具,无新增顶层命令,命令数 175 不变**;默认路径字节不变。本版把 `docs/CLAUDE_CODE_IDE_INCREMENTAL_GAP_ANALYSIS_2026-07-13.md` 的 P1-9 三个剩项全部收口。\n\n- **协议能力文档 CI byte-diff 单源生成**:新增生成器 `scripts/gen-protocol-doc.mjs`(`--out`/`--check`)从唯一源 `capability-manifest.js` `renderProtocolDoc()` 投影出 `docs/cli/PROTOCOL_CAPABILITY_MANIFEST.generated.md`(协议版本 + 可协商 wire 特性表 + 权限模式);npm 脚本 `docs:protocol` / `docs:protocol:check`;`capability-manifest.test.js` 新增 byte-diff 断言(读签入副本 = `renderProtocolDoc()`),manifest 加 wire 字段但未重生成即测试红——drift 不可能 merge 绿。\n- **离线协议回放 + 兼容审计**:新增 `protocol-replay.js`——拿一段录制的 stream-json 会话 + 协商上下文(server×client offer),**无需活体对端**离线①回放到该协商下的线上形态(未通过协商的字段按 field-gate 剥离)②审计录制是否遵守协商(任何帧携带已 gate-OFF 的可协商 wire 字段 = 前向兼容违规,fail-closed)。可 gate 字段集从唯一源 `toFieldGate()` 投影不会漂移;`sessionDigest` 键序无关可 pin golden 录制。离线工具 `scripts/replay-protocol.mjs`(`--replay`/`--audit`,违规 exit 1)+ golden fixture。\n- **治理覆盖率指标(§11.3 验收)**:新增 `governance-coverage.js`——①高风险 Tool Call Ledger/Trace 覆盖率(每个不可逆副作用调用须既有 side-effect-ledger 记录又有 trace span,「高风险」复用唯一源 `classifyToolSideEffect`)②Plugin/MCP/Skill/Hook 溯源可追溯率(外部来源调用须带 source+version+scope+权限决策);`ok` 仅双 100% 才真(fail-closed),给逐条未覆盖项。离线工具 `scripts/coverage-report.mjs`(读 run-summary JSON,任一 gap exit 1,可对录制 run 工件 CI 强制 100%)。"
|
|
@@ -118,6 +118,15 @@ export function verifyAllSessions(options = {}) {
|
|
|
118
118
|
.map((file) => verifySession(basename(file, ".jsonl")));
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
/** All locally-stored session ids (the source of truth a mirror derives from). */
|
|
122
|
+
export function listSessionIds() {
|
|
123
|
+
const dir = getSessionsDir();
|
|
124
|
+
if (!existsSync(dir)) return [];
|
|
125
|
+
return readdirSync(dir)
|
|
126
|
+
.filter((file) => file.endsWith(".jsonl"))
|
|
127
|
+
.map((file) => basename(file, ".jsonl"));
|
|
128
|
+
}
|
|
129
|
+
|
|
121
130
|
export { TRANSCRIPT_CHAIN_STATUS };
|
|
122
131
|
|
|
123
132
|
export function startSession(sessionId, meta = {}) {
|