chainlesschain 0.162.37 → 0.162.39

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 (162) hide show
  1. package/package.json +3 -2
  2. package/src/assets/web-panel/assets/{AIOps-_oxz4VHy.js → AIOps-DCjoAX_u.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-uaeqFuDj.js → ActionButton-XHoOmsbP.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BPVV0OUf.js → Analytics--xaFkDnL.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-ppCYKm3I.js → AppLayout-CSa3FBn8.js} +4 -4
  6. package/src/assets/web-panel/assets/{Audit-DFAY6umk.js → Audit-ONWXiAwG.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-pAPBFDyP.js → Backup-CKOPNdgy.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-BbBl0uT2.js → BaseInput-PNj4uVqg.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-Ct22JUnT.js → Chat-CZCulyXV.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DPlsLl22.js → ChatBubbleRenderer-CjuJpfpV.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-DEkCollc.js → Checkbox-jvy668lD.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-Tor-de39.js → Codegen-DhUebOQD.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-ojNrLQU7.js → Col-BiBvHfdT.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-CLOGhqMF.js → Community-CmEdEti-.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-CYKNlSZ4.js → Compact-CtxpF4R5.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-C5E6ABuA.js → Compliance-CvPTrTAJ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-CHeEsZ3W.js → Cowork-BMafGHjy.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-B4e1n2e7.js → Cron-mdg_4TR1.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-DbNV8P9R.js → Crosschain--dGxsUvn.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-C5_Tk3nC.js → DID-C9oKaCml.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-BhdV_c4N.js → Dashboard-CoGxKMvy.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-CEi5AMtM.js → Dropdown-CDDu3ZZ3.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DOhPiYng.js → EmailListRenderer-Dy7_r9Ag.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-fu4NRP3X.js → FamilyGuardDashboard-CNg6vImJ.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-B7BtIWKL.js → Federation-CT61bf3u.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-BmPWZVLP.js → FormItemContext-CSLRnXhg.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-hsOPNJq8.js → GenericCardRenderer-CZ4NE5N3.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-Bi_EFBUH.js → Git-DBuOma3L.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-emf2ubDK.js → Governance-BTU_SEef.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-B7KjKzkI.js → Inference-47SAmLC_.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-uAaBK0F3.js → KnowledgeGraph-DCrK5vP4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-utK7hNpj.js → Logs-BqiDxdav.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CzQe6n3z.js → Marketplace-CReUjsDt.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-CuAaJr51.js → McpTools-agZBV3p8.js} +6 -6
  35. package/src/assets/web-panel/assets/{Memory-CRuZZJ75.js → Memory-C_YvUtyS.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-Cp06wunh.js → MobileBridge-41fP1Tui.js} +3 -3
  37. package/src/assets/web-panel/assets/{MobileProjects-DJEdUwhr.js → MobileProjects-BkqLvGfL.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-8YY4dR7g.js → Mtc-JFJCXUnk.js} +5 -5
  39. package/src/assets/web-panel/assets/{MtcAudit-BmPJYHar.js → MtcAudit-BHNpPZC9.js} +6 -6
  40. package/src/assets/web-panel/assets/{Multisig-d-ydyVdq.js → Multisig-DuCRumiz.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-DA_ikw_n.js → NLProgramming-DK-g0fKY.js} +1 -1
  42. package/src/assets/web-panel/assets/Notes-BSMcjsPf.js +7 -0
  43. package/src/assets/web-panel/assets/{NotificationSettings-CzPZXEtK.js → NotificationSettings-9ouC118H.js} +1 -1
  44. package/src/assets/web-panel/assets/OrderTableRenderer-LG2nUO5y.js +1 -0
  45. package/src/assets/web-panel/assets/{Organization-DdDZ_Ap6.js → Organization-DSV7oRnR.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-BnMBkttv.js → Overflow-DVkkORc3.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-Es1050f-.js → P2P-BXXjkkQD.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-CKkRmyn9.js → PdhVaultBrowser-O5hNnLTP.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-zU9n9cAD.js → Permissions-D_s0H5Av.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-BZi5Xwas.js → PersonalDataHub-CzMDrwUi.js} +3 -3
  51. package/src/assets/web-panel/assets/{Pipeline-CRfeGiFc.js → Pipeline-i9krLVTL.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CQA_IgLA.js → Privacy-cMQcj9I8.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-C9hmEvoT.js → ProjectInit-Ca_l7avo.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-yXA72ws4.js → ProjectSettings-BkaIhd6b.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-BpWS-qam.js → Projects-Dy9yNmDg.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-Cxe55dRD.js → Providers-D0nzYiqz.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-Do0aUTQr.js → QuickAsk-Bzzr9d0f.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend--ysZHjyA.js → Recommend-C-UFbQnX.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-BOBU8JrH.js → Reputation-BKMIKO5F.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-C6X7bRKE.js → Row-Bs7htK1T.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-D8AwqlkQ.js → RssFeed-v6MdULUh.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-Bi3rCZD4.js → Search-DlRWYzvz.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-DxUDVrtY.js → Security-DXWO37xX.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-BXXN7yC1.js → Services-C2tWA-O0.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-B3BR34tZ.js → Skeleton-Q8pIYY4a.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-BjYu8OQ1.js → Skills-D7XBlErj.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-DDkCtD8w.js → Sla-CiyMVPJ1.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-CGhYzP7V.js → SpeechSettings-CadCeeiR.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-CYNKVAHA.js → SyncSettings-DzNAUhQq.js} +2 -2
  70. package/src/assets/web-panel/assets/Tasks-BjdHjZeb.js +1 -0
  71. package/src/assets/web-panel/assets/{Templates-CQuYFf2C.js → Templates-DfgEpUa4.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-DdzZh8vE.js → Tenant-C8ajkuYi.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-B9rHwQQx.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-DKOARnc_.js → TimelineRenderer-D1ZVNezX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-D7QRNG8y.js → Tokens-CAkED4mx.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-BCsqLZl4.js → Trigger-CJSrm6X0.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-BarGUa6p.js → Trust-B-TeorSk.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-pHrg5a8E.js → UkeySign-Di7Ymofy.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-Dug3m1py.js → VideoEditing-DM1eYNZe.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-BfK3Z_Ez.js → Wallet-DvRWkbmR.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-CYRdl9td.js → WebAuthn-CeZ3Y622.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-DTW5AcqM.js → WorkflowEditor-Cq8c4h5j.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-CCXz4j38.js → chat-7-WfML6Q.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-BJBOhAqa.js → colors-D6FgCmB-.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-E9M6BQcM.js → compact-item-ClYV25qi.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-Cg9CAws4.js → createContext-CDhtjdkV.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-O0FVFeZg.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-DhVtqv5L.js → hasIn-DZSH5LQd.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-_PNqQ5mE.js → index---azBCXl.js} +1 -1
  90. package/src/assets/web-panel/assets/index--ANIKvhL.js +1 -0
  91. package/src/assets/web-panel/assets/{index-kz1oXl1a.js → index-B13QnrnE.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-C-2dUIli.js → index-B4PMzmOx.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-Ca8BYV1g.js → index-B6VWGnwq.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BFZPRd0T.js → index-B78X5S22.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Dwvewrul.js → index-BHeK8I5A.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-MdXEhfdJ.js → index-BJ7mrOaB.js} +1 -1
  97. package/src/assets/web-panel/assets/{index--7o5YdL6.js → index-BUOPjAUM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CFp-wdrQ.js → index-B_mMFQ4S.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DdhnGez0.js → index-Bj8hZiyL.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CUp_c8Le.js → index-BlBF_l8m.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-6-04M2Nx.js → index-BpzOUiSb.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-ByazO4Q9.js → index-BqOIoEo6.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ComyTKz-.js → index-C7pQa2is.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Cm1m7BJh.js → index-C7sC56w8.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B4NBF4Sa.js → index-CDX4QU3k.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DSQazU6J.js → index-CKgS8E_X.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BAB0nGP7.js → index-CSjoWPxB.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B8bjEHrQ.js → index-CWOkL-8O.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CznfPnOx.js → index-CmU631Je.js} +3 -3
  110. package/src/assets/web-panel/assets/{index-D7DXdf7x.js → index-CrTmxbL8.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-wkt-o5q5.js → index-CxwfFZ1u.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BxSzyly9.js → index-D0YzTJJO.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-4N5lNXGP.js → index-DGJK8D0l.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DaFe1aqY.js → index-DGj1orXm.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Di5LBXcE.js → index-DL6GFJAd.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B_SMPD4L.js → index-DLizxxId.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CSiyjCYi.js → index-DPEYvNvq.js} +1 -1
  118. package/src/assets/web-panel/assets/index-DUfp4rnQ.js +1 -0
  119. package/src/assets/web-panel/assets/{index-D5yC2Ps8.js → index-DWRoh3_3.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DDcJO27F.js → index-DZ4zuoCP.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CJ8nNT8h.js → index-DgaF1F0W.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ChsSljaN.js → index-Di9pFrHV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CFarAlXj.js → index-DjG82V0v.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B111fZ21.js → index-Or_McYjX.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CVR_s-pT.js → index-rCs9VJJp.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CkTeBHI9.js → index-tU6pZ1TP.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CeRlLp3F.js → index-z-R0KaJS.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-iyBaePF-.js → initDefaultProps-CSdsIGy3.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-RWtj4rgu.js → motion-Do-AcZV4.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-CqPRVzpH.js → move-BmgOoMsi.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DsvJze25.js → omit-D4Tm7-s9.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-B4tfZBhc.js → pickAttrs-CuWA8-lj.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-KvHUwXMA.js → placementArrow-BSbEF5op.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-DGdJ-b7W.js → responsiveObserve-GIMJwB_9.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-Cd6ebRmw.js → slide-DlZxpIBe.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-Bg9GcIAn.js → statusUtils-BZ26LPlh.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-MQjKsG84.js → styleChecker-Yn_3FZ0l.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-C241WujP.js → useFlexGapSupport-O_LOE1AB.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-CMpy7RS4.js → useFs-VFMyQqtl.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-BLHtapKb.js → usePersonalDataHub-B_hyrGB-.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-DmcTV67c.js → vnode-D4LttGy7.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-DHL8_0Y8.js → zoom-KnTK1fjj.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +31 -0
  145. package/src/commands/mcp.js +236 -6
  146. package/src/harness/mcp-client.js +70 -1
  147. package/src/lib/ide-context.js +271 -0
  148. package/src/lib/repl-completer.js +139 -0
  149. package/src/lib/settings-hooks.cjs +1 -0
  150. package/src/repl/agent-repl.js +88 -20
  151. package/src/repl/mcp-prompt.js +122 -0
  152. package/src/runtime/agent-core.js +156 -17
  153. package/src/runtime/headless-runner.js +53 -9
  154. package/src/runtime/headless-stream.js +19 -9
  155. package/src/runtime/mcp-config.js +118 -9
  156. package/src/assets/web-panel/assets/Notes-DIyF-fRe.js +0 -7
  157. package/src/assets/web-panel/assets/OrderTableRenderer-BiLtg-LY.js +0 -1
  158. package/src/assets/web-panel/assets/Tasks-DavmlJpd.js +0 -1
  159. package/src/assets/web-panel/assets/Terminal-D75WeG9d.js +0 -3
  160. package/src/assets/web-panel/assets/devWarning-BrsbTJUv.js +0 -1
  161. package/src/assets/web-panel/assets/index-DSTQDO-Y.js +0 -1
  162. package/src/assets/web-panel/assets/index-c2U6LV3Q.js +0 -1
@@ -1 +1 @@
1
- import{u as f}from"./index-CznfPnOx.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-CmU631Je.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-CznfPnOx.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-CmU631Je.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-CznfPnOx.js";import{i as f}from"./motion-RWtj4rgu.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-CmU631Je.js";import{i as f}from"./motion-Do-AcZV4.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-CznfPnOx.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-CmU631Je.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">
@@ -124,6 +124,10 @@ export function registerAgentCommand(program) {
124
124
  "--resume [id]",
125
125
  "Resume a session by id (no id → most recent — claude --resume parity)",
126
126
  )
127
+ .option(
128
+ "--fork-session",
129
+ "When resuming, branch into a NEW session id and leave the original untouched (claude --fork-session parity)",
130
+ )
127
131
  .option(
128
132
  "--add-dir <dir>",
129
133
  "Extra working directory the agent may read/search/edit (repeatable)",
@@ -269,6 +273,33 @@ export function registerAgentCommand(program) {
269
273
  }
270
274
  }
271
275
 
276
+ // --fork-session: branch the resolved session into a NEW id so the
277
+ // ORIGINAL transcript is preserved (Claude-Code parity). One chokepoint
278
+ // before headless / stream / interactive dispatch — all read
279
+ // `options.session`. The copy carries the full history, so the branch
280
+ // replays end-to-end on a later --resume. Only meaningful when resuming;
281
+ // a no-op (silent) for a fresh run.
282
+ if (options.forkSession && options.session) {
283
+ const store = await import("../harness/jsonl-session-store.js");
284
+ const { applyForkSession } =
285
+ await import("../runtime/headless-runner.js");
286
+ const fork = applyForkSession(
287
+ { forkSession: true, sessionId: options.session },
288
+ store,
289
+ );
290
+ if (fork.missing) {
291
+ process.stderr.write(
292
+ `--fork-session: no headless transcript for "${options.session}" — ` +
293
+ "nothing to fork; continuing on it.\n",
294
+ );
295
+ } else if (fork.forkedFrom) {
296
+ process.stderr.write(
297
+ `Forked session ${fork.forkedFrom} → ${fork.sessionId} (original preserved)\n`,
298
+ );
299
+ options.session = fork.sessionId;
300
+ }
301
+ }
302
+
272
303
  // --include-partial-messages only makes sense for NDJSON output: the
273
304
  // stream-input mode is always NDJSON, otherwise require stream-json
274
305
  // explicitly (fail fast rather than silently dropping the deltas).
@@ -38,6 +38,49 @@ function getClient() {
38
38
  return mcpClient;
39
39
  }
40
40
 
41
+ /**
42
+ * Connect MCP server(s) for a one-shot query (resources / prompts). Connects
43
+ * the named server, or every registered server when `serverName` is omitted.
44
+ * Returns `{ client, connected }`; the caller must `await shutdown()`.
45
+ */
46
+ async function connectForQuery(program, serverName) {
47
+ const ctx = await bootstrap({ verbose: program.opts().verbose });
48
+ if (!ctx.db) {
49
+ logger.error("Database not available");
50
+ process.exit(1);
51
+ }
52
+ const db = ctx.db.getDatabase();
53
+ const config = new MCPServerConfig(db);
54
+ let rows;
55
+ if (serverName) {
56
+ const row = config.get(serverName);
57
+ if (!row) {
58
+ logger.error(
59
+ `Server "${serverName}" not configured. Use 'mcp add' first.`,
60
+ );
61
+ await shutdown();
62
+ process.exit(1);
63
+ }
64
+ rows = [row];
65
+ } else {
66
+ rows = config.list();
67
+ }
68
+ const client = new MCPClient();
69
+ const connected = [];
70
+ for (const row of rows) {
71
+ if (!row) continue;
72
+ try {
73
+ await client.connect(row.name, row);
74
+ connected.push(row.name);
75
+ } catch (err) {
76
+ logger.log(
77
+ chalk.yellow(` Failed to connect "${row.name}": ${err.message}`),
78
+ );
79
+ }
80
+ }
81
+ return { client, connected };
82
+ }
83
+
41
84
  // Phase 3 (Hosted MCP Policy): resolve runtime mode from --mode > env > local.
42
85
  function resolveMode(options) {
43
86
  return (
@@ -68,10 +111,20 @@ export function registerMcpCommand(program) {
68
111
  // mcp login — OAuth 2.0 (Auth Code + PKCE) for a remote MCP server.
69
112
  mcp
70
113
  .command("login <url>")
71
- .description("Authorize a remote MCP server via OAuth (opens a browser); stores the token")
114
+ .description(
115
+ "Authorize a remote MCP server via OAuth (opens a browser); stores the token",
116
+ )
72
117
  .option("--scope <scope>", "OAuth scope(s) to request")
73
- .option("--client-id <id>", "Use a pre-registered client_id instead of dynamic registration")
74
- .option("--port <n>", "Localhost callback port", (v) => parseInt(v, 10), 53682)
118
+ .option(
119
+ "--client-id <id>",
120
+ "Use a pre-registered client_id instead of dynamic registration",
121
+ )
122
+ .option(
123
+ "--port <n>",
124
+ "Localhost callback port",
125
+ (v) => parseInt(v, 10),
126
+ 53682,
127
+ )
75
128
  .option("--no-open", "Print the authorize URL instead of opening a browser")
76
129
  .action(async (url, options) => {
77
130
  try {
@@ -109,7 +162,8 @@ export function registerMcpCommand(program) {
109
162
  .description("Delete the stored OAuth token for a remote MCP server")
110
163
  .action(async (url) => {
111
164
  try {
112
- const { deleteStoredToken, serverKey } = await import("../lib/mcp-oauth.js");
165
+ const { deleteStoredToken, serverKey } =
166
+ await import("../lib/mcp-oauth.js");
113
167
  const ok = deleteStoredToken(url);
114
168
  logger.log(
115
169
  ok
@@ -129,7 +183,8 @@ export function registerMcpCommand(program) {
129
183
  .option("--json", "Output as JSON")
130
184
  .action(async (options) => {
131
185
  try {
132
- const { loadTokenStore, isTokenExpired } = await import("../lib/mcp-oauth.js");
186
+ const { loadTokenStore, isTokenExpired } =
187
+ await import("../lib/mcp-oauth.js");
133
188
  const store = loadTokenStore();
134
189
  const rows = Object.values(store).map((r) => ({
135
190
  server: r.server,
@@ -142,7 +197,9 @@ export function registerMcpCommand(program) {
142
197
  return;
143
198
  }
144
199
  if (rows.length === 0) {
145
- logger.log(chalk.gray("No MCP OAuth tokens. Run: cc mcp login <url>"));
200
+ logger.log(
201
+ chalk.gray("No MCP OAuth tokens. Run: cc mcp login <url>"),
202
+ );
146
203
  return;
147
204
  }
148
205
  for (const r of rows) {
@@ -566,6 +623,179 @@ export function registerMcpCommand(program) {
566
623
  }
567
624
  });
568
625
 
626
+ // mcp resources — list resources exposed by configured servers
627
+ mcp
628
+ .command("resources")
629
+ .description("List resources exposed by MCP servers")
630
+ .option("-s, --server <name>", "Filter by / connect only this server")
631
+ .option("--json", "Output as JSON")
632
+ .action(async (options) => {
633
+ try {
634
+ const { client } = await connectForQuery(program, options.server);
635
+ const resources = client.listResources(options.server);
636
+ if (options.json) {
637
+ console.log(JSON.stringify(resources, null, 2));
638
+ } else if (resources.length === 0) {
639
+ logger.info("No resources available.");
640
+ } else {
641
+ logger.log(chalk.bold(`MCP Resources (${resources.length}):\n`));
642
+ for (const r of resources) {
643
+ logger.log(` ${chalk.cyan(r.uri)} ${chalk.gray(`[${r.server}]`)}`);
644
+ if (r.name) logger.log(` ${chalk.gray(r.name)}`);
645
+ if (r.description) logger.log(` ${chalk.gray(r.description)}`);
646
+ }
647
+ }
648
+ await client.disconnectAll();
649
+ await shutdown();
650
+ } catch (err) {
651
+ logger.error(`Failed: ${err.message}`);
652
+ process.exit(1);
653
+ }
654
+ });
655
+
656
+ // mcp read-resource — read a resource's contents by URI
657
+ mcp
658
+ .command("read-resource")
659
+ .description("Read an MCP resource by URI")
660
+ .argument("<uri>", "Resource URI")
661
+ .option("-s, --server <name>", "Server that owns the resource")
662
+ .option("--json", "Output as JSON")
663
+ .action(async (uri, options) => {
664
+ try {
665
+ const { client } = await connectForQuery(program, options.server);
666
+ let server = options.server;
667
+ if (!server) {
668
+ const match = client.listResources().find((r) => r.uri === uri);
669
+ if (!match) {
670
+ logger.error(
671
+ `Resource "${uri}" not found. Run 'mcp resources' to list URIs.`,
672
+ );
673
+ await client.disconnectAll();
674
+ await shutdown();
675
+ process.exit(1);
676
+ }
677
+ server = match.server;
678
+ }
679
+ const result = await client.readResource(server, uri);
680
+ if (options.json) {
681
+ console.log(JSON.stringify(result, null, 2));
682
+ } else if (Array.isArray(result?.contents)) {
683
+ for (const c of result.contents) {
684
+ if (typeof c.text === "string") {
685
+ logger.log(c.text);
686
+ } else if (c.blob) {
687
+ logger.log(
688
+ chalk.gray(
689
+ `[Binary: ${c.mimeType || "application/octet-stream"}]`,
690
+ ),
691
+ );
692
+ } else {
693
+ logger.log(JSON.stringify(c, null, 2));
694
+ }
695
+ }
696
+ } else {
697
+ logger.log(JSON.stringify(result, null, 2));
698
+ }
699
+ await client.disconnectAll();
700
+ await shutdown();
701
+ } catch (err) {
702
+ logger.error(`Read failed: ${err.message}`);
703
+ process.exit(1);
704
+ }
705
+ });
706
+
707
+ // mcp prompts — list prompts (server-provided slash commands)
708
+ mcp
709
+ .command("prompts")
710
+ .description("List prompts exposed by MCP servers")
711
+ .option("-s, --server <name>", "Filter by / connect only this server")
712
+ .option("--json", "Output as JSON")
713
+ .action(async (options) => {
714
+ try {
715
+ const { client } = await connectForQuery(program, options.server);
716
+ const prompts = client.listPrompts(options.server);
717
+ if (options.json) {
718
+ console.log(JSON.stringify(prompts, null, 2));
719
+ } else if (prompts.length === 0) {
720
+ logger.info("No prompts available.");
721
+ } else {
722
+ logger.log(chalk.bold(`MCP Prompts (${prompts.length}):\n`));
723
+ for (const p of prompts) {
724
+ logger.log(
725
+ ` ${chalk.cyan(`/mcp__${p.server}__${p.name}`)} ${chalk.gray(`[${p.server}]`)}`,
726
+ );
727
+ if (p.description) logger.log(` ${chalk.gray(p.description)}`);
728
+ if (Array.isArray(p.arguments) && p.arguments.length > 0) {
729
+ const argNames = p.arguments
730
+ .map((a) => (a.required ? `${a.name}*` : a.name))
731
+ .join(", ");
732
+ logger.log(` ${chalk.gray(`args: ${argNames}`)}`);
733
+ }
734
+ }
735
+ }
736
+ await client.disconnectAll();
737
+ await shutdown();
738
+ } catch (err) {
739
+ logger.error(`Failed: ${err.message}`);
740
+ process.exit(1);
741
+ }
742
+ });
743
+
744
+ // mcp get-prompt — fetch a rendered prompt by name
745
+ mcp
746
+ .command("get-prompt")
747
+ .description("Fetch a rendered MCP prompt by name")
748
+ .argument("<name>", "Prompt name")
749
+ .option("-s, --server <name>", "Server that owns the prompt")
750
+ .option("-a, --args <json>", "Prompt arguments as JSON")
751
+ .option("--json", "Output as JSON")
752
+ .action(async (name, options) => {
753
+ try {
754
+ const { client } = await connectForQuery(program, options.server);
755
+ let server = options.server;
756
+ if (!server) {
757
+ const match = client.listPrompts().find((p) => p.name === name);
758
+ if (!match) {
759
+ logger.error(
760
+ `Prompt "${name}" not found. Run 'mcp prompts' to list prompts.`,
761
+ );
762
+ await client.disconnectAll();
763
+ await shutdown();
764
+ process.exit(1);
765
+ }
766
+ server = match.server;
767
+ }
768
+ const args = options.args ? JSON.parse(options.args) : {};
769
+ const result = await client.getPrompt(server, name, args);
770
+ if (options.json) {
771
+ console.log(JSON.stringify(result, null, 2));
772
+ } else {
773
+ if (result?.description) {
774
+ logger.log(chalk.gray(result.description) + "\n");
775
+ }
776
+ for (const msg of result?.messages || []) {
777
+ const blocks = Array.isArray(msg.content)
778
+ ? msg.content
779
+ : [msg.content];
780
+ for (const b of blocks) {
781
+ if (b && b.type === "text") {
782
+ logger.log(`${chalk.gray(`[${msg.role}]`)} ${b.text}`);
783
+ } else {
784
+ logger.log(
785
+ `${chalk.gray(`[${msg.role}]`)} ${JSON.stringify(b)}`,
786
+ );
787
+ }
788
+ }
789
+ }
790
+ }
791
+ await client.disconnectAll();
792
+ await shutdown();
793
+ } catch (err) {
794
+ logger.error(`Get prompt failed: ${err.message}`);
795
+ process.exit(1);
796
+ }
797
+ });
798
+
569
799
  // mcp scaffold — generate a boilerplate MCP server project
570
800
  mcp
571
801
  .command("scaffold <name>")
@@ -156,7 +156,7 @@ export class MCPClient extends EventEmitter {
156
156
  // Initialize MCP protocol
157
157
  const initResult = await this._sendRequest(name, "initialize", {
158
158
  protocolVersion: "2024-11-05",
159
- capabilities: { tools: {}, resources: {} },
159
+ capabilities: { tools: {}, resources: {}, prompts: {} },
160
160
  clientInfo: { name: "chainlesschain-cli", version: "0.37.9" },
161
161
  });
162
162
 
@@ -187,12 +187,21 @@ export class MCPClient extends EventEmitter {
187
187
  // Server may not support resources
188
188
  }
189
189
 
190
+ // Fetch available prompts (server-provided slash commands)
191
+ try {
192
+ const promptsResult = await this._sendRequest(name, "prompts/list", {});
193
+ entry.prompts = promptsResult?.prompts || [];
194
+ } catch {
195
+ // Server may not support prompts
196
+ }
197
+
190
198
  this.emit("server-connected", { name, tools: entry.tools.length });
191
199
  return {
192
200
  name,
193
201
  state: entry.state,
194
202
  tools: entry.tools,
195
203
  resources: entry.resources,
204
+ prompts: entry.prompts,
196
205
  serverInfo: entry.serverInfo,
197
206
  };
198
207
  } catch (err) {
@@ -250,6 +259,7 @@ export class MCPClient extends EventEmitter {
250
259
  state: entry.state,
251
260
  tools: entry.tools.length,
252
261
  resources: entry.resources.length,
262
+ prompts: (entry.prompts || []).length,
253
263
  serverInfo: entry.serverInfo || {},
254
264
  });
255
265
  }
@@ -296,6 +306,26 @@ export class MCPClient extends EventEmitter {
296
306
  return result;
297
307
  }
298
308
 
309
+ /**
310
+ * List resources from a specific server or all servers. Each resource is
311
+ * annotated with its owning `server` (mirrors `listTools`).
312
+ */
313
+ listResources(serverName) {
314
+ if (serverName) {
315
+ const entry = this.servers.get(serverName);
316
+ if (!entry) throw new Error(`Server "${serverName}" not found`);
317
+ return (entry.resources || []).map((r) => ({ ...r, server: serverName }));
318
+ }
319
+
320
+ const all = [];
321
+ for (const [name, entry] of this.servers) {
322
+ for (const r of entry.resources || []) {
323
+ all.push({ ...r, server: name });
324
+ }
325
+ }
326
+ return all;
327
+ }
328
+
299
329
  /**
300
330
  * Read a resource from a server.
301
331
  */
@@ -309,6 +339,45 @@ export class MCPClient extends EventEmitter {
309
339
  return result;
310
340
  }
311
341
 
342
+ /**
343
+ * List prompts from a specific server or all servers. Each prompt is
344
+ * annotated with its owning `server` (mirrors `listTools`).
345
+ */
346
+ listPrompts(serverName) {
347
+ if (serverName) {
348
+ const entry = this.servers.get(serverName);
349
+ if (!entry) throw new Error(`Server "${serverName}" not found`);
350
+ return (entry.prompts || []).map((p) => ({ ...p, server: serverName }));
351
+ }
352
+
353
+ const all = [];
354
+ for (const [name, entry] of this.servers) {
355
+ for (const p of entry.prompts || []) {
356
+ all.push({ ...p, server: name });
357
+ }
358
+ }
359
+ return all;
360
+ }
361
+
362
+ /**
363
+ * Fetch a rendered prompt (`prompts/get`) from a server. `args` is a map of
364
+ * the prompt's named arguments to string values. Returns the server's result
365
+ * `{ description?, messages: [...] }`.
366
+ */
367
+ async getPrompt(serverName, promptName, args = {}) {
368
+ const entry = this.servers.get(serverName);
369
+ if (!entry) throw new Error(`Server "${serverName}" not found`);
370
+ if (entry.state !== ServerState.CONNECTED) {
371
+ throw new Error(`Server "${serverName}" is not connected`);
372
+ }
373
+
374
+ const result = await this._sendRequest(serverName, "prompts/get", {
375
+ name: promptName,
376
+ arguments: args || {},
377
+ });
378
+ return result;
379
+ }
380
+
312
381
  // ─── Internal JSON-RPC transport ──────────────────────────────
313
382
 
314
383
  _sendRequest(serverName, method, params) {