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.
- package/package.json +10 -10
- package/src/assets/web-panel/assets/{AIOps-DherW0Rh.js → AIOps-BDLu5Elz.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CDGfqt2Y.js → ActionButton-DH5us-CK.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BYhkzdgD.js → Analytics-BZ0u8IFG.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-cEKk1cpb.js → AppLayout-Duu8xR14.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-_aXR3WWc.js → Artifacts-Br2YBbh_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CYAf-gY7.js → Audit-C3C6a482.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D4Q20phR.js → BackgroundAgents-CzHvebcj.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cq0Tyk58.js → Backup-DZNHYDFd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CPj_CdAv.js → BaseInput-VRiC4fIx.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BQ-Qq0es.js → Chat-Cm08WWAD.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ci97vNTs.js → ChatBubbleRenderer-CGHYrugQ.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-rke6l3yg.js → Checkbox-DtByk7d7.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DiacrIPq.js → Codegen-CphXXOfD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Cx3BY-Up.js → Col-Hz86TnLR.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DfmWiQy8.js → Community-HP03ltpD.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DdQnpxy5.js → Compact-B_N1mqQz.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-lzliOH_r.js → Compliance-CVztRpi8.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CYx4Un5k.js → Cowork-wUVOyZih.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-BGDcPFlo.js → Cron-DW5TLJKw.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-0_X5g2ri.js → Crosschain-CrAFGhWH.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C0PEf3Eu.js → DID-pA-oD8ke.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DULQjQ58.js → Dashboard-CXrd5gAw.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DGRHRbW6.js → Dropdown-EweJcsek.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ChX8XPwB.js → EmailListRenderer-C9xVLPG4.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dyq6IBNu.js → FamilyGuardDashboard-CDcEEqlu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DH1NfAL2.js → Federation-DtZda9A_.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BN1I_uNi.js → FormItemContext-CiYdcVz3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Dq_2UYpe.js → GenericCardRenderer-DA13uwA0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BAy1yvI2.js → Git-DzRhZD1O.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Db6Q2iSy.js → Governance-D5RMgOSb.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-0ub6yHcr.js → Inference-BgrPfSNk.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DtLetM36.js → KnowledgeGraph-DzjnD571.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Bcoy7CUd.js → Logs-BhWzVDtN.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BfEMFAXf.js → MarkdownRenderer-BDape9cx.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-tt2rzwRR.js → Marketplace-DJtL5GV7.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BhOgX-MU.js → McpTools-CZcQygI7.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BJUxeWBL.js → Memory-DUWSDUUu.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BwUY2G9w.js → MobileBridge-BTwq2WKY.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B2WMboOm.js → Mtc-BiGugEQm.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-8pNEXO63.js → MtcAudit-DY7a6gUe.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C1wm5a_1.js → Multisig-BQbDu_w7.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C1QpKF7g.js → NLProgramming-CM2wXTLv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CiQUcxFu.js → Notes-DI6gGs1v.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BblDPJ_x.js → NotificationSettings-BsZOLWAB.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DRjYcPtb.js → OrderTableRenderer-C48mu09U.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dp3VKB0X.js → Organization-Cds0_tXr.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Czx161m9.js → Overflow-WunYMD87.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-ClFi6wOs.js → P2P-Bo6j4DDv.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CRweW0lz.js → PdhVaultBrowser-Bh2XPD5f.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BzcRoqTn.js → Permissions-EMvMMC8N.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-ChGTpNMd.js → PersonalDataHub-AX3ypUDV.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BMOOpKWA.js → Pipeline-BOx8HOgL.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D0AZHObH.js → Privacy-tBeTVQVM.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-yYFlZ6Ja.js → ProjectInit-CVYg1W4M.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DJNVuMQs.js → ProjectSettings-Dvt5I7y1.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Br0rBWH1.js → Projects-Cc7FC9-e.js} +1 -1
- package/src/assets/web-panel/assets/Providers-Ct8xqY-E.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-81NZOitV.js → QrScannerModal-Cni8Ooja.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Dic2lCbJ.js → QuickAsk-BJVLKdxr.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Dh9iwViE.js → Recommend-DPG8Rbbm.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Bq9VYEFy.js → RemoteSession-DsdR7dCt.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CxFZ-NbJ.js → Reputation-Csg1YM-b.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BVSLcaX2.js → Row-D9DoFoEf.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BbC-5DOH.js → RssFeed-BsvKrXMS.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BfjZ1GCr.js → Search-DFUStfgQ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CVjhOV5r.js → Security-ILg1zxdK.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D45u-Aqe.js → Services-Dd41PCaY.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-WkGoK4he.js → Skeleton-Bzo1cN80.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D_jvQZcj.js → Skills-BDHh17P0.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bf4QTF3E.js → Sla-jl7UTiRY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DVpZdbMN.js → SpeechSettings-BePa-RF6.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DEEojoMS.js → SyncSettings-DiqqDKGZ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DFwxpLIk.js → Tasks-DYQ_6lxj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bzl-9wY5.js → Templates-JiDeI06L.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-0khxUOB8.js → Tenant-hhgI6zwS.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B0Y4LONc.js → TimelineRenderer-B8uB5Llk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DEE07SFh.js → Tokens-C3b_6r2z.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BM7xvA5z.js → Trigger-tIP7HKVe.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Dv3ijvvZ.js → Trust-vjoc11vJ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B1-enmMt.js → UkeySign-DUPBnGuH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DYiIPByd.js → VideoEditing-CBvhUY5T.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-D-y374BQ.js → Wallet-DUaQ0uA5.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-HBDjcUhi.js → WebAuthn-DllSivjE.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-sKn4qTID.js → WorkflowEditor-xc8D3uO6.js} +1 -1
- package/src/assets/web-panel/assets/{chat-TVYhaBXj.js → chat-BVicU7oA.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DMADxY9v.js → colors-DJzLmhLm.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-OftcHpO_.js → compact-item-BvYRfThE.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DW1zVUSN.js → createContext-DGXxCBKR.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CaUathNp.js → hasIn-SBDJB1y4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeCIYYG7.js → index-1SdDS6lR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAfT3EMd.js → index-9gdI7uUW.js} +1 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +1 -0
- package/src/assets/web-panel/assets/{index-sm1sGIxW.js → index-BJZf9DhV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBNg08cD.js → index-BO1itZaY.js} +3 -3
- package/src/assets/web-panel/assets/{index-CKNdnJRo.js → index-BTrBGBJs.js} +1 -1
- package/src/assets/web-panel/assets/{index--5UvwqH_.js → index-BYqz4Wrr.js} +1 -1
- package/src/assets/web-panel/assets/{index-8YelceUU.js → index-Bf-ctERC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Lr0MO-GU.js → index-CKyEivf8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZdT8nio.js → index-CdGY9P8a.js} +1 -1
- package/src/assets/web-panel/assets/{index-s-EnkUCn.js → index-Cf-O_g_8.js} +1 -1
- package/src/assets/web-panel/assets/{index-pSVCBsG4.js → index-CloCgBUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-19mFhn.js → index-CoJAO1Lm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKjqFpYa.js → index-Crk5NTb0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ1PjRY3.js → index-Cs2rmLFt.js} +1 -1
- package/src/assets/web-panel/assets/{index-77kgkUgY.js → index-CtwqO5qo.js} +1 -1
- package/src/assets/web-panel/assets/{index-D63QVAiJ.js → index-D7HimK0M.js} +1 -1
- package/src/assets/web-panel/assets/{index-B52Ztt8Q.js → index-DCdRAgjy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHi634g9.js → index-DCqRS6da.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFVbDpqg.js → index-DHVLJ8q0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvRw4Fna.js → index-DKrvvWm4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZXYI5LU.js → index-DMarmfrv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CM8W07sc.js → index-DRfiXB_p.js} +1 -1
- package/src/assets/web-panel/assets/{index-iDmgT2Dg.js → index-Dm_77jgR.js} +1 -1
- package/src/assets/web-panel/assets/{index-hXq7QRA_.js → index-DnjPdvR6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEzLLVYd.js → index-DonCnfMr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYwwUKDg.js → index-DvUTDYXX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXcqvWBp.js → index-FxZzRyE1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmdv6Dev.js → index-MjC4G09d.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9JoaYSs.js → index-VMfwIH5G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK-p7Hji.js → index-YJkzy8ZF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BupSWDcl.js → index-d5BVd-cL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bg-7FpaL.js → index-e4fXH_WO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpDtN0dl.js → index-hxTODbM1.js} +1 -1
- package/src/assets/web-panel/assets/{index-kdMl_0zL.js → index-lpaGoTH3.js} +1 -1
- package/src/assets/web-panel/assets/{index-GUKz4Pv9.js → index-wcCL-miV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWVZ3T0t.js → index-xfluRkCT.js} +1 -1
- package/src/assets/web-panel/assets/index-ycwAfC-i.js +1 -0
- package/src/assets/web-panel/assets/{index-BSp1Ofvx.js → index-z1ZylsLq.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DdcKTlQR.js → initDefaultProps-C1zO1KnY.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CL-hTBQj.js → motion-CWLtEGmC.js} +1 -1
- package/src/assets/web-panel/assets/{move-qYSAkxNG.js → move-DzD_C3Vm.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-ZwRSZtRP.js → mtc-parser-D880PYJl.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Bld-8ftI.js → omit-CFR_z2ov.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DGHs-a9Z.js → pickAttrs-srIhgrSC.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DRQPMyI5.js → placementArrow-C1rXpibP.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C5MJG_Yo.js → responsiveObserve-C30gRcSS.js} +1 -1
- package/src/assets/web-panel/assets/{slide-VZ-fpZCD.js → slide-CvtKiMfV.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9ocfCyHk.js → statusUtils-DNHO7ITG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B6QAwAN5.js → styleChecker-Dt_Sl-g4.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Bq1twor3.js → useFlexGapSupport-Cjev42Gh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DKZq96tz.js → useFs-Baxglj2V.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D0RmRVXf.js → usePersonalDataHub-B4NkcLaP.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D6kEj_tt.js → vnode-mIRkdT7o.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-2yfasoQf.js → zoom-HzI5DlH_.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/auth/npm-auth.js +30 -5
- package/src/commands/agenda.js +64 -2
- package/src/commands/agent.js +39 -1
- package/src/commands/config.js +70 -5
- package/src/commands/context.js +36 -2
- package/src/commands/hub.js +19 -1
- package/src/commands/memory.js +21 -6
- package/src/commands/permissions.js +57 -1
- package/src/commands/plugin.js +2 -0
- package/src/commands/review.js +23 -11
- package/src/commands/routine.js +31 -8
- package/src/commands/session.js +11 -3
- package/src/commands/team.js +20 -7
- package/src/commands/update.js +65 -10
- package/src/gateways/terminal/PtyManager.js +8 -1
- package/src/gateways/ws/message-dispatcher.js +3 -0
- package/src/gateways/ws/session-protocol.js +26 -0
- package/src/gateways/ws/ws-agent-handler.js +107 -69
- package/src/gateways/ws/ws-server.js +74 -2
- package/src/harness/jsonl-session-store.js +13 -6
- package/src/harness/mcp-client.js +200 -1
- package/src/lib/__tests__/personal-data-hub-aichat-wizard.test.js +15 -0
- package/src/lib/agent-coordinator.js +4 -0
- package/src/lib/agent-ipc-bus.js +32 -2
- package/src/lib/agent-sandbox.js +16 -2
- package/src/lib/agent-schedule-store.js +55 -0
- package/src/lib/agent-tool-admission.js +104 -0
- package/src/lib/api-key-helper.js +10 -2
- package/src/lib/async-hook-supervisor.cjs +12 -2
- package/src/lib/changelog.js +19 -11
- package/src/lib/channels/channel-manager.js +6 -0
- package/src/lib/channels/telegram-channel.js +11 -1
- package/src/lib/channels/webhook-channel.js +15 -3
- package/src/lib/checkpoint-store.js +10 -2
- package/src/lib/cloud/bundle.js +12 -2
- package/src/lib/code-review.js +32 -8
- package/src/lib/computer-use/control-backend.js +18 -3
- package/src/lib/context-breakdown.js +46 -0
- package/src/lib/context-source-ledger.js +43 -0
- package/src/lib/diff-review-follow-up.js +154 -0
- package/src/lib/downloader.js +17 -3
- package/src/lib/ensure-utf8.js +11 -3
- package/src/lib/event-runtime-producer.js +58 -0
- package/src/lib/event-runtime-store.js +354 -0
- package/src/lib/event-runtime-worker.js +109 -0
- package/src/lib/execution-backend.js +72 -21
- package/src/lib/git-integration.js +19 -4
- package/src/lib/hook-manager.js +6 -15
- package/src/lib/hook-runner.cjs +48 -3
- package/src/lib/hooks-v2-producers.js +15 -0
- package/src/lib/hooks-v2-runtime.js +70 -21
- package/src/lib/host-adb-bridge.js +111 -21
- package/src/lib/ide-context.js +128 -1
- package/src/lib/interaction-adapter.js +39 -0
- package/src/lib/json-schema-validate.js +190 -36
- package/src/lib/lan-pairing-preflight.js +13 -2
- package/src/lib/lsp/__tests__/lsp-server-registry.test.js +18 -0
- package/src/lib/lsp/lsp-client.js +18 -1
- package/src/lib/lsp/lsp-manager.js +4 -0
- package/src/lib/lsp/lsp-server-registry.js +11 -0
- package/src/lib/mcp-oauth.js +8 -2
- package/src/lib/npm-invocation.js +29 -0
- package/src/lib/packer/pkg-runner.js +13 -2
- package/src/lib/packer/precheck.js +33 -16
- package/src/lib/packer/web-panel-builder.js +16 -2
- package/src/lib/permission-rules.cjs +5 -1
- package/src/lib/personal-data-hub-aichat-wizard.js +22 -6
- package/src/lib/personal-data-hub-wiring.js +27 -3
- package/src/lib/plan-mode.js +204 -11
- package/src/lib/plugin-monitor-supervisor.js +39 -4
- package/src/lib/plugin-runtime/bin.js +45 -0
- package/src/lib/plugin-runtime/hooks.js +14 -1
- package/src/lib/plugin-runtime/install.js +2 -1
- package/src/lib/plugin-runtime/lsp.js +3 -0
- package/src/lib/plugin-runtime/mcp.js +8 -1
- package/src/lib/plugin-runtime/monitors.js +4 -0
- package/src/lib/plugin-runtime/plugin-options.js +74 -7
- package/src/lib/plugin-runtime/signature.js +45 -0
- package/src/lib/pr-create.js +21 -8
- package/src/lib/pr-link-ledger.js +15 -3
- package/src/lib/process-execution-broker/credential-agent.js +23 -3
- package/src/lib/process-execution-broker/index.js +315 -38
- package/src/lib/process-execution-broker/patch-child-process.js +2 -3
- package/src/lib/process-manager.js +18 -3
- package/src/lib/publish-workspace.js +14 -6
- package/src/lib/secret-store.js +159 -0
- package/src/lib/service-manager.js +64 -29
- package/src/lib/settings-hook-events.cjs +61 -1
- package/src/lib/settings-hooks.cjs +4 -0
- package/src/lib/side-effect-ledger.js +22 -0
- package/src/lib/sub-agent-context.js +5 -0
- package/src/lib/sub-agent-profiles.js +4 -0
- package/src/lib/turn-context.js +14 -8
- package/src/lib/unattended-action-policy.js +83 -0
- package/src/lib/update-notice.js +6 -2
- package/src/lib/with-file-lock.js +7 -0
- package/src/lib/ws-server.js +1 -0
- package/src/repl/agent-repl.js +32 -0
- package/src/repl/clipboard-copy.js +8 -2
- package/src/repl/pr-comments.js +30 -7
- package/src/runtime/agent-core.js +439 -87
- package/src/runtime/agent-runtime.js +1 -0
- package/src/runtime/coding-agent-contract-shared.cjs +52 -0
- package/src/runtime/coding-agent-policy.cjs +20 -0
- package/src/runtime/diagnostics.js +73 -8
- package/src/runtime/headless-runner.js +63 -0
- package/src/runtime/headless-stream.js +269 -17
- package/src/runtime/mcp-config.js +16 -1
- package/src/assets/web-panel/assets/MobileProjects-BLRfHhqi.js +0 -1
- package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +0 -1
- package/src/assets/web-panel/assets/Terminal-DWGYhAYU.js +0 -3
- package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +0 -1
- package/src/assets/web-panel/assets/index-CSgUfMTM.js +0 -1
- 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 {
|
|
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
|
-
|
|
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?.
|
|
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
|
-
|
|
299
|
-
"[PLAN REVIEW SNAPSHOT]" + (meta ? ` ${meta}` : "")
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
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 === "
|
|
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:
|
|
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
|
-
{
|
|
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 =
|
|
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};
|