chainlesschain 0.162.111 → 0.162.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-Dx2g8DpX.js → AIOps-C31IEALR.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-B8Lo5phW.js → ActionButton-CAoIkNY6.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BU0vuI3z.js → Analytics-BofSQQzg.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-qXfIaD4s.js → AppLayout-C2dIYNTH.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-P72yyUJV.js → Audit-BXaDbU7P.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-UzVc5fsz.js → Backup-BTfBqsmK.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-Bjp6HmHC.js → BaseInput-B_ak0VMO.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-BXIaBLL2.js → Chat-BhcN6up6.js} +4 -4
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Tos6mvVK.js → ChatBubbleRenderer-D0dZVHhx.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-CBCKEULn.js → Checkbox-CjT0jj8Z.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-CKGgNFCv.js → Codegen-CzLTeJlc.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-BeKCXMuc.js → Col-CiOd4VCk.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-DdEqA8hQ.js → Community-MDcN43_I.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-vozeJTi_.js → Compact-BlP5PKNl.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-CNJT80_l.js → Compliance-DQYF00Cq.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-sxPYkNyf.js → Cowork-BOSrQFS0.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-DlszkLq4.js → Cron-C0Htgg3F.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-C444Z6V9.js → Crosschain-BuLRkpY3.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-Davn7zId.js → DID-N3E4UBEh.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-0Ot1Ln5d.js → Dashboard-BB8JTDyU.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-TZs_Zca_.js → Dropdown-Dua4QX4R.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DgTnHNdf.js → EmailListRenderer-Cj26sbeq.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B9no2fGW.js → FamilyGuardDashboard-TwiOlWAm.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-BHSHha9G.js → Federation-CeGFlymx.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-Q0FBeG3d.js → FormItemContext-lrtJ7VdL.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-C6zutFMf.js → GenericCardRenderer-CSPy6cv0.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-BEnJDdpd.js → Git-C9V804Um.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-BR4-6CZb.js → Governance-BCRg6szw.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-MhzqAfW3.js → Inference-0DjHobMq.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-BBV6cAOb.js → KnowledgeGraph-CKzlkXzc.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-CdT6H1Go.js → Logs-BgzswcOA.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-C70PbAnT.js → Marketplace-DXBTxAMo.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-DJ7s6ZsI.js → McpTools-CvzNbZys.js} +4 -4
  35. package/src/assets/web-panel/assets/{Memory-PZOsSn-W.js → Memory-BbBmqtPo.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-B92HKTS-.js → MobileBridge-BpL2BNXG.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileProjects-CdyFsRSF.js → MobileProjects-R_zFuemA.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-BPvqaEd3.js → Mtc-DQu3Arm_.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-O_Hbuei5.js → MtcAudit-DbswMnGL.js} +4 -4
  40. package/src/assets/web-panel/assets/{Multisig-BUzJ8CU3.js → Multisig-BJWojM4Z.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BPVPJs9L.js → NLProgramming-Cb60ScpP.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-Clllz42a.js → Notes-CzoE6dCZ.js} +4 -4
  43. package/src/assets/web-panel/assets/{NotificationSettings-CzYj1Stb.js → NotificationSettings-BZXqrg-J.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-CruZ1EVE.js → OrderTableRenderer-BxAKnbfD.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-B6orc6fs.js → Organization-BoTaL8pl.js} +3 -3
  46. package/src/assets/web-panel/assets/{Overflow-B9YUj9fc.js → Overflow-CAzqg4k3.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-D5s0_yCK.js → P2P-CgzJoBIr.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-CLD9lBih.js → PdhVaultBrowser-Cfaa63CB.js} +5 -5
  49. package/src/assets/web-panel/assets/{Permissions-Bg0d2P49.js → Permissions-DxUeh680.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DUdprkx0.js → PersonalDataHub-S-H5XNNn.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-P5nxxgmn.js → Pipeline-BjrADxSK.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CGBXQVYn.js → Privacy-DYsdMxlQ.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-nyhwIdsc.js → ProjectInit-CUzdaYx1.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-CxAir6zJ.js → ProjectSettings-DFnmFlpD.js} +2 -2
  55. package/src/assets/web-panel/assets/Projects-GOQqdP4u.js +1 -0
  56. package/src/assets/web-panel/assets/{Providers-D79W7rI4.js → Providers-Cpm9BlNl.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-CKcZDQmH.js → QuickAsk-DjBFjSUh.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-DY7WGUfS.js → Recommend-EVTMMe1P.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-BHSHoWyL.js → Reputation-Botbv7S3.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-DHIKnFWR.js → Row-C3Nz28W3.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-CCTno3xq.js → RssFeed-CjiBjWeF.js} +2 -2
  62. package/src/assets/web-panel/assets/{Search-BuIHlvNF.js → Search-DlsyX5fR.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-BCfzcijJ.js → Security-CZhHoMdL.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-DN5AqFLj.js → Services-D_Bnic0O.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-Bf-bQNVZ.js → Skeleton-CiZvE330.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-BhsZnWn7.js → Skills-CKVqtO-U.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-DiGAjtH5.js → Sla-BInnM5w6.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-DrKpQyqM.js → SpeechSettings-QnJOhSa-.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-BB7L3WIK.js → SyncSettings-CVpEDGPv.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-j0Orler1.js → Tasks-DjpSdKoQ.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-BmCw5FcI.js → Templates-DAs7hSZn.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-CosLW_bB.js → Tenant-fbZFofRo.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-7PpJ-714.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-DRxjvSRn.js → TimelineRenderer-KQuaMPPO.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-BbzOX-w9.js → Tokens-co0lrUd8.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-2hgI6vxF.js → Trigger-DGu6KG0U.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-BtN76dZ_.js → Trust-DxcBRMa0.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-P1MMpJ6M.js → UkeySign-BmIm0kl6.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-mVto-BAL.js → VideoEditing-D2_w5mGi.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-DXPq6ZB6.js → Wallet-BHAaiE8X.js} +3 -3
  81. package/src/assets/web-panel/assets/{WebAuthn-B3l84wPo.js → WebAuthn-CRtrKFSh.js} +4 -4
  82. package/src/assets/web-panel/assets/{WorkflowEditor-tx9XyCXN.js → WorkflowEditor-DjrhTXw-.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-C2edClle.js → chat-DDCMxp1K.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-zv8-ytfB.js → colors--4_xSbq4.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-DBZtkGzs.js → compact-item-DUz7Nnrf.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-CKI5OFIw.js → createContext-C6hgEA6P.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-qzaZtWgD.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-Coy3oSp1.js → hasIn-DLsr5ccI.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-YVaiFo0k.js → index-5S59MN5w.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-CntdCK8F.js → index-B0qel7OZ.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Dg6tHb34.js → index-B98uRfVY.js} +1 -1
  92. package/src/assets/web-panel/assets/index-BFKz8uJQ.js +1 -0
  93. package/src/assets/web-panel/assets/{index-BcWEO3hN.js → index-BKs7IQEb.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-WIaX8Xil.js → index-BPVk2Aef.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-yb-33k6-.js → index-B_HoZFWD.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Bhg2yols.js → index-Ba-1vjJD.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-iDQpG3F_.js → index-Bf2UWwla.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CsOlyPhR.js → index-BgVCtv2i.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B4VqSetp.js → index-BrAktVfD.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Cxc27KZH.js → index-BvBVv_y6.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Ce4nDGfM.js → index-C0MclIlp.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-D7_-t3kR.js → index-C0edasoI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CNq3K_ot.js → index-CCBU-dhE.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BtKKoSv6.js → index-CORbX-su.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CcbwpMn8.js → index-CS0DcLLe.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DbVqizl6.js → index-CZRi_BiL.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C-zLZsBH.js → index-Cdx5wAKy.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CskKid3w.js → index-CfWjCIeD.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DDi6Al0l.js → index-CrC3Z0wT.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DqK2W-FP.js → index-DO4JBw2m.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DMbpi_L6.js → index-DQfBPPHG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BFdKuftV.js → index-DTB3o-AG.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-ChwUxlyQ.js → index-DVTlvsAd.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BdaOq1JN.js → index-DWQ4A_ig.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C6JuZUZF.js → index-DmMDr432.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BlJcDi7S.js → index-DtjUgB7B.js} +3 -3
  117. package/src/assets/web-panel/assets/{index-DTmxd6OS.js → index-Dts1rdrh.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-UYz58LRo.js → index-DuMSr7qB.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-iWVmVaJY.js → index-Dzr4dwNg.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DTpHYzZ9.js → index-UcbyVEUR.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-VXMiiI1U.js → index-VW4mGJ0g.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C_s_9SXg.js → index-ZzZ7sUbw.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-XUdoPMSi.js → index-kB6cCYAK.js} +1 -1
  124. package/src/assets/web-panel/assets/index-lhIs6Z78.js +1 -0
  125. package/src/assets/web-panel/assets/{index-B7KfsA2c.js → index-nhe7lwfU.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-cHUvyVAv.js → index-x59Oik1J.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-5NgeEoKe.js → index-zwI19UuK.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-cmuOliyS.js → initDefaultProps-CPyHDtDC.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-L8NYhKjt.js → motion-Blq36u4Y.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-DhOWjgTO.js → move-HuAtMUkO.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-B7mBGzmE.js → omit-CVMoOx32.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-BqBmGbuI.js → pickAttrs-BunNS-fj.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-Bn2nt-i-.js → placementArrow-Eg_eS8OF.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-Be4beK0V.js → responsiveObserve-BiU0qt8R.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-fXtV4NQl.js → slide-BZfRWEJu.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-C_uISQQt.js → statusUtils-j5payJ2P.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-CU8rSpth.js → styleChecker--CNWRiiz.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-4Eew0ra6.js → useFlexGapSupport-BtY8OW_f.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-BV8X0vMd.js → useFs-CL-bgDIB.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-CfLWlSz8.js → usePersonalDataHub-BEjDzvTR.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-BFEcByvT.js → vnode-B3IodNFs.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-B2L4y4I0.js → zoom-DvLt_owF.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/mcp.js +15 -2
  145. package/src/commands/note.js +53 -25
  146. package/src/lib/llm-pricing.js +6 -2
  147. package/src/lib/loop.js +3 -1
  148. package/src/lib/permission-rules.cjs +33 -0
  149. package/src/assets/web-panel/assets/Projects-DjSUR09w.js +0 -1
  150. package/src/assets/web-panel/assets/Terminal-BaXtGGWV.js +0 -3
  151. package/src/assets/web-panel/assets/devWarning--C3K0QR-.js +0 -1
  152. package/src/assets/web-panel/assets/index-C3coGtcp.js +0 -1
  153. package/src/assets/web-panel/assets/index-Dz7ZZdm4.js +0 -1
@@ -1 +1 @@
1
- import{u as f}from"./index-BlJcDi7S.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
+ import{u as f}from"./index-DtjUgB7B.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{M as i,h as a,w as l}from"./index-BlJcDi7S.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.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 N(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,N as t};
1
+ import{M as i,h as a,w as l}from"./index-DtjUgB7B.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.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 N(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,N as t};
@@ -1,4 +1,4 @@
1
- import{K as o}from"./index-BlJcDi7S.js";import{i as f}from"./motion-L8NYhKjt.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),{[`
1
+ import{K as o}from"./index-DtjUgB7B.js";import{i as f}from"./motion-Blq36u4Y.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-BlJcDi7S.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-DtjUgB7B.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-BvqAck49.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/icons-DP3uiYxy.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
@@ -33,6 +33,15 @@ import {
33
33
  getServer as registryGetServer,
34
34
  } from "../lib/mcp-registry.js";
35
35
 
36
+ /**
37
+ * Whether `mcp login` should NOT open a browser. True when either the canonical
38
+ * `--no-open` flag or the Claude-Code-parity `--no-browser` alias is passed.
39
+ * Commander maps each negatable flag to a boolean that is `false` when present.
40
+ */
41
+ export function loginWantsNoBrowser(options = {}) {
42
+ return options.open === false || options.browser === false;
43
+ }
44
+
36
45
  // Singleton MCP client for session reuse
37
46
  let mcpClient = null;
38
47
 
@@ -151,12 +160,16 @@ export function registerMcpCommand(program) {
151
160
  53682,
152
161
  )
153
162
  .option("--no-open", "Print the authorize URL instead of opening a browser")
163
+ .option(
164
+ "--no-browser",
165
+ "Alias for --no-open (do not open a browser; print the URL — handy over SSH)",
166
+ )
154
167
  .action(async (target, options) => {
155
168
  try {
156
169
  const url = await resolveAuthTargetUrl(program, target);
157
170
  const oauth = await import("../lib/mcp-oauth.js");
158
- if (options.open === false) {
159
- oauth._deps.openBrowser = () => false; // commander maps --no-open open:false
171
+ if (loginWantsNoBrowser(options)) {
172
+ oauth._deps.openBrowser = () => false; // --no-open / --no-browser
160
173
  }
161
174
  logger.log(chalk.gray(`Authorizing ${url} …`));
162
175
  const rec = await oauth.authorizeInteractive(url, {
@@ -64,6 +64,48 @@ function ensureNotesTable(db) {
64
64
  `);
65
65
  }
66
66
 
67
+ /**
68
+ * Select notes for `note list`. Tags are stored as a JSON array, so tag
69
+ * filtering happens in-memory — the row limit must therefore be applied AFTER
70
+ * that filter rather than via SQL `LIMIT`, otherwise `--tag X --limit N`
71
+ * returns "matches among the N most-recent notes" (often far fewer than N, or
72
+ * zero) instead of "up to N notes tagged X". Category is a real column, so it
73
+ * is SQL-filtered and composes with LIMIT directly.
74
+ *
75
+ * Exported for unit testing. `rawDb` only needs a better-sqlite3-style
76
+ * `prepare(sql).all(...params)`. `limit` is the already-resolved numeric cap.
77
+ */
78
+ export function selectNotesForList(rawDb, { category, tag, limit } = {}) {
79
+ let sql =
80
+ "SELECT id, title, tags, category, created_at FROM notes WHERE deleted_at IS NULL";
81
+ const params = [];
82
+ if (category) {
83
+ sql += " AND category = ?";
84
+ params.push(category);
85
+ }
86
+ sql += " ORDER BY created_at DESC";
87
+ // Only push LIMIT into SQL when no in-memory tag filter follows.
88
+ if (!tag) {
89
+ sql += " LIMIT ?";
90
+ params.push(limit);
91
+ }
92
+
93
+ let notes = rawDb.prepare(sql).all(...params);
94
+
95
+ if (tag) {
96
+ notes = notes
97
+ .filter((n) => {
98
+ try {
99
+ return JSON.parse(n.tags || "[]").includes(tag);
100
+ } catch {
101
+ return false;
102
+ }
103
+ })
104
+ .slice(0, limit);
105
+ }
106
+ return notes;
107
+ }
108
+
67
109
  export function registerNoteCommand(program) {
68
110
  const note = program
69
111
  .command("note")
@@ -142,31 +184,17 @@ export function registerNoteCommand(program) {
142
184
  const rawDb = ctx.db.getDatabase();
143
185
  ensureNotesTable(rawDb);
144
186
 
145
- let sql =
146
- "SELECT id, title, tags, category, created_at FROM notes WHERE deleted_at IS NULL";
147
- const params = [];
148
-
149
- if (options.category) {
150
- sql += " AND category = ?";
151
- params.push(options.category);
152
- }
153
-
154
- sql += " ORDER BY created_at DESC LIMIT ?";
155
- params.push(numericOption(options.limit, { name: "--limit", integer: true, min: 1, fallback: 20 }));
156
-
157
- let notes = rawDb.prepare(sql).all(...params);
158
-
159
- // Filter by tag in-memory (tags stored as JSON array)
160
- if (options.tag) {
161
- notes = notes.filter((n) => {
162
- try {
163
- const tags = JSON.parse(n.tags || "[]");
164
- return tags.includes(options.tag);
165
- } catch {
166
- return false;
167
- }
168
- });
169
- }
187
+ const limit = numericOption(options.limit, {
188
+ name: "--limit",
189
+ integer: true,
190
+ min: 1,
191
+ fallback: 20,
192
+ });
193
+ const notes = selectNotesForList(rawDb, {
194
+ category: options.category,
195
+ tag: options.tag,
196
+ limit,
197
+ });
170
198
 
171
199
  if (options.json) {
172
200
  console.log(JSON.stringify(notes, null, 2));
@@ -113,6 +113,10 @@ export function mergePricing(overrides, base = PRICE_TABLE) {
113
113
 
114
114
  for (const [provider, rawEntries] of Object.entries(overrides)) {
115
115
  if (!Array.isArray(rawEntries)) continue;
116
+ // lookupRate() always lowercases the provider, and built-in keys are
117
+ // lowercase, so an override under a mixed-case key (e.g. "Anthropic")
118
+ // would land on an unreachable key and be silently ignored. Normalize.
119
+ const providerKey = String(provider).toLowerCase();
116
120
  const valid = rawEntries
117
121
  .filter(
118
122
  (e) =>
@@ -129,10 +133,10 @@ export function mergePricing(overrides, base = PRICE_TABLE) {
129
133
  }));
130
134
  if (valid.length === 0) continue;
131
135
  const overridden = new Set(valid.map((v) => v.match));
132
- const kept = (merged[provider] || []).filter(
136
+ const kept = (merged[providerKey] || []).filter(
133
137
  (e) => !overridden.has(e.match.toLowerCase()),
134
138
  );
135
- merged[provider] = [...valid, ...kept];
139
+ merged[providerKey] = [...valid, ...kept];
136
140
  }
137
141
  return merged;
138
142
  }
package/src/lib/loop.js CHANGED
@@ -21,7 +21,9 @@ const DURATION_UNITS = { ms: 1, s: 1000, m: 60000, h: 3600000 };
21
21
  */
22
22
  export function parseDuration(input) {
23
23
  if (typeof input === "number" && Number.isFinite(input)) {
24
- return Math.max(0, Math.round(input));
24
+ // Consistent with the bare-string path below: a bare number is SECONDS,
25
+ // so parseDuration(30) === parseDuration("30") === parseDuration("30s").
26
+ return Math.max(0, Math.round(input * DURATION_UNITS.s));
25
27
  }
26
28
  const s = String(input ?? "")
27
29
  .trim()
@@ -18,6 +18,11 @@
18
18
  * input parameter, incl. arbitrary MCP tool args;
19
19
  * `*` crosses `/` here, unlike path globs)
20
20
  * mcp__db__query(table:users) → that MCP tool whose `table` arg is "users"
21
+ * Agent(Explore) → spawn_sub_agent whose type (profile/agent/role) is
22
+ * "Explore" (CC 2.1.186 `Agent(type)`; case-insensitive
23
+ * identifiers, globs ok)
24
+ * Agent(Explore,Plan) → spawn_sub_agent whose type is Explore OR Plan
25
+ * (CC 2.1.186 `Agent(x,y)` allowed/denied-types list)
21
26
  * Bash → every run_shell call
22
27
  * * → every tool call (Claude-Code deny-all idiom)
23
28
  * Bash(*) → every run_shell call (lone-`*` pattern = match-all)
@@ -54,6 +59,7 @@ const TOOL_GROUPS = Object.freeze({
54
59
  webfetch: ["web_fetch"],
55
60
  websearch: ["web_search"],
56
61
  task: ["spawn_sub_agent"],
62
+ agent: ["spawn_sub_agent"],
57
63
  skill: ["run_skill", "list_skills"],
58
64
  runcode: ["run_code"],
59
65
  git: ["git"],
@@ -73,6 +79,8 @@ const PATH_TOOLS = new Set([
73
79
  ]);
74
80
  /** Tools whose match target is a URL. */
75
81
  const URL_TOOLS = new Set(["web_fetch"]);
82
+ /** Tools whose positional pattern is a sub-agent TYPE list (CC `Agent(type)`). */
83
+ const SUBAGENT_TOOLS = new Set(["spawn_sub_agent"]);
76
84
 
77
85
  /**
78
86
  * Does a rule's tool token apply to the concrete tool being evaluated?
@@ -254,6 +262,30 @@ function matchPattern(pattern, actualTool, args, cwd) {
254
262
  if (pv && Object.prototype.hasOwnProperty.call(args || {}, pv[1])) {
255
263
  return matchParamValue(pv[2].trim(), (args || {})[pv[1]]);
256
264
  }
265
+ // Claude-Code 2.1.186: `Agent(type)` / `Agent(typeA,typeB)` — restrict the
266
+ // spawn_sub_agent tool by sub-agent TYPE. A call's type identity is its
267
+ // `profile`, named `agent`, or `role` (whichever are present). The pattern is
268
+ // a comma-separated list; it matches when ANY listed type matches ANY of the
269
+ // call's identities (case-insensitive identifiers; `*`/`?` globs allowed).
270
+ // The `Tool(param:value)` branch above still handles `Task(profile:explorer)`;
271
+ // this adds the bare positional spelling Claude-Code settings.json uses.
272
+ if (SUBAGENT_TOOLS.has(actualTool)) {
273
+ const a = args || {};
274
+ const ids = [a.profile, a.agent, a.role].filter(
275
+ (x) => x != null && String(x) !== "",
276
+ );
277
+ if (!ids.length) return false;
278
+ const wanted = pattern
279
+ .split(",")
280
+ .map((s) => s.trim())
281
+ .filter(Boolean);
282
+ if (!wanted.length) return false;
283
+ return wanted.some((w) =>
284
+ ids.some((id) =>
285
+ matchParamValue(w.toLowerCase(), String(id).toLowerCase()),
286
+ ),
287
+ );
288
+ }
257
289
  const target = extractTarget(actualTool, args, cwd);
258
290
  if (target.kind === "command") {
259
291
  return target.value ? matchCommand(pattern, target.value) : false;
@@ -367,6 +399,7 @@ module.exports = {
367
399
  COMMAND_TOOLS,
368
400
  PATH_TOOLS,
369
401
  URL_TOOLS,
402
+ SUBAGENT_TOOLS,
370
403
  toolMatches,
371
404
  parseRule,
372
405
  globToRegExp,
@@ -1 +0,0 @@
1
- import{I as i,J as I,U,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-BvqAck49.js";import{_ as we,b as re,u as ie,d}from"./index-BlJcDi7S.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aM as ke,aN as Fe,aO as be,f as je,a4 as Ce,a7 as xe,as as Oe,R as Se}from"./icons-DP3uiYxy.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:J}=de();async function w(o,f,ye,ae=8e3){if(J){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],M=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),W=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function H(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function K(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function Q(o){return{onClick:()=>V(o)}}async function V(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function G(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),A.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:J,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:M,filteredProjects:W,statusColor:g,syncColor:H,formatTime:K,loadAll:C,onRowClick:Q,openDetail:V,onDelete:G,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,J,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),M=i("a-popconfirm"),W=i("a-table"),g=i("a-descriptions-item"),H=i("a-descriptions"),K=i("a-divider"),C=i("a-empty"),Q=i("a-list-item"),V=i("a-list"),G=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),U("div",Ue,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(W,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),I(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(M,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(H,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),I("code",Re,s(e.detail.root_path),1)):(p(),I("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(K,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(G,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(V,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Q,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(M,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[U("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(A,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(A,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(A,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(A,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const Je=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-wz1aJH/repo/packages/web-panel/src/views/Projects.vue"]]);export{Je 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-BlJcDi7S.js";import{I as z,J as x,U as _,Q as D,S as K,K as T,V as R,c as A,F as Q,Z as Y,R as E,o as Z,f as G,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,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 H of v)m.write(H.data),t.lastSeq=H.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const j=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});j.observe(b);const ue=t.offs;t.offs=()=>{try{j.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function J(){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 J()}),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 X={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:J,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 ye},get useTerminal(){return oe}};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},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 y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),K(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[D(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=D(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),K(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Q,null,Y(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Q,null,Y(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",De,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-wz1aJH/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-BlJcDi7S.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-DHIKnFWR.js";import{U as t}from"./index-BlJcDi7S.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-Be4beK0V.js";import"./useFlexGapSupport-4Eew0ra6.js";import"./styleChecker-CU8rSpth.js";import"./index-Dg6tHb34.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-BeKCXMuc.js";import{U as t}from"./index-BlJcDi7S.js";import"./vendor-BvqAck49.js";import"./index-Dg6tHb34.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};