chainlesschain 0.162.175 → 0.162.176

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 (263) hide show
  1. package/package.json +10 -10
  2. package/src/assets/web-panel/assets/{AIOps-DherW0Rh.js → AIOps-BDLu5Elz.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-CDGfqt2Y.js → ActionButton-DH5us-CK.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BYhkzdgD.js → Analytics-BZ0u8IFG.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-cEKk1cpb.js → AppLayout-Duu8xR14.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-_aXR3WWc.js → Artifacts-Br2YBbh_.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CYAf-gY7.js → Audit-C3C6a482.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-D4Q20phR.js → BackgroundAgents-CzHvebcj.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Cq0Tyk58.js → Backup-DZNHYDFd.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CPj_CdAv.js → BaseInput-VRiC4fIx.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-BQ-Qq0es.js → Chat-Cm08WWAD.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ci97vNTs.js → ChatBubbleRenderer-CGHYrugQ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-rke6l3yg.js → Checkbox-DtByk7d7.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DiacrIPq.js → Codegen-CphXXOfD.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-Cx3BY-Up.js → Col-Hz86TnLR.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DfmWiQy8.js → Community-HP03ltpD.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DdQnpxy5.js → Compact-B_N1mqQz.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-lzliOH_r.js → Compliance-CVztRpi8.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CYx4Un5k.js → Cowork-wUVOyZih.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-BGDcPFlo.js → Cron-DW5TLJKw.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-0_X5g2ri.js → Crosschain-CrAFGhWH.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-C0PEf3Eu.js → DID-pA-oD8ke.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DULQjQ58.js → Dashboard-CXrd5gAw.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-DGRHRbW6.js → Dropdown-EweJcsek.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-ChX8XPwB.js → EmailListRenderer-C9xVLPG4.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dyq6IBNu.js → FamilyGuardDashboard-CDcEEqlu.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DH1NfAL2.js → Federation-DtZda9A_.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-BN1I_uNi.js → FormItemContext-CiYdcVz3.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-Dq_2UYpe.js → GenericCardRenderer-DA13uwA0.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-BAy1yvI2.js → Git-DzRhZD1O.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-Db6Q2iSy.js → Governance-D5RMgOSb.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-0ub6yHcr.js → Inference-BgrPfSNk.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DtLetM36.js → KnowledgeGraph-DzjnD571.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Bcoy7CUd.js → Logs-BhWzVDtN.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BfEMFAXf.js → MarkdownRenderer-BDape9cx.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-tt2rzwRR.js → Marketplace-DJtL5GV7.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BhOgX-MU.js → McpTools-CZcQygI7.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-BJUxeWBL.js → Memory-DUWSDUUu.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BwUY2G9w.js → MobileBridge-BTwq2WKY.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-B2WMboOm.js → Mtc-BiGugEQm.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-8pNEXO63.js → MtcAudit-DY7a6gUe.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-C1wm5a_1.js → Multisig-BQbDu_w7.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-C1QpKF7g.js → NLProgramming-CM2wXTLv.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-CiQUcxFu.js → Notes-DI6gGs1v.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-BblDPJ_x.js → NotificationSettings-BsZOLWAB.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-DRjYcPtb.js → OrderTableRenderer-C48mu09U.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Dp3VKB0X.js → Organization-Cds0_tXr.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-Czx161m9.js → Overflow-WunYMD87.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-ClFi6wOs.js → P2P-Bo6j4DDv.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-CRweW0lz.js → PdhVaultBrowser-Bh2XPD5f.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-BzcRoqTn.js → Permissions-EMvMMC8N.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-ChGTpNMd.js → PersonalDataHub-AX3ypUDV.js} +2 -2
  54. package/src/assets/web-panel/assets/{Pipeline-BMOOpKWA.js → Pipeline-BOx8HOgL.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-D0AZHObH.js → Privacy-tBeTVQVM.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-yYFlZ6Ja.js → ProjectInit-CVYg1W4M.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-DJNVuMQs.js → ProjectSettings-Dvt5I7y1.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Br0rBWH1.js → Projects-Cc7FC9-e.js} +1 -1
  59. package/src/assets/web-panel/assets/Providers-Ct8xqY-E.js +1 -0
  60. package/src/assets/web-panel/assets/{QrScannerModal-81NZOitV.js → QrScannerModal-Cni8Ooja.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Dic2lCbJ.js → QuickAsk-BJVLKdxr.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Dh9iwViE.js → Recommend-DPG8Rbbm.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-Bq9VYEFy.js → RemoteSession-DsdR7dCt.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CxFZ-NbJ.js → Reputation-Csg1YM-b.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-BVSLcaX2.js → Row-D9DoFoEf.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-BbC-5DOH.js → RssFeed-BsvKrXMS.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-BfjZ1GCr.js → Search-DFUStfgQ.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CVjhOV5r.js → Security-ILg1zxdK.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-D45u-Aqe.js → Services-Dd41PCaY.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-WkGoK4he.js → Skeleton-Bzo1cN80.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-D_jvQZcj.js → Skills-BDHh17P0.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Bf4QTF3E.js → Sla-jl7UTiRY.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-DVpZdbMN.js → SpeechSettings-BePa-RF6.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DEEojoMS.js → SyncSettings-DiqqDKGZ.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DFwxpLIk.js → Tasks-DYQ_6lxj.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Bzl-9wY5.js → Templates-JiDeI06L.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-0khxUOB8.js → Tenant-hhgI6zwS.js} +1 -1
  78. package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +3 -0
  79. package/src/assets/web-panel/assets/{TimelineRenderer-B0Y4LONc.js → TimelineRenderer-B8uB5Llk.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DEE07SFh.js → Tokens-C3b_6r2z.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BM7xvA5z.js → Trigger-tIP7HKVe.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-Dv3ijvvZ.js → Trust-vjoc11vJ.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-B1-enmMt.js → UkeySign-DUPBnGuH.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DYiIPByd.js → VideoEditing-CBvhUY5T.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-D-y374BQ.js → Wallet-DUaQ0uA5.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-HBDjcUhi.js → WebAuthn-DllSivjE.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-sKn4qTID.js → WorkflowEditor-xc8D3uO6.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-TVYhaBXj.js → chat-BVicU7oA.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DMADxY9v.js → colors-DJzLmhLm.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-OftcHpO_.js → compact-item-BvYRfThE.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DW1zVUSN.js → createContext-DGXxCBKR.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-CaUathNp.js → hasIn-SBDJB1y4.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CeCIYYG7.js → index-1SdDS6lR.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DAfT3EMd.js → index-9gdI7uUW.js} +1 -1
  96. package/src/assets/web-panel/assets/index-B7nuIywP.js +1 -0
  97. package/src/assets/web-panel/assets/{index-sm1sGIxW.js → index-BJZf9DhV.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BBNg08cD.js → index-BO1itZaY.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-CKNdnJRo.js → index-BTrBGBJs.js} +1 -1
  100. package/src/assets/web-panel/assets/{index--5UvwqH_.js → index-BYqz4Wrr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-8YelceUU.js → index-Bf-ctERC.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Lr0MO-GU.js → index-CKyEivf8.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DZdT8nio.js → index-CdGY9P8a.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-s-EnkUCn.js → index-Cf-O_g_8.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-pSVCBsG4.js → index-CloCgBUR.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-B-19mFhn.js → index-CoJAO1Lm.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DKjqFpYa.js → index-Crk5NTb0.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BJ1PjRY3.js → index-Cs2rmLFt.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-77kgkUgY.js → index-CtwqO5qo.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D63QVAiJ.js → index-D7HimK0M.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-B52Ztt8Q.js → index-DCdRAgjy.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DHi634g9.js → index-DCqRS6da.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BFVbDpqg.js → index-DHVLJ8q0.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BvRw4Fna.js → index-DKrvvWm4.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CZXYI5LU.js → index-DMarmfrv.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CM8W07sc.js → index-DRfiXB_p.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-iDmgT2Dg.js → index-Dm_77jgR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-hXq7QRA_.js → index-DnjPdvR6.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BEzLLVYd.js → index-DonCnfMr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DYwwUKDg.js → index-DvUTDYXX.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DXcqvWBp.js → index-FxZzRyE1.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Cmdv6Dev.js → index-MjC4G09d.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C9JoaYSs.js → index-VMfwIH5G.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CK-p7Hji.js → index-YJkzy8ZF.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BupSWDcl.js → index-d5BVd-cL.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Bg-7FpaL.js → index-e4fXH_WO.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CpDtN0dl.js → index-hxTODbM1.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-kdMl_0zL.js → index-lpaGoTH3.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-GUKz4Pv9.js → index-wcCL-miV.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DWVZ3T0t.js → index-xfluRkCT.js} +1 -1
  131. package/src/assets/web-panel/assets/index-ycwAfC-i.js +1 -0
  132. package/src/assets/web-panel/assets/{index-BSp1Ofvx.js → index-z1ZylsLq.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DdcKTlQR.js → initDefaultProps-C1zO1KnY.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-CL-hTBQj.js → motion-CWLtEGmC.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-qYSAkxNG.js → move-DzD_C3Vm.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-ZwRSZtRP.js → mtc-parser-D880PYJl.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-Bld-8ftI.js → omit-CFR_z2ov.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-DGHs-a9Z.js → pickAttrs-srIhgrSC.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-DRQPMyI5.js → placementArrow-C1rXpibP.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-C5MJG_Yo.js → responsiveObserve-C30gRcSS.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-VZ-fpZCD.js → slide-CvtKiMfV.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-9ocfCyHk.js → statusUtils-DNHO7ITG.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-B6QAwAN5.js → styleChecker-Dt_Sl-g4.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Bq1twor3.js → useFlexGapSupport-Cjev42Gh.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DKZq96tz.js → useFs-Baxglj2V.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-D0RmRVXf.js → usePersonalDataHub-B4NkcLaP.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D6kEj_tt.js → vnode-mIRkdT7o.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-2yfasoQf.js → zoom-HzI5DlH_.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/auth/npm-auth.js +30 -5
  151. package/src/commands/agenda.js +64 -2
  152. package/src/commands/agent.js +39 -1
  153. package/src/commands/config.js +70 -5
  154. package/src/commands/context.js +36 -2
  155. package/src/commands/hub.js +19 -1
  156. package/src/commands/memory.js +21 -6
  157. package/src/commands/permissions.js +57 -1
  158. package/src/commands/plugin.js +2 -0
  159. package/src/commands/review.js +23 -11
  160. package/src/commands/routine.js +31 -8
  161. package/src/commands/session.js +11 -3
  162. package/src/commands/team.js +20 -7
  163. package/src/commands/update.js +65 -10
  164. package/src/gateways/terminal/PtyManager.js +8 -1
  165. package/src/gateways/ws/message-dispatcher.js +3 -0
  166. package/src/gateways/ws/session-protocol.js +26 -0
  167. package/src/gateways/ws/ws-agent-handler.js +107 -69
  168. package/src/gateways/ws/ws-server.js +74 -2
  169. package/src/harness/jsonl-session-store.js +13 -6
  170. package/src/harness/mcp-client.js +200 -1
  171. package/src/lib/__tests__/personal-data-hub-aichat-wizard.test.js +15 -0
  172. package/src/lib/agent-coordinator.js +4 -0
  173. package/src/lib/agent-ipc-bus.js +32 -2
  174. package/src/lib/agent-sandbox.js +16 -2
  175. package/src/lib/agent-schedule-store.js +55 -0
  176. package/src/lib/agent-tool-admission.js +104 -0
  177. package/src/lib/api-key-helper.js +10 -2
  178. package/src/lib/async-hook-supervisor.cjs +12 -2
  179. package/src/lib/changelog.js +19 -11
  180. package/src/lib/channels/channel-manager.js +6 -0
  181. package/src/lib/channels/telegram-channel.js +11 -1
  182. package/src/lib/channels/webhook-channel.js +15 -3
  183. package/src/lib/checkpoint-store.js +10 -2
  184. package/src/lib/cloud/bundle.js +12 -2
  185. package/src/lib/code-review.js +32 -8
  186. package/src/lib/computer-use/control-backend.js +18 -3
  187. package/src/lib/context-breakdown.js +46 -0
  188. package/src/lib/context-source-ledger.js +43 -0
  189. package/src/lib/diff-review-follow-up.js +154 -0
  190. package/src/lib/downloader.js +17 -3
  191. package/src/lib/ensure-utf8.js +11 -3
  192. package/src/lib/event-runtime-producer.js +58 -0
  193. package/src/lib/event-runtime-store.js +354 -0
  194. package/src/lib/event-runtime-worker.js +109 -0
  195. package/src/lib/execution-backend.js +72 -21
  196. package/src/lib/git-integration.js +19 -4
  197. package/src/lib/hook-manager.js +6 -15
  198. package/src/lib/hook-runner.cjs +48 -3
  199. package/src/lib/hooks-v2-producers.js +15 -0
  200. package/src/lib/hooks-v2-runtime.js +70 -21
  201. package/src/lib/host-adb-bridge.js +111 -21
  202. package/src/lib/ide-context.js +128 -1
  203. package/src/lib/interaction-adapter.js +39 -0
  204. package/src/lib/json-schema-validate.js +190 -36
  205. package/src/lib/lan-pairing-preflight.js +13 -2
  206. package/src/lib/lsp/__tests__/lsp-server-registry.test.js +18 -0
  207. package/src/lib/lsp/lsp-client.js +18 -1
  208. package/src/lib/lsp/lsp-manager.js +4 -0
  209. package/src/lib/lsp/lsp-server-registry.js +11 -0
  210. package/src/lib/mcp-oauth.js +8 -2
  211. package/src/lib/npm-invocation.js +29 -0
  212. package/src/lib/packer/pkg-runner.js +13 -2
  213. package/src/lib/packer/precheck.js +33 -16
  214. package/src/lib/packer/web-panel-builder.js +16 -2
  215. package/src/lib/permission-rules.cjs +5 -1
  216. package/src/lib/personal-data-hub-aichat-wizard.js +22 -6
  217. package/src/lib/personal-data-hub-wiring.js +27 -3
  218. package/src/lib/plan-mode.js +204 -11
  219. package/src/lib/plugin-monitor-supervisor.js +39 -4
  220. package/src/lib/plugin-runtime/bin.js +45 -0
  221. package/src/lib/plugin-runtime/hooks.js +14 -1
  222. package/src/lib/plugin-runtime/install.js +2 -1
  223. package/src/lib/plugin-runtime/lsp.js +3 -0
  224. package/src/lib/plugin-runtime/mcp.js +8 -1
  225. package/src/lib/plugin-runtime/monitors.js +4 -0
  226. package/src/lib/plugin-runtime/plugin-options.js +74 -7
  227. package/src/lib/plugin-runtime/signature.js +45 -0
  228. package/src/lib/pr-create.js +21 -8
  229. package/src/lib/pr-link-ledger.js +15 -3
  230. package/src/lib/process-execution-broker/credential-agent.js +23 -3
  231. package/src/lib/process-execution-broker/index.js +315 -38
  232. package/src/lib/process-execution-broker/patch-child-process.js +2 -3
  233. package/src/lib/process-manager.js +18 -3
  234. package/src/lib/publish-workspace.js +14 -6
  235. package/src/lib/secret-store.js +159 -0
  236. package/src/lib/service-manager.js +64 -29
  237. package/src/lib/settings-hook-events.cjs +61 -1
  238. package/src/lib/settings-hooks.cjs +4 -0
  239. package/src/lib/side-effect-ledger.js +22 -0
  240. package/src/lib/sub-agent-context.js +5 -0
  241. package/src/lib/sub-agent-profiles.js +4 -0
  242. package/src/lib/turn-context.js +14 -8
  243. package/src/lib/unattended-action-policy.js +83 -0
  244. package/src/lib/update-notice.js +6 -2
  245. package/src/lib/with-file-lock.js +7 -0
  246. package/src/lib/ws-server.js +1 -0
  247. package/src/repl/agent-repl.js +32 -0
  248. package/src/repl/clipboard-copy.js +8 -2
  249. package/src/repl/pr-comments.js +30 -7
  250. package/src/runtime/agent-core.js +439 -87
  251. package/src/runtime/agent-runtime.js +1 -0
  252. package/src/runtime/coding-agent-contract-shared.cjs +52 -0
  253. package/src/runtime/coding-agent-policy.cjs +20 -0
  254. package/src/runtime/diagnostics.js +73 -8
  255. package/src/runtime/headless-runner.js +63 -0
  256. package/src/runtime/headless-stream.js +269 -17
  257. package/src/runtime/mcp-config.js +16 -1
  258. package/src/assets/web-panel/assets/MobileProjects-BLRfHhqi.js +0 -1
  259. package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +0 -1
  260. package/src/assets/web-panel/assets/Terminal-DWGYhAYU.js +0 -3
  261. package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +0 -1
  262. package/src/assets/web-panel/assets/index-CSgUfMTM.js +0 -1
  263. package/src/assets/web-panel/assets/index-DliSZvAP.js +0 -1
@@ -79,6 +79,7 @@ import {
79
79
  reconcileSideEffects,
80
80
  classifyToolSideEffect,
81
81
  } from "../lib/side-effect-ledger.js";
82
+ import { DiffReviewFollowUpTracker } from "../lib/diff-review-follow-up.js";
82
83
  import {
83
84
  loadSideEffectLedger,
84
85
  persistSideEffectLedger,
@@ -240,26 +241,106 @@ export function createStreamCoalescer({
240
241
  export function planSnapshot(pm) {
241
242
  let items = [];
242
243
  let risk = null;
244
+ let planId = null;
245
+ let planVersion = null;
246
+ let previousPlanId = null;
247
+ let executionLock = null;
243
248
  try {
244
249
  const plan = pm.currentPlan;
250
+ planId = plan?.id || null;
251
+ planVersion = plan?.version || null;
252
+ previousPlanId = plan?.revisionOf || null;
245
253
  items = (plan?.items || []).map((i) => ({
246
254
  id: i.id,
247
255
  title: i.title,
248
256
  tool: i.tool,
249
257
  impact: i.estimatedImpact || "low",
250
258
  status: i.status,
259
+ ...(i.turn ? { turn: i.turn } : {}),
260
+ ...(i.toolUseId ? { tool_use_id: i.toolUseId } : {}),
261
+ ...(i.startedAt ? { started_at: i.startedAt } : {}),
262
+ ...(i.completedAt ? { completed_at: i.completedAt } : {}),
263
+ ...(i.error ? { error: String(i.error).slice(0, 1000) } : {}),
251
264
  }));
252
265
  if (items.length > 0) {
253
266
  const r = pm.getRiskAssessment();
254
267
  if (r) risk = { level: r.level, totalScore: r.totalScore };
255
268
  }
269
+ executionLock = pm.getExecutionLock?.() || null;
256
270
  } catch {
257
271
  /* snapshot is best-effort */
258
272
  }
259
- return { active: pm.isActive(), state: pm.state || null, items, risk };
273
+ return {
274
+ active: pm.isActive(),
275
+ state: pm.state || null,
276
+ plan_id: planId,
277
+ plan_version: planVersion,
278
+ previous_plan_id: previousPlanId,
279
+ items,
280
+ risk,
281
+ ...(executionLock ? { execution_lock: executionLock } : {}),
282
+ };
260
283
  }
261
284
 
262
285
  const MAX_PLAN_REVIEW_SNAPSHOT_CHARS = 24000;
286
+ const MAX_PLAN_REVIEW_COMMENTS = 64;
287
+ const MAX_PLAN_REVIEW_COMMENT_CHARS = 2000;
288
+
289
+ function boundedReviewString(value, limit) {
290
+ return String(value == null ? "" : value).slice(0, limit);
291
+ }
292
+
293
+ function normalizePlanReviewComments(values) {
294
+ const out = [];
295
+ let remaining = MAX_PLAN_REVIEW_SNAPSHOT_CHARS;
296
+ for (const raw of Array.isArray(values)
297
+ ? values.slice(0, MAX_PLAN_REVIEW_COMMENTS)
298
+ : []) {
299
+ if (!raw || typeof raw !== "object" || remaining <= 0) continue;
300
+ const text = boundedReviewString(
301
+ raw.text,
302
+ Math.min(MAX_PLAN_REVIEW_COMMENT_CHARS, remaining),
303
+ ).trim();
304
+ if (!text) continue;
305
+ remaining -= text.length;
306
+ const positive = (value) => {
307
+ const number = Number(value);
308
+ return Number.isInteger(number) && number > 0 ? number : null;
309
+ };
310
+ out.push({
311
+ id: boundedReviewString(raw.id, 160) || `comment-${out.length + 1}`,
312
+ sourceLine: positive(raw.sourceLine),
313
+ itemId: boundedReviewString(raw.itemId, 160) || null,
314
+ text,
315
+ file: boundedReviewString(raw.file, 1024) || null,
316
+ line: positive(raw.line),
317
+ column: positive(raw.column),
318
+ turn: positive(raw.turn),
319
+ });
320
+ }
321
+ return out;
322
+ }
323
+
324
+ function normalizePlanExecutionLock(value) {
325
+ if (!value || typeof value !== "object") return null;
326
+ const strings = (input, limit = 128) => [
327
+ ...new Set(
328
+ (Array.isArray(input) ? input : [])
329
+ .slice(0, limit)
330
+ .map((entry) => boundedReviewString(entry, 160))
331
+ .filter(Boolean),
332
+ ),
333
+ ];
334
+ return {
335
+ planId: boundedReviewString(value.planId, 160),
336
+ permissionMode: boundedReviewString(value.permissionMode, 64) || "default",
337
+ approvedItemIds: strings(value.approvedItemIds),
338
+ allowedTools: strings(value.allowedTools),
339
+ ...(value.createdAt
340
+ ? { createdAt: boundedReviewString(value.createdAt, 64) }
341
+ : {}),
342
+ };
343
+ }
263
344
 
264
345
  function planReviewFromInput(obj) {
265
346
  const review =
@@ -270,7 +351,8 @@ function planReviewFromInput(obj) {
270
351
  : typeof review?.snapshot === "string"
271
352
  ? review.snapshot
272
353
  : "";
273
- if (!snapshot.trim()) return null;
354
+ const comments = normalizePlanReviewComments(review?.comments);
355
+ if (!snapshot.trim() && comments.length === 0) return null;
274
356
  const text =
275
357
  snapshot.length > MAX_PLAN_REVIEW_SNAPSHOT_CHARS
276
358
  ? snapshot.slice(0, MAX_PLAN_REVIEW_SNAPSHOT_CHARS) +
@@ -282,22 +364,43 @@ function planReviewFromInput(obj) {
282
364
  typeof review?.reviewedAt === "string" ? review.reviewedAt : null,
283
365
  conversationId:
284
366
  typeof review?.conversationId === "string" ? review.conversationId : null,
367
+ revision:
368
+ Number.isInteger(review?.revision) && review.revision > 0
369
+ ? review.revision
370
+ : null,
371
+ comments,
372
+ executionLock: normalizePlanExecutionLock(review?.executionLock),
285
373
  snapshot: text,
286
374
  };
287
375
  }
288
376
 
289
377
  function planReviewSystemMessage(review) {
290
- if (!review?.snapshot) return null;
378
+ if (!review || (!review.snapshot && !review.comments?.length)) return null;
291
379
  const meta = [
292
380
  review.action ? `action=${review.action}` : null,
293
381
  review.reviewedAt ? `reviewedAt=${review.reviewedAt}` : null,
294
382
  review.conversationId ? `conversationId=${review.conversationId}` : null,
383
+ review.revision ? `revision=${review.revision}` : null,
295
384
  ]
296
385
  .filter(Boolean)
297
386
  .join(" ");
298
- return (
299
- "[PLAN REVIEW SNAPSHOT]" + (meta ? ` ${meta}` : "") + "\n" + review.snapshot
300
- );
387
+ const sections = [
388
+ "[PLAN REVIEW SNAPSHOT]" + (meta ? ` ${meta}` : ""),
389
+ review.snapshot || "(no Markdown snapshot)",
390
+ ];
391
+ if (review.comments?.length) {
392
+ sections.push(
393
+ "[PLAN REVIEW STRUCTURED COMMENTS]",
394
+ JSON.stringify(review.comments),
395
+ );
396
+ }
397
+ if (review.executionLock) {
398
+ sections.push(
399
+ "[PLAN REVIEW REQUESTED EXECUTION LOCK - AUDIT ONLY]",
400
+ JSON.stringify(review.executionLock),
401
+ );
402
+ }
403
+ return sections.join("\n");
301
404
  }
302
405
  import { withQuietStdout } from "./quiet-stdout.js";
303
406
 
@@ -329,7 +432,8 @@ export function parseInputEvent(line) {
329
432
  // Plan-mode control events (chat-panel plan UI):
330
433
  // {"type":"plan","action":"enter"|"approve"|"reject"}
331
434
  if (obj && typeof obj === "object" && obj.type === "plan") {
332
- const action = String(obj.action || "").toLowerCase();
435
+ const rawAction = String(obj.action || "").toLowerCase();
436
+ const action = rawAction === "requestchanges" ? "revise" : rawAction;
333
437
  if (!action) return null;
334
438
  const planReview = planReviewFromInput(obj);
335
439
  return planReview ? { plan: action, planReview } : { plan: action };
@@ -583,7 +687,7 @@ function buildSideEffectRecovery(ledger) {
583
687
  async function runTurn(
584
688
  messages,
585
689
  loopOptions,
586
- { runLoop, emit, costBudget, nextToolUseId, sideEffects },
690
+ { runLoop, emit, costBudget, nextToolUseId, sideEffects, turnNumber },
587
691
  ) {
588
692
  const usage = {
589
693
  input_tokens: 0,
@@ -595,10 +699,14 @@ async function runTurn(
595
699
  let finalText = "";
596
700
  let endReason = "complete";
597
701
  let stopForCost = false;
702
+ let responseCompleted = false;
598
703
  // P0-2: the side-effect op currently in flight (at most one — the loop runs
599
704
  // tools serially). Non-null only between a dangerous tool's tool-executing
600
705
  // and its tool-result.
601
706
  let currentSideEffectOpId = null;
707
+ const diffReviewFollowUps = new DiffReviewFollowUpTracker(
708
+ sideEffects?.ledger,
709
+ );
602
710
 
603
711
  // Collapse consecutive same-role turns before the model call ONLY when the
604
712
  // caller flags a resume-degenerate transcript (`mergeRoles`): a resumed
@@ -629,13 +737,28 @@ async function runTurn(
629
737
  // agent-sdk docs/PROTOCOL.md §1.2.1): the matching tool_result below
630
738
  // echoes the same id so UIs can pair calls without adjacency.
631
739
  const toolUseId = nextToolUseId ? nextToolUseId() : undefined;
632
- toolCalls.push({ id: toolUseId, tool: event.tool, args: event.args });
740
+ const pm = getPlanModeManager();
741
+ const planItem = pm.startPlanItemForTool(event.tool, {
742
+ toolUseId,
743
+ turn: turnNumber,
744
+ });
745
+ toolCalls.push({
746
+ id: toolUseId,
747
+ tool: event.tool,
748
+ args: event.args,
749
+ planItemId: planItem?.id || null,
750
+ });
633
751
  emit({
634
752
  type: "tool_use",
635
753
  ...(toolUseId ? { id: toolUseId } : {}),
754
+ ...(planItem?.id ? { plan_item_id: planItem.id } : {}),
755
+ ...(planItem?.turn ? { turn: planItem.turn } : {}),
636
756
  tool: event.tool,
637
757
  args: event.args,
638
758
  });
759
+ if (planItem) {
760
+ emit({ type: "plan_update", ...planSnapshot(pm) });
761
+ }
639
762
  // P0-2: record an irreversible effect as STARTED (persisted before it
640
763
  // settles) so a crash before the matching tool-result leaves a
641
764
  // reconcilable "in flight" marker instead of a silent replay — mirrors
@@ -673,6 +796,13 @@ async function runTurn(
673
796
  // P0-2: settle the in-flight side-effect (commit on success, fail on
674
797
  // a clean error) and persist the updated ledger snapshot.
675
798
  if (sideEffects && currentSideEffectOpId) {
799
+ if (event.result?._diffReviewAudit) {
800
+ diffReviewFollowUps.observe(
801
+ sideEffects.ledger,
802
+ currentSideEffectOpId,
803
+ event.result._diffReviewAudit,
804
+ );
805
+ }
676
806
  if (err)
677
807
  sideEffects.ledger.fail(
678
808
  currentSideEffectOpId,
@@ -688,14 +818,29 @@ async function runTurn(
688
818
  const lastCall =
689
819
  toolCalls.length > 0 ? toolCalls[toolCalls.length - 1] : null;
690
820
  if (lastCall) lastCall.is_error = Boolean(err);
821
+ const pm = getPlanModeManager();
822
+ const settledItem = lastCall?.planItemId
823
+ ? pm.settlePlanItem(lastCall.planItemId, {
824
+ success: !err,
825
+ error: err,
826
+ result: event.result,
827
+ })
828
+ : null;
691
829
  emit({
692
830
  type: "tool_result",
693
831
  ...(lastCall?.id ? { id: lastCall.id } : {}),
832
+ ...(lastCall?.planItemId
833
+ ? { plan_item_id: lastCall.planItemId }
834
+ : {}),
835
+ ...(settledItem?.turn ? { turn: settledItem.turn } : {}),
694
836
  tool: event.tool,
695
837
  is_error: Boolean(err),
696
838
  error: err,
697
839
  result: event.result,
698
840
  });
841
+ if (settledItem) {
842
+ emit({ type: "plan_update", ...planSnapshot(pm) });
843
+ }
699
844
  break;
700
845
  }
701
846
  case "token-usage":
@@ -735,6 +880,7 @@ async function runTurn(
735
880
  break;
736
881
  case "response-complete":
737
882
  finalText = event.content || "";
883
+ responseCompleted = true;
738
884
  break;
739
885
  case "run-ended":
740
886
  if (event.reason) endReason = event.reason;
@@ -747,6 +893,18 @@ async function runTurn(
747
893
  // just the switch) so no further paid LLM call is made.
748
894
  if (stopForCost) break;
749
895
  }
896
+ if (
897
+ sideEffects &&
898
+ diffReviewFollowUps.complete(sideEffects.ledger, {
899
+ status:
900
+ responseCompleted || endReason === "complete"
901
+ ? "completed-without-reproposal"
902
+ : "interrupted",
903
+ reason: responseCompleted || endReason === "complete" ? null : endReason,
904
+ }).length > 0
905
+ ) {
906
+ sideEffects.persist();
907
+ }
750
908
  return { finalText, endReason, usage, toolCalls };
751
909
  }
752
910
 
@@ -1137,6 +1295,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1137
1295
  options: qOptions,
1138
1296
  multiSelect,
1139
1297
  timeoutMs,
1298
+ metadata,
1140
1299
  } = {}) =>
1141
1300
  new Promise((resolve, reject) => {
1142
1301
  const id = `q-${++questionSeq}`;
@@ -1151,6 +1310,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1151
1310
  question: typeof question === "string" ? question : "",
1152
1311
  options: Array.isArray(qOptions) ? qOptions : null,
1153
1312
  multiSelect: multiSelect === true,
1313
+ ...(metadata && typeof metadata === "object" ? { metadata } : {}),
1154
1314
  });
1155
1315
  });
1156
1316
 
@@ -1458,6 +1618,39 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1458
1618
  }
1459
1619
  }
1460
1620
 
1621
+ // MCP servers may pause a tool flow with `elicitation/create`. Register the
1622
+ // handler only after MCP resolution so the client is initialized before use.
1623
+ // Reuse the structured Desktop/headless question channel, while preserving
1624
+ // the MCP response shape (`action` + object `content`) at this boundary.
1625
+ if (mcp?.mcpClient?.setElicitationHandler && interactiveQuestions) {
1626
+ mcp.mcpClient.setElicitationHandler(async (request) => {
1627
+ const { emitHooksV2Event } = await import("../lib/hooks-v2-producers.js");
1628
+ emitHooksV2Event("MCPElicitation", {
1629
+ server: request.server || null,
1630
+ request_id: request.requestId ?? null,
1631
+ message: request.message || "MCP server requests additional input",
1632
+ requested_schema: request.requestedSchema || null,
1633
+ session_id: sessionId,
1634
+ });
1635
+ const answer = await interactionAskUser({
1636
+ question: request.message || "MCP server requests additional input",
1637
+ timeoutMs: request.timeoutMs,
1638
+ metadata: {
1639
+ kind: "mcp_elicitation",
1640
+ server: request.server,
1641
+ requestId: request.requestId,
1642
+ requestedSchema: request.requestedSchema || null,
1643
+ },
1644
+ });
1645
+ if (answer == null) return { action: "cancel" };
1646
+ return {
1647
+ action: "accept",
1648
+ content:
1649
+ answer && typeof answer === "object" ? answer : { value: answer },
1650
+ };
1651
+ });
1652
+ }
1653
+
1461
1654
  // Seed MCP roots for --add-dir (roots/list_changed parity): advertise the full
1462
1655
  // workspace-root list to connected MCP servers when the stream session started
1463
1656
  // with extra roots. No --add-dir → workspaceRootDirs = [cwd] → no-op. Mirrors
@@ -1563,6 +1756,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1563
1756
  approvalGate,
1564
1757
  permissionRules,
1565
1758
  settingsHooks,
1759
+ toolAdmission: options.toolAdmission || null,
1566
1760
  classifyAllShell,
1567
1761
  enabledToolNames,
1568
1762
  disabledTools,
@@ -1812,10 +2006,14 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1812
2006
  // exits plan mode. Every control answers with a `plan_update` event.
1813
2007
  if (parsed.plan) {
1814
2008
  const pm = getPlanModeManager();
1815
- const reviewMessage =
1816
- parsed.plan === "approve" || parsed.plan === "reject"
1817
- ? planReviewSystemMessage(parsed.planReview)
1818
- : null;
2009
+ const reviewMessage = [
2010
+ "approve",
2011
+ "reject",
2012
+ "revise",
2013
+ "regenerate",
2014
+ ].includes(parsed.plan)
2015
+ ? planReviewSystemMessage(parsed.planReview)
2016
+ : null;
1819
2017
  if (reviewMessage) {
1820
2018
  messages.push({ role: "system", content: reviewMessage });
1821
2019
  }
@@ -1848,7 +2046,47 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1848
2046
  });
1849
2047
  continue;
1850
2048
  }
1851
- if (parsed.plan === "approve") {
2049
+ if (parsed.plan === "revise" || parsed.plan === "regenerate") {
2050
+ if (!pm.isActive()) {
2051
+ emit({
2052
+ type: "plan_update",
2053
+ ...planSnapshot(pm),
2054
+ session_id: sessionId,
2055
+ note: "nothing to revise",
2056
+ });
2057
+ continue;
2058
+ }
2059
+ const revision = pm.beginPlanRevision({
2060
+ reason: parsed.plan,
2061
+ });
2062
+ if (revision.error) {
2063
+ emit({
2064
+ type: "plan_update",
2065
+ ...planSnapshot(pm),
2066
+ session_id: sessionId,
2067
+ note: revision.error,
2068
+ });
2069
+ continue;
2070
+ }
2071
+ messages.push({
2072
+ role: "system",
2073
+ content:
2074
+ `[PLAN REVISION REQUESTED] Plan ${revision.previousPlan.id} is frozen. ` +
2075
+ `Create version ${revision.plan.version} as plan ${revision.plan.id}. ` +
2076
+ (parsed.plan === "regenerate"
2077
+ ? "Regenerate the plan from scratch using the review snapshot."
2078
+ : "Revise the plan using the inline comments and reviewer notes."),
2079
+ });
2080
+ emit({
2081
+ type: "plan_update",
2082
+ ...planSnapshot(pm),
2083
+ session_id: sessionId,
2084
+ });
2085
+ parsed.text =
2086
+ parsed.plan === "regenerate"
2087
+ ? "Regenerate the plan from the review feedback."
2088
+ : "Revise the plan from the review feedback.";
2089
+ } else if (parsed.plan === "approve") {
1852
2090
  if (!pm.isActive() || !(pm.currentPlan?.items?.length > 0)) {
1853
2091
  emit({
1854
2092
  type: "plan_update",
@@ -1858,10 +2096,17 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1858
2096
  });
1859
2097
  continue;
1860
2098
  }
1861
- pm.approvePlan();
2099
+ const approval = pm.approvePlan({
2100
+ permissionMode: options.permissionMode || "default",
2101
+ });
2102
+ const executionLock = approval.executionLock;
1862
2103
  messages.push({
1863
2104
  role: "system",
1864
- content: `[PLAN APPROVED] The user has approved your plan with ${pm.currentPlan.items.length} items. You can now use all tools including write_file, edit_file, run_shell, and run_skill. Execute the plan items in order.`,
2105
+ content:
2106
+ `[PLAN APPROVED] The user has approved your plan with ${pm.currentPlan.items.length} items. ` +
2107
+ `Permission mode is ${executionLock.permissionMode}. The execution lock permits only: ` +
2108
+ `${executionLock.allowedTools.join(", ")}. Execute the approved plan items in order; ` +
2109
+ "request a plan revision before using any other tool.",
1865
2110
  });
1866
2111
  emit({
1867
2112
  type: "plan_update",
@@ -2166,7 +2411,14 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
2166
2411
  // Resume-degenerate role merge for the first live model call only.
2167
2412
  mergeRoles: mergeRolesThisTurn,
2168
2413
  },
2169
- { runLoop, emit, costBudget, nextToolUseId, sideEffects },
2414
+ {
2415
+ runLoop,
2416
+ emit,
2417
+ costBudget,
2418
+ nextToolUseId,
2419
+ sideEffects,
2420
+ turnNumber: turns,
2421
+ },
2170
2422
  );
2171
2423
  } catch (err) {
2172
2424
  currentAbort = null;
@@ -34,6 +34,7 @@ import {
34
34
  isInJetbrainsContext,
35
35
  } from "../lib/jetbrains-bridge.js";
36
36
  import { collectPluginMcpServers } from "../lib/plugin-runtime/mcp.js";
37
+ import { EventRuntimeStore } from "../lib/event-runtime-store.js";
37
38
 
38
39
  /**
39
40
  * Normalize a parsed config object into a `{ name: serverConfig }` map.
@@ -150,7 +151,9 @@ export function mcpAuthHint(url, errMessage) {
150
151
  */
151
152
  export async function setupMcpFromConfig(servers, deps = {}) {
152
153
  const writeErr = deps.writeErr || (() => {});
153
- const createClient = deps.createClient || (() => new MCPClient());
154
+ const createClient =
155
+ deps.createClient ||
156
+ (() => new MCPClient({ eventRuntimeStore: deps.eventRuntimeStore || null }));
154
157
  servers = filterMcpServersByPolicy(servers, deps.mcpPolicy, writeErr);
155
158
 
156
159
  // `deps.into` lets a second batch (e.g. registered servers) accumulate into
@@ -191,6 +194,12 @@ export async function setupMcpFromConfig(servers, deps = {}) {
191
194
  if (deps.sessionId != null && typeof mcpClient.setSessionId === "function") {
192
195
  mcpClient.setSessionId(deps.sessionId);
193
196
  }
197
+ if (typeof mcpClient.setElicitationHandler === "function" &&
198
+ typeof deps.elicitationHandler === "function") {
199
+ mcpClient.setElicitationHandler(deps.elicitationHandler, {
200
+ timeoutMs: deps.elicitationTimeoutMs,
201
+ });
202
+ }
194
203
 
195
204
  for (const [name, cfg] of Object.entries(servers)) {
196
205
  // Skip a name already connected — an earlier batch (ad-hoc --mcp-config)
@@ -745,6 +754,11 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
745
754
  const doIde = deps.loadIdeMcp || loadIdeMcp;
746
755
  const doPdh = deps.loadPdhMcp || loadPdhMcp;
747
756
  const doJetbrains = deps.loadJetbrainsMcp || loadJetbrainsMcp;
757
+ const runtimeEnv = args.env || process.env;
758
+ const eventRuntimeStore =
759
+ deps.eventRuntimeStore ||
760
+ args.eventRuntimeStore ||
761
+ (runtimeEnv.CC_EVENT_RUNTIME_DURABLE === "1" ? new EventRuntimeStore() : null);
748
762
  // Thread the agent session id down to setupMcpFromConfig so spawned stdio MCP
749
763
  // servers get CC_SESSION_ID / CLAUDE_CODE_SESSION_ID (Claude-Code parity).
750
764
  let mcpPolicy = deps.mcpPolicy || null;
@@ -759,6 +773,7 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
759
773
  const fwd = {
760
774
  ...deps,
761
775
  ...(args.sessionId != null ? { sessionId: args.sessionId } : {}),
776
+ ...(eventRuntimeStore ? { eventRuntimeStore } : {}),
762
777
  mcpPolicy,
763
778
  };
764
779
  let result = null;
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-BBNg08cD.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function D(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const I=v(B,[["render",D],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-9KS1eD/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{I as default};
@@ -1 +0,0 @@
1
- import{E as N,r as k,I as m,J as F,U as d,c as i,K as l,V as u,S as P,F as R,Z as q,o as I,a as A,P as g,Q as x,R as C,_ as D}from"./vendor-Bn1JzzAn.js";import{u as M,_ as E,d as _}from"./index-BBNg08cD.js";import{a as H,b as W,c as j}from"./parsers-UEvh_ShA.js";import{R as J}from"./icons-DG5UD-6K.js";const B=N("providers",()=>{const K=k(!1),o=k(null),v=k([]),e=k([]),w=k(null);async function U(){const s=M();K.value=!0;try{const{output:f}=await s.execute("llm providers",15e3);v.value=H(f);const p=v.value.find(h=>h.active);p&&(w.value=p.name);const{output:b}=await s.execute("llm models",15e3);e.value=W(b)}catch(f){console.error("Failed to load providers:",f)}finally{K.value=!1}}async function y(s){await M().execute(`llm switch ${s}`,1e4),v.value.forEach(p=>p.active=p.name===s),w.value=s}async function a(s){const f=M();o.value=s;try{const{output:p,exitCode:b}=await f.execute("llm test",3e4),h=v.value.find(L=>L.name===s);return h&&(h.status=b===0?"ok":"error"),b===0}catch{const p=v.value.find(b=>b.name===s);return p&&(p.status="error"),!1}finally{o.value=null}}return{loading:K,testing:o,providers:v,localModels:e,activeProvider:w,loadProviders:U,switchProvider:y,testProvider:a}}),Q={__name:"Providers",setup(K,{expose:o}){o();const v=B(),e=M(),w=k(!1),U=k(!1),y=k(!1),a=A({provider:void 0,model:"",apiKey:"",baseUrl:"",temperature:.7,maxTokens:4096});let s={};const f=["ollama","openai","anthropic","volcengine","deepseek","gemini","groq","mistral","custom","zhipu"],p={ollama:"Ollama(本地)",openai:"OpenAI",anthropic:"Anthropic",volcengine:"火山引擎(豆包)",deepseek:"DeepSeek",gemini:"Google Gemini",groq:"Groq",mistral:"Mistral",custom:"Custom(自定义)",zhipu:"智谱 AI"},b=f.map(n=>({value:n,label:p[n]||n}));async function h(n){try{await v.switchProvider(n),_.success(`已切换到 ${n}`)}catch(t){_.error(`切换失败: ${t.message}`)}}async function L(n){await v.testProvider(n)?_.success(`${n} 连接正常`):_.warning(`${n} 连接失败,请检查配置`)}async function z(){w.value=!0;try{const{output:n}=await e.execute("config list",15e3),t=j(n);t.provider&&(a.provider=t.provider),t.model&&(a.model=t.model),t.apiKey&&(a.apiKey=t.apiKey),t.baseUrl&&(a.baseUrl=t.baseUrl),t.temperature!==void 0&&(a.temperature=t.temperature),t.maxTokens!==void 0&&(a.maxTokens=t.maxTokens),s={provider:t.provider??"",model:t.model??"",apiKey:t.apiKey??"",baseUrl:t.baseUrl??"",temperature:t.temperature??a.temperature,maxTokens:t.maxTokens??a.maxTokens},_.success("配置已加载")}catch(n){_.error(`加载配置失败: ${n.message}`)}finally{w.value=!1}}async function O(){U.value=!0;const n=[],t=[];try{if(a.provider&&a.provider!==s.provider)try{await e.execute(`config set llm.provider ${a.provider}`,1e4),t.push("provider")}catch(c){n.push(`provider: ${c.message}`)}if(a.model&&a.model!==s.model)try{await e.execute(`config set llm.model ${a.model}`,1e4),t.push("model")}catch(c){n.push(`model: ${c.message}`)}if(a.apiKey&&a.apiKey!==s.apiKey)try{await e.execute(`config set llm.apiKey ${a.apiKey}`,1e4),t.push("apiKey")}catch(c){n.push(`apiKey: ${c.message}`)}if(a.baseUrl!==void 0&&a.baseUrl!==s.baseUrl)try{await e.execute(`config set llm.baseUrl ${a.baseUrl}`,1e4),t.push("baseUrl")}catch(c){n.push(`baseUrl: ${c.message}`)}if(a.temperature!==s.temperature)try{await e.execute(`config set llm.temperature ${a.temperature}`,1e4),t.push("temperature")}catch(c){n.push(`temperature: ${c.message}`)}if(a.maxTokens!==s.maxTokens)try{await e.execute(`config set llm.maxTokens ${a.maxTokens}`,1e4),t.push("maxTokens")}catch(c){n.push(`maxTokens: ${c.message}`)}n.length>0?_.warning(`部分配置保存失败: ${n.join("; ")}`):t.length>0?(_.success(`已保存 ${t.length} 项配置`),s={...a},(t.includes("apiKey")||t.includes("provider")||t.includes("baseUrl")||t.includes("model"))&&(y.value=!0),t.includes("provider")&&v.loadProviders()):_.info("没有检测到配置变更")}catch(c){_.error(`保存配置失败: ${c.message}`)}finally{U.value=!1}}function S(){a.provider=s.provider||void 0,a.model=s.model||"",a.apiKey=s.apiKey||"",a.baseUrl=s.baseUrl||"",a.temperature=s.temperature??.7,a.maxTokens=s.maxTokens??4096}I(()=>{v.loadProviders(),z()});const T={providersStore:v,ws:e,configLoading:w,configSaving:U,showRestartHint:y,configForm:a,get loadedConfig(){return s},set loadedConfig(n){s=n},knownProviders:f,providerLabels:p,providerOptions:b,switchProvider:h,test:L,loadConfig:z,saveConfig:O,resetForm:S,onMounted:I,reactive:A,ref:k,get ReloadOutlined(){return J},get message(){return _},get useProvidersStore(){return B},get useWsStore(){return M},get parseLlmConfigOutput(){return j}};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}},Z={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},X={key:1,style:{"text-align":"center",padding:"60px"}},Y={class:"providers-grid"},$={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},ee={style:{"font-size":"24px"}},oe={style:{flex:"1"}},ae={style:{color:"#e0e0e0","font-weight":"500"}},te={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},re={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},se={key:0,style:{"margin-top":"24px"}},ne={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"16px"}},le={class:"config-grid"},de={style:{display:"flex","align-items":"center",gap:"12px"}},ce={style:{display:"flex",gap:"12px","justify-content":"flex-end","margin-top":"16px"}};function me(K,o,v,e,w,U){const y=m("a-button"),a=m("a-alert"),s=m("a-spin"),f=m("a-tag"),p=m("a-badge"),b=m("a-card"),h=m("a-list-item"),L=m("a-list"),z=m("a-divider"),O=m("a-select"),S=m("a-form-item"),T=m("a-input"),n=m("a-input-password"),t=m("a-slider"),c=m("a-input-number"),V=m("a-form");return g(),F("div",null,[d("div",Z,[o[10]||(o[10]=d("div",null,[d("h2",{class:"page-title"},"LLM 配置"),d("p",{class:"page-sub"},"管理 AI 服务提供商")],-1)),i(y,{type:"primary",ghost:"",loading:e.providersStore.loading,onClick:o[0]||(o[0]=r=>e.providersStore.loadProviders())},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[9]||(o[9]=x(" 刷新 ",-1))]),_:1},8,["loading"])]),u(" Active Provider Banner "),e.providersStore.activeProvider?(g(),P(a,{key:0,type:"success",style:{"margin-bottom":"20px",background:"rgba(41,162,112,.08)","border-color":"rgba(41,162,112,.3)"},"show-icon":""},{message:l(()=>[d("span",null,[o[11]||(o[11]=x("当前激活:",-1)),d("strong",null,C(e.providersStore.activeProvider),1)])]),_:1})):u("v-if",!0),u(" Loading "),e.providersStore.loading?(g(),F("div",X,[i(s,{size:"large"}),o[12]||(o[12]=d("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载 LLM 信息中...",-1))])):(g(),F(R,{key:2},[u(" Providers Grid "),d("div",null,[d("div",Y,[(g(!0),F(R,null,q(e.providersStore.providers,r=>(g(),P(b,{key:r.name,class:D(["provider-card",{active:r.active}]),style:{background:"var(--bg-card)"},size:"small"},{default:l(()=>[d("div",$,[d("span",ee,C(r.icon),1),d("div",oe,[d("div",ae,C(r.label),1),d("div",te,C(r.name),1)]),d("div",null,[r.active?(g(),P(f,{key:0,color:"green"},{default:l(()=>[...o[13]||(o[13]=[x("活跃",-1)])]),_:1})):r.status==="ok"?(g(),P(p,{key:1,status:"success",text:""})):r.status==="error"?(g(),P(p,{key:2,status:"error",text:""})):u("v-if",!0)])]),d("div",re,[i(y,{size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"},loading:e.providersStore.testing===r.name,onClick:G=>e.test(r.name)},{default:l(()=>[...o[14]||(o[14]=[x(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),r.active?(g(),P(f,{key:1,color:"green",style:{margin:"0","line-height":"24px"}},{default:l(()=>[...o[16]||(o[16]=[x("当前",-1)])]),_:1})):(g(),P(y,{key:0,size:"small",type:"primary",ghost:"",onClick:G=>e.switchProvider(r.name)},{default:l(()=>[...o[15]||(o[15]=[x(" 切换 ",-1)])]),_:1},8,["onClick"]))])]),_:2},1032,["class"]))),128))]),u(" Local Models (Ollama) "),e.providersStore.localModels.length?(g(),F("div",se,[o[17]||(o[17]=d("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}}," 本地模型(Ollama) ",-1)),i(L,{"data-source":e.providersStore.localModels,size:"small",style:{background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)"}},{renderItem:l(({item:r})=>[i(h,{style:{padding:"10px 16px","border-color":"#252525"}},{actions:l(()=>[i(f,{color:"cyan",style:{"font-size":"10px"}},{default:l(()=>[x(C(r.size||"local"),1)]),_:2},1024)]),default:l(()=>[d("span",ne,C(r.name),1)]),_:2},1024)]),_:1},8,["data-source"])])):u("v-if",!0),u(" LLM Parameter Settings "),i(z,{style:{"border-color":"var(--border-color)",margin:"32px 0 24px"}}),e.showRestartHint?(g(),P(a,{key:1,type:"warning","show-icon":"",closable:"",style:{"margin-bottom":"16px"},message:"配置已保存,但当前聊天会话仍在用旧 key",description:"桌面端的 LLM 会话只在新建会话时重读配置。请新建一个 Chat,或重启应用,新 key/Provider 才会生效。",onClose:o[1]||(o[1]=r=>e.showRestartHint=!1)})):u("v-if",!0),d("div",ie,[o[19]||(o[19]=d("h3",{class:"section-title"},"LLM 参数设置",-1)),i(y,{size:"small",loading:e.configLoading,onClick:e.loadConfig,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[18]||(o[18]=x(" 加载配置 ",-1))]),_:1},8,["loading"])]),i(b,{class:"config-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[i(V,{model:e.configForm,layout:"vertical",class:"config-form"},{default:l(()=>[d("div",le,[u(" Provider "),i(S,{label:"Provider(提供商)"},{default:l(()=>[i(O,{value:e.configForm.provider,"onUpdate:value":o[2]||(o[2]=r=>e.configForm.provider=r),placeholder:"选择 LLM 提供商",options:e.providerOptions,style:{width:"100%"},disabled:e.configSaving},null,8,["value","options","disabled"])]),_:1}),u(" Model "),i(S,{label:"Model(模型名称)"},{default:l(()=>[i(T,{value:e.configForm.model,"onUpdate:value":o[3]||(o[3]=r=>e.configForm.model=r),placeholder:"例如 doubao-seed-1-6-251015","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" API Key "),i(S,{label:"API Key"},{default:l(()=>[i(n,{value:e.configForm.apiKey,"onUpdate:value":o[4]||(o[4]=r=>e.configForm.apiKey=r),placeholder:"输入 API Key",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Base URL "),i(S,{label:"Base URL"},{default:l(()=>[i(T,{value:e.configForm.baseUrl,"onUpdate:value":o[5]||(o[5]=r=>e.configForm.baseUrl=r),placeholder:"例如 https://ark.cn-beijing.volces.com/api/v3","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Temperature "),i(S,{label:"Temperature(温度)"},{default:l(()=>[d("div",de,[i(t,{value:e.configForm.temperature,"onUpdate:value":o[6]||(o[6]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,style:{flex:"1"},disabled:e.configSaving},null,8,["value","disabled"]),i(c,{value:e.configForm.temperature,"onUpdate:value":o[7]||(o[7]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,precision:1,style:{width:"80px"},disabled:e.configSaving},null,8,["value","disabled"])])]),_:1}),u(" Max Tokens "),i(S,{label:"Max Tokens(最大输出长度)"},{default:l(()=>[i(c,{value:e.configForm.maxTokens,"onUpdate:value":o[8]||(o[8]=r=>e.configForm.maxTokens=r),min:256,max:128e3,step:256,style:{width:"100%"},placeholder:"4096",disabled:e.configSaving},null,8,["value","disabled"])]),_:1})]),d("div",ce,[i(y,{onClick:e.resetForm,disabled:e.configSaving,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:l(()=>[...o[20]||(o[20]=[x(" 重置 ",-1)])]),_:1},8,["disabled"]),i(y,{type:"primary",loading:e.configSaving,onClick:e.saveConfig},{default:l(()=>[...o[21]||(o[21]=[x(" 保存配置 ",-1)])]),_:1},8,["loading"])])]),_:1},8,["model"])]),_:1})])],2112))])}const ge=E(Q,[["render",me],["__scopeId","data-v-64155d06"],["__file","/tmp/cc-web-panel-9KS1eD/repo/packages/web-panel/src/views/Providers.vue"]]);export{ge as default};
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{u as fe,_ as me,d as V,e as U}from"./index-BBNg08cD.js";import{I as z,J as x,U as _,Q as P,S as Q,K as T,V as R,c as A,F as Y,Z,R as E,o as G,f as H,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-Bn1JzzAn.js";import{R as ye,b as pe,at as ge}from"./icons-DG5UD-6K.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(D=>({seq:D.seq,data:ae(D.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function D(t){return t?t.slice(0,8):""}let O=null,M=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:M}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),L=new p.FitAddon;m.loadAddon(L),m.open(b);try{L.fit()}catch{}t.xterm=m,t.fitAddon=L;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const j=new ResizeObserver(()=>{try{L.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});j.observe(b);const ue=t.offs;t.offs=()=>{try{j.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function K(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}G(async()=>{await K()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const X={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:D,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:K,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},De=["data-session-id"],Le={key:0,class:"xterm-placeholder"},Pe={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=P(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),Q(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[P(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=P(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=P(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),Q(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Y,null,Z(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Y,null,Z(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,De)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Le,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",Pe,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-9KS1eD/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-BBNg08cD.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-BVSLcaX2.js";import{a0 as t}from"./index-BBNg08cD.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-C5MJG_Yo.js";import"./useFlexGapSupport-Bq1twor3.js";import"./styleChecker-B6QAwAN5.js";import"./index-DHi634g9.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-Cx3BY-Up.js";import{a0 as t}from"./index-BBNg08cD.js";import"./vendor-Bn1JzzAn.js";import"./index-DHi634g9.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};