chainlesschain 0.162.48 → 0.162.49

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 (161) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-BeMOUkMq.js → AIOps-DmdtNmWd.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DrRegmIt.js → ActionButton-DkuYVafg.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BM7hvUn8.js → Analytics-Ba_h8Tub.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BfLLYSz_.js → AppLayout-yb8Zm9MX.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-BpiPR-rs.js → Audit-BGjex2fm.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-BLq4IRI9.js → Backup-IFQ2hOF2.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-Bv89IFrM.js → BaseInput-W8AkPkrV.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-BUM9MdnH.js → Chat-BgI7t-iW.js} +6 -6
  10. package/src/assets/web-panel/assets/ChatBubbleRenderer-CfpKEQUF.js +1 -0
  11. package/src/assets/web-panel/assets/{Checkbox-82jih_zU.js → Checkbox-DuWsZP4g.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-ygmM1mNL.js → Codegen-DyoTNmYg.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-CqXc8_ft.js → Col-DttmlDRk.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-CqPPfyR3.js → Community-D9nnIdKn.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-LR8Z206-.js → Compact-C8KVQaHb.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-D4alm_Gx.js → Compliance-R2owqgjj.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-D-DLVanT.js → Cowork-DwGMMjRn.js} +3 -3
  18. package/src/assets/web-panel/assets/{Cron-UDtmjvd4.js → Cron-BSTcN_lK.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-iqbVDPNE.js → Crosschain-CTNuIbFD.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-DzdUfzc9.js → DID-CgApGsFP.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-DvKp1skY.js → Dashboard-D_OJ3UN5.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-S6ORlfef.js → Dropdown-B84Jwra_.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-mJViHjiq.js → EmailListRenderer-Bv-YO-6y.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-A4Lu5m_e.js → FamilyGuardDashboard-drgZ408Y.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-Bv-6737r.js → Federation-CtzFkdW2.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-DNcZoiWu.js → FormItemContext-BFAvNhl9.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-B_a0l9U4.js → GenericCardRenderer-DnuEyz_l.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-BbVAsh_N.js → Git-jlHajmRJ.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-ChxUMZEU.js → Governance-DmJC7PGL.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-Buu_bAQ-.js → Inference-B-u7xD2n.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-BMmMjxEu.js → KnowledgeGraph-BaYCA2Cd.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-BeGHcPEC.js → Logs-DTNYQWfp.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CP2Qg_xJ.js → Marketplace-CUu1xYvo.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-C42B4JYb.js → McpTools-BmoeTyrC.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-D5VeitFY.js → Memory-DxTU3QU7.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-BouoJ2FQ.js → MobileBridge-CpcOlKAD.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileProjects-mAJsyk7U.js → MobileProjects-Bjh_z16l.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-Chn6ES5y.js → Mtc-LfxwOm0x.js} +5 -5
  39. package/src/assets/web-panel/assets/{MtcAudit-D0_Q6GEn.js → MtcAudit-D6A9Gjkh.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-BWaCi_wo.js → Multisig-Ch_jofPV.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-CoSEiroa.js → NLProgramming-Bkvogg0I.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-CiqCbDw3.js → Notes-C5t5Xihm.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-BXmzKL9F.js → NotificationSettings-CTpDUNCb.js} +1 -1
  44. package/src/assets/web-panel/assets/OrderTableRenderer-ST2lr-Bi.js +1 -0
  45. package/src/assets/web-panel/assets/{Organization-CAVgSxyI.js → Organization-Dr37BaXa.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-BIVUo8YB.js → Overflow-ZGjsdP7N.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-DX-Ov-eJ.js → P2P-bWJU5Vxd.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-6clRu-J6.js → PdhVaultBrowser-BRVoW-ye.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-CANl-V55.js → Permissions-BOSnFZaC.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-BE90gjUO.js → PersonalDataHub-X4SgjP6P.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-Ck8lV8Pn.js → Pipeline-DoJhB9bj.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-BBYUDK4T.js → Privacy-OM9lDj-R.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-DcbOrnbt.js → ProjectInit-BXQEOmLn.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-DZ6-whxP.js → ProjectSettings-DBXo3K5u.js} +2 -2
  55. package/src/assets/web-panel/assets/Projects-CJ4DBJlS.js +1 -0
  56. package/src/assets/web-panel/assets/{Providers-VWoO_Y9u.js → Providers-Tk9SawmO.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-RJfSXWYg.js → QuickAsk-DRI1-nTC.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-Y7MWWkXa.js → Recommend-DtrIVTu9.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-nG8nut3l.js → Reputation-DkH8ImwZ.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-DAio6Dx2.js → Row-DpA9dlvi.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-DwY72Lc7.js → RssFeed-DV3OhxWd.js} +2 -2
  62. package/src/assets/web-panel/assets/{Search-qGG6AUWY.js → Search-QxdntiQx.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-Djsmom8n.js → Security-CGuEnrD2.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-DTEgHkUO.js → Services-BvwSSD8b.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-R5xY0J9Y.js → Skeleton-sx_8L3-5.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-CFaRLO3o.js → Skills-dWOwxRsu.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-B5bzoY1I.js → Sla-zxXnfKrT.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-B_al6SiQ.js → SpeechSettings-CmFlcNjr.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-DkUU63oJ.js → SyncSettings-BeXeqURL.js} +2 -2
  70. package/src/assets/web-panel/assets/Tasks-iImd8xSO.js +1 -0
  71. package/src/assets/web-panel/assets/{Templates-CcYJxTNB.js → Templates-DlgR3XFH.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-B0_sIpl2.js → Tenant-0P8HgQaM.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-B5VDEEHD.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-DuMkErBx.js → TimelineRenderer-hbO7agZs.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-BXjPA6rV.js → Tokens-CsmhgTBO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-BMAAx3Uu.js → Trigger-DnaF_2PP.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-BPeNXpsi.js → Trust-C1oafGj1.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-A0qabV14.js → UkeySign-eLL4DOmC.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-BMLfYykd.js → VideoEditing-CX45sVq7.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-BfDI3zjs.js → Wallet-aWPqpHdQ.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-BCnZEScW.js → WebAuthn-DMYV1MAo.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-DvtS5Asf.js → WorkflowEditor-D9uRIJvH.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-CDJZtBM7.js → chat-BmWYfCxG.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-fbH1Saco.js → colors-DqvTCkBe.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-CuZFa9l8.js → compact-item-Bh0L0ejI.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-CQuPOqqD.js → createContext-r2qgp1mn.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-CusWDjWW.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-CDZlDrhJ.js → hasIn-BcffXa-S.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-CAzMdnkI.js → index-585fuGAN.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-BhZkMMey.js → index-B3mmDuOv.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-BSy0noke.js → index-B6pAm1iJ.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-DjgZRX0_.js → index-B7z0qK1W.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-Bt1j0mjJ.js → index-BCBqTRWH.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CnfR7qmj.js → index-BLN-neIf.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BKaue5Pv.js → index-BMn_luHQ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-14gri6Vh.js → index-BQlAPNSU.js} +1 -1
  97. package/src/assets/web-panel/assets/{index--SCX46Az.js → index-BXXxkeij.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CmeO_DfK.js → index-BXae4ZyX.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BNEG9-EK.js → index-BbMox24t.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DNN-xBWV.js → index-BeV-KoQl.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BhYltBvN.js +1 -0
  102. package/src/assets/web-panel/assets/{index-ycBlRXAf.js → index-Bma_yHcC.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CkhudJH0.js → index-BtyXyl3t.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BJCXJCUA.js → index-C2-02rrp.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BzIDfObk.js → index-C9nh3ANl.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DwAiu9LT.js → index-CAlxkpnv.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CzeRvhia.js → index-CCyB-RK5.js} +3 -3
  108. package/src/assets/web-panel/assets/{index-CD9ml9ZJ.js → index-CDR3GmaO.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Dkuecn17.js → index-CJt0iuep.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D365qmj8.js → index-CKnEtlZD.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Bz5_6E63.js → index-COrfHebA.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CNmJrCxV.js → index-CY8RXaZR.js} +1 -1
  113. package/src/assets/web-panel/assets/index-CZiIHw4e.js +1 -0
  114. package/src/assets/web-panel/assets/{index-kGzPbvry.js → index-Cbj6C3pA.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-WDQkyh-E.js → index-Ct8qhPZe.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-COSyGm80.js → index-DPFT7J7I.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DGAK9Dj4.js → index-DRXcGa5y.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CQ5FVEji.js → index-DW1y18GR.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BdORz0iZ.js → index-DWlDSE0F.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-oe9ZPRtQ.js → index-Dcjol7ot.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Deqod8La.js → index-De36_UgR.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BivMeInw.js → index-DutDlDUF.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Cr_shi_7.js → index-DxajFkK2.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DhFyStIG.js → index-S4E77Aer.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C6epsHef.js → index-U86pxDyR.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DvBgQoaw.js → index-XwbSqOB2.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CdiNFWPp.js → index-h4O0AcBt.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-DHRWNV-y.js → initDefaultProps-C1d8I-BX.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-MJ2jhdVO.js → motion-Dq7fiy4Y.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-Bly0QFE5.js → move-Bqb2dySM.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DkoMB0pZ.js → omit-BUYqb4My.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-9M-gsXIc.js → pickAttrs-DeytiKlZ.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-Bnht1xci.js → placementArrow-xrXZWCqG.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-B0Cn1i64.js → responsiveObserve-CcL2K-YY.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-BdI4DDyM.js → slide-DmCWaic7.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-DdBktcMD.js → statusUtils-CqNrFif7.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-aYEwS4Pw.js → styleChecker-C436m5Xy.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-y8cUyKiP.js → useFlexGapSupport-CVhutCN8.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-Bk1SrPFp.js → useFs-DUd49Bui.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-Dp04zAB3.js → usePersonalDataHub-fuS9raic.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-B52a38TC.js → vnode-C3kmDmk-.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-DFwyL43U.js → zoom-hX-F1dT-.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/lib/agent-core.js +2 -0
  145. package/src/lib/mcp-client.js +1 -0
  146. package/src/repl/agent-repl.js +179 -1
  147. package/src/repl/config-summary.js +59 -0
  148. package/src/repl/conversation-export.js +133 -0
  149. package/src/repl/doctor-status.js +114 -0
  150. package/src/repl/memory-status.js +45 -0
  151. package/src/repl/permissions-status.js +51 -0
  152. package/src/repl/recent-sessions.js +46 -0
  153. package/src/repl/session-cost.js +119 -0
  154. package/src/assets/web-panel/assets/ChatBubbleRenderer-rH_t53ZW.js +0 -1
  155. package/src/assets/web-panel/assets/OrderTableRenderer-BhlKyGrE.js +0 -1
  156. package/src/assets/web-panel/assets/Projects-DO25SEFT.js +0 -1
  157. package/src/assets/web-panel/assets/Tasks-C2y4XdrQ.js +0 -1
  158. package/src/assets/web-panel/assets/Terminal-B_waZb0O.js +0 -3
  159. package/src/assets/web-panel/assets/devWarning-mhGhHpNs.js +0 -1
  160. package/src/assets/web-panel/assets/index-DGBjZXvW.js +0 -1
  161. package/src/assets/web-panel/assets/index-DujMkFuc.js +0 -1
@@ -1 +1 @@
1
- import{u as f}from"./index-CzeRvhia.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-CCyB-RK5.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-CzeRvhia.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-CCyB-RK5.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-CzeRvhia.js";import{i as f}from"./motion-MJ2jhdVO.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-CCyB-RK5.js";import{i as f}from"./motion-Dq7fiy4Y.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-CzeRvhia.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-CCyB-RK5.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">
@@ -11,6 +11,8 @@
11
11
  export {
12
12
  AGENT_TOOLS,
13
13
  AGENT_TOOL_REGISTRY,
14
+ MAX_SUB_AGENT_DEPTH,
15
+ reloadSkills,
14
16
  getAgentToolDefinitions,
15
17
  getAgentToolDescriptors,
16
18
  getCachedPython,
@@ -14,5 +14,6 @@ export {
14
14
  MCPServerConfig,
15
15
  inferTransport,
16
16
  isHttpTransport,
17
+ isLikelyConnectionError,
17
18
  _deps,
18
19
  } from "../harness/mcp-client.js";
@@ -76,6 +76,7 @@ import { composeSystemPrompt } from "../runtime/system-prompt.js";
76
76
  import { makeFallbackChatFn } from "../runtime/fallback-model.js";
77
77
  import { resolveSlashMacro } from "./slash-macro.js";
78
78
  import { expandMcpPrompt, renderMcpSurface } from "./mcp-prompt.js";
79
+ import { newCostStore, addUsage } from "./session-cost.js";
79
80
 
80
81
  /**
81
82
  * Reference to the runtime DB for hook execution (set during startAgentRepl)
@@ -757,14 +758,20 @@ export async function startAgentRepl(options = {}) {
757
758
  "/cd",
758
759
  "/clear",
759
760
  "/compact",
761
+ "/config",
760
762
  "/context",
763
+ "/cost",
761
764
  "/cowork",
765
+ "/doctor",
762
766
  "/exit",
767
+ "/export",
763
768
  "/help",
764
769
  "/ide",
765
770
  "/mcp",
771
+ "/memory",
766
772
  "/model",
767
773
  "/output-style",
774
+ "/permissions",
768
775
  "/plan",
769
776
  "/profile",
770
777
  "/provider",
@@ -774,6 +781,7 @@ export async function startAgentRepl(options = {}) {
774
781
  "/rewind",
775
782
  "/search",
776
783
  "/session",
784
+ "/sessions",
777
785
  "/stats",
778
786
  "/statusline",
779
787
  "/sub-agents",
@@ -881,6 +889,7 @@ export async function startAgentRepl(options = {}) {
881
889
  let _curModel = model; // tracks the per-turn active model for the readout
882
890
  let _ctxUsedTokens = 0;
883
891
  let _turnCount = 0;
892
+ const _costStore = newCostStore(); // running token spend for `/cost`
884
893
  let _renderStatus = null;
885
894
  try {
886
895
  const slm = await import("../lib/status-line.cjs");
@@ -1022,9 +1031,27 @@ export async function startAgentRepl(options = {}) {
1022
1031
  logger.log(
1023
1032
  ` ${chalk.cyan("/statusline")} Context-usage line on/off (/statusline [on|off])`,
1024
1033
  );
1034
+ logger.log(
1035
+ ` ${chalk.cyan("/config")} Effective config (provider/model, keys masked)`,
1036
+ );
1037
+ logger.log(
1038
+ ` ${chalk.cyan("/doctor")} Session health check (provider/key/IDE/MCP/hooks)`,
1039
+ );
1040
+ logger.log(
1041
+ ` ${chalk.cyan("/memory")} Project-memory files loaded (cc.md hierarchy + rules)`,
1042
+ );
1025
1043
  logger.log(
1026
1044
  ` ${chalk.cyan("/context")} Live context-window usage by role`,
1027
1045
  );
1046
+ logger.log(
1047
+ ` ${chalk.cyan("/cost")} Session token spend + estimated $ (so far)`,
1048
+ );
1049
+ logger.log(
1050
+ ` ${chalk.cyan("/permissions")} Allow/ask/deny rules in effect this session`,
1051
+ );
1052
+ logger.log(
1053
+ ` ${chalk.cyan("/export")} Save this conversation to a Markdown file (/export [path])`,
1054
+ );
1028
1055
  logger.log(
1029
1056
  ` ${chalk.cyan("/rewind")} Rewind conversation to an earlier turn (double-Esc lists)`,
1030
1057
  );
@@ -1042,6 +1069,9 @@ export async function startAgentRepl(options = {}) {
1042
1069
  );
1043
1070
  logger.log(` ${chalk.cyan("/task clear")} Clear current task`);
1044
1071
  logger.log(` ${chalk.cyan("/session")} Show current session info`);
1072
+ logger.log(
1073
+ ` ${chalk.cyan("/sessions")} List recent resumable sessions (/session resume <id> to switch)`,
1074
+ );
1045
1075
  logger.log(
1046
1076
  ` ${chalk.cyan("/reindex")} Reindex notes for BM25 search`,
1047
1077
  );
@@ -1432,7 +1462,7 @@ export async function startAgentRepl(options = {}) {
1432
1462
  }
1433
1463
 
1434
1464
  // Session info
1435
- if (trimmed.startsWith("/session")) {
1465
+ if (trimmed === "/session" || trimmed.startsWith("/session ")) {
1436
1466
  const sessionArg = trimmed.slice(8).trim();
1437
1467
  if (sessionArg.startsWith("resume ")) {
1438
1468
  const resumeId = sessionArg.slice(7).trim();
@@ -2110,6 +2140,42 @@ export async function startAgentRepl(options = {}) {
2110
2140
  return;
2111
2141
  }
2112
2142
 
2143
+ // `/sessions` — list recent RESUMABLE conversations (read-only; the ids
2144
+ // work with `cc agent --resume <id>`). `/session` shows the current one.
2145
+ if (trimmed === "/sessions" || trimmed === "/sessions ") {
2146
+ try {
2147
+ const { listRecentSessions } = await import("../lib/recent-session.js");
2148
+ const { renderRecentSessions } = await import("./recent-sessions.js");
2149
+ const sessions = listRecentSessions({ db: _hookDb }, { scan: 20 });
2150
+ logger.log(renderRecentSessions(sessions, { currentId: sessionId }));
2151
+ } catch (err) {
2152
+ logger.error(chalk.red(`/sessions failed: ${err.message}`));
2153
+ }
2154
+ prompt();
2155
+ return;
2156
+ }
2157
+
2158
+ // `/memory` — project-memory files auto-loaded into the system prompt
2159
+ // (cc.md hierarchy + imports + path-scoped rules). Distinct from `#` (add
2160
+ // a note) and `cc memory recall` (scoped store).
2161
+ if (trimmed === "/memory" || trimmed === "/memory ") {
2162
+ try {
2163
+ const { loadProjectInstructions } =
2164
+ await import("../lib/project-instructions.js");
2165
+ const { renderMemoryFiles } = await import("./memory-status.js");
2166
+ const loaded = loadProjectInstructions({ cwd: process.cwd() });
2167
+ logger.log(
2168
+ renderMemoryFiles(loaded, {
2169
+ enabled: process.env.CC_PROJECT_MEMORY !== "0",
2170
+ }),
2171
+ );
2172
+ } catch (err) {
2173
+ logger.error(chalk.red(`/memory failed: ${err.message}`));
2174
+ }
2175
+ prompt();
2176
+ return;
2177
+ }
2178
+
2113
2179
  // `/mcp` — overview of connected MCP servers' resources + prompts.
2114
2180
  if (trimmed === "/mcp" || trimmed === "/mcp ") {
2115
2181
  const mcpClient = _adhocMcp?.mcpClient || _bundleMcpClient;
@@ -2118,6 +2184,115 @@ export async function startAgentRepl(options = {}) {
2118
2184
  return;
2119
2185
  }
2120
2186
 
2187
+ // `/config` — effective configuration (secret-safe): the LLM provider/model
2188
+ // in effect, whether keys are set, web-search backend, config path.
2189
+ if (trimmed === "/config" || trimmed === "/config ") {
2190
+ try {
2191
+ const { loadConfig } = await import("../lib/config-manager.js");
2192
+ const { getConfigPath } = await import("../lib/paths.js");
2193
+ const { renderConfigSummary } = await import("./config-summary.js");
2194
+ logger.log(
2195
+ renderConfigSummary(loadConfig(), {
2196
+ path: getConfigPath(),
2197
+ activeProvider: provider,
2198
+ activeModel: _curModel || model,
2199
+ }),
2200
+ );
2201
+ } catch (err) {
2202
+ logger.error(chalk.red(`/config failed: ${err.message}`));
2203
+ }
2204
+ prompt();
2205
+ return;
2206
+ }
2207
+
2208
+ // `/doctor` — consolidated session-health readout (Claude-Code parity):
2209
+ // provider/key/IDE/MCP/permissions/hooks in one pass-or-warn view.
2210
+ if (trimmed === "/doctor" || trimmed === "/doctor ") {
2211
+ let config = {};
2212
+ try {
2213
+ config = (await import("../lib/config-manager.js")).loadConfig() || {};
2214
+ } catch (_err) {
2215
+ // config read is best-effort; checks degrade gracefully
2216
+ }
2217
+ const { buildDoctorChecks, renderDoctor } =
2218
+ await import("./doctor-status.js");
2219
+ const { ideToolNames } = await import("./ide-status.js");
2220
+ const checks = buildDoctorChecks({
2221
+ config,
2222
+ ideTools: ideToolNames(_adhocMcp),
2223
+ mcpServers: _adhocMcp?.connected,
2224
+ permissionRules: _permissionRules,
2225
+ settingsHooks: _settingsHooks,
2226
+ });
2227
+ logger.log(renderDoctor(checks));
2228
+ prompt();
2229
+ return;
2230
+ }
2231
+
2232
+ // `/export [path]` — dump the live conversation to a Markdown transcript
2233
+ // (Claude-Code parity). Distinct from `cc export` (knowledge base). Captures
2234
+ // exactly what's in context now, persisted or not.
2235
+ if (trimmed === "/export" || trimmed.startsWith("/export ")) {
2236
+ const arg = trimmed.slice("/export".length).trim();
2237
+ try {
2238
+ const { renderConversationMarkdown, defaultExportFilename } =
2239
+ await import("./conversation-export.js");
2240
+ const fs = await import("fs");
2241
+ const path = await import("path");
2242
+ const md = renderConversationMarkdown(messages, {
2243
+ provider,
2244
+ model: _curModel || model,
2245
+ sessionId,
2246
+ exportedAt: new Date().toISOString(),
2247
+ });
2248
+ const file = arg
2249
+ ? path.resolve(process.cwd(), arg)
2250
+ : path.resolve(process.cwd(), defaultExportFilename(new Date()));
2251
+ fs.writeFileSync(file, md, "utf-8");
2252
+ logger.log(
2253
+ chalk.green(`Exported ${messages.length} messages → ${file}`),
2254
+ );
2255
+ } catch (err) {
2256
+ logger.error(chalk.red(`/export failed: ${err.message}`));
2257
+ }
2258
+ prompt();
2259
+ return;
2260
+ }
2261
+
2262
+ // `/permissions` — allow/ask/deny rules in effect this session (Claude-Code
2263
+ // parity): what the agent runs unprompted, asks about, or is blocked from.
2264
+ if (trimmed === "/permissions" || trimmed === "/permissions ") {
2265
+ let files = [];
2266
+ try {
2267
+ const { loadSettings } = await import("../lib/settings-loader.cjs");
2268
+ files = loadSettings({ cwd: process.cwd() }).files || [];
2269
+ } catch (_err) {
2270
+ // source listing is best-effort — still show the live rules
2271
+ }
2272
+ const { renderPermissions } = await import("./permissions-status.js");
2273
+ logger.log(renderPermissions(_permissionRules, { files }));
2274
+ prompt();
2275
+ return;
2276
+ }
2277
+
2278
+ // `/cost` — running token spend + estimated $ for this session (Claude-Code
2279
+ // parity). In-memory accumulation, so it works without session persistence.
2280
+ if (trimmed === "/cost" || trimmed === "/cost ") {
2281
+ let overrides;
2282
+ try {
2283
+ const { loadConfig } = await import("../lib/config-manager.js");
2284
+ overrides = loadConfig()?.llm?.pricing;
2285
+ } catch (_err) {
2286
+ // pricing overrides are optional — fall back to the built-in table
2287
+ }
2288
+ const { renderSessionCost } = await import("./session-cost.js");
2289
+ logger.log(
2290
+ renderSessionCost(_costStore, { pricingOverrides: overrides }),
2291
+ );
2292
+ prompt();
2293
+ return;
2294
+ }
2295
+
2121
2296
  // `/ide` — IDE bridge connection status (Claude-Code parity): which editor
2122
2297
  // is connected, its tools, or why discovery came up empty.
2123
2298
  if (trimmed === "/ide" || trimmed === "/ide ") {
@@ -2362,6 +2537,9 @@ export async function startAgentRepl(options = {}) {
2362
2537
  });
2363
2538
  _turnAbort = null;
2364
2539
 
2540
+ // Running spend for `/cost` (in-memory, works without persistence).
2541
+ if (usageEvents?.length) addUsage(_costStore, usageEvents);
2542
+
2365
2543
  if (sessionId && usageEvents?.length) {
2366
2544
  for (const ue of usageEvents) {
2367
2545
  try {
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `/config` REPL command (Claude-Code parity) — show the effective
3
+ * configuration in a readable, SECRET-SAFE form: the LLM provider/model/baseURL
4
+ * actually in effect, whether an API key is set (never the key itself), the
5
+ * web-search backend, and the config-file path. Also surfaces the session's
6
+ * active provider/model, which can differ from the file (a --provider flag or
7
+ * .claude/settings.json overrides it).
8
+ *
9
+ * Pure: takes the loaded config + context, returns plain text. The REPL does
10
+ * the I/O. NEVER prints a secret — only "set (…1234)" / "not set".
11
+ */
12
+
13
+ /** Mask a secret: presence + last 4 chars only, or "not set". */
14
+ export function maskSecret(v) {
15
+ if (v == null || v === "") return "not set";
16
+ const s = String(v);
17
+ return s.length <= 4 ? "set (hidden)" : `set (…${s.slice(-4)})`;
18
+ }
19
+
20
+ /**
21
+ * @param {object|null} config loaded config.json
22
+ * @param {object} [opts] { path, activeProvider, activeModel }
23
+ * @returns {string}
24
+ */
25
+ export function renderConfigSummary(config, opts = {}) {
26
+ const cfg = config || {};
27
+ const llm = cfg.llm || {};
28
+ const lines = ["Effective configuration:"];
29
+ if (opts.path) lines.push(` config file: ${opts.path}`);
30
+
31
+ lines.push(" llm:");
32
+ lines.push(` provider: ${llm.provider || "(unset → defaults to ollama)"}`);
33
+ lines.push(` model: ${llm.model || "(unset)"}`);
34
+ if (llm.visionModel) lines.push(` vision: ${llm.visionModel}`);
35
+ if (llm.baseUrl) lines.push(` baseUrl: ${llm.baseUrl}`);
36
+ lines.push(` apiKey: ${maskSecret(llm.apiKey)}`);
37
+
38
+ const ws = cfg.webSearch || {};
39
+ if (ws.provider || ws.apiKey) {
40
+ lines.push(" webSearch:");
41
+ lines.push(` provider: ${ws.provider || "(unset → auto)"}`);
42
+ lines.push(` apiKey: ${maskSecret(ws.apiKey)}`);
43
+ }
44
+
45
+ if (opts.activeProvider || opts.activeModel) {
46
+ const ap = opts.activeProvider || "?";
47
+ const am = opts.activeModel || "?";
48
+ const differs = !!llm.provider && (ap !== llm.provider || am !== llm.model);
49
+ lines.push(
50
+ ` active this session: ${ap} · ${am}` +
51
+ (differs ? " (overrides config)" : ""),
52
+ );
53
+ }
54
+
55
+ lines.push(
56
+ " note: keys are hidden; env vars (e.g. *_API_KEY) can override config at runtime.",
57
+ );
58
+ return lines.join("\n");
59
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * `/export` REPL command — dump the LIVE in-memory conversation to a Markdown
3
+ * transcript (Claude-Code parity). Distinct from `cc export` (knowledge-base
4
+ * export) and from `cc session export` (which reads the persisted JSONL store):
5
+ * this renders the agent REPL's working `messages` array, so it captures
6
+ * exactly what's in context right now, persisted or not.
7
+ *
8
+ * Pure over the OpenAI-shaped message list the agent loop maintains:
9
+ * {role:"user"|"assistant"|"system", content} content: string | parts[]
10
+ * {role:"assistant", content, tool_calls:[{function:{name,arguments}}]}
11
+ * {role:"tool", content, tool_call_id}
12
+ * The REPL does the file I/O; this only produces text + a default filename.
13
+ */
14
+
15
+ export const TOOL_BLOCK_CAP = 4000;
16
+
17
+ /** Render message content (string, or OpenAI multimodal parts[]) as text. */
18
+ function contentToText(content) {
19
+ if (content == null) return "";
20
+ if (typeof content === "string") return content;
21
+ if (Array.isArray(content)) {
22
+ return content
23
+ .map((part) => {
24
+ if (typeof part === "string") return part;
25
+ if (!part || typeof part !== "object") return "";
26
+ if (part.type === "text" || typeof part.text === "string") {
27
+ return part.text || "";
28
+ }
29
+ if (part.type === "image_url" || part.image_url) return "[image]";
30
+ return "";
31
+ })
32
+ .filter(Boolean)
33
+ .join("\n");
34
+ }
35
+ try {
36
+ return JSON.stringify(content, null, 2);
37
+ } catch {
38
+ return String(content);
39
+ }
40
+ }
41
+
42
+ function fence(body, lang = "") {
43
+ const text =
44
+ typeof body === "string"
45
+ ? body
46
+ : (() => {
47
+ try {
48
+ return JSON.stringify(body, null, 2);
49
+ } catch {
50
+ return String(body);
51
+ }
52
+ })();
53
+ const capped =
54
+ text.length > TOOL_BLOCK_CAP
55
+ ? `${text.slice(0, TOOL_BLOCK_CAP)}\n… [truncated]`
56
+ : text;
57
+ const guard = capped.includes("```") ? "````" : "```";
58
+ return `${guard}${lang}\n${capped}\n${guard}`;
59
+ }
60
+
61
+ /** Pretty-print a tool_call's JSON-string arguments, falling back to raw. */
62
+ function prettyArgs(argStr) {
63
+ if (typeof argStr !== "string") return fence(argStr, "json");
64
+ try {
65
+ return fence(JSON.parse(argStr), "json");
66
+ } catch {
67
+ return fence(argStr);
68
+ }
69
+ }
70
+
71
+ const two = (n) => String(n).padStart(2, "0");
72
+
73
+ /**
74
+ * A timestamped default filename, e.g. chainlesschain-export-20260613-130600.md.
75
+ * Takes a Date so callers/tests stay deterministic.
76
+ */
77
+ export function defaultExportFilename(date = new Date()) {
78
+ const d = date instanceof Date && !isNaN(date) ? date : new Date(0);
79
+ const stamp =
80
+ `${d.getFullYear()}${two(d.getMonth() + 1)}${two(d.getDate())}` +
81
+ `-${two(d.getHours())}${two(d.getMinutes())}${two(d.getSeconds())}`;
82
+ return `chainlesschain-export-${stamp}.md`;
83
+ }
84
+
85
+ /**
86
+ * Render the conversation as Markdown.
87
+ * @param {Array} messages the REPL's working message list
88
+ * @param {object} [meta] { provider, model, sessionId, exportedAt }
89
+ * @returns {string}
90
+ */
91
+ export function renderConversationMarkdown(messages, meta = {}) {
92
+ const msgs = Array.isArray(messages) ? messages : [];
93
+ const L = ["# ChainlessChain Conversation Export", ""];
94
+ const bits = [];
95
+ if (meta.sessionId) bits.push(`session: ${meta.sessionId}`);
96
+ if (meta.provider) bits.push(`provider: ${meta.provider}`);
97
+ if (meta.model) bits.push(`model: ${meta.model}`);
98
+ if (meta.exportedAt) bits.push(`exported: ${meta.exportedAt}`);
99
+ if (bits.length) {
100
+ L.push(`> ${bits.join(" · ")}`, "");
101
+ }
102
+
103
+ let users = 0;
104
+ let assistants = 0;
105
+ for (const m of msgs) {
106
+ if (!m || typeof m !== "object") continue;
107
+ const role = m.role;
108
+ if (role === "user") {
109
+ users += 1;
110
+ L.push("## 👤 User", "", contentToText(m.content), "");
111
+ } else if (role === "assistant") {
112
+ const text = contentToText(m.content);
113
+ if (text) {
114
+ assistants += 1;
115
+ L.push("## 🤖 Assistant", "", text, "");
116
+ }
117
+ if (Array.isArray(m.tool_calls)) {
118
+ for (const tc of m.tool_calls) {
119
+ const name = tc?.function?.name || tc?.name || "?";
120
+ L.push(`**🔧 tool_call — \`${name}\`**`, "");
121
+ L.push(prettyArgs(tc?.function?.arguments ?? tc?.arguments), "");
122
+ }
123
+ }
124
+ } else if (role === "tool") {
125
+ L.push("**↩ tool_result**", "", fence(contentToText(m.content)), "");
126
+ } else if (role === "system") {
127
+ L.push("## ⚙ System", "", contentToText(m.content), "");
128
+ }
129
+ }
130
+
131
+ L.push("---", `_${users} user / ${assistants} assistant turns_`, "");
132
+ return L.join("\n");
133
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * `/doctor` REPL command (Claude-Code parity) — a consolidated session-health
3
+ * readout. Where /config, /ide, /mcp, /permissions each show one subsystem,
4
+ * /doctor rolls them into a single pass/warn view and flags the common reasons
5
+ * a chat silently fails (no provider, provider set but no key, …).
6
+ *
7
+ * Pure and dependency-free: `buildDoctorChecks` turns already-resolved session
8
+ * state into a check list, `renderDoctor` formats it. The REPL gathers inputs.
9
+ */
10
+
11
+ /** Providers whose models run locally and need no API key. */
12
+ const FREE_PROVIDERS = ["ollama", "local", "llamacpp", "mediapipe"];
13
+
14
+ /**
15
+ * @param {object} input
16
+ * { config, ideTools?: string[], mcpServers?: Array, permissionRules?, settingsHooks? }
17
+ * @returns {Array<{level:'ok'|'warn'|'info'|'err', name:string, detail:string}>}
18
+ */
19
+ export function buildDoctorChecks(input = {}) {
20
+ const { config, ideTools, mcpServers, permissionRules, settingsHooks } =
21
+ input;
22
+ const llm = (config && config.llm) || {};
23
+ const checks = [];
24
+
25
+ // LLM provider / model
26
+ if (!llm.provider) {
27
+ checks.push({
28
+ level: "warn",
29
+ name: "LLM provider",
30
+ detail:
31
+ "unset → defaults to ollama (local); set llm.provider or --provider",
32
+ });
33
+ } else {
34
+ checks.push({
35
+ level: "ok",
36
+ name: "LLM provider",
37
+ detail: `${llm.provider}${llm.model ? " · " + llm.model : " (no model set)"}`,
38
+ });
39
+ }
40
+
41
+ // API key for non-local providers
42
+ if (
43
+ llm.provider &&
44
+ !FREE_PROVIDERS.includes(String(llm.provider).toLowerCase()) &&
45
+ !llm.apiKey
46
+ ) {
47
+ checks.push({
48
+ level: "warn",
49
+ name: "API key",
50
+ detail: `${llm.provider} has no apiKey set (config llm.apiKey or a *_API_KEY env var)`,
51
+ });
52
+ }
53
+
54
+ // IDE bridge
55
+ const ideCount = Array.isArray(ideTools) ? ideTools.length : 0;
56
+ checks.push(
57
+ ideCount > 0
58
+ ? {
59
+ level: "ok",
60
+ name: "IDE bridge",
61
+ detail: `${ideCount} tools connected`,
62
+ }
63
+ : { level: "info", name: "IDE bridge", detail: "not connected" },
64
+ );
65
+
66
+ // MCP servers
67
+ const mcpCount = Array.isArray(mcpServers) ? mcpServers.length : 0;
68
+ checks.push(
69
+ mcpCount > 0
70
+ ? { level: "ok", name: "MCP servers", detail: `${mcpCount} connected` }
71
+ : { level: "info", name: "MCP servers", detail: "none" },
72
+ );
73
+
74
+ // Permission rules
75
+ const ruleCount = permissionRules
76
+ ? (permissionRules.allow?.length || 0) +
77
+ (permissionRules.ask?.length || 0) +
78
+ (permissionRules.deny?.length || 0)
79
+ : 0;
80
+ checks.push({
81
+ level: "info",
82
+ name: "Permission rules",
83
+ detail: ruleCount > 0 ? `${ruleCount} rule(s)` : "none (default gate)",
84
+ });
85
+
86
+ // settings.json hooks
87
+ checks.push({
88
+ level: "info",
89
+ name: "settings.json hooks",
90
+ detail: settingsHooks ? "loaded" : "none",
91
+ });
92
+
93
+ return checks;
94
+ }
95
+
96
+ const ICON = { ok: "✓", warn: "⚠", err: "✗", info: "·" };
97
+
98
+ /** Render the check list as a readable health block. */
99
+ export function renderDoctor(checks) {
100
+ const list = Array.isArray(checks) ? checks : [];
101
+ const lines = ["Session health (/doctor):"];
102
+ for (const c of list) {
103
+ lines.push(` ${ICON[c.level] || "·"} ${c.name}: ${c.detail}`);
104
+ }
105
+ const problems = list.filter(
106
+ (c) => c.level === "warn" || c.level === "err",
107
+ ).length;
108
+ lines.push(
109
+ problems === 0
110
+ ? " no problems detected"
111
+ : ` ${problems} item(s) need attention`,
112
+ );
113
+ return lines.join("\n");
114
+ }