chainlesschain 0.162.154 → 0.162.156
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/README.md +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CIpoXyVI.js → AIOps-DjBXlypQ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Ch_QXIPk.js → ActionButton-Cv9er9bp.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CvaBYShv.js → Analytics-CLKDjSNs.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-CfyZNzmJ.js +9 -0
- package/src/assets/web-panel/assets/{Audit-Bng8eHCW.js → Audit-CXafD178.js} +1 -1
- package/src/assets/web-panel/assets/BackgroundAgents-CP5c-GSd.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +1 -0
- package/src/assets/web-panel/assets/{Backup-DvBs8-lm.js → Backup-BbYLQfyt.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DKwajm0g.js → BaseInput-Bqe0MwZL.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BoGpZ3uO.js → Chat-jNA_yUPH.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-mDQl_PXO.js → ChatBubbleRenderer-BOFLF01s.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BMJEmxFQ.js → Checkbox-Dlzz-zD1.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Bsoag5CV.js → Codegen-BAsDQjGf.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CDjH9-sp.js → Col-Ju0HrAuS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Cg2QHPQ6.js → Community-DynJd43Z.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BU2BaqP-.js → Compact-CabbZVww.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-D6ZYMCqZ.js → Compliance-DW4BmAoh.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DaZ8VW-I.js → Cowork-Bk1S_7X-.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DQY1RH9v.js → Cron-By4sh_NM.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BVR28vk9.js → Crosschain-DdZdbS1C.js} +1 -1
- package/src/assets/web-panel/assets/{DID-N44KvTP-.js → DID-CkL-sQyS.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Bjhlx6wS.js → Dashboard-g_mOpumg.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CpLYxpy1.js → Dropdown-DtHyE7Ao.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-srEITSPI.js → EmailListRenderer-Kpvov5Wr.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-juOC_fX2.js → FamilyGuardDashboard-C4kZoePR.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-nRaQtaXW.js → Federation-BAwWoK2N.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DflhTj09.js → FormItemContext-DeI0i5f8.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DulI_3NI.js → GenericCardRenderer-CkcKRtos.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BxOPefXn.js → Git-kX6jjI9y.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C6G_Wnwi.js → Governance-BXJCBm6x.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BnFYa2BF.js → Inference-ujD2JSKo.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-TqQLEabm.js → KnowledgeGraph-3Dnuf1Wh.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BH4AVh7s.js → Logs-lVAZCtUB.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DoWLTaEE.js → Marketplace-qnzNPm-A.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D6yC7OG_.js → McpTools-CqjzefRU.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DLCeHj21.js → Memory-BFiPAxk6.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BZBE0GRl.js → MobileBridge-D0O43VwF.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DJA15G1J.js → MobileProjects-B3now48t.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CyTKJDHn.js → Mtc-DybhtaCS.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-DZKjgEVc.js → MtcAudit-D7MmY4F0.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-2rMPNhSO.js → Multisig-wZvGJnB8.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-VeMk4Fx-.js → NLProgramming-BNPpgfvn.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-jr2GHMhh.js → Notes-B6FS3KBj.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-WN9VZyFb.js → NotificationSettings-CK0yla9U.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CXfPHIpy.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DdjVHuzT.js → Organization-geqgwN1T.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-l8vBsGGq.js → Overflow-BWJYZFbC.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-BlgL9440.js → OverrideContext-C0w0P4A3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CVQDHHwq.js → P2P-DnU1505F.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CTsNh8qE.js → PdhVaultBrowser-BGY74KnC.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DLW87uyK.js → Permissions-CgArrWtQ.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-N8OvASTx.js → PersonalDataHub-C2vYE61a.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BPZmdlz2.js → Pipeline-CBYLI4yW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-MFZw_GNh.js → Privacy-B-PdW9aN.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-zW0pEsfU.js → ProjectInit-CuWQegbV.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CppVHr_o.js → ProjectSettings-4d32m_cS.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BTglkJO2.js → Projects-VLA7ttwd.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CPHZ6JKT.js → Providers-B_Izb_oa.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DO4klNZ2.js → QrScannerModal-C6B_ndXV.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-B37TTqUa.js → QuickAsk-C6tavL-y.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-n7KIfK7y.js → Recommend-CF-LaZ6x.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-SjVoS9mm.js → RemoteSession-DBqTTQ9_.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Dt6RTeHi.js → Reputation-B01FALUi.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dty6jz5V.js → Row-DO0fd48A.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DDLhqw5j.js → RssFeed-BV5LDzFR.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DrYbXi-W.js → Search-CTti4_MP.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Fc9Z6fbB.js → Security-DwSrWRCw.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BAhPgjSM.js → Services-BEf1QyM4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-8JF7EPfE.js → Skeleton-LZXTpovy.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DL39dY0t.js → Skills-SKgc0Zug.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CSvjcATc.js → Sla-C_QVOtkN.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Demx7Gnx.js → SpeechSettings-v5TW2V-X.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CKLnRWJr.js → SyncSettings-CQPjHdqU.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DCd-uYcI.js +1 -0
- package/src/assets/web-panel/assets/{Templates-AjQI5rxD.js → Templates-62VDIjtj.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-dbtEh1yR.js → Tenant-BnFQ0pNy.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DX-9jjfk.js → Terminal-D3v0MGSj.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C11EDZRt.js → TimelineRenderer-BI1Ka-cu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-GiA9fiZn.js → Tokens-BwX1jXYP.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BPcnclJn.js → Trigger-CSA8TqNx.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-C-DVY8nq.js → Trust-Bn3IjCx7.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DxodSwME.js → UkeySign-pUbOAqNi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D_WV0O8O.js → VideoEditing-Db2RercF.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DSeNlVSU.js → Wallet-CpR1BVAl.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Bwuuvpz1.js → WebAuthn-Yxtkn7Zp.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-8M96EU1N.js → WorkflowEditor-CYLe9a2E.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D5S6SmLm.js → chat-gsOGdak0.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-DVfhbsdP.js → collapseMotion-CqM1QOwM.js} +1 -1
- package/src/assets/web-panel/assets/{colors-5fbnGkAP.js → colors-D9fN299a.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DaSuuMlW.js → compact-item-vkd7s-ay.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BNOHcXAF.js → createContext-C7YkbMyy.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DEcR2h6k.js +1 -0
- package/src/assets/web-panel/assets/{echarts-CL0F2SnX.js → echarts-C61Vn3mP.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-DONwZUra.js → hasIn-ig7reRSU.js} +1 -1
- package/src/assets/web-panel/assets/{icons-BsDmGpcT.js → icons-DEmcnxBf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJp4kRjw.js → index-9TxdMYju.js} +1 -1
- package/src/assets/web-panel/assets/{index-MOgO5Yvx.js → index-B7QRpKif.js} +1 -1
- package/src/assets/web-panel/assets/index-BEibanjg.js +1 -0
- package/src/assets/web-panel/assets/{index-CAYmc5Nh.js → index-BHHN_KTS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcWMZqb4.js → index-BMw48d19.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_yDD9Lm.js → index-BYe9HRSt.js} +1 -1
- package/src/assets/web-panel/assets/{index-xo2f4DZR.js → index-BfpVcXKa.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbdQBn4n.js → index-BhftELHI.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd7xwGcD.js → index-BkP17Z95.js} +1 -1
- package/src/assets/web-panel/assets/{index-RkInlwV0.js → index-BpGlLbRv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DM3Ug61e.js → index-Bt-9ZhIu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrkCFohi.js → index-BvDEukXe.js} +1 -1
- package/src/assets/web-panel/assets/{index-_6S41ikV.js → index-C7AY39sg.js} +1 -1
- package/src/assets/web-panel/assets/{index-uR5KTNZA.js → index-C8HZMygt.js} +1 -1
- package/src/assets/web-panel/assets/{index-5_fj5gVd.js → index-CAkz1f1r.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLzMuz38.js → index-CDWTycrg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEO5f7Vf.js → index-CGzGe5tv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEzd5m5a.js → index-Co2NYyew.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcqOK7Lv.js → index-CspGymmg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP2-3A_j.js → index-D2yhtk6a.js} +1 -1
- package/src/assets/web-panel/assets/{index-LRIt-AFl.js → index-D6s_kbjt.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4L3gsNA.js → index-DFM1oNe1.js} +1 -1
- package/src/assets/web-panel/assets/{index-KwV9g_cf.js → index-DFfxF7Vt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK2N5yVW.js → index-DPguq3X7.js} +4 -4
- package/src/assets/web-panel/assets/{index-Cf2OCa8q.js → index-DQ8U7kzC.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7gs_3Ck.js → index-DZAxCnjS.js} +1 -1
- package/src/assets/web-panel/assets/{index-PsMErAB1.js → index-DhdXbsXX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTZeOnzO.js → index-DuwbKHoS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm5A-MN5.js → index-DvCJXmrx.js} +1 -1
- package/src/assets/web-panel/assets/{index-vYtprlNs.js → index-Dy_TKZ9h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHx2lhHW.js → index-FzGr6CVk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn5LtyIH.js → index-PkH39qsp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmUOjyL6.js → index-SDrcQXO1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CztESwB4.js → index-W52sHRdr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSfYJqXt.js → index-bVbgYBhv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrAJSu-v.js → index-gj8kxcAi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLXf-8ek.js → index-gpurplyq.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClGqO-2X.js → index-nX8YE6cj.js} +1 -1
- package/src/assets/web-panel/assets/index-z_25tU3p.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-CxwLynp9.js → initDefaultProps-BrgfVRg9.js} +1 -1
- package/src/assets/web-panel/assets/{motion-XbPvGJbW.js → motion-D_3xmwac.js} +1 -1
- package/src/assets/web-panel/assets/{move-D1u5pcgS.js → move-DDDJdlxw.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDxhTBMH.js → mtc-parser-BK2uEWwn.js} +1 -1
- package/src/assets/web-panel/assets/{omit-EtIFGg5k.js → omit-BPHKbDcf.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D33sWb0l.js → pickAttrs-LNnTscuz.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BwFRzaGo.js → placementArrow-CvmTZll5.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CBk2WqvQ.js → responsiveObserve-eBj7qi2J.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B52HtrKn.js → slide-D68hHkrM.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D4qxqWnH.js → statusUtils-daTlaeo0.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BxaCFlOL.js → styleChecker-DtyKMtHB.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-ekFwFs9h.js +1 -0
- package/src/assets/web-panel/assets/{useFs-C6VAU1_6.js → useFs-jRaSEoF4.js} +1 -1
- package/src/assets/web-panel/assets/{useMergedState-Dc9sO2d7.js → useMergedState-DXbJa_zE.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-rEG6oXG8.js → usePersonalDataHub-DD5nGzjA.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-CAeFRzPf.js → useRefs-BrCfMLMc.js} +1 -1
- package/src/assets/web-panel/assets/{useState-LwExUYDO.js → useState-CnxtbLoC.js} +1 -1
- package/src/assets/web-panel/assets/{vendor-BMxUs6UX.js → vendor-Bn1JzzAn.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DOTafkEi.js → vnode-KcgLUiom.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BuwwN5K2.js → zoom-Cyk2PQ-s.js} +1 -1
- package/src/assets/web-panel/index.html +3 -3
- package/src/command-manifest.json +50 -1
- package/src/commands/agenda.js +228 -0
- package/src/commands/agent.js +23 -2
- package/src/commands/agents.js +62 -1
- package/src/commands/auto-mode.js +87 -0
- package/src/commands/background-session.js +499 -0
- package/src/commands/batch.js +345 -0
- package/src/commands/command.js +4 -1
- package/src/commands/permissions.js +49 -0
- package/src/commands/remote-control.js +407 -0
- package/src/data/changelog.json +12 -2
- package/src/gateways/ws/background-agent-protocol.js +337 -0
- package/src/gateways/ws/message-dispatcher.js +10 -0
- package/src/gateways/ws/remote-session-protocol.js +102 -1
- package/src/gateways/ws/ws-server.js +61 -0
- package/src/harness/mcp-client.js +8 -0
- package/src/index.js +22 -0
- package/src/lib/agent-batch.js +235 -0
- package/src/lib/agent-notify.js +66 -0
- package/src/lib/agent-schedule-store.js +330 -0
- package/src/lib/auto-mode-config.js +396 -0
- package/src/lib/background-agent-supervisor.js +202 -17
- package/src/lib/background-session-transport.js +315 -0
- package/src/lib/permission-denial-store.js +159 -0
- package/src/lib/remote-approval-bridge.js +360 -0
- package/src/lib/remote-control.js +270 -0
- package/src/lib/repl-denials.js +26 -0
- package/src/lib/shell-approval.js +4 -0
- package/src/lib/ws-rpc-client.js +150 -0
- package/src/repl/agent-repl.js +208 -16
- package/src/repl/permission-tier.js +31 -0
- package/src/runtime/agent-core.js +161 -0
- package/src/runtime/coding-agent-contract-shared.cjs +104 -0
- package/src/runtime/coding-agent-policy.cjs +28 -0
- package/src/runtime/headless-runner.js +126 -8
- package/src/runtime/headless-stream.js +87 -1
- package/src/runtime/mcp-config.js +11 -0
- package/src/runtime/mcp-tool-search.js +0 -0
- package/src/runtime/policies/agent-policy.js +17 -0
- package/src/workers/background-agent-worker.js +218 -37
- package/src/assets/web-panel/assets/AppLayout-B6Q6olcr.js +0 -9
- package/src/assets/web-panel/assets/OrderTableRenderer-CjNO-e9T.js +0 -1
- package/src/assets/web-panel/assets/Tasks-mhITRxjv.js +0 -1
- package/src/assets/web-panel/assets/devWarning-K_woVElh.js +0 -1
- package/src/assets/web-panel/assets/index-3ILvaBpo.js +0 -1
- package/src/assets/web-panel/assets/index-JpB-FoZq.js +0 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-B1lWlqXN.js +0 -1
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
resolvePermissionPromptTool,
|
|
43
43
|
makePermissionPromptConfirmer,
|
|
44
44
|
} from "./mcp-config.js";
|
|
45
|
+
import { maybeApplyToolSearch } from "./mcp-tool-search.js";
|
|
45
46
|
import { IterationBudget } from "../lib/iteration-budget.js";
|
|
46
47
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
47
48
|
import {
|
|
@@ -723,10 +724,34 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
723
724
|
let approvalGate = null;
|
|
724
725
|
try {
|
|
725
726
|
approvalGate = await getApprovalGate();
|
|
727
|
+
if (approvalGate && (options.permissionMode || "default") === "auto") {
|
|
728
|
+
// autoMode.decisions: user-configured riskLevel → allow/ask/deny
|
|
729
|
+
// classifier (same wiring as headless-runner). Only wrap when settings
|
|
730
|
+
// customize the map so the unconfigured path stays byte-identical.
|
|
731
|
+
try {
|
|
732
|
+
const {
|
|
733
|
+
loadAutoModeConfig,
|
|
734
|
+
resolveAutoModeDecisions,
|
|
735
|
+
createAutoModeApprovalGate,
|
|
736
|
+
} = await import("../lib/auto-mode-config.js");
|
|
737
|
+
const autoConfig = loadAutoModeConfig({
|
|
738
|
+
cwd,
|
|
739
|
+
settingsFile: options.settingsFile,
|
|
740
|
+
});
|
|
741
|
+
const resolved = resolveAutoModeDecisions(autoConfig.effective);
|
|
742
|
+
if (resolved.customized) {
|
|
743
|
+
approvalGate = createAutoModeApprovalGate(approvalGate, resolved);
|
|
744
|
+
}
|
|
745
|
+
} catch {
|
|
746
|
+
// fail to the default trusted mapping — never block the run
|
|
747
|
+
}
|
|
748
|
+
}
|
|
726
749
|
if (approvalGate) {
|
|
727
750
|
approvalGate.setSessionPolicy?.(sessionId, perm.sessionPolicy);
|
|
728
751
|
approvalGate.setConfirmer?.(
|
|
729
|
-
interactive
|
|
752
|
+
interactive && perm.allowInteractiveApprovals
|
|
753
|
+
? interactiveConfirm
|
|
754
|
+
: perm.confirmer,
|
|
730
755
|
);
|
|
731
756
|
}
|
|
732
757
|
} catch {
|
|
@@ -949,6 +974,20 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
949
974
|
loadJetbrainsMcp: deps.loadJetbrainsMcp,
|
|
950
975
|
},
|
|
951
976
|
);
|
|
977
|
+
// MCP tool search (context scaling): defer big tool schemas behind the
|
|
978
|
+
// internal tool_search tool. Below-threshold / disabled → no-op.
|
|
979
|
+
if (mcp) {
|
|
980
|
+
try {
|
|
981
|
+
(deps.maybeApplyToolSearch || maybeApplyToolSearch)(mcp, {
|
|
982
|
+
model,
|
|
983
|
+
provider,
|
|
984
|
+
cwd: options.cwd || process.cwd(),
|
|
985
|
+
writeErr,
|
|
986
|
+
});
|
|
987
|
+
} catch {
|
|
988
|
+
// best-effort — full schemas still work without deferral
|
|
989
|
+
}
|
|
990
|
+
}
|
|
952
991
|
} catch (err) {
|
|
953
992
|
emit({
|
|
954
993
|
type: "result",
|
|
@@ -987,6 +1026,43 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
987
1026
|
}
|
|
988
1027
|
}
|
|
989
1028
|
|
|
1029
|
+
// --remote-control: route CONFIRM-tier approvals to paired mobile/web
|
|
1030
|
+
// devices (第四阶段 #2). Pairing info is emitted as a stream event so panel
|
|
1031
|
+
// hosts can render the QR. --permission-prompt-tool and --interactive-
|
|
1032
|
+
// approvals win when given (this block skips) — explicit routing beats the
|
|
1033
|
+
// ambient device bridge.
|
|
1034
|
+
let _remoteApproval = null;
|
|
1035
|
+
if (
|
|
1036
|
+
options.remoteControl &&
|
|
1037
|
+
!options.permissionPromptTool &&
|
|
1038
|
+
options.interactiveApprovals !== true
|
|
1039
|
+
) {
|
|
1040
|
+
try {
|
|
1041
|
+
const { startHeadlessRemoteApproval } =
|
|
1042
|
+
await import("../lib/remote-approval-bridge.js");
|
|
1043
|
+
_remoteApproval = await startHeadlessRemoteApproval({
|
|
1044
|
+
agentSessionId: sessionId,
|
|
1045
|
+
});
|
|
1046
|
+
emit({
|
|
1047
|
+
type: "remote_control",
|
|
1048
|
+
subtype: "pairing",
|
|
1049
|
+
pairing_uri: _remoteApproval.pairing.uri,
|
|
1050
|
+
remote_session_id: _remoteApproval.pairing.remoteSessionId,
|
|
1051
|
+
expires_at: _remoteApproval.pairing.expiresAt,
|
|
1052
|
+
});
|
|
1053
|
+
if (approvalGate && typeof approvalGate.setConfirmer === "function") {
|
|
1054
|
+
approvalGate.setConfirmer(_remoteApproval.confirmer);
|
|
1055
|
+
}
|
|
1056
|
+
} catch (err) {
|
|
1057
|
+
emit({
|
|
1058
|
+
type: "remote_control",
|
|
1059
|
+
subtype: "unavailable",
|
|
1060
|
+
error: err.message,
|
|
1061
|
+
});
|
|
1062
|
+
_remoteApproval = null;
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
|
|
990
1066
|
const loopOptionsBase = {
|
|
991
1067
|
model,
|
|
992
1068
|
provider,
|
|
@@ -1723,6 +1799,16 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
1723
1799
|
}
|
|
1724
1800
|
}
|
|
1725
1801
|
|
|
1802
|
+
// Tear down the --remote-control approval bridge + its self-hosted WS
|
|
1803
|
+
// server so the stream session's port never outlives the invocation.
|
|
1804
|
+
if (_remoteApproval) {
|
|
1805
|
+
try {
|
|
1806
|
+
await _remoteApproval.close();
|
|
1807
|
+
} catch {
|
|
1808
|
+
// best-effort
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1726
1812
|
// settings.json SessionEnd hooks (observe-only) when stdin closes.
|
|
1727
1813
|
if (settingsHooks) {
|
|
1728
1814
|
try {
|
|
@@ -169,6 +169,14 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
169
169
|
// (created before this field existed) is passed in.
|
|
170
170
|
if (!Array.isArray(result.resources)) result.resources = [];
|
|
171
171
|
if (!Array.isArray(result.prompts)) result.prompts = [];
|
|
172
|
+
// Per-server usage instructions from the MCP initialize response (surfaced
|
|
173
|
+
// by tool search; absent for servers that send none).
|
|
174
|
+
if (
|
|
175
|
+
!result.instructionsByServer ||
|
|
176
|
+
typeof result.instructionsByServer !== "object"
|
|
177
|
+
) {
|
|
178
|
+
result.instructionsByServer = {};
|
|
179
|
+
}
|
|
172
180
|
const {
|
|
173
181
|
mcpClient,
|
|
174
182
|
extraToolDefinitions,
|
|
@@ -261,6 +269,9 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
261
269
|
resources: resources.length,
|
|
262
270
|
prompts: prompts.length,
|
|
263
271
|
});
|
|
272
|
+
if (typeof res?.instructions === "string" && res.instructions.trim()) {
|
|
273
|
+
result.instructionsByServer[name] = res.instructions.trim();
|
|
274
|
+
}
|
|
264
275
|
for (const r of resources) {
|
|
265
276
|
if (!r || !r.uri) continue;
|
|
266
277
|
result.resources.push({ ...r, server: name });
|
|
Binary file
|
|
@@ -44,6 +44,17 @@ export function resolveAgentPolicy({
|
|
|
44
44
|
// IDEA built-in MCP tri-state (undefined=auto when the JetBrains plugin
|
|
45
45
|
// injected the endpoint / true=--jetbrains / false=--no-jetbrains).
|
|
46
46
|
jetbrains: overrides.jetbrains,
|
|
47
|
+
// Consumed by the interactive REPL (startAgentRepl) — plain passthrough
|
|
48
|
+
// (undefined = unset). These were silently dropped by this allowlist
|
|
49
|
+
// before 2026-07-09, breaking --vim/--think/--thinking-budget/
|
|
50
|
+
// --fallback-model/--pdh/--permission-mode for interactive sessions.
|
|
51
|
+
permissionMode: overrides.permissionMode,
|
|
52
|
+
vimMode: overrides.vimMode,
|
|
53
|
+
thinking: overrides.thinking,
|
|
54
|
+
thinkingBudget: overrides.thinkingBudget,
|
|
55
|
+
fallbackModels: overrides.fallbackModels,
|
|
56
|
+
pdh: overrides.pdh,
|
|
57
|
+
outputStyle: overrides.outputStyle,
|
|
47
58
|
};
|
|
48
59
|
}
|
|
49
60
|
|
|
@@ -58,6 +69,12 @@ export function resolveServerPolicy(overrides = {}) {
|
|
|
58
69
|
project: overrides.project || process.cwd(),
|
|
59
70
|
httpPort: overrides.httpPort || null,
|
|
60
71
|
bundlePath: overrides.bundlePath || null,
|
|
72
|
+
// startServer() reads these for the Remote Session E2EE relay. They were
|
|
73
|
+
// silently dropped by this allowlist before 2026-07-09 — `cc serve
|
|
74
|
+
// --remote-session-relay-url` never actually enabled the relay (same
|
|
75
|
+
// allowlist-drop class as the batch-9 resolveAgentPolicy fix).
|
|
76
|
+
remoteSessionRelayUrl: overrides.remoteSessionRelayUrl || null,
|
|
77
|
+
remoteSessionPeerId: overrides.remoteSessionPeerId || null,
|
|
61
78
|
};
|
|
62
79
|
}
|
|
63
80
|
|
|
@@ -1,60 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* background-agent-worker — detached supervisor process for one background
|
|
3
|
+
* session. Spawns the agent CLI child with output to the session log, keeps a
|
|
4
|
+
* heartbeat in the state file, and (since batch 10) hosts a local session
|
|
5
|
+
* transport so `cc attach <id>` can send follow-up prompts interactively.
|
|
6
|
+
*
|
|
7
|
+
* Turn loop: the initial task runs as turn 1. While a client is attached the
|
|
8
|
+
* worker stays alive between turns (phase "idle"); a received prompt starts
|
|
9
|
+
* the next turn via `job.followUpArgv + ["-p", text]` on the same session id
|
|
10
|
+
* (headless `--session` resumes the conversation). The worker finalizes and
|
|
11
|
+
* exits only when the current turn has ended, the prompt queue is empty, and
|
|
12
|
+
* no client is attached.
|
|
13
|
+
*/
|
|
14
|
+
|
|
1
15
|
import { spawn } from "node:child_process";
|
|
2
16
|
import { readFileSync } from "node:fs";
|
|
17
|
+
import { randomBytes } from "node:crypto";
|
|
3
18
|
import {
|
|
19
|
+
DEFAULT_HEARTBEAT_INTERVAL_MS,
|
|
20
|
+
backgroundAgentsDir,
|
|
4
21
|
openBackgroundLogFile,
|
|
5
22
|
readBackgroundAgentState,
|
|
6
23
|
removeJobFile,
|
|
7
24
|
writeBackgroundAgentState,
|
|
8
25
|
} from "../lib/background-agent-supervisor.js";
|
|
26
|
+
import { startBackgroundSessionServer } from "../lib/background-session-transport.js";
|
|
9
27
|
|
|
10
28
|
const jobFile = process.argv[2];
|
|
11
29
|
let job;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
30
|
+
let log;
|
|
31
|
+
let server = null;
|
|
32
|
+
let child = null;
|
|
33
|
+
let heartbeat = null;
|
|
34
|
+
let finalized = false;
|
|
35
|
+
let phase = "turn";
|
|
36
|
+
let turnCount = 0;
|
|
37
|
+
let lastExit = { code: 0, signal: null };
|
|
38
|
+
let transportState = null;
|
|
39
|
+
const promptQueue = [];
|
|
40
|
+
|
|
41
|
+
function mergeState(patch) {
|
|
42
|
+
const current = readBackgroundAgentState(job.id) || { id: job.id };
|
|
43
|
+
const next = { ...current, id: job.id, ...patch };
|
|
44
|
+
writeBackgroundAgentState(next);
|
|
45
|
+
return next;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function writeHeartbeat() {
|
|
49
|
+
const current = readBackgroundAgentState(job.id) || { id: job.id };
|
|
50
|
+
if (current.status && current.status !== "running") return false;
|
|
51
|
+
writeBackgroundAgentState({
|
|
52
|
+
...current,
|
|
53
|
+
id: job.id,
|
|
54
|
+
pid: process.pid,
|
|
55
|
+
workerPid: process.pid,
|
|
56
|
+
agentPid: child?.pid ?? current.agentPid ?? null,
|
|
57
|
+
status: "running",
|
|
58
|
+
heartbeatAt: Date.now(),
|
|
59
|
+
// Re-assert the transport endpoint so a launcher write racing the
|
|
60
|
+
// worker's initial merge self-heals within one heartbeat.
|
|
61
|
+
...(transportState ? { transport: transportState } : {}),
|
|
62
|
+
});
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function finalize(code, signal, errorMessage) {
|
|
67
|
+
if (finalized) return;
|
|
68
|
+
finalized = true;
|
|
69
|
+
clearInterval(heartbeat);
|
|
70
|
+
const current = readBackgroundAgentState(job.id) || { id: job.id };
|
|
71
|
+
// An external `cc daemon stop` already recorded its own terminal status —
|
|
72
|
+
// don't overwrite it; just clear the dead transport endpoint.
|
|
73
|
+
if (!current.status || current.status === "running") {
|
|
74
|
+
writeBackgroundAgentState({
|
|
75
|
+
...current,
|
|
76
|
+
id: job.id,
|
|
77
|
+
status: errorMessage ? "failed" : code === 0 ? "completed" : "failed",
|
|
78
|
+
endedAt: Date.now(),
|
|
79
|
+
exitCode: errorMessage ? (code ?? 1) : code,
|
|
80
|
+
signal: signal || null,
|
|
81
|
+
...(errorMessage ? { error: errorMessage } : {}),
|
|
82
|
+
phase: null,
|
|
83
|
+
transport: null,
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
writeBackgroundAgentState({ ...current, phase: null, transport: null });
|
|
87
|
+
}
|
|
88
|
+
const done = () => {
|
|
89
|
+
try {
|
|
90
|
+
log?.close();
|
|
91
|
+
} catch {
|
|
92
|
+
/* log fd already closed */
|
|
93
|
+
}
|
|
94
|
+
process.exit(errorMessage ? 1 : (code ?? 1));
|
|
95
|
+
};
|
|
96
|
+
if (server) {
|
|
97
|
+
server.broadcast({ type: "closing" });
|
|
98
|
+
server.close().then(done, done);
|
|
99
|
+
} else {
|
|
100
|
+
done();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function startTurn(argv, promptText) {
|
|
105
|
+
phase = "turn";
|
|
106
|
+
turnCount++;
|
|
107
|
+
child = spawn(process.execPath, [job.cliEntry, ...argv], {
|
|
17
108
|
cwd: job.cwd,
|
|
18
109
|
env: { ...process.env, CC_BACKGROUND_AGENT_ID: job.id },
|
|
19
110
|
stdio: ["ignore", log.fd, log.fd],
|
|
20
111
|
windowsHide: true,
|
|
21
112
|
});
|
|
113
|
+
mergeState({
|
|
114
|
+
status: "running",
|
|
115
|
+
phase,
|
|
116
|
+
turnCount,
|
|
117
|
+
agentPid: child.pid,
|
|
118
|
+
heartbeatAt: Date.now(),
|
|
119
|
+
});
|
|
120
|
+
server?.broadcast({
|
|
121
|
+
type: "turn-started",
|
|
122
|
+
turn: turnCount,
|
|
123
|
+
prompt: promptText || null,
|
|
124
|
+
});
|
|
22
125
|
child.on("exit", (code, signal) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
status: code === 0 ? "completed" : "failed",
|
|
28
|
-
endedAt: Date.now(),
|
|
29
|
-
exitCode: code,
|
|
30
|
-
signal: signal || null,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
log.close();
|
|
34
|
-
process.exit(code ?? 1);
|
|
126
|
+
lastExit = { code, signal };
|
|
127
|
+
child = null;
|
|
128
|
+
server?.broadcast({ type: "turn-ended", turn: turnCount, exitCode: code });
|
|
129
|
+
maybeContinue();
|
|
35
130
|
});
|
|
36
131
|
child.on("error", (error) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
...current,
|
|
40
|
-
status: "failed",
|
|
41
|
-
endedAt: Date.now(),
|
|
42
|
-
exitCode: 1,
|
|
43
|
-
error: error.message,
|
|
44
|
-
});
|
|
45
|
-
log.close();
|
|
46
|
-
process.exit(1);
|
|
132
|
+
child = null;
|
|
133
|
+
finalize(1, null, error.message);
|
|
47
134
|
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function maybeContinue() {
|
|
138
|
+
if (finalized) return;
|
|
139
|
+
// External stop marked the session terminal while a turn was in flight —
|
|
140
|
+
// don't start another turn against a stopped session.
|
|
141
|
+
const current = readBackgroundAgentState(job.id);
|
|
142
|
+
if (current?.status && current.status !== "running") {
|
|
143
|
+
finalize(lastExit.code, lastExit.signal);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (promptQueue.length && Array.isArray(job.followUpArgv)) {
|
|
147
|
+
const text = promptQueue.shift();
|
|
148
|
+
startTurn([...job.followUpArgv, "-p", text], text);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (server && server.clientCount() > 0) {
|
|
152
|
+
phase = "idle";
|
|
153
|
+
mergeState({ phase, agentPid: null, heartbeatAt: Date.now() });
|
|
154
|
+
server.broadcast({ type: "idle", turn: turnCount });
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
finalize(lastExit.code, lastExit.signal);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function getStatus() {
|
|
161
|
+
return {
|
|
162
|
+
id: job.id,
|
|
163
|
+
sessionId: job.sessionId || null,
|
|
164
|
+
title: job.title || null,
|
|
165
|
+
phase,
|
|
166
|
+
turn: turnCount,
|
|
167
|
+
interactive: Array.isArray(job.followUpArgv),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function main() {
|
|
172
|
+
job = JSON.parse(readFileSync(jobFile, "utf8"));
|
|
173
|
+
removeJobFile(jobFile);
|
|
174
|
+
log = openBackgroundLogFile(job.id);
|
|
175
|
+
|
|
176
|
+
// Session transport (best-effort): interactive attach needs it, but a
|
|
177
|
+
// transport failure must never take down the background task itself.
|
|
178
|
+
try {
|
|
179
|
+
const token = randomBytes(16).toString("hex");
|
|
180
|
+
server = await startBackgroundSessionServer({
|
|
181
|
+
id: job.id,
|
|
182
|
+
dir: backgroundAgentsDir(),
|
|
183
|
+
token,
|
|
184
|
+
getStatus,
|
|
185
|
+
onPrompt: (text) => {
|
|
186
|
+
if (!Array.isArray(job.followUpArgv)) {
|
|
187
|
+
throw new Error(
|
|
188
|
+
"this session was launched without follow-up support — start a new one with cc agent --bg",
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
promptQueue.push(text);
|
|
192
|
+
const queued = promptQueue.length;
|
|
193
|
+
if (!child) maybeContinue();
|
|
194
|
+
return { queued };
|
|
195
|
+
},
|
|
196
|
+
onStop: () => {
|
|
197
|
+
child?.kill("SIGTERM");
|
|
198
|
+
},
|
|
199
|
+
onClientChange: (count) => {
|
|
200
|
+
// Last client detached while the session is idle → nothing left to
|
|
201
|
+
// wait for; finalize with the last turn's exit code.
|
|
202
|
+
if (count === 0 && !child && promptQueue.length === 0) {
|
|
203
|
+
finalize(lastExit.code, lastExit.signal);
|
|
204
|
+
}
|
|
205
|
+
},
|
|
57
206
|
});
|
|
207
|
+
transportState = { pipe: server.pipePath, token };
|
|
208
|
+
mergeState({ transport: transportState });
|
|
209
|
+
} catch {
|
|
210
|
+
server = null;
|
|
58
211
|
}
|
|
59
|
-
|
|
212
|
+
|
|
213
|
+
writeHeartbeat();
|
|
214
|
+
heartbeat = setInterval(() => {
|
|
215
|
+
try {
|
|
216
|
+
if (!writeHeartbeat()) {
|
|
217
|
+
clearInterval(heartbeat);
|
|
218
|
+
// External stop: the child tree is being killed by the stopper; make
|
|
219
|
+
// sure the worker itself never lingers holding the pipe.
|
|
220
|
+
if (!child) finalize(lastExit.code, lastExit.signal);
|
|
221
|
+
}
|
|
222
|
+
} catch {
|
|
223
|
+
/* do not let heartbeat persistence kill the worker */
|
|
224
|
+
}
|
|
225
|
+
}, DEFAULT_HEARTBEAT_INTERVAL_MS);
|
|
226
|
+
heartbeat.unref?.();
|
|
227
|
+
|
|
228
|
+
startTurn(job.argv, null);
|
|
60
229
|
}
|
|
230
|
+
|
|
231
|
+
main().catch((error) => {
|
|
232
|
+
if (job?.id) {
|
|
233
|
+
try {
|
|
234
|
+
finalize(1, null, error.message);
|
|
235
|
+
return;
|
|
236
|
+
} catch {
|
|
237
|
+
/* fall through to hard exit */
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
process.exit(1);
|
|
241
|
+
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{b as v,r as P,I as k,P as p,J as L,c as e,K as t,U as d,Q as l,R as a,S as A,F as I,Z as se,_ as W,V as m,o as z,x as $,$ as fe,N as J,f as ee,M as te,w as ne,a0 as me}from"./vendor-BMxUs6UX.js";import{u as H,_ as Y,E as ke,a as oe,b as ie,c as ae,T as _e,d as V}from"./index-BK2N5yVW.js";import{u as U}from"./useShellMode-CgR0wCYM.js";import{R as ge,B as de,M as ue,U as Oe,D as he,S as be,h as we,i as ve,j as Le,N as Se,k as Ce,F as Ee,l as Te,m as Be,A as Ae,P as Me,n as Re,o as Pe,p as je,q as Ne,r as De,s as Ue,t as Ie,u as Ke,v as Fe,w as Ve,x as We,V as ze,K as Ge,y as He,z as qe,G as Je,H as Qe,J as Ye,W as Ze,O as Xe,Q as xe,X as $e,Y as et,Z as tt,_ as nt,$ as ot,a0 as it,a1 as at,a2 as lt,a3 as rt,a4 as st,a5 as dt,e as ut,a6 as ct,a7 as yt,a8 as pt,a9 as ft,aa as mt,ab as kt,ac as _t}from"./icons-BsDmGpcT.js";import le from"./index-Cn5LtyIH.js";import"./KeyCode-D63Tfrq7.js";import"./omit-EtIFGg5k.js";import"./pickAttrs-D33sWb0l.js";import"./initDefaultProps-CxwLynp9.js";import"./motion-XbPvGJbW.js";import"./raf-Deuc0E8-.js";import"./index-RkInlwV0.js";import"./index-DP2-3A_j.js";import"./isVisible-C7tPsqfj.js";import"./useState-LwExUYDO.js";import"./devWarning-K_woVElh.js";import"./compact-item-DaSuuMlW.js";import"./createContext-BNOHcXAF.js";import"./Compact-BU2BaqP-.js";import"./_getTag-DnrRH4E6.js";import"./styleChecker-BxaCFlOL.js";import"./zoom-BuwwN5K2.js";import"./ActionButton-Ch_QXIPk.js";import"./vnode-DOTafkEi.js";const gt=""+new URL("logo-DBCYUiWP.png",import.meta.url).href,T={notifications:P([]),unreadCount:P(0)};function G(i){if(i&&i.ok===!1)throw new Error(i.error||"notification handler failed");return i?.result??i}function re(){const i=H();async function y({limit:o=50,offset:s=0,isRead:f}={}){if(!U().isEmbedded)return T.notifications.value=[],T.unreadCount.value=0,T.notifications.value;const g=await i.sendRaw({type:"notification.list",limit:o,offset:s,isRead:f},15e3),O=G(g);if(O?.success===!1)throw new Error(O.error||"notification.list failed");return T.notifications.value=Array.isArray(O?.notifications)?O.notifications:[],await S(),T.notifications.value}async function S(){if(!U().isEmbedded)return T.unreadCount.value=0,0;const o=await i.sendRaw({type:"notification.unread-count"},1e4),s=G(o);return T.unreadCount.value=Number(s?.count)||0,T.unreadCount.value}async function n(o){if(o==null||o==="")throw new Error("id is required");if(!U().isEmbedded)return;const s=await i.sendRaw({type:"notification.mark-read",id:o},1e4),f=G(s);if(f?.success===!1)throw new Error(f.error||"notification.mark-read failed");const g=T.notifications.value.find(O=>O.id===o);g&&(g.is_read=1),await S()}async function _(){if(!U().isEmbedded)return;const o=await i.sendRaw({type:"notification.mark-all-read"},1e4),s=G(o);if(s?.success===!1)throw new Error(s.error||"notification.mark-all-read failed");for(const f of T.notifications.value)f.is_read=1;T.unreadCount.value=0}async function h(o,s=""){if(!U().isEmbedded)throw new Error("桌面通知仅在嵌入式 web-shell 中可用");const f=await i.sendRaw({type:"notification.send-desktop",title:o,body:s},1e4),g=G(f);if(g?.success===!1)throw new Error(g.error||"notification.send-desktop failed")}return{notifications:v(()=>T.notifications.value),unreadCount:v(()=>T.unreadCount.value),refresh:y,refreshUnreadCount:S,markRead:n,markAllRead:_,sendDesktop:h}}const Ot={__name:"NotificationBell",setup(i,{expose:y}){y();const S=P(!1),n=P("all"),_=P(!1),{notifications:h,unreadCount:o,refresh:s,markRead:f,markAllRead:g}=re();function O(){j()}z(()=>{window.addEventListener("cc:open-notification-drawer",O)}),$(()=>{window.removeEventListener("cc:open-notification-drawer",O)});const M=v(()=>n.value==="unread"?h.value.filter(u=>!u.is_read):h.value);async function C(){if(U().isEmbedded){_.value=!0;try{await s({limit:100})}catch{}finally{_.value=!1}}}async function j(){S.value=!0,await C()}async function N(u){if(!u.is_read)try{await f(u.id)}catch{}}async function r(){try{await g()}catch(u){console.warn("[NotificationBell] markAllRead failed:",u?.message||u)}}function w(u){if(!u)return"";const b=typeof u=="string"?Date.parse(u):Number(u);if(!Number.isFinite(b))return String(u);const R=Date.now()-b,D=6e4,K=60*D,F=24*K;return R<D?"刚刚":R<K?`${Math.floor(R/D)} 分钟前`:R<F?`${Math.floor(R/K)} 小时前`:new Date(b).toLocaleDateString()}const B={visible:S,filter:n,loading:_,notifications:h,unreadCount:o,refresh:s,markRead:f,markAllRead:g,_onOpenEvent:O,filtered:M,refreshList:C,onOpen:j,onItemClick:N,onMarkAllRead:r,formatTime:w,ref:P,computed:v,onMounted:z,onUnmounted:$,get Empty(){return ke},get BellOutlined(){return de},get ReloadOutlined(){return ge},get useNotifications(){return re},get useShellMode(){return U}};return Object.defineProperty(B,"__isScriptSetup",{enumerable:!1,value:!0}),B}},ht={class:"notif-toolbar"},bt={class:"notif-body"},wt={key:2,class:"notif-list"},vt=["onClick"],Lt={class:"notif-row"},St={class:"notif-title"},Ct={class:"notif-time"},Et={key:0,class:"notif-message"};function Tt(i,y,S,n,_,h){const o=k("a-badge"),s=k("a-tooltip"),f=k("a-radio-button"),g=k("a-radio-group"),O=k("a-space"),M=k("a-button"),C=k("a-empty"),j=k("a-spin"),N=k("a-drawer");return p(),L(I,null,[e(s,{title:"通知"},{default:t(()=>[e(o,{count:n.unreadCount,"overflow-count":99,offset:[-4,4]},{default:t(()=>[d("button",{type:"button",class:"notif-bell-btn","aria-label":"通知",onClick:n.onOpen},[e(n.BellOutlined)])]),_:1},8,["count"])]),_:1}),e(N,{open:n.visible,"onUpdate:open":y[1]||(y[1]=r=>n.visible=r),title:"通知中心",placement:"right",width:400,"body-style":{padding:0}},{default:t(()=>[d("div",ht,[e(O,null,{default:t(()=>[e(g,{value:n.filter,"onUpdate:value":y[0]||(y[0]=r=>n.filter=r),size:"small","button-style":"solid"},{default:t(()=>[e(f,{value:"all"},{default:t(()=>[l("全部 ("+a(n.notifications.length)+")",1)]),_:1}),e(f,{value:"unread"},{default:t(()=>[l("未读 ("+a(n.unreadCount)+")",1)]),_:1})]),_:1},8,["value"])]),_:1}),e(O,null,{default:t(()=>[e(M,{size:"small",loading:n.loading,onClick:n.refreshList},{icon:t(()=>[e(n.ReloadOutlined)]),_:1},8,["loading"]),e(M,{size:"small",disabled:n.unreadCount===0,onClick:n.onMarkAllRead},{default:t(()=>[...y[2]||(y[2]=[l(" 全部已读 ",-1)])]),_:1},8,["disabled"])]),_:1})]),d("div",bt,[!n.loading&&n.filtered.length===0?(p(),A(C,{key:0,description:"暂无通知",image:n.Empty.PRESENTED_IMAGE_SIMPLE,style:{padding:"60px 0"}},null,8,["image"])):n.loading?(p(),A(j,{key:1,style:{display:"block",padding:"60px"}})):(p(),L("ul",wt,[(p(!0),L(I,null,se(n.filtered,r=>(p(),L("li",{key:r.id,class:W(["notif-item",{unread:!r.is_read}]),onClick:w=>n.onItemClick(r)},[d("div",Lt,[d("div",St,a(r.title||r.message||"(无标题)"),1),d("span",Ct,a(n.formatTime(r.created_at)),1)]),r.message&&r.title?(p(),L("div",Et,a(r.message),1)):m("v-if",!0)],10,vt))),128))]))])]),_:1},8,["open"])],64)}const Bt=Y(Ot,[["render",Tt],["__scopeId","data-v-8c1554dd"],["__file","/tmp/cc-web-panel-CQtNLO/repo/packages/web-panel/src/components/NotificationBell.vue"]]),At={__name:"MobileBridgeHeaderStatus",setup(i,{expose:y}){y();function S(r){if(!r)return[];try{return JSON.parse(r)}catch{}const w=String(r).split(`
|
|
2
|
-
`),B=w.findIndex(u=>{const b=u.trim();if(!b)return!1;const R=b[0];if(R!=="["&&R!=="{")return!1;if(b.length===1)return!0;const D=b[1];return!(D>="A"&&D<="Z"||D>="a"&&D<="z")});if(B<0)return[];for(let u=w.length-1;u>=B;u--){const b=w[u].trim();if(/^[\]\}]/.test(b)&&!/^[\]\}][A-Za-z]/.test(b))try{return JSON.parse(w.slice(B,u+1).join(`
|
|
3
|
-
`))}catch{return[]}}return[]}const n=J(),_=H(),h=P([]);let o=null;const s=v(()=>h.value.length),f=v(()=>h.value.filter(r=>M(r)).length),g=v(()=>s.value===0?"var(--text-muted, #999)":"#52c41a"),O=v(()=>s.value===0?"尚未配对任何手机 — 点击进入配对":`已配对 ${s.value} 台手机 — 点击进入管理`);function M(r){if(!r)return!1;if(typeof r.online=="boolean")return r.online;const w=(r.status||"").toLowerCase();return w==="online"||w==="connected"||w==="active"||w==="paired"}async function C(){if(_.status==="connected")try{const{output:r}=await _.execute("p2p devices --type mobile --json",1e4);h.value=S(r)||[]}catch{}}function j(){n.push("/mobile-bridge")}z(()=>{C(),o=setInterval(C,5e3)}),ee(()=>{o&&(clearInterval(o),o=null)});const N={parseJsonOutput:S,router:n,ws:_,devices:h,get pollTimer(){return o},set pollTimer(r){o=r},totalCount:s,onlineCount:f,iconColor:g,tooltip:O,isOnline:M,refresh:C,onClick:j,ref:P,computed:v,onMounted:z,onBeforeUnmount:ee,get useRouter(){return J},get MobileOutlined(){return ue},get useWsStore(){return H}};return Object.defineProperty(N,"__isScriptSetup",{enumerable:!1,value:!0}),N}},Mt={key:0,class:"mbh-count"};function Rt(i,y,S,n,_,h){const o=k("a-badge"),s=k("a-tooltip");return p(),A(s,{title:n.tooltip},{default:t(()=>[e(o,{count:n.totalCount,"show-zero":!1,"overflow-count":9,offset:[-2,4]},{default:t(()=>[d("button",{type:"button",class:W(["mbh-btn",{"mbh-btn--active":n.totalCount>0}]),onClick:n.onClick},[e(n.MobileOutlined,{style:fe({color:n.iconColor,fontSize:"14px"})},null,8,["style"]),n.totalCount>0?(p(),L("span",Mt,a(n.totalCount),1)):m("v-if",!0)],2)]),_:1},8,["count"])]),_:1},8,["title"])}const Pt=Y(At,[["render",Rt],["__scopeId","data-v-e8ef01d6"],["__file","/tmp/cc-web-panel-CQtNLO/repo/packages/web-panel/src/components/MobileBridgeHeaderStatus.vue"]]),Q="cc.web-panel.sidebar.openKeys",jt={__name:"AppLayout",setup(i,{expose:y}){y();const S=J(),n=te(),_=H(),h=oe(),{t:o}=ie(),s=U(),f=P(!1),g=window.__CC_CONFIG__||{},O=v(()=>g.mode==="project"),M="v5.0.3.134",C=v(()=>h.current),j=v(()=>h.config.vars["--menu-mode"]),N=v(()=>{const c=n.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp",quickask:"quick-ask",ukeysign:"ukey-sign"}[c]||c]}),r=["g-overview","g-config","g-data","g-advanced","g-enterprise","g-social","g-media","g-extension"];function w(){try{const c=localStorage.getItem(Q);if(c){const E=JSON.parse(c);if(Array.isArray(E))return E.filter(q=>r.includes(q))}}catch{}return[...r]}const B=P(w());ne(B,c=>{try{localStorage.setItem(Q,JSON.stringify(c))}catch{}},{deep:!0});const u=v(()=>_.status),b=v(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[_.status]||"default"),R=v(()=>{const c=`appLayout.footerStatus.${_.status}`,E=o(c);return E===c?o("appLayout.footerStatus.unknown"):E});function D(c){h.setTheme(c)}const{current:K,supported:F,setLocale:Z}=ae();function ce(){const c=F[(F.indexOf(K.value)+1)%F.length];Z(c)}async function X(c){try{const E=await _.sendRaw({type:"window.open",role:c},1e4);if(E?.ok===!1){V.error(`打开失败:${E.error||"未知"}`);return}const q=E?.result??E;q?.reason==="role_reserved"?V.warning("该窗口角色被保留"):q?.reason}catch(E){V.error(`打开桌面窗口失败:${E.message||E}`)}}async function ye(){le.confirm({title:"切换到桌面壳?",content:"回到 V5/V6 桌面壳。完整 electronAPI 表面(UKey 硬件 / 原生对话框 / 系统设置等)会重新可用,但失去 web-panel 的 SPA 体验。保存后需要重启应用才生效。",okText:"切换并重启",cancelText:"取消",centered:!0,async onOk(){try{const c=await _.sendRaw({type:"shell.switch",target:"desktop"},5e3);if(c?.ok===!1)throw new Error(c.error||"shell.switch returned failure");V.loading({content:"正在重启…",duration:0})}catch(c){const E=c instanceof Error?c.message:String(c);V.error("切换失败:"+E)}}})}function pe({key:c}){if(typeof c=="string"&&c.startsWith("desktop:")){X(c);return}S.push({mcp:"/mcp"}[c]||`/${c}`)}z(()=>_.connect());const x={router:S,route:n,ws:_,themeStore:h,t:o,shellMode:s,collapsed:f,cfg:g,isProject:O,PRODUCT_VERSION:M,currentTheme:C,menuTheme:j,selectedKeys:N,ALL_GROUP_KEYS:r,OPEN_KEYS_LS:Q,loadOpenKeys:w,openKeys:B,wsStatus:u,statusBadge:b,statusText:R,setTheme:D,locale:K,SUPPORTED_LOCALES:F,setLocale:Z,toggleLocale:ce,openDesktopWindow:X,switchToDesktopShell:ye,onMenuClick:pe,ref:P,computed:v,onMounted:z,watch:ne,get useRouter(){return J},get useRoute(){return te},get DashboardOutlined(){return _t},get MessageOutlined(){return kt},get RocketOutlined(){return mt},get AppstoreOutlined(){return ft},get ApiOutlined(){return pt},get FolderOutlined(){return yt},get GlobalOutlined(){return ct},get InfoCircleOutlined(){return ut},get ControlOutlined(){return dt},get FileTextOutlined(){return st},get CloudServerOutlined(){return rt},get BookOutlined(){return lt},get BranchesOutlined(){return at},get ClockCircleOutlined(){return it},get ThunderboltOutlined(){return ot},get ApartmentOutlined(){return nt},get SafetyCertificateOutlined(){return tt},get LockOutlined(){return et},get WifiOutlined(){return $e},get CodeOutlined(){return xe},get ProjectOutlined(){return Xe},get WalletOutlined(){return Ze},get TeamOutlined(){return Ye},get BarChartOutlined(){return Qe},get BlockOutlined(){return Je},get CloudUploadOutlined(){return qe},get ReadOutlined(){return He},get KeyOutlined(){return Ge},get VideoCameraOutlined(){return ze},get ShareAltOutlined(){return We},get IdcardOutlined(){return Ve},get UsergroupAddOutlined(){return Fe},get ShoppingOutlined(){return Ke},get SwapOutlined(){return Ie},get AlertOutlined(){return Ue},get SafetyOutlined(){return De},get ExperimentOutlined(){return Ne},get DeploymentUnitOutlined(){return je},get BulbOutlined(){return Pe},get BankOutlined(){return Re},get PartitionOutlined(){return Me},get AuditOutlined(){return Ae},get FileSearchOutlined(){return Be},get TrophyOutlined(){return Te},get FireOutlined(){return Ee},get SearchOutlined(){return Ce},get NumberOutlined(){return Se},get ClusterOutlined(){return Le},get SoundOutlined(){return ve},get DesktopOutlined(){return we},get BellOutlined(){return de},get SyncOutlined(){return be},get MobileOutlined(){return ue},get DatabaseOutlined(){return he},get UnorderedListOutlined(){return Oe},get message(){return V},get Modal(){return le},get useWsStore(){return H},get useThemeStore(){return oe},get THEMES(){return _e},get logoSrc(){return gt},get useShellMode(){return U},get useI18n(){return ie},get useLocale(){return ae},NotificationBell:Bt,MobileBridgeHeaderStatus:Pt};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},Nt=["src"],Dt={key:0,class:"logo-text"},Ut={key:0,class:"mode-banner project"},It={class:"banner-info"},Kt={class:"banner-name"},Ft={class:"banner-sub"},Vt={key:1,class:"mode-banner global"},Wt={class:"banner-name"},zt=["title"],Gt={class:"group-label"},Ht={class:"group-label"},qt={class:"group-label"},Jt={class:"group-label"},Qt={class:"group-label"},Yt={class:"group-label"},Zt={class:"group-label"},Xt={class:"group-label"},xt={class:"group-label"},$t={key:0,class:"footer-text"},en={class:"header-left"},tn={class:"header-right"},nn={class:"theme-switcher"},on=["data-theme-key","onClick"],an=["data-locale"],ln={class:"lang-switch-label"},rn={class:"version-tag"};function sn(i,y,S,n,_,h){const o=k("a-menu-item"),s=k("a-sub-menu"),f=k("a-menu-divider"),g=k("a-menu"),O=k("a-badge"),M=k("a-layout-sider"),C=k("a-tooltip"),j=k("a-tag"),N=k("a-layout-header"),r=k("router-view"),w=k("a-layout-content"),B=k("a-layout");return p(),A(B,{class:"app-root"},{default:t(()=>[m(" ── Sidebar ─────────────────────────────────────────────────── "),e(M,{collapsed:n.collapsed,"onUpdate:collapsed":y[2]||(y[2]=u=>n.collapsed=u),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[m(" Logo "),d("div",{class:W(["logo",{collapsed:n.collapsed}])},[d("img",{src:n.logoSrc,alt:"ChainlessChain",class:"logo-icon"},null,8,Nt),n.collapsed?m("v-if",!0):(p(),L("span",Dt,"ChainlessChain"))],2),m(" Mode banner "),n.collapsed?(p(),L("div",{key:1,class:"mode-icon-sm",title:n.isProject?n.cfg.projectName:i.$t("appLayout.scope.global")},[n.isProject?(p(),A(n.FolderOutlined,{key:0,style:{color:"#1677ff"}})):(p(),A(n.GlobalOutlined,{key:1,style:{color:"#722ed1"}}))],8,zt)):(p(),L(I,{key:0},[n.isProject?(p(),L("div",Ut,[e(n.FolderOutlined,{class:"banner-icon"}),d("div",It,[d("div",Kt,a(n.cfg.projectName||i.$t("appLayout.scope.fallbackProject")),1),d("div",Ft,a(i.$t("appLayout.scope.projectPanel")),1)])])):(p(),L("div",Vt,[e(n.GlobalOutlined,{class:"banner-icon"}),d("span",Wt,a(i.$t("appLayout.scope.global")),1)]))],64)),m(" Navigation "),e(g,{selectedKeys:n.selectedKeys,"onUpdate:selectedKeys":y[0]||(y[0]=u=>n.selectedKeys=u),openKeys:n.openKeys,"onUpdate:openKeys":y[1]||(y[1]=u=>n.openKeys=u),theme:n.menuTheme,mode:"inline","inline-collapsed":n.collapsed,class:"side-menu",onClick:n.onMenuClick},{default:t(()=>[n.collapsed?(p(),L(I,{key:1},[e(o,{key:"dashboard"},{icon:t(()=>[e(n.DashboardOutlined)]),_:1}),e(o,{key:"chat"},{icon:t(()=>[e(n.MessageOutlined)]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(n.ThunderboltOutlined)]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(n.RocketOutlined)]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(n.ControlOutlined)]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(n.AlertOutlined)]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(n.NumberOutlined)]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(n.FileTextOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"skills"},{icon:t(()=>[e(n.AppstoreOutlined)]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(n.ApiOutlined)]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(n.CloudServerOutlined)]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(n.FolderOutlined)]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(n.SoundOutlined)]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(n.BellOutlined)]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(n.SyncOutlined)]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(n.BulbOutlined)]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(n.CodeOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"notes"},{icon:t(()=>[e(n.BookOutlined)]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(n.SearchOutlined)]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(n.BranchesOutlined)]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(n.ShareAltOutlined)]),_:1}),e(o,{key:"personal-data-hub"},{icon:t(()=>[e(n.DatabaseOutlined)]),_:1}),e(o,{key:"personal-data-hub/browser"},{icon:t(()=>[e(n.UnorderedListOutlined)]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(n.ShoppingOutlined)]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(n.ClockCircleOutlined)]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(n.ApartmentOutlined)]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(n.PartitionOutlined)]),_:1}),e(o,{key:"tasks"},{icon:t(()=>[e(n.ThunderboltOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"security"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),_:1}),e(o,{key:"ukey-sign"},{icon:t(()=>[e(n.KeyOutlined)]),_:1}),e(o,{key:"trust"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"audit"},{icon:t(()=>[e(n.FileSearchOutlined)]),_:1}),e(o,{key:"mtc"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"mtc-audit"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"multisig"},{icon:t(()=>[e(n.TeamOutlined)]),_:1}),e(o,{key:"did"},{icon:t(()=>[e(n.IdcardOutlined)]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(n.LockOutlined)]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(n.WifiOutlined)]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(n.MobileOutlined)]),_:1}),e(o,{key:"terminal"},{icon:t(()=>[e(n.DesktopOutlined)]),_:1}),e(o,{key:"backup"},{icon:t(()=>[e(n.CloudUploadOutlined)]),_:1}),e(o,{key:"git"},{icon:t(()=>[e(n.CodeOutlined)]),_:1}),e(o,{key:"projects"},{icon:t(()=>[e(n.ProjectOutlined)]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(n.SwapOutlined)]),_:1}),e(o,{key:"compliance"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"privacy"},{icon:t(()=>[e(n.ExperimentOutlined)]),_:1}),e(o,{key:"inference"},{icon:t(()=>[e(n.DeploymentUnitOutlined)]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(n.ClusterOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"wallet"},{icon:t(()=>[e(n.WalletOutlined)]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(n.TeamOutlined)]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(n.BankOutlined)]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(n.DashboardOutlined)]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(n.BarChartOutlined)]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(n.BlockOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"community"},{icon:t(()=>[e(n.UsergroupAddOutlined)]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(n.AuditOutlined)]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(n.TrophyOutlined)]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(n.FireOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"rssfeed"},{icon:t(()=>[e(n.ReadOutlined)]),_:1}),e(o,{key:"webauthn"},{icon:t(()=>[e(n.KeyOutlined)]),_:1}),n.shellMode.isEmbedded?(p(),L(I,{key:0},[e(f,{class:"divider-sm"}),e(o,{key:"desktop:hardware-wallet"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),_:1}),e(o,{key:"desktop:backup-dashboard"},{icon:t(()=>[e(n.CloudUploadOutlined)]),_:1}),e(o,{key:"desktop:llm-test-chat"},{icon:t(()=>[e(n.ExperimentOutlined)]),_:1}),e(o,{key:"desktop:settings"},{icon:t(()=>[e(n.ControlOutlined)]),_:1})],64)):m("v-if",!0)],64)):(p(),L(I,{key:0},[e(s,{key:"g-overview"},{title:t(()=>[d("span",Gt,a(i.$t("appLayout.groups.overview")),1)]),default:t(()=>[e(o,{key:"dashboard"},{icon:t(()=>[e(n.DashboardOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.dashboard")),1)]),_:1}),e(o,{key:"chat"},{icon:t(()=>[e(n.MessageOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.chat")),1)]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(n.ThunderboltOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.quickAsk")),1)]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(n.RocketOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.cowork")),1)]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(n.ControlOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.services")),1)]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(n.AlertOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.aiops")),1)]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(n.NumberOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.tokens")),1)]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(n.FileTextOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.logs")),1)]),_:1})]),_:1}),e(s,{key:"g-config"},{title:t(()=>[d("span",Ht,a(i.$t("appLayout.groups.config")),1)]),default:t(()=>[e(o,{key:"skills"},{icon:t(()=>[e(n.AppstoreOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.skills")),1)]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(n.ApiOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.providers")),1)]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(n.CloudServerOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mcp")),1)]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(n.FolderOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.projectSettings")),1)]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(n.SoundOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.speechSettings")),1)]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(n.BellOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.notificationSettings")),1)]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(n.SyncOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.syncSettings")),1)]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(n.BulbOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.nlprog")),1)]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(n.CodeOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.codegen")),1)]),_:1})]),_:1}),e(s,{key:"g-data"},{title:t(()=>[d("span",qt,a(i.$t("appLayout.groups.data")),1)]),default:t(()=>[e(o,{key:"notes"},{icon:t(()=>[e(n.BookOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.notes")),1)]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(n.SearchOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.search")),1)]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(n.BranchesOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.memory")),1)]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(n.ShareAltOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.knowledge")),1)]),_:1}),e(o,{key:"personal-data-hub"},{icon:t(()=>[e(n.DatabaseOutlined)]),default:t(()=>[y[3]||(y[3]=l("个人数据中台",-1))]),_:1}),e(o,{key:"personal-data-hub/browser"},{icon:t(()=>[e(n.UnorderedListOutlined)]),default:t(()=>[y[4]||(y[4]=l("数据浏览器",-1))]),_:1}),e(o,{key:"family-guard"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[y[5]||(y[5]=l("家庭守护",-1))]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(n.ShoppingOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.marketplace")),1)]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(n.ClockCircleOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.cron")),1)]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(n.ApartmentOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.workflow")),1)]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(n.PartitionOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.pipeline")),1)]),_:1}),e(o,{key:"tasks"},{icon:t(()=>[e(n.ThunderboltOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.tasks")),1)]),_:1})]),_:1}),e(s,{key:"g-advanced"},{title:t(()=>[d("span",Jt,a(i.$t("appLayout.groups.advanced")),1)]),default:t(()=>[e(o,{key:"security"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.security")),1)]),_:1}),e(o,{key:"ukey-sign"},{icon:t(()=>[e(n.KeyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.ukeySign")),1)]),_:1}),e(o,{key:"trust"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.trust")),1)]),_:1}),e(o,{key:"audit"},{icon:t(()=>[e(n.FileSearchOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.audit")),1)]),_:1}),e(o,{key:"mtc"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mtc")),1)]),_:1}),e(o,{key:"mtc-audit"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mtcAudit","MTC 审计")),1)]),_:1}),e(o,{key:"multisig"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.multisig","M-of-N 多签")),1)]),_:1}),e(o,{key:"did"},{icon:t(()=>[e(n.IdcardOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.did")),1)]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(n.LockOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.permissions")),1)]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(n.WifiOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.p2p")),1)]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(n.MobileOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mobileBridge","移动桥")),1)]),_:1}),e(o,{key:"remote-session"},{icon:t(()=>[e(n.DesktopOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.remoteSession","远程会话")),1)]),_:1}),e(o,{key:"mobile-projects"},{icon:t(()=>[e(n.MobileOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mobileProjects","手机项目 (v0.2)")),1)]),_:1}),e(o,{key:"terminal"},{icon:t(()=>[e(n.DesktopOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.terminal","远程终端")),1)]),_:1}),e(o,{key:"backup"},{icon:t(()=>[e(n.CloudUploadOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.backup")),1)]),_:1}),e(o,{key:"git"},{icon:t(()=>[e(n.CodeOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.git")),1)]),_:1}),e(o,{key:"projects"},{icon:t(()=>[e(n.ProjectOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.projects")),1)]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(n.SwapOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.crosschain")),1)]),_:1}),e(o,{key:"compliance"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.compliance")),1)]),_:1}),e(o,{key:"privacy"},{icon:t(()=>[e(n.ExperimentOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.privacy")),1)]),_:1}),e(o,{key:"inference"},{icon:t(()=>[e(n.DeploymentUnitOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.inference")),1)]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(n.ClusterOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.federation")),1)]),_:1})]),_:1}),e(s,{key:"g-enterprise"},{title:t(()=>[d("span",Qt,a(i.$t("appLayout.groups.enterprise")),1)]),default:t(()=>[e(o,{key:"wallet"},{icon:t(()=>[e(n.WalletOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.wallet")),1)]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.organization")),1)]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(n.BankOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.tenant")),1)]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(n.DashboardOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.sla")),1)]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(n.BarChartOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.analytics")),1)]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(n.BlockOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.templates")),1)]),_:1})]),_:1}),e(s,{key:"g-social"},{title:t(()=>[d("span",Yt,a(i.$t("appLayout.groups.social")),1)]),default:t(()=>[e(o,{key:"community"},{icon:t(()=>[e(n.UsergroupAddOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.community")),1)]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(n.AuditOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.governance")),1)]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(n.TrophyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.reputation")),1)]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(n.FireOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.recommend")),1)]),_:1})]),_:1}),e(s,{key:"g-media"},{title:t(()=>[d("span",Zt,a(i.$t("appLayout.groups.media")),1)]),default:t(()=>[e(o,{key:"video"},{icon:t(()=>[e(n.VideoCameraOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.video")),1)]),_:1})]),_:1}),e(s,{key:"g-extension"},{title:t(()=>[d("span",Xt,a(i.$t("appLayout.groups.extension")),1)]),default:t(()=>[e(o,{key:"rssfeed"},{icon:t(()=>[e(n.ReadOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.rssfeed")),1)]),_:1}),e(o,{key:"webauthn"},{icon:t(()=>[e(n.KeyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.webauthn")),1)]),_:1})]),_:1}),m(` Desktop-only group — only shown in the embedded web-shell. Each
|
|
4
|
-
click opens a new BrowserWindow loading the V5/V6 desktop
|
|
5
|
-
renderer (full electronAPI / UKey / FS / settings live there). `),n.shellMode.isEmbedded?(p(),A(s,{key:"g-desktop"},{title:t(()=>[d("span",xt,a(i.$t("appLayout.groups.desktop")),1)]),default:t(()=>[e(o,{key:"desktop:hardware-wallet"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopHardware")),1)]),_:1}),e(o,{key:"desktop:backup-dashboard"},{icon:t(()=>[e(n.CloudUploadOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopBackup")),1)]),_:1}),e(o,{key:"desktop:llm-test-chat"},{icon:t(()=>[e(n.ExperimentOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopLlmTest")),1)]),_:1}),e(o,{key:"desktop:settings"},{icon:t(()=>[e(n.ControlOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopSettings")),1)]),_:1})]),_:1})):m("v-if",!0)],64))]),_:1},8,["selectedKeys","openKeys","theme","inline-collapsed"]),m(" Connection status "),d("div",{class:W(["sidebar-footer",{collapsed:n.collapsed}])},[e(O,{status:n.statusBadge},null,8,["status"]),n.collapsed?m("v-if",!0):(p(),L("span",$t,a(n.statusText),1))],2)]),_:1},8,["collapsed"]),m(" ── Main area ───────────────────────────────────────────────── "),e(B,{class:"main-area"},{default:t(()=>[m(" Header "),e(N,{class:"app-header"},{default:t(()=>[d("div",en,[d("div",{class:W(["scope-tag",n.isProject?"project":"global"])},[(p(),A(me(n.isProject?n.FolderOutlined:n.GlobalOutlined))),d("span",null,a(n.isProject?n.cfg.projectName||i.$t("appLayout.scope.fallbackProject"):i.$t("appLayout.scope.global")),1),n.isProject&&n.cfg.projectRoot?(p(),A(C,{key:0,title:n.cfg.projectRoot},{default:t(()=>[e(n.InfoCircleOutlined,{class:"info-icon"})]),_:1},8,["title"])):m("v-if",!0)],2)]),d("div",tn,[m(" Theme switcher "),d("div",nn,[(p(!0),L(I,null,se(n.THEMES,(u,b)=>(p(),A(C,{key:b,title:u.label},{default:t(()=>[d("button",{class:W(["theme-btn",{active:n.currentTheme===b}]),"data-theme-key":b,onClick:R=>n.setTheme(b)},a(u.icon),11,on)]),_:2},1032,["title"]))),128))]),m(` Language switcher (incremental i18n; only owns its own
|
|
6
|
-
labels + ErrorBoundary + common.* today). `),e(C,{title:i.$t("language.label")},{default:t(()=>[d("button",{class:"lang-switch-btn","data-locale":n.locale,onClick:n.toggleLocale},[e(n.GlobalOutlined,{class:"lang-switch-icon"}),d("span",ln,a(i.$t("language.switch")),1)],8,an)]),_:1},8,["title"]),m(" Mobile bridge status — pill showing online/total paired phones.\n Click to /mobile-bridge. Polls every 5s via `p2p devices` CLI. "),e(n.MobileBridgeHeaderStatus),m(` Notification bell — only meaningful in the embedded web-shell
|
|
7
|
-
where notification.* WS topics are registered. In pure-browser
|
|
8
|
-
mode the composable returns empty / no-op shapes, so the badge
|
|
9
|
-
just shows 0 and the drawer is empty. `),n.shellMode.isEmbedded?(p(),A(n.NotificationBell,{key:0})):m("v-if",!0),d("span",rn,a(n.PRODUCT_VERSION),1),m(" Phase 1.6 symmetric switch: only inside the embedded\n desktop shell does this make sense (no-op in `cc serve`\n browser mode where there's no V5/V6 to fall back to). "),n.shellMode.isEmbedded?(p(),A(C,{key:1,title:i.$t("appLayout.shellSwitch")},{default:t(()=>[d("button",{type:"button",class:"shell-switch-btn",onClick:n.switchToDesktopShell},[e(n.DesktopOutlined)])]),_:1},8,["title"])):m("v-if",!0),e(j,{color:n.wsStatus==="connected"?"green":n.wsStatus==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(a(n.wsStatus==="connected"?i.$t("appLayout.wsStatus.connected"):n.wsStatus==="connecting"?i.$t("appLayout.wsStatus.connecting"):i.$t("appLayout.wsStatus.disconnected")),1)]),_:1},8,["color"])])]),_:1}),m(" Content "),e(w,{class:"page-content"},{default:t(()=>[e(r)]),_:1})]),_:1})]),_:1})}const Pn=Y(jt,[["render",sn],["__scopeId","data-v-6f6437fc"],["__file","/tmp/cc-web-panel-CQtNLO/repo/packages/web-panel/src/components/AppLayout.vue"]]);export{Pn as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-BMxUs6UX.js";import{_ as N}from"./index-BK2N5yVW.js";import"./icons-BsDmGpcT.js";const S={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},k={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},L={key:1,class:"row"};function M(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",k,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",L,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const H=N(S,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-CQtNLO/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{H as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as B,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S,V as x,o as I,x as O,P as i,Q as k,R as r,F as N,Z as F}from"./vendor-BMxUs6UX.js";import{u as P,_ as E}from"./index-BK2N5yVW.js";import{R as L}from"./icons-BsDmGpcT.js";const V=B("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const T=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){b(),s(),u=setInterval(s,e),C()}function b(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function C(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:T,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:b,formatDuration:A,getStatusColor:o}}),U={__name:"Tasks",setup(y,{expose:l}){l();const u=V(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function T(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),O(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:T,truncate:v,onMounted:I,onUnmounted:O,get ReloadOutlined(){return L},get useTasksStore(){return V}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},Q={class:"page-header"},j={key:0,class:"error-text"},J={key:1},K={class:"task-header"},M={class:"task-desc"},W={class:"task-id"},Z={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,T){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),b=p("a-row"),C=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",Q,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),S(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",j,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",J,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("v-if",!0),n(b,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),S(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(N,null,F(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",K,[n(C,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",M,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Z,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):x("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),S(C,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,q)):o.key==="duration"?(i(),c(N,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(N,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(N,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(N,{key:5},[e.status==="running"?(i(),S(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=E(U,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-CQtNLO/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-BK2N5yVW.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-CDjH9-sp.js";import{a0 as t}from"./index-BK2N5yVW.js";import"./vendor-BMxUs6UX.js";import"./index-CmUOjyL6.js";import"./icons-BsDmGpcT.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-Dty6jz5V.js";import{a0 as t}from"./index-BK2N5yVW.js";import"./vendor-BMxUs6UX.js";import"./responsiveObserve-CBk2WqvQ.js";import"./useFlexGapSupport-B1lWlqXN.js";import"./styleChecker-BxaCFlOL.js";import"./index-CmUOjyL6.js";import"./icons-BsDmGpcT.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-BMxUs6UX.js";import{d as s}from"./styleChecker-BxaCFlOL.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
|