chainlesschain 0.162.180 → 0.162.182
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 +7 -3
- package/scripts/build-windows-sandbox-helper.ps1 +163 -0
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-D_TIL54O.js → AIOps-DzZ5_xoj.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-eQwy9r-f.js → ActionButton-DeLXddIg.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D2eNuDgT.js → Analytics-rvDCmet1.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CFhwOFsf.js → AppLayout-Yt6QVDnp.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CJUMw6PB.js → Artifacts-BS112K5L.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CDB9V58o.js → Audit-0wJuQrNu.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-TBppYFjN.js → BackgroundAgents-B90PMgbn.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CYEOUpzJ.js → Backup-TkgMglQQ.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C88fFT2u.js → BaseInput-CQVS9p1l.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-mkr1vC3N.js → Chat-YTjQHoC7.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-PR074hUN.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CVU4xqti.js → Checkbox-5bwaOabq.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-rrNcByz3.js → Codegen-BFmNQ_Xe.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Cqu-zCvh.js → Col-BT_u4Dzp.js} +1 -1
- package/src/assets/web-panel/assets/{Community-RGRlSgXV.js → Community-CJP52u5b.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DBm6epOK.js → Compact-BpzhJE9i.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BgKw5iaW.js → Compliance-Cg7rfslp.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BqQcNO3Z.js → Cowork-JisxL6Yy.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DO5gTFNb.js → Cron-Bu7Ug_MC.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B8hbJNuN.js → Crosschain-CvuqoLdj.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B08bFJ2C.js → DID-C2u9G8Pu.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-xNdy_ifo.js → Dashboard-BFt5Yv3d.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D-KIZgWL.js → Dropdown-DIaT9Wxq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DKCvsaGo.js → EmailListRenderer-D_A601Y4.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D_cfqama.js → FamilyGuardDashboard--IyQ8I8w.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B-UqQD68.js → Federation-BihWHxuY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BWWvWuJW.js → FormItemContext-BB8dOXc_.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CPchx6N7.js → GenericCardRenderer-DQYhj1HH.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Vx4co9Ff.js → Git-B-2QZxGf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D4x0pp_m.js → Governance-CusSb-nG.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-T3KvwPYR.js → Inference-BAjmvPPL.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Ddv3KUv3.js → KnowledgeGraph-DoNYWKYq.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DfH-Dkae.js → Logs-B8fKWD-n.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DHW3PbCq.js → MarkdownRenderer-BlJm1J7E.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-tjgb0R3D.js → Marketplace-CyOscbSL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DHAk5nYX.js → McpTools-Ex6Om5da.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-A2Yx7thM.js → Memory-CDcD8l8r.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BEmTVfN5.js → MobileBridge-xfBqoFDg.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DuFHUgE4.js → MobileProjects-BwObMMA2.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BDSll0OZ.js → Mtc-CIWd36OV.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CuBvluaS.js → MtcAudit-CPX0ouuA.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BmXAA-Sb.js → Multisig-BDJsIUuW.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-ci2stZAe.js → NLProgramming-DEkbuD3N.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D-1RpqnS.js → Notes-DJpHRhH1.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C0GyitIT.js → NotificationSettings-C1UZ-Qd5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-U2bN-hj5.js → OrderTableRenderer-GlJtqLjT.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BNZgpPci.js → Organization-Bbhj0fac.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CDidKmUN.js → Overflow-1H04x3kx.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BnreBaXq.js → P2P-CDpPe3et.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DwJUxO9j.js → PdhVaultBrowser-MUX0Bpvw.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BQGgJPH0.js → Permissions-A07-0Ci1.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-k_fSkCwL.js → PersonalDataHub-DhhDWxAZ.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-WGqKMqau.js → Pipeline-CyfbJfe-.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DtHj9Ymq.js → Privacy-CNFps3ED.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B3wH2SFC.js → ProjectInit--T-u3Dr5.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Cd0cgcA1.js → ProjectSettings-DJmrK2fC.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Qx_MdX9k.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DTpxEXur.js → Providers-DLzzbOZd.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-B2v6gR-C.js → QrScannerModal-CexOomKS.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D3Nr9xXR.js → QuickAsk-QklGi19_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-C9inoMky.js → Recommend-Bb9kwSw8.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-DZuVNNN5.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-41KFG646.js → Reputation-Dr5cLP0N.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DqAaqqCv.js → Row-oCQHYv5t.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CMDpCDKc.js → RssFeed-IFDEykIR.js} +3 -3
- package/src/assets/web-panel/assets/{Search-B6mtegNL.js → Search-CspVIxDc.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BaePFVZ8.js → Security-Bm66o_DH.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DeG3Qscl.js → Services-DvanNqXl.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D_QP7F90.js → Skeleton-CHjEe9_O.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DLGyUgIA.js → Skills-Cb8jWjMX.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BN2pxW1Q.js → Sla-DxZm1491.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWsZPd8B.js → SpeechSettings-DWxEEclC.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-VOZRPODW.js → SyncSettings-FIvOFw5p.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-CyuLnDFR.js +1 -0
- package/src/assets/web-panel/assets/{Templates-eJSob-q0.js → Templates-CaNjzV_t.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Bdwk8Rwy.js → Tenant-DjlP6TmH.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-DwzGMniO.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-D5qkbPKT.js → TimelineRenderer-DoZ8y7y8.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DKgwn8hI.js → Tokens-390cg2TC.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-HlEHniGM.js → Trigger-CLrtCj5_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CdPcsBpN.js → Trust-DpESfSPn.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-vAdXd-vG.js → UkeySign-CN6279O0.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-9hHBYFnH.js → VideoEditing-DPtAUlSe.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dxh5d1yR.js → Wallet-nKOMV_1n.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BsFmLHkp.js → WebAuthn-HuXlSOc4.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Cn0OIwLn.js → WorkflowEditor-CUfFjARi.js} +1 -1
- package/src/assets/web-panel/assets/chat-6Eq0PcZJ.js +1 -0
- package/src/assets/web-panel/assets/{colors-Du9jzLN0.js → colors-BP_Sf6Iy.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DhEscfzw.js → compact-item-BufMKIh5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CwzEfF3i.js → createContext-BBMXxWSW.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DgVKduH2.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DT_GSE6J.js → hasIn-fUK_tRO2.js} +1 -1
- package/src/assets/web-panel/assets/{index-tND8-TDU.js → index-2A5ph8b2.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8s5FxJY.js → index-3FuwBewR.js} +1 -1
- package/src/assets/web-panel/assets/{index-53z1YUxX.js → index-6GmBa4Kg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFD0cEna.js → index-B2vS66eI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQWxDOvM.js → index-B7Etk0Te.js} +1 -1
- package/src/assets/web-panel/assets/{index-VeHs6qH0.js → index-B9WYSn4m.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGvgnfl9.js → index-BHy6yNiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3llLkYM.js → index-BMLHv389.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dny_ZnAO.js → index-BWKoBU8R.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzjzrOli.js → index-Bkg4ZePE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DN60VBn5.js → index-C44atv4k.js} +1 -1
- package/src/assets/web-panel/assets/{index-v5HLYCVa.js → index-CE2DdTP2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BF-ZCVGE.js → index-CGjmILDm.js} +1 -1
- package/src/assets/web-panel/assets/{index-gFjYdstW.js → index-CW_G-MXw.js} +1 -1
- package/src/assets/web-panel/assets/{index-NA2oBLSB.js → index-CZ6Yt17L.js} +1 -1
- package/src/assets/web-panel/assets/{index-Mobw3PHs.js → index-CeASi4fr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWL3SYN3.js → index-CgiECHu2.js} +1 -1
- package/src/assets/web-panel/assets/{index-1LoutPJd.js → index-Cp8vhyZy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnHhFnwt.js → index-CwSf5pnf.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6QDWRLk.js → index-D4_MuGkd.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-QkW1fp.js → index-D9vU25ij.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4SN3by5.js → index-DASluSqY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyEhUJcu.js → index-DLpIs_P_.js} +1 -1
- package/src/assets/web-panel/assets/index-DOZTSoS7.js +1 -0
- package/src/assets/web-panel/assets/{index-BrkJ7JPm.js → index-DPdUNk1i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cnok8mhZ.js → index-DVsqvI4M.js} +1 -1
- package/src/assets/web-panel/assets/index-DhpvjpqI.js +1 -0
- package/src/assets/web-panel/assets/{index-CAVW0cWM.js → index-DmkMXwnR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cc9aPkv-.js → index-DocdRcbd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnVVYKCE.js → index-Dyngbd29.js} +20 -20
- package/src/assets/web-panel/assets/{index-D8gt0j7r.js → index-GwdRUZ-x.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIYTjbv_.js → index-LvCBfTLo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhXay17G.js → index-cpEli44X.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQWENaZf.js → index-fzaMtSJ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfRDyY1q.js → index-pum7HYBA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgSR2WMG.js → index-t8N1tSeX.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5IytTND.js → index-uCbEN7cY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtRwLhee.js → index-wKTLbKyc.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4kZoXNr.js → index-wV6iGdpY.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Cvt59c10.js → initDefaultProps-V5Fo95FM.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D15pPEzl.js → motion-BYWU0hUT.js} +1 -1
- package/src/assets/web-panel/assets/{move-N55KeXJ7.js → move-Cr1M-J2h.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CyFO1bYP.js → mtc-parser-BysQKi2N.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B5IXfxU2.js → omit-D1zHU8GC.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CpVqsulV.js → pickAttrs-CUArxtfi.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-ME36sMF3.js → placementArrow-ChoYEys0.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BXAIR1r-.js → responsiveObserve-BQRs3Mo7.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BkOX3-Dp.js → slide-B8zbsCkg.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Cy4Aklpt.js → statusUtils-C2U8Gs6h.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-gUd2T206.js → styleChecker-Dd8MgL_V.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CaVD4o99.js → useFlexGapSupport-hknqY5NH.js} +1 -1
- package/src/assets/web-panel/assets/{useFs--pFGl0KD.js → useFs-CLTAmcfw.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D45iP86i.js → usePersonalDataHub-ByegHbiB.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BayoChH_.js → vnode-DqlAy5DP.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CpP38poi.js → zoom-DiXiztQn.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agenda.js +115 -3
- package/src/commands/agent.js +10 -1
- package/src/commands/background-session.js +2 -1
- package/src/commands/context.js +69 -2
- package/src/data/changelog.json +26 -0
- package/src/gateways/terminal/PtyManager.js +45 -4
- package/src/gateways/ws/background-agent-protocol.js +38 -0
- package/src/gateways/ws/message-dispatcher.js +1 -0
- package/src/gateways/ws/remote-session-protocol.js +65 -6
- package/src/gateways/ws/ws-server.js +18 -2
- package/src/harness/background-task-manager.js +70 -2
- package/src/harness/feature-flags.js +15 -8
- package/src/harness/mcp-client.js +618 -43
- package/src/harness/worktree-isolator.js +14 -3
- package/src/lazy-dispatch.js +30 -1
- package/src/lib/agent-authority.js +22 -0
- package/src/lib/agent-core.js +3 -0
- package/src/lib/agent-sandbox.js +161 -0
- package/src/lib/agent-schedule-store.js +45 -22
- package/src/lib/agent-team/team-runner.js +22 -0
- package/src/lib/artifact-store.js +35 -0
- package/src/lib/async-hook-supervisor.cjs +13 -2
- package/src/lib/audit-mtc.js +3 -2
- package/src/lib/background-agent-supervisor.js +104 -3
- package/src/lib/background-interaction-journal.js +407 -0
- package/src/lib/background-interaction-resolver.js +23 -34
- package/src/lib/background-session-transport.js +12 -2
- package/src/lib/capability-manifest.js +41 -3
- package/src/lib/capability-negotiation.js +1 -1
- package/src/lib/channels/channel-manager.js +33 -0
- package/src/lib/channels/telegram-channel.js +23 -5
- package/src/lib/channels/webhook-channel.js +38 -15
- package/src/lib/chrome-connector.js +169 -23
- package/src/lib/config-manager.js +23 -9
- package/src/lib/context-breakdown.js +31 -0
- package/src/lib/cowork-cron.js +274 -32
- package/src/lib/cross-chain-mtc.js +3 -2
- package/src/lib/durable-security-store.js +124 -0
- package/src/lib/event-runtime-host.js +67 -6
- package/src/lib/event-runtime-store.js +163 -0
- package/src/lib/goal-store.js +32 -12
- package/src/lib/headless-manifest.js +2 -1
- package/src/lib/hook-environment.cjs +58 -0
- package/src/lib/hook-manager.js +12 -5
- package/src/lib/hook-runner.cjs +122 -28
- package/src/lib/hook-runner.js +7 -2
- package/src/lib/hooks-v2-producers.js +36 -0
- package/src/lib/hooks-v2-runtime.js +329 -52
- package/src/lib/interaction-adapter.js +60 -19
- package/src/lib/interaction-binding.js +64 -0
- package/src/lib/json-schema-output.js +439 -14
- package/src/lib/json-schema-validate.js +514 -883
- package/src/lib/lan-pairing-tokens.js +115 -57
- package/src/lib/lsp/__tests__/lsp-client.test.js +32 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +25 -0
- package/src/lib/lsp/lsp-client.js +4 -0
- package/src/lib/lsp/lsp-manager.js +3 -0
- package/src/lib/lsp/lsp-server-registry.js +18 -0
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-oauth.js +35 -21
- package/src/lib/packer/pkg-config-generator.js +3 -0
- package/src/lib/permission-decision.js +99 -0
- package/src/lib/plugin-monitor-supervisor.js +3 -0
- package/src/lib/plugin-runtime/bin.js +1148 -70
- package/src/lib/plugin-runtime/capabilities.js +50 -0
- package/src/lib/plugin-runtime/capability-consent.js +42 -35
- package/src/lib/plugin-runtime/hooks.js +36 -9
- package/src/lib/plugin-runtime/install.js +23 -7
- package/src/lib/plugin-runtime/lsp.js +4 -0
- package/src/lib/plugin-runtime/manifest.js +112 -8
- package/src/lib/plugin-runtime/mcp.js +30 -5
- package/src/lib/plugin-runtime/monitors.js +11 -0
- package/src/lib/plugin-runtime/plugin-options.js +94 -38
- package/src/lib/plugin-runtime/policy.js +29 -2
- package/src/lib/plugin-runtime/sandbox-policy.js +84 -0
- package/src/lib/plugin-runtime/scopes.js +27 -13
- package/src/lib/plugin-runtime/trust.js +36 -31
- package/src/lib/process-execution-broker/credential-agent.js +114 -16
- package/src/lib/process-execution-broker/credential-transport-worker.js +312 -0
- package/src/lib/process-execution-broker/credential-transport.js +378 -0
- package/src/lib/process-execution-broker/index.js +765 -49
- package/src/lib/process-execution-broker/platform-sandbox.js +4233 -138
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +3856 -0
- package/src/lib/project-mcp-trust.js +21 -26
- package/src/lib/protocol-replay.js +19 -12
- package/src/lib/repl-bang-memorize.js +67 -10
- package/src/lib/settings-hooks.cjs +13 -0
- package/src/lib/skill-loader.js +83 -10
- package/src/lib/slash-commands.js +27 -4
- package/src/lib/sync-credentials.js +5 -4
- package/src/lib/turn-binding.js +8 -6
- package/src/repl/agent-repl.js +117 -31
- package/src/repl/repl-turn-binding.js +5 -2
- package/src/runtime/agent-core.js +699 -70
- package/src/runtime/agent-runtime.js +13 -1
- package/src/runtime/coding-agent-contract-shared.cjs +3 -3
- package/src/runtime/headless-runner.js +105 -7
- package/src/runtime/headless-stream.js +209 -23
- package/src/runtime/mcp-config.js +29 -17
- package/src/runtime/policies/agent-policy.js +2 -0
- package/src/workers/background-agent-worker.js +128 -13
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C7bofJuA.js +0 -1
- package/src/assets/web-panel/assets/Projects-BbgmyQnS.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Bqk3EYSu.js +0 -4
- package/src/assets/web-panel/assets/Tasks-3bDAUz8K.js +0 -1
- package/src/assets/web-panel/assets/Terminal-CsMLKIoV.js +0 -3
- package/src/assets/web-panel/assets/chat-CJ19O6Dh.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BBMFnsja.js +0 -1
- package/src/assets/web-panel/assets/index-Do8JMV4N.js +0 -1
- package/src/assets/web-panel/assets/index-UYAJ6iNM.js +0 -1
|
@@ -33,6 +33,8 @@ export function resolveAgentPolicy({
|
|
|
33
33
|
: [],
|
|
34
34
|
sandbox: overrides.sandbox || null,
|
|
35
35
|
autoCheckpoint: overrides.autoCheckpoint === true,
|
|
36
|
+
worktreeId:
|
|
37
|
+
overrides.worktreeId == null ? null : String(overrides.worktreeId),
|
|
36
38
|
systemPrompt: overrides.systemPrompt || null,
|
|
37
39
|
appendSystemPrompt: overrides.appendSystemPrompt || null,
|
|
38
40
|
fallbackModel: overrides.fallbackModel || null,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* no client is attached.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import { readFileSync } from "node:fs";
|
|
15
|
+
import { readFileSync, writeSync } from "node:fs";
|
|
16
16
|
import { randomBytes } from "node:crypto";
|
|
17
17
|
import {
|
|
18
18
|
DEFAULT_HEARTBEAT_INTERVAL_MS,
|
|
@@ -25,6 +25,11 @@ import {
|
|
|
25
25
|
import { startBackgroundSessionServer } from "../lib/background-session-transport.js";
|
|
26
26
|
import { idlePhaseFor } from "../lib/background-agent-phase.js";
|
|
27
27
|
import { attachInteractionRequestHandler } from "../lib/background-interaction-resolver.js";
|
|
28
|
+
import {
|
|
29
|
+
loadBackgroundInteractionJournal,
|
|
30
|
+
rejectPendingBackgroundInteractions,
|
|
31
|
+
updateBackgroundInteractionJournal,
|
|
32
|
+
} from "../lib/background-interaction-journal.js";
|
|
28
33
|
import executionBroker from "../lib/process-execution-broker/index.js";
|
|
29
34
|
|
|
30
35
|
const jobFile = process.argv[2];
|
|
@@ -39,6 +44,7 @@ let turnCount = 0;
|
|
|
39
44
|
let lastExit = { code: 0, signal: null };
|
|
40
45
|
let transportState = null;
|
|
41
46
|
let detachInteractionHandler = null;
|
|
47
|
+
let interactionJournal = null;
|
|
42
48
|
const promptQueue = [];
|
|
43
49
|
// P0-2: 保存 pending 的交互请求,等 attach 客户端连接后转发
|
|
44
50
|
const pendingInteractions = new Map();
|
|
@@ -49,6 +55,24 @@ const pendingInteractions = new Map();
|
|
|
49
55
|
// relays the throw as {type:"error", message}) instead of silently queued.
|
|
50
56
|
const MAX_PROMPT_QUEUE = 100;
|
|
51
57
|
|
|
58
|
+
function updateInteractionJournal(mutate, options = {}) {
|
|
59
|
+
const mutation = updateBackgroundInteractionJournal(
|
|
60
|
+
job.sessionId,
|
|
61
|
+
interactionJournal,
|
|
62
|
+
mutate,
|
|
63
|
+
options,
|
|
64
|
+
);
|
|
65
|
+
interactionJournal = mutation.journal;
|
|
66
|
+
return mutation.result;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function persistInteractionSettlement(requestId, binding, outcome) {
|
|
70
|
+
return updateInteractionJournal(
|
|
71
|
+
(draft) => draft.settle(requestId, binding, outcome),
|
|
72
|
+
{ persistIf: (result) => result.applied },
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
52
76
|
function mergeState(patch) {
|
|
53
77
|
const current = readBackgroundAgentState(job.id) || { id: job.id };
|
|
54
78
|
const next = { ...current, id: job.id, ...patch };
|
|
@@ -162,6 +186,14 @@ function startTurn(argv, promptText) {
|
|
|
162
186
|
child,
|
|
163
187
|
async (payload, msg, { signal }) => {
|
|
164
188
|
const requestId = msg.requestId;
|
|
189
|
+
updateInteractionJournal((draft) =>
|
|
190
|
+
draft.recordPending({
|
|
191
|
+
requestId,
|
|
192
|
+
binding: msg.binding,
|
|
193
|
+
payload,
|
|
194
|
+
createdAt: Date.now(),
|
|
195
|
+
}),
|
|
196
|
+
);
|
|
165
197
|
phase = "needs_input";
|
|
166
198
|
mergeState({
|
|
167
199
|
phase,
|
|
@@ -196,19 +228,33 @@ function startTurn(argv, promptText) {
|
|
|
196
228
|
return true;
|
|
197
229
|
};
|
|
198
230
|
const onAbort = () => {
|
|
231
|
+
let rejection;
|
|
232
|
+
try {
|
|
233
|
+
persistInteractionSettlement(requestId, msg.binding, {
|
|
234
|
+
status: "cancelled",
|
|
235
|
+
error: {
|
|
236
|
+
code: "INTERACTION_CANCELLED",
|
|
237
|
+
message: "Background interaction was cancelled",
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
} catch (error) {
|
|
241
|
+
rejection = error;
|
|
242
|
+
}
|
|
199
243
|
if (!cleanup()) return;
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
244
|
+
if (!rejection) {
|
|
245
|
+
rejection = new Error("Background interaction was cancelled");
|
|
246
|
+
rejection.code = "INTERACTION_CANCELLED";
|
|
247
|
+
}
|
|
248
|
+
reject(rejection);
|
|
203
249
|
};
|
|
204
250
|
const entry = {
|
|
205
251
|
payload,
|
|
206
252
|
binding: msg.binding,
|
|
207
|
-
|
|
253
|
+
deliverResolved(answer) {
|
|
208
254
|
if (!cleanup()) return;
|
|
209
255
|
resolve(answer);
|
|
210
256
|
},
|
|
211
|
-
|
|
257
|
+
deliverRejected(error) {
|
|
212
258
|
if (!cleanup()) return;
|
|
213
259
|
reject(error);
|
|
214
260
|
},
|
|
@@ -236,8 +282,19 @@ function startTurn(argv, promptText) {
|
|
|
236
282
|
detachInteractionHandler = null;
|
|
237
283
|
// Reject any request that survived an abnormal child exit. Normal
|
|
238
284
|
// responses remove themselves from this map before the turn continues.
|
|
239
|
-
for (const [, pending] of pendingInteractions) {
|
|
240
|
-
|
|
285
|
+
for (const [requestId, pending] of pendingInteractions) {
|
|
286
|
+
const error = new Error("Agent exited");
|
|
287
|
+
error.code = "INTERACTION_CHILD_EXITED";
|
|
288
|
+
try {
|
|
289
|
+
persistInteractionSettlement(requestId, pending.binding, {
|
|
290
|
+
status: "rejected",
|
|
291
|
+
error,
|
|
292
|
+
});
|
|
293
|
+
} catch {
|
|
294
|
+
// The child is already gone; the unresolved journal remains pending
|
|
295
|
+
// so the supervisor recovery path can reject it deterministically.
|
|
296
|
+
}
|
|
297
|
+
pending.deliverRejected?.(error);
|
|
241
298
|
}
|
|
242
299
|
pendingInteractions.clear();
|
|
243
300
|
server?.broadcast({ type: "turn-ended", turn: turnCount, exitCode: code });
|
|
@@ -303,6 +360,27 @@ async function main() {
|
|
|
303
360
|
job = JSON.parse(readFileSync(jobFile, "utf8"));
|
|
304
361
|
removeJobFile(jobFile);
|
|
305
362
|
log = openBackgroundLogFile(job.id);
|
|
363
|
+
interactionJournal = loadBackgroundInteractionJournal(job.sessionId, job.id);
|
|
364
|
+
if (interactionJournal.pending().length > 0) {
|
|
365
|
+
const recovery = rejectPendingBackgroundInteractions(
|
|
366
|
+
job.sessionId,
|
|
367
|
+
job.id,
|
|
368
|
+
{
|
|
369
|
+
code: "INTERACTION_WORKER_RESTARTED",
|
|
370
|
+
message:
|
|
371
|
+
"The background worker restarted before the interaction settled",
|
|
372
|
+
},
|
|
373
|
+
);
|
|
374
|
+
interactionJournal = recovery.journal;
|
|
375
|
+
mergeState({
|
|
376
|
+
phase: "turn",
|
|
377
|
+
pendingQuestion: null,
|
|
378
|
+
interactionRecovery: {
|
|
379
|
+
rejected: recovery.rejected.length,
|
|
380
|
+
recoveredAt: Date.now(),
|
|
381
|
+
},
|
|
382
|
+
});
|
|
383
|
+
}
|
|
306
384
|
|
|
307
385
|
// Session transport (best-effort): interactive attach needs it, but a
|
|
308
386
|
// transport failure must never take down the background task itself.
|
|
@@ -362,17 +440,41 @@ async function main() {
|
|
|
362
440
|
finalize(lastExit.code, lastExit.signal);
|
|
363
441
|
}
|
|
364
442
|
},
|
|
365
|
-
onInteractionResponse: ({ requestId, intId, answer, error }) => {
|
|
443
|
+
onInteractionResponse: ({ requestId, intId, binding, answer, error }) => {
|
|
366
444
|
// Support both field names: requestId (from transport) and intId (legacy)
|
|
367
445
|
const resolvedId = requestId ?? intId;
|
|
368
446
|
const entry = pendingInteractions.get(resolvedId);
|
|
369
|
-
|
|
447
|
+
const outcome = error
|
|
448
|
+
? {
|
|
449
|
+
status: "rejected",
|
|
450
|
+
error:
|
|
451
|
+
typeof error === "object"
|
|
452
|
+
? error
|
|
453
|
+
: { code: "INTERACTION_REJECTED", message: String(error) },
|
|
454
|
+
}
|
|
455
|
+
: { status: "resolved", answer };
|
|
456
|
+
const settlement = persistInteractionSettlement(
|
|
457
|
+
resolvedId,
|
|
458
|
+
binding,
|
|
459
|
+
outcome,
|
|
460
|
+
);
|
|
461
|
+
if (!settlement.applied) {
|
|
462
|
+
return { accepted: true, duplicate: true };
|
|
463
|
+
}
|
|
464
|
+
if (!entry) {
|
|
465
|
+
return { accepted: true, duplicate: false, delivered: false };
|
|
466
|
+
}
|
|
370
467
|
if (error) {
|
|
371
|
-
|
|
468
|
+
const rejection = new Error(
|
|
469
|
+
typeof error === "object" ? error.message : error,
|
|
470
|
+
);
|
|
471
|
+
rejection.code =
|
|
472
|
+
(typeof error === "object" && error.code) || "INTERACTION_REJECTED";
|
|
473
|
+
entry.deliverRejected(rejection);
|
|
372
474
|
} else {
|
|
373
|
-
entry.
|
|
475
|
+
entry.deliverResolved(answer);
|
|
374
476
|
}
|
|
375
|
-
return true;
|
|
477
|
+
return { accepted: true, duplicate: false, delivered: true };
|
|
376
478
|
},
|
|
377
479
|
});
|
|
378
480
|
transportState = { pipe: server.pipePath, token };
|
|
@@ -400,6 +502,19 @@ async function main() {
|
|
|
400
502
|
}
|
|
401
503
|
|
|
402
504
|
main().catch((error) => {
|
|
505
|
+
// The earliest bootstrap failures happen before `job` and `log` exist.
|
|
506
|
+
// Write synchronously to the launcher-provided stderr handle so detached
|
|
507
|
+
// Windows workers retain the loader/job/state error that caused the exit.
|
|
508
|
+
try {
|
|
509
|
+
writeSync(
|
|
510
|
+
2,
|
|
511
|
+
`[background-agent-worker] fatal: ${
|
|
512
|
+
error?.stack || error?.message || String(error)
|
|
513
|
+
}\n`,
|
|
514
|
+
);
|
|
515
|
+
} catch {
|
|
516
|
+
/* the inherited stderr handle itself may be unavailable */
|
|
517
|
+
}
|
|
403
518
|
if (job?.id) {
|
|
404
519
|
try {
|
|
405
520
|
finalize(1, null, error.message);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as m,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-DnVVYKCE.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),u=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),b=String(e.getMonth()+1).padStart(2,"0"),f=String(e.getDate()).padStart(2,"0"),g=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${b}-${f} ${g}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:u,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},q={class:"meta"},M={class:"actor"},R={class:"time"},V={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return m(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",q,[n("span",M,a(r.actorLabel),1),n("span",R,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(m(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as I,U,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-DnVVYKCE.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as be,aP as Fe,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),b=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function G(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){b.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!b.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:b.value.name.trim(),description:b.value.description||null,projectType:b.value.type,rootPath:b.value.rootPath||null},`project init "${b.value.name.trim()}" --type ${b.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const F=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},F.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),F.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),A.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:b,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:M,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:F,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return Fe},get FileAddOutlined(){return be},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),b=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),M=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),F=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),U("div",Ue,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(b,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),I(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),I("code",Re,s(e.detail.root_path),1)):(p(),I("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[U("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(A,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(F,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(A,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(A,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(A,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(F,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(F,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(F,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{E as Cn,r as te,I as V,J as $e,U as Ie,c as A,K as _,S as ie,V as _e,o as Tt,a8 as kt,b as Be,P as W,Q as z,R as ye,a5 as Nn}from"./vendor-Bn1JzzAn.js";import{Q as Fn}from"./QrScannerModal-B2v6gR-C.js";import{_ as Hn}from"./index-DnVVYKCE.js";import{ax as Dn,aC as $n}from"./icons-DG5UD-6K.js";import"./markdown-CsiA8-E5.js";function Mn(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function ve(t,e=""){if(typeof t!="number"){const n=e&&`"${e}" `;throw new TypeError(`${n}expected number, got ${typeof t}`)}if(!Number.isSafeInteger(t)||t<0){const n=e&&`"${e}" `;throw new RangeError(`${n}expected integer >= 0, got ${t}`)}}function se(t,e,n=""){const r=Mn(t),o=t?.length,s=e!==void 0;if(!r||s&&o!==e){const i=n&&`"${n}" `,c=s?` of length ${e}`:"",f=r?`length=${o}`:`type=${typeof t}`,a=i+"expected Uint8Array"+c+", got "+f;throw r?new RangeError(a):new TypeError(a)}return t}function mt(t){if(typeof t!="function"||typeof t.create!="function")throw new TypeError("Hash must wrapped by utils.createHasher");if(ve(t.outputLen),ve(t.blockLen),t.outputLen<1)throw new Error('"outputLen" must be >= 1');if(t.blockLen<1)throw new Error('"blockLen" must be >= 1')}function Ge(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function on(t,e){se(t,void 0,"digestInto() output");const n=e.outputLen;if(t.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function Le(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function rt(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}function re(t,e){return t<<32-e|t>>>e}const sn=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Zn=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function bt(t){if(se(t),sn)return t.toHex();let e="";for(let n=0;n<t.length;n++)e+=Zn[t[n]];return e}const oe={_0:48,_9:57,A:65,F:70,a:97,f:102};function Lt(t){if(t>=oe._0&&t<=oe._9)return t-oe._0;if(t>=oe.A&&t<=oe.F)return t-(oe.A-10);if(t>=oe.a&&t<=oe.f)return t-(oe.a-10)}function Et(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);if(sn)try{return Uint8Array.fromHex(t)}catch(o){throw o instanceof SyntaxError?new RangeError(o.message):o}const e=t.length,n=e/2;if(e%2)throw new RangeError("hex string expected, got unpadded hex of length "+e);const r=new Uint8Array(n);for(let o=0,s=0;o<n;o++,s+=2){const i=Lt(t.charCodeAt(s)),c=Lt(t.charCodeAt(s+1));if(i===void 0||c===void 0){const f=t[s]+t[s+1];throw new RangeError('hex string expected, got non-hex character "'+f+'" at index '+s)}r[o]=i*16+c}return r}function zn(t,e={}){const n=(o,s)=>t(s).update(o).digest(),r=t(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>t(o),Object.assign(n,e),Object.freeze(n)}function Pn(t=32){ve(t,"bytesLength");const e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof e?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(t>65536)throw new RangeError(`"bytesLength" expected <= 65536, got ${t}`);return e.getRandomValues(new Uint8Array(t))}const Yn=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});function jn(t,e,n){return t&e^~t&n}function Xn(t,e,n){return t&e^t&n^e&n}class Vn{blockLen;outputLen;canXOF=!1;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,n,r,o){this.blockLen=e,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=new Uint8Array(e),this.view=rt(this.buffer)}update(e){Ge(this),se(e);const{view:n,buffer:r,blockLen:o}=this,s=e.length;for(let i=0;i<s;){const c=Math.min(o-this.pos,s-i);if(c===o){const f=rt(e);for(;o<=s-i;i+=o)this.process(f,i);continue}r.set(e.subarray(i,i+c),this.pos),this.pos+=c,i+=c,this.pos===o&&(this.process(n,0),this.pos=0)}return this.length+=e.length,this.roundClean(),this}digestInto(e){Ge(this),on(e,this),this.finished=!0;const{buffer:n,view:r,blockLen:o,isLE:s}=this;let{pos:i}=this;n[i++]=128,Le(this.buffer.subarray(i)),this.padOffset>o-i&&(this.process(r,0),i=0);for(let l=i;l<o;l++)n[l]=0;r.setBigUint64(o-8,BigInt(this.length*8),s),this.process(r,0);const c=rt(e),f=this.outputLen;if(f%4)throw new Error("_sha2: outputLen must be aligned to 32bit");const a=f/4,u=this.get();if(a>u.length)throw new Error("_sha2: outputLen bigger than state");for(let l=0;l<a;l++)c.setUint32(4*l,u[l],s)}digest(){const{buffer:e,outputLen:n}=this;this.digestInto(e);const r=e.slice(0,n);return this.destroy(),r}_cloneInto(e){e||=new this.constructor,e.set(...this.get());const{blockLen:n,buffer:r,length:o,finished:s,destroyed:i,pos:c}=this;return e.destroyed=i,e.finished=s,e.length=o,e.pos=c,o%n&&e.buffer.set(r),e}clone(){return this._cloneInto()}}const ce=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Kn=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ae=new Uint32Array(64);class Gn extends Vn{constructor(e){super(64,e,8,!1)}get(){const{A:e,B:n,C:r,D:o,E:s,F:i,G:c,H:f}=this;return[e,n,r,o,s,i,c,f]}set(e,n,r,o,s,i,c,f){this.A=e|0,this.B=n|0,this.C=r|0,this.D=o|0,this.E=s|0,this.F=i|0,this.G=c|0,this.H=f|0}process(e,n){for(let l=0;l<16;l++,n+=4)ae[l]=e.getUint32(n,!1);for(let l=16;l<64;l++){const m=ae[l-15],g=ae[l-2],v=re(m,7)^re(m,18)^m>>>3,E=re(g,17)^re(g,19)^g>>>10;ae[l]=E+ae[l-7]+v+ae[l-16]|0}let{A:r,B:o,C:s,D:i,E:c,F:f,G:a,H:u}=this;for(let l=0;l<64;l++){const m=re(c,6)^re(c,11)^re(c,25),g=u+m+jn(c,f,a)+Kn[l]+ae[l]|0,E=(re(r,2)^re(r,13)^re(r,22))+Xn(r,o,s)|0;u=a,a=f,f=c,c=i+g|0,i=s,s=o,o=r,r=g+E|0}r=r+this.A|0,o=o+this.B|0,s=s+this.C|0,i=i+this.D|0,c=c+this.E|0,f=f+this.F|0,a=a+this.G|0,u=u+this.H|0,this.set(r,o,s,i,c,f,a,u)}roundClean(){Le(ae)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),Le(this.buffer)}}class Wn extends Gn{A=ce[0]|0;B=ce[1]|0;C=ce[2]|0;D=ce[3]|0;E=ce[4]|0;F=ce[5]|0;G=ce[6]|0;H=ce[7]|0;constructor(){super(32)}}const Ut=zn(()=>new Wn,Yn(1));const ue=(t,e,n)=>se(t,e,n),cn=ve,an=bt,Qn=t=>Et(t),Jn=t=>Pn(t),We=BigInt(0),pt=BigInt(1);function fn(t,e=""){if(typeof t!="boolean"){const n=e&&`"${e}" `;throw new TypeError(n+"expected boolean, got type="+typeof t)}return t}function er(t){if(typeof t=="bigint"){if(!Xe(t))throw new RangeError("positive bigint expected, got "+t)}else cn(t);return t}function qt(t,e=""){if(typeof t!="number"){const n=e&&`"${e}" `;throw new TypeError(n+"expected number, got type="+typeof t)}if(!Number.isSafeInteger(t)){const n=e&&`"${e}" `;throw new RangeError(n+"expected safe integer, got "+t)}}function un(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);return t===""?We:BigInt("0x"+t)}function tr(t){return un(bt(t))}function Ue(t){return un(bt(qe(se(t)).reverse()))}function ln(t,e){if(ve(e),e===0)throw new RangeError("zero length");t=er(t);const n=t.toString(16);if(n.length>e*2)throw new RangeError("number too large");return Et(n.padStart(e*2,"0"))}function dn(t,e){return ln(t,e).reverse()}function nr(t,e){if(t=ue(t),e=ue(e),t.length!==e.length)return!1;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function qe(t){return Uint8Array.from(ue(t))}const Xe=t=>typeof t=="bigint"&&We<=t;function rr(t,e,n){return Xe(t)&&Xe(e)&&Xe(n)&&e<=t&&t<n}function Qe(t,e,n,r){if(!rr(e,n,r))throw new RangeError("expected valid "+t+": "+n+" <= n < "+r+", got "+e)}function or(t){if(t<We)throw new Error("expected non-negative bigint, got "+t);let e;for(e=0;t>We;t>>=pt,e+=1);return e}const sr=t=>(pt<<BigInt(t))-pt;function vt(t,e={},n={}){if(Object.prototype.toString.call(t)!=="[object Object]")throw new TypeError("expected valid options object");function r(s,i,c){if(!c&&i!=="function"&&!Object.hasOwn(t,s))throw new TypeError(`param "${s}" is invalid: expected own property`);const f=t[s];if(c&&f===void 0)return;const a=typeof f;if(a!==i||f===null)throw new TypeError(`param "${s}" is invalid: expected ${i}, got ${a}`)}const o=(s,i)=>Object.entries(s).forEach(([c,f])=>r(c,f,i));o(e,!1),o(n,!0)}const Ct=()=>{throw new Error("not implemented")};const Z=BigInt(0),M=BigInt(1),he=BigInt(2),pn=BigInt(3),hn=BigInt(4),gn=BigInt(5),ir=BigInt(7),wn=BigInt(8),cr=BigInt(9),yn=BigInt(16);function C(t,e){if(e<=Z)throw new Error("mod: expected positive modulus, got "+e);const n=t%e;return n>=Z?n:e+n}function ee(t,e,n){if(e<Z)throw new Error("pow2: expected non-negative exponent, got "+e);let r=t;for(;e-- >Z;)r*=r,r%=n;return r}function Nt(t,e){if(t===Z)throw new Error("invert: expected non-zero number");if(e<=Z)throw new Error("invert: expected positive modulus, got "+e);let n=C(t,e),r=e,o=Z,s=M;for(;n!==Z;){const c=r/n,f=r-n*c,a=o-s*c;r=n,n=f,o=s,s=a}if(r!==M)throw new Error("invert: does not exist");return C(o,e)}function xt(t,e,n){const r=t;if(!r.eql(r.sqr(e),n))throw new Error("Cannot find square root")}function mn(t,e){const n=t,r=(n.ORDER+M)/hn,o=n.pow(e,r);return xt(n,o,e),o}function ar(t,e){const n=t,r=(n.ORDER-gn)/wn,o=n.mul(e,he),s=n.pow(o,r),i=n.mul(e,s),c=n.mul(n.mul(i,he),s),f=n.mul(i,n.sub(c,n.ONE));return xt(n,f,e),f}function fr(t){const e=St(t),n=bn(t),r=n(e,e.neg(e.ONE)),o=n(e,r),s=n(e,e.neg(r)),i=(t+ir)/yn;return((c,f)=>{const a=c;let u=a.pow(f,i),l=a.mul(u,r);const m=a.mul(u,o),g=a.mul(u,s),v=a.eql(a.sqr(l),f),E=a.eql(a.sqr(m),f);u=a.cmov(u,l,v),l=a.cmov(g,m,E);const d=a.eql(a.sqr(l),f),p=a.cmov(u,l,d);return xt(a,p,f),p})}function bn(t){if(t<pn)throw new Error("sqrt is not defined for small field");let e=t-M,n=0;for(;e%he===Z;)e/=he,n++;let r=he;const o=St(t);for(;Ft(o,r)===1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return mn;let s=o.pow(r,e);const i=(e+M)/he;return function(f,a){const u=f;if(u.is0(a))return a;if(Ft(u,a)!==1)throw new Error("Cannot find square root");let l=n,m=u.mul(u.ONE,s),g=u.pow(a,e),v=u.pow(a,i);for(;!u.eql(g,u.ONE);){if(u.is0(g))return u.ZERO;let E=1,d=u.sqr(g);for(;!u.eql(d,u.ONE);)if(E++,d=u.sqr(d),E===l)throw new Error("Cannot find square root");const p=M<<BigInt(l-E-1),y=u.pow(m,p);l=E,m=u.sqr(y),g=u.mul(g,m),v=u.mul(v,y)}return v}}function ur(t){return t%hn===pn?mn:t%wn===gn?ar:t%yn===cr?fr(t):bn(t)}const de=(t,e)=>(C(t,e)&M)===M,lr=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function dr(t){const e={ORDER:"bigint",BYTES:"number",BITS:"number"},n=lr.reduce((r,o)=>(r[o]="function",r),e);if(vt(t,n),qt(t.BYTES,"BYTES"),qt(t.BITS,"BITS"),t.BYTES<1||t.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(t.ORDER<=M)throw new Error("invalid field: expected ORDER > 1, got "+t.ORDER);return t}function pr(t,e,n){const r=t;if(n<Z)throw new Error("invalid exponent, negatives unsupported");if(n===Z)return r.ONE;if(n===M)return e;let o=r.ONE,s=e;for(;n>Z;)n&M&&(o=r.mul(o,s)),s=r.sqr(s),n>>=M;return o}function En(t,e,n=!1){const r=t,o=new Array(e.length).fill(n?r.ZERO:void 0),s=e.reduce((c,f,a)=>r.is0(f)?c:(o[a]=c,r.mul(c,f)),r.ONE),i=r.inv(s);return e.reduceRight((c,f,a)=>r.is0(f)?c:(o[a]=r.mul(c,o[a]),r.mul(c,f)),i),o}function Ft(t,e){const n=t,r=(n.ORDER-M)/he,o=n.pow(e,r),s=n.eql(o,n.ONE),i=n.eql(o,n.ZERO),c=n.eql(o,n.neg(n.ONE));if(!s&&!i&&!c)throw new Error("invalid Legendre symbol result");return s?1:i?0:-1}function hr(t,e){if(e!==void 0&&cn(e),t<=Z)throw new Error("invalid n length: expected positive n, got "+t);if(e!==void 0&&e<1)throw new Error("invalid n length: expected positive bit length, got "+e);const n=or(t);if(e!==void 0&&e<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${e})`);const r=e!==void 0?e:n,o=Math.ceil(r/8);return{nBitLength:r,nByteLength:o}}const Ht=new WeakMap;class vn{ORDER;BITS;BYTES;isLE;ZERO=Z;ONE=M;_lengths;_mod;constructor(e,n={}){if(e<=M)throw new Error("invalid field: expected ORDER > 1, got "+e);let r;this.isLE=!1,n!=null&&typeof n=="object"&&(typeof n.BITS=="number"&&(r=n.BITS),typeof n.sqrt=="function"&&Object.defineProperty(this,"sqrt",{value:n.sqrt,enumerable:!0}),typeof n.isLE=="boolean"&&(this.isLE=n.isLE),n.allowedLengths&&(this._lengths=Object.freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));const{nBitLength:o,nByteLength:s}=hr(e,r);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=o,this.BYTES=s,Object.freeze(this)}create(e){return C(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new TypeError("invalid field element: expected bigint, got "+typeof e);return Z<=e&&e<this.ORDER}is0(e){return e===Z}isValidNot0(e){return!this.is0(e)&&this.isValid(e)}isOdd(e){return(e&M)===M}neg(e){return C(-e,this.ORDER)}eql(e,n){return e===n}sqr(e){return C(e*e,this.ORDER)}add(e,n){return C(e+n,this.ORDER)}sub(e,n){return C(e-n,this.ORDER)}mul(e,n){return C(e*n,this.ORDER)}pow(e,n){return pr(this,e,n)}div(e,n){return C(e*Nt(n,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return Nt(e,this.ORDER)}sqrt(e){let n=Ht.get(this);return n||Ht.set(this,n=ur(this.ORDER)),n(this,e)}toBytes(e){return this.isLE?dn(e,this.BYTES):ln(e,this.BYTES)}fromBytes(e,n=!1){ue(e);const{_lengths:r,BYTES:o,isLE:s,ORDER:i,_mod:c}=this;if(r){if(e.length<1||!r.includes(e.length)||e.length>o)throw new Error("Field.fromBytes: expected "+r+" bytes, got "+e.length);const a=new Uint8Array(o);a.set(e,s?0:a.length-e.length),e=a}if(e.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let f=s?Ue(e):tr(e);if(c&&(f=C(f,i)),!n&&!this.isValid(f))throw new Error("invalid field element: outside of range 0..ORDER");return f}invertBatch(e){return En(this,e)}cmov(e,n,r){return fn(r,"condition"),r?n:e}}Object.freeze(vn.prototype);function St(t,e={}){return new vn(t,e)}const Je=BigInt(0),ht=BigInt(1);function Dt(t,e){const n=e.negate();return t?n:e}function ot(t,e){const n=En(t.Fp,e.map(r=>r.Z));return e.map((r,o)=>t.fromAffine(r.toAffine(n[o])))}function xn(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function st(t,e){xn(t,e);const n=Math.ceil(e/t)+1,r=2**(t-1),o=2**t,s=sr(t),i=BigInt(t);return{windows:n,windowSize:r,mask:s,maxNumber:o,shiftBy:i}}function $t(t,e,n){const{windowSize:r,mask:o,maxNumber:s,shiftBy:i}=n;let c=Number(t&o),f=t>>i;c>r&&(c-=s,f+=ht);const a=e*r,u=a+Math.abs(c)-1,l=c===0,m=c<0,g=e%2!==0;return{nextN:f,offset:u,isZero:l,isNeg:m,isNegF:g,offsetF:a}}const it=new WeakMap,Sn=new WeakMap;function ct(t){return Sn.get(t)||1}function Mt(t){if(t!==Je)throw new Error("invalid wNAF")}class gr{BASE;ZERO;Fn;bits;constructor(e,n){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=n}_unsafeLadder(e,n,r=this.ZERO){let o=e;for(;n>Je;)n&ht&&(r=r.add(o)),o=o.double(),n>>=ht;return r}precomputeWindow(e,n){const{windows:r,windowSize:o}=st(n,this.bits),s=[];let i=e,c=i;for(let f=0;f<r;f++){c=i,s.push(c);for(let a=1;a<o;a++)c=c.add(i),s.push(c);i=c.double()}return s}wNAF(e,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,s=this.BASE;const i=st(e,this.bits);for(let c=0;c<i.windows;c++){const{nextN:f,offset:a,isZero:u,isNeg:l,isNegF:m,offsetF:g}=$t(r,c,i);r=f,u?s=s.add(Dt(m,n[g])):o=o.add(Dt(l,n[a]))}return Mt(r),{p:o,f:s}}wNAFUnsafe(e,n,r,o=this.ZERO){const s=st(e,this.bits);for(let i=0;i<s.windows&&r!==Je;i++){const{nextN:c,offset:f,isZero:a,isNeg:u}=$t(r,i,s);if(r=c,!a){const l=n[f];o=o.add(u?l.negate():l)}}return Mt(r),o}getPrecomputes(e,n,r){let o=it.get(n);return o||(o=this.precomputeWindow(n,e),e!==1&&(typeof r=="function"&&(o=r(o)),it.set(n,o))),o}cached(e,n,r){const o=ct(e);return this.wNAF(o,this.getPrecomputes(o,e,r),n)}unsafe(e,n,r,o){const s=ct(e);return s===1?this._unsafeLadder(e,n,o):this.wNAFUnsafe(s,this.getPrecomputes(s,e,r),n,o)}createCache(e,n){xn(n,this.bits),Sn.set(e,n),it.delete(e)}hasCache(e){return ct(e)!==1}}function Zt(t,e,n){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return dr(e),e}else return St(t,{isLE:n})}function wr(t,e,n={},r){if(r===void 0&&(r=t==="edwards"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(const f of["p","n","h"]){const a=e[f];if(!(typeof a=="bigint"&&a>Je))throw new Error(`CURVE.${f} must be positive bigint`)}const o=Zt(e.p,n.Fp,r),s=Zt(e.n,n.Fn,r),c=["Gx","Gy","a","d"];for(const f of c)if(!o.isValid(e[f]))throw new Error(`CURVE.${f} must be valid field element of CURVE.Fp`);return e=Object.freeze(Object.assign({},e)),{CURVE:e,Fp:o,Fn:s}}function yr(t,e){return function(r){const o=t(r);return{secretKey:o,publicKey:e(o)}}}const fe=BigInt(0),P=BigInt(1),at=BigInt(2),mr=BigInt(8);function br(t,e,n,r){const o=t.sqr(n),s=t.sqr(r),i=t.add(t.mul(e.a,o),s),c=t.add(t.ONE,t.mul(e.d,t.mul(o,s)));return t.eql(i,c)}function Er(t,e={}){const n=e,r=wr("edwards",t,n,n.FpFnLE),{Fp:o,Fn:s}=r;let i=r.CURVE;const{h:c}=i;vt(n,{},{uvRatio:"function"});const f=at<<BigInt(s.BYTES*8)-P,a=E=>o.create(E),u=n.uvRatio===void 0?(E,d)=>{try{return{isValid:!0,value:o.sqrt(o.div(E,d))}}catch{return{isValid:!1,value:fe}}}:n.uvRatio;if(!br(o,i,i.Gx,i.Gy))throw new Error("bad curve params: generator point");function l(E,d,p=!1){const y=p?P:fe;return Qe("coordinate "+E,d,y,f),d}function m(E){if(!(E instanceof g))throw new Error("EdwardsPoint expected")}class g{static BASE=new g(i.Gx,i.Gy,P,a(i.Gx*i.Gy));static ZERO=new g(fe,P,P,fe);static Fp=o;static Fn=s;X;Y;Z;T;constructor(d,p,y,b){this.X=l("x",d),this.Y=l("y",p),this.Z=l("z",y,!0),this.T=l("t",b),Object.freeze(this)}static CURVE(){return i}static fromAffine(d){if(d instanceof g)throw new Error("extended point not allowed");const{x:p,y}=d||{};return l("x",p),l("y",y),new g(p,y,P,a(p*y))}static fromBytes(d,p=!1){const y=o.BYTES,{a:b,d:S}=i;d=qe(ue(d,y,"point")),fn(p,"zip215");const R=qe(d),L=d[y-1];R[y-1]=L&-129;const T=Ue(R),U=p?f:o.ORDER;Qe("point.y",T,fe,U);const O=a(T*T),H=a(O-P),I=a(S*O-b);let{isValid:N,value:D}=u(H,I);if(!N)throw new Error("bad point: invalid y coordinate");const B=(D&P)===P,k=(L&128)!==0;if(!p&&D===fe&&k)throw new Error("bad point: x=0 and x_0=1");return k!==B&&(D=a(-D)),g.fromAffine({x:D,y:T})}static fromHex(d,p=!1){return g.fromBytes(Qn(d),p)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(d=8,p=!0){return v.createCache(this,d),p||this.multiply(at),this}assertValidity(){const d=this,{a:p,d:y}=i;if(d.is0())throw new Error("bad point: ZERO");const{X:b,Y:S,Z:R,T:L}=d,T=a(b*b),U=a(S*S),O=a(R*R),H=a(O*O),I=a(T*p),N=a(O*a(I+U)),D=a(H+a(y*a(T*U)));if(N!==D)throw new Error("bad point: equation left != right (1)");const B=a(b*S),k=a(R*L);if(B!==k)throw new Error("bad point: equation left != right (2)")}equals(d){m(d);const{X:p,Y:y,Z:b}=this,{X:S,Y:R,Z:L}=d,T=a(p*L),U=a(S*b),O=a(y*L),H=a(R*b);return T===U&&O===H}is0(){return this.equals(g.ZERO)}negate(){return new g(a(-this.X),this.Y,this.Z,a(-this.T))}double(){const{a:d}=i,{X:p,Y:y,Z:b}=this,S=a(p*p),R=a(y*y),L=a(at*a(b*b)),T=a(d*S),U=p+y,O=a(a(U*U)-S-R),H=T+R,I=H-L,N=T-R,D=a(O*I),B=a(H*N),k=a(O*N),$=a(I*H);return new g(D,B,$,k)}add(d){m(d);const{a:p,d:y}=i,{X:b,Y:S,Z:R,T:L}=this,{X:T,Y:U,Z:O,T:H}=d,I=a(b*T),N=a(S*U),D=a(L*y*H),B=a(R*O),k=a((b+S)*(T+U)-I-N),$=B-D,Q=B+D,j=a(N-p*I),G=a(k*$),X=a(Q*j),J=a(k*j),ne=a($*Q);return new g(G,X,ne,J)}subtract(d){return m(d),this.add(d.negate())}multiply(d){if(!s.isValidNot0(d))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");const{p,f:y}=v.cached(this,d,b=>ot(g,b));return ot(g,[p,y])[0]}multiplyUnsafe(d){if(!s.isValid(d))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return d===fe?g.ZERO:this.is0()||d===P?this:v.unsafe(this,d,p=>ot(g,p))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){return v.unsafe(this,i.n).is0()}toAffine(d){const p=this;let y=d;const{X:b,Y:S,Z:R}=p,L=p.is0();y==null&&(y=L?mr:o.inv(R));const T=a(b*y),U=a(S*y),O=o.mul(R,y);if(L)return{x:fe,y:P};if(O!==P)throw new Error("invZ was invalid");return{x:T,y:U}}clearCofactor(){return c===P?this:this.multiplyUnsafe(c)}toBytes(){const{x:d,y:p}=this.toAffine(),y=o.toBytes(p);return y[y.length-1]|=d&P?128:0,y}toHex(){return an(this.toBytes())}toString(){return`<Point ${this.is0()?"ZERO":this.toHex()}>`}}const v=new gr(g,s.BITS);return s.BITS>=8&&g.BASE.precompute(8),Object.freeze(g.prototype),Object.freeze(g),g}class vr{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){this.ep=e}static fromBytes(e){Ct()}static fromHex(e){Ct()}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity()}toAffine(e){return this.ep.toAffine(e)}toHex(){return an(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return!0}isSmallOrder(){return!1}add(e){return this.assertSame(e),this.init(this.ep.add(e.ep))}subtract(e){return this.assertSame(e),this.init(this.ep.subtract(e.ep))}multiply(e){return this.init(this.ep.multiply(e))}multiplyUnsafe(e){return this.init(this.ep.multiplyUnsafe(e))}double(){return this.init(this.ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}}const Re=BigInt(0),me=BigInt(1),Me=BigInt(2);function xr(t){return vt(t,{P:"bigint",type:"string",adjustScalarBytes:"function",powPminus2:"function"},{randomBytes:"function"}),Object.freeze({...t})}function Sr(t){const e=xr(t),{P:n,type:r,adjustScalarBytes:o,powPminus2:s,randomBytes:i}=e,c=r==="x25519";if(!c&&r!=="x448")throw new Error("invalid type");const f=i===void 0?Jn:i,a=c?255:448,u=c?32:56,l=BigInt(c?9:5),m=BigInt(c?121665:39081),g=c?Me**BigInt(254):Me**BigInt(447),v=c?BigInt(8)*Me**BigInt(251)-me:BigInt(4)*Me**BigInt(445)-me,E=g+v+me,d=B=>C(B,n),p=y(l);function y(B){return dn(d(B),u)}function b(B){const k=qe(ue(B,u,"uCoordinate"));return c&&(k[31]&=127),d(Ue(k))}function S(B){return Ue(o(qe(ue(B,u,"scalar"))))}function R(B,k){const $=H(b(k),S(B));if($===Re)throw new Error("invalid private or public key received");return y($)}function L(B){return R(B,p)}const T=L,U=R;function O(B,k,$){const Q=d(B*(k-$));return k=d(k-Q),$=d($+Q),{x_2:k,x_3:$}}function H(B,k){Qe("u",B,Re,n),Qe("scalar",k,g,E);const $=k,Q=B;let j=me,G=Re,X=B,J=me,ne=Re;for(let Se=BigInt(a-1);Se>=Re;Se--){const Fe=$>>Se&me;ne^=Fe,{x_2:j,x_3:X}=O(ne,j,X),{x_2:G,x_3:J}=O(ne,G,J),ne=Fe;const we=j+G,h=d(we*we),w=j-G,x=d(w*w),q=h-x,nt=X+J,He=X-J,De=d(He*we),Rt=d(nt*w),At=De+Rt,Ot=De-Rt;X=d(At*At),J=d(Q*d(Ot*Ot)),j=d(h*x),G=d(q*(h+d(m*q)))}({x_2:j,x_3:X}=O(ne,j,X)),{x_2:G,x_3:J}=O(ne,G,J);const tt=s(G);return d(j*tt)}const I={secretKey:u,publicKey:u,seed:u},N=B=>(B=B===void 0?f(u):B,ue(B,I.seed,"seed"),B),D={randomSecretKey:N};return Object.freeze(I),Object.freeze(D),Object.freeze({keygen:yr(N,T),getSharedSecret:U,getPublicKey:T,scalarMult:R,scalarMultBase:L,utils:D,GuBytes:p.slice(),lengths:I})}const Ir=BigInt(0),ke=BigInt(1),zt=BigInt(2),_r=BigInt(3),Br=BigInt(5),Rr=BigInt(8),xe=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),In={p:xe,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:Rr,a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function _n(t){const e=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),s=xe,c=t*t%s*t%s,f=ee(c,zt,s)*c%s,a=ee(f,ke,s)*t%s,u=ee(a,Br,s)*a%s,l=ee(u,e,s)*u%s,m=ee(l,n,s)*l%s,g=ee(m,r,s)*m%s,v=ee(g,o,s)*g%s,E=ee(v,o,s)*g%s,d=ee(E,e,s)*u%s;return{pow_p_5_8:ee(d,zt,s)*t%s,b2:c}}function Ar(t){return t[0]&=248,t[31]&=127,t[31]|=64,t}const gt=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function Bn(t,e){const n=xe,r=C(e*e*e,n),o=C(r*r*e,n),s=_n(t*o).pow_p_5_8;let i=C(t*r*s,n);const c=C(e*i*i,n),f=i,a=C(i*gt,n),u=c===t,l=c===C(-t,n),m=c===C(-t*gt,n);return u&&(i=f),(l||m)&&(i=a),de(i,n)&&(i=C(-i,n)),{isValid:u||l,value:i}}const Ee=Er(In,{uvRatio:Bn}),pe=Ee.Fp,Or=Ee.Fn,wt=(()=>{const t=xe;return Sr({P:t,type:"x25519",powPminus2:e=>{const{pow_p_5_8:n,b2:r}=_n(e);return C(ee(n,_r,t)*r,t)},adjustScalarBytes:Ar})})(),Pt=gt,Tr=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),Yt=t=>Bn(ke,t),kr=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),Lr=t=>pe.create(Ue(t)&kr);class K extends vr{static BASE=new K(Ee.BASE);static ZERO=new K(Ee.ZERO);static Fp=pe;static Fn=Or;constructor(e){super(e)}static fromAffine(e){return new K(Ee.fromAffine(e))}assertSame(e){if(!(e instanceof K))throw new Error("RistrettoPoint expected")}init(e){return new K(e)}static fromBytes(e){se(e,32);const{a:n,d:r}=In,o=xe,s=S=>pe.create(S),i=Lr(e);if(!nr(pe.toBytes(i),e)||de(i,o))throw new Error("invalid ristretto255 encoding 1");const c=s(i*i),f=s(ke+n*c),a=s(ke-n*c),u=s(f*f),l=s(a*a),m=s(n*r*u-l),{isValid:g,value:v}=Yt(s(m*l)),E=s(v*a),d=s(v*E*m);let p=s((i+i)*E);de(p,o)&&(p=s(-p));const y=s(f*d),b=s(p*y);if(!g||de(b,o)||y===Ir)throw new Error("invalid ristretto255 encoding 2");return new K(new Ee(p,y,ke,b))}static fromHex(e){return K.fromBytes(Et(e))}toBytes(){let{X:e,Y:n,Z:r,T:o}=this.ep;const s=xe,i=d=>pe.create(d),c=i(i(r+n)*i(r-n)),f=i(e*n),a=i(f*f),{value:u}=Yt(i(c*a)),l=i(u*c),m=i(u*f),g=i(l*m*o);let v;if(de(o*g,s)){let d=i(n*Pt),p=i(e*Pt);e=d,n=p,v=i(l*Tr)}else v=m;de(e*g,s)&&(n=i(-n));let E=i((r-n)*v);return de(E,s)&&(E=i(-E)),pe.toBytes(E)}equals(e){this.assertSame(e);const{X:n,Y:r}=this.ep,{X:o,Y:s}=e.ep,i=a=>pe.create(a),c=i(n*s)===i(r*o),f=i(r*s)===i(n*o);return c||f}is0(){return this.equals(K.ZERO)}}Object.freeze(K.BASE);Object.freeze(K.ZERO);Object.freeze(K.prototype);Object.freeze(K);class jt{oHash;iHash;blockLen;outputLen;canXOF=!1;finished=!1;destroyed=!1;constructor(e,n){if(mt(e),se(n,void 0,"key"),this.iHash=e.create(),typeof this.iHash.update!="function")throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let s=0;s<o.length;s++)o[s]^=54;this.iHash.update(o),this.oHash=e.create();for(let s=0;s<o.length;s++)o[s]^=106;this.oHash.update(o),Le(o)}update(e){return Ge(this),this.iHash.update(e),this}digestInto(e){Ge(this),on(e,this),this.finished=!0;const n=e.subarray(0,this.outputLen);this.iHash.digestInto(n),this.oHash.update(n),this.oHash.digestInto(n),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||=Object.create(Object.getPrototypeOf(this),{});const{oHash:n,iHash:r,finished:o,destroyed:s,blockLen:i,outputLen:c}=this;return e=e,e.finished=o,e.destroyed=s,e.blockLen=i,e.outputLen=c,e.oHash=n._cloneInto(e.oHash),e.iHash=r._cloneInto(e.iHash),e}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const Rn=(()=>{const t=((e,n,r)=>new jt(e,n).update(r).digest());return t.create=(e,n)=>new jt(e,n),t})();function Ur(t,e,n){return mt(t),n===void 0&&(n=new Uint8Array(t.outputLen)),Rn(t,n,e)}const ft=Uint8Array.of(0),Xt=Uint8Array.of();function qr(t,e,n,r=32){mt(t),ve(r,"length"),se(e,void 0,"prk");const o=t.outputLen;if(e.length<o)throw new Error('"prk" must be at least HashLen octets');if(r>255*o)throw new Error("Length must be <= 255*HashLen");const s=Math.ceil(r/o);n===void 0?n=Xt:se(n,void 0,"info");const i=new Uint8Array(s*o),c=Rn.create(t,e),f=c._cloneInto(),a=new Uint8Array(c.outputLen);for(let u=0;u<s;u++)ft[0]=u+1,f.update(u===0?Xt:a).update(n).update(ft).digestInto(a),i.set(a,o*u),c._cloneInto(f);return c.destroy(),f.destroy(),Le(a,ft),i.slice(0,r)}const Cr=(t,e,n,r,o)=>qr(t,Ur(t,e,n),r,o);function Nr(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function Vt(t){if(typeof t!="number")throw new TypeError("number expected, got "+typeof t);if(!Number.isSafeInteger(t)||t<0)throw new RangeError("positive integer expected, got "+t)}function Y(t,e,n=""){const r=Nr(t),o=t?.length,s=e!==void 0;if(!r||s&&o!==e){const i=n&&`"${n}" `,c=s?` of length ${e}`:"",f=r?`length=${o}`:`type=${typeof t}`,a=i+"expected Uint8Array"+c+", got "+f;throw r?new RangeError(a):new TypeError(a)}return t}function Kt(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function Fr(t,e,n=!1){Y(t,void 0,"output");const r=e.outputLen;if(t.length<r)throw new RangeError("digestInto() expects output buffer of length at least "+r);if(n&&!Ce(t))throw new Error("invalid output, must be aligned")}function Hr(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function ge(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function le(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function et(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}const It=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,An=t=>t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255,F=It?t=>t:t=>An(t)>>>0,Dr=t=>{for(let e=0;e<t.length;e++)t[e]=An(t[e]);return t},_t=It?t=>t:Dr;function $r(t,e){if(t.length!==e.length)return!1;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function Mr(t,e,n){const r=e,o=n||(()=>[]),s=(c,f)=>r(f,...o(c)).update(c).digest(),i=r(new Uint8Array(t),...o(new Uint8Array(0)));return s.outputLen=i.outputLen,s.blockLen=i.blockLen,s.create=(c,...f)=>r(c,...f),s}const Zr=(t,e)=>{function n(r,...o){if(Y(r,void 0,"key"),t.nonceLength!==void 0){const u=o[0];Y(u,t.varSizeNonce?void 0:t.nonceLength,"nonce")}const s=t.tagLength;s&&o[1]!==void 0&&Y(o[1],void 0,"AAD");const i=e(r,...o),c=(u,l)=>{if(l!==void 0){if(u!==2)throw new Error("cipher output not supported");Y(l,void 0,"output")}};let f=!1;return{encrypt(u,l){if(f)throw new Error("cannot encrypt() twice with same key + nonce");return f=!0,Y(u),c(i.encrypt.length,l),i.encrypt(u,l)},decrypt(u,l){if(Y(u),s&&u.length<s)throw new Error('"ciphertext" expected length bigger than tagLength='+s);return c(i.decrypt.length,l),i.decrypt(u,l)}}}return Object.assign(n,t),n};function zr(t,e,n=!0){if(e===void 0)return new Uint8Array(t);if(Y(e,void 0,"output"),e.length!==t)throw new Error('"output" expected Uint8Array of length '+t+", got: "+e.length);if(n&&!Ce(e))throw new Error("invalid output, must be aligned");return e}function Pr(t,e,n){Vt(t),Vt(e);const r=new Uint8Array(16),o=et(r);return o.setBigUint64(0,BigInt(e),n),o.setBigUint64(8,BigInt(t),n),r}function Ce(t){return t.byteOffset%4===0}function Ne(t){return Uint8Array.from(Y(t))}const be=16,On=new Uint8Array(16),Ae=ge(On),Yr=225,jr=(t,e,n,r)=>{const o=r&1;return{s3:n<<31|r>>>1,s2:e<<31|n>>>1,s1:t<<31|e>>>1,s0:t>>>1^Yr<<24&-(o&1)}},Ze=t=>(t>>>0&255)<<24|(t>>>8&255)<<16|(t>>>16&255)<<8|t>>>24&255|0,Xr=t=>t>64*1024?8:t>1024?4:2;class Vr{blockLen=be;outputLen=be;s0=0;s1=0;s2=0;s3=0;finished=!1;destroyed=!1;t;W;windowSize;constructor(e,n){Y(e,16,"key"),e=Ne(e);const r=et(e);let o=r.getUint32(0,!1),s=r.getUint32(4,!1),i=r.getUint32(8,!1),c=r.getUint32(12,!1);const f=[];for(let v=0;v<128;v++)f.push({s0:Ze(o),s1:Ze(s),s2:Ze(i),s3:Ze(c)}),{s0:o,s1:s,s2:i,s3:c}=jr(o,s,i,c);const a=Xr(n||1024);if(![1,2,4,8].includes(a))throw new Error("ghash: invalid window size, expected 2, 4 or 8");this.W=a;const l=128/a,m=this.windowSize=2**a,g=[];for(let v=0;v<l;v++)for(let E=0;E<m;E++){let d=0,p=0,y=0,b=0;for(let S=0;S<a;S++){if(!(E>>>a-S-1&1))continue;const{s0:L,s1:T,s2:U,s3:O}=f[a*v+S];d^=L,p^=T,y^=U,b^=O}g.push({s0:d,s1:p,s2:y,s3:b})}this.t=g}_updateBlock(e,n,r,o){e^=this.s0,n^=this.s1,r^=this.s2,o^=this.s3;const{W:s,t:i,windowSize:c}=this;let f=0,a=0,u=0,l=0;const m=(1<<s)-1;let g=0;for(const v of[e,n,r,o])for(let E=0;E<4;E++){const d=v>>>8*E&255;for(let p=8/s-1;p>=0;p--){const y=d>>>s*p&m,{s0:b,s1:S,s2:R,s3:L}=i[g*c+y];f^=b,a^=S,u^=R,l^=L,g+=1}}this.s0=f,this.s1=a,this.s2=u,this.s3=l}update(e){Kt(this),Y(e),e=Ne(e);const n=ge(e),r=Math.floor(e.length/be),o=e.length%be;for(let s=0;s<r;s++)this._updateBlock(F(n[s*4+0]),F(n[s*4+1]),F(n[s*4+2]),F(n[s*4+3]));return o&&(On.set(e.subarray(r*be)),this._updateBlock(F(Ae[0]),F(Ae[1]),F(Ae[2]),F(Ae[3])),le(Ae)),this}destroy(){this.destroyed=!0;const{t:e}=this;for(const n of e)n.s0=0,n.s1=0,n.s2=0,n.s3=0}digestInto(e){Kt(this),Fr(e,this,!0),this.finished=!0;const{s0:n,s1:r,s2:o,s3:s}=this,i=ge(e);i[0]=n,i[1]=r,i[2]=o,i[3]=s,_t(i)}digest(){const e=new Uint8Array(be);return this.digestInto(e),this.destroy(),e}}const Gt=Mr(16,(t,e)=>new Vr(t,e),t=>[t.length]),yt=16,Kr=4,ze=new Uint8Array(yt),Gr=283;function Wr(t){if(![16,24,32].includes(t.length))throw new Error('"aes key" expected Uint8Array of length 16/24/32, got length='+t.length)}function Bt(t){return t<<1^Gr&-(t>>7)}function Wt(t,e){let n=0;for(;e>0;e>>=1)n^=t&-(e&1),t=Bt(t);return n}const Qr=(()=>{const t=new Uint8Array(256);for(let n=0,r=1;n<256;n++,r^=Bt(r))t[n]=r;const e=new Uint8Array(256);e[0]=99;for(let n=0;n<255;n++){let r=t[255-n];r|=r<<8,e[t[n]]=(r^r>>4^r>>5^r>>6^r>>7^99)&255}return le(t),e})(),Jr=t=>t<<24|t>>>8,ut=t=>t<<8|t>>>24;function eo(t,e){if(t.length!==256)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map((a,u)=>e(t[u])),r=n.map(ut),o=r.map(ut),s=o.map(ut),i=new Uint32Array(256*256),c=new Uint32Array(256*256),f=new Uint16Array(256*256);for(let a=0;a<256;a++)for(let u=0;u<256;u++){const l=a*256+u;i[l]=n[a]^r[u],c[l]=o[a]^s[u],f[l]=t[a]<<8|t[u]}return{sbox:t,sbox2:f,T0:n,T1:r,T2:o,T3:s,T01:i,T23:c}}const Tn=eo(Qr,t=>Wt(t,3)<<24|t<<16|t<<8|Wt(t,2)),to=(()=>{const t=new Uint8Array(16);for(let e=0,n=1;e<16;e++,n=Bt(n))t[e]=n;return t})();function no(t){Y(t);const e=t.length;Wr(t);const{sbox2:n}=Tn,r=[];(!It||!Ce(t))&&r.push(t=Ne(t));const o=_t(ge(t)),s=o.length,i=f=>Oe(n,f,f,f,f),c=new Uint32Array(e+28);c.set(o);for(let f=s;f<c.length;f++){let a=c[f-1];f%s===0?a=i(Jr(a))^to[f/s-1]:s>6&&f%s===4&&(a=i(a)),c[f]=c[f-s]^a}return le(...r),c}function Pe(t,e,n,r,o,s){return t[n<<8&65280|r>>>8&255]^e[o>>>8&65280|s>>>24&255]}function Oe(t,e,n,r,o){return t[e&255|n&65280]|t[r>>>16&255|o>>>16&65280]<<16}function Qt(t,e,n,r,o){const{sbox2:s,T01:i,T23:c}=Tn;let f=0;e^=t[f++],n^=t[f++],r^=t[f++],o^=t[f++];const a=t.length/4-2;for(let v=0;v<a;v++){const E=t[f++]^Pe(i,c,e,n,r,o),d=t[f++]^Pe(i,c,n,r,o,e),p=t[f++]^Pe(i,c,r,o,e,n),y=t[f++]^Pe(i,c,o,e,n,r);e=E,n=d,r=p,o=y}const u=t[f++]^Oe(s,e,n,r,o),l=t[f++]^Oe(s,n,r,o,e),m=t[f++]^Oe(s,r,o,e,n),g=t[f++]^Oe(s,o,e,n,r);return{s0:u,s1:l,s2:m,s3:g}}function Ye(t,e,n,r,o){Y(n,yt,"nonce"),Y(r),o=zr(r.length,o);const s=n,i=ge(s),c=et(s),f=ge(r),a=ge(o),u=e?0:12,l=r.length;let m=c.getUint32(u,e),{s0:g,s1:v,s2:E,s3:d}=Qt(t,F(i[0]),F(i[1]),F(i[2]),F(i[3]));for(let y=0;y+4<=f.length;y+=4)a[y+0]=f[y+0]^F(g),a[y+1]=f[y+1]^F(v),a[y+2]=f[y+2]^F(E),a[y+3]=f[y+3]^F(d),m=m+1>>>0,c.setUint32(u,m,e),{s0:g,s1:v,s2:E,s3:d}=Qt(t,F(i[0]),F(i[1]),F(i[2]),F(i[3]));const p=yt*Math.floor(f.length/Kr);if(p<l){const y=new Uint32Array([g,v,E,d]);_t(y);const b=Hr(y);for(let S=p,R=0;S<l;S++,R++)o[S]=r[S]^b[R];le(y)}return o}function ro(t,e,n,r,o){const s=o?o.length:0,i=t.create(n,r.length+s);o&&i.update(o);const c=Pr(8*r.length,8*s,e);i.update(r),i.update(c);const f=i.digest();return le(c),f}const Jt=Zr({blockSize:16,nonceLength:12,tagLength:16,varSizeNonce:!0},function(e,n,r){if(n.length<8)throw new Error("aes/gcm: invalid nonce length");const o=16;function s(c,f,a){const u=ro(Gt,!1,c,a,r);for(let l=0;l<f.length;l++)u[l]^=f[l];return u}function i(){const c=no(e),f=ze.slice(),a=ze.slice();if(Ye(c,!1,a,a,f),n.length===12)a.set(n);else{const l=ze.slice();et(l).setBigUint64(8,BigInt(n.length*8),!1);const g=Gt.create(f).update(n).update(l);g.digestInto(a),g.destroy()}const u=Ye(c,!1,a,ze);return{xk:c,authKey:f,counter:a,tagMask:u}}return{encrypt(c){const{xk:f,authKey:a,counter:u,tagMask:l}=i(),m=new Uint8Array(c.length+o),g=[f,a,u,l];Ce(c)||g.push(c=Ne(c)),Ye(f,!1,u,c,m.subarray(0,c.length));const v=s(a,l,m.subarray(0,m.length-o));return g.push(v),m.set(v,c.length),le(...g),m},decrypt(c){const{xk:f,authKey:a,counter:u,tagMask:l}=i(),m=[f,a,l,u];Ce(c)||m.push(c=Ne(c));const g=c.subarray(0,-o),v=c.subarray(-o),E=s(a,l,g);if(m.push(E),!$r(E,v))throw le(...m),new Error("aes/gcm: invalid ghash tag");const d=Ye(f,!1,u,g);return le(...m),d}}}),kn="chainlesschain.remote-session.e2ee.v1",en="chainlesschain://remote-session/pair#",lt=32,oo=new TextEncoder,Ln=new TextDecoder;function Ve(t){return oo.encode(t)}function je(t){let e="";for(const n of t)e+=String.fromCharCode(n);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Te(t){const e=String(t).replace(/-/g,"+").replace(/_/g,"/"),n=atob(e),r=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)r[o]=n.charCodeAt(o);return r}function so(t){const e=new Uint8Array(t);return globalThis.crypto.getRandomValues(e),e}function io(){const t=wt.utils;return t.randomSecretKey?t.randomSecretKey():t.randomPrivateKey()}function tn(t,e,n){return Ve(`${kn}
|
|
2
|
-
${t}
|
|
3
|
-
${e}
|
|
4
|
-
${n}`)}function co(t,e=Date.now()){if(typeof t!="string"||!t.startsWith(en))throw new Error("Invalid Remote Session pairing URI");let n;try{n=JSON.parse(Ln.decode(Te(t.slice(en.length))))}catch{throw new Error("Malformed Remote Session pairing payload")}if(n.v!==1||!n.relayUrl||!n.remoteSessionId||!n.hostPeerId||!n.hostPublicKey||!n.pairingToken)throw new Error("Incomplete Remote Session pairing payload");if(n.expiresAt&&n.expiresAt<=e)throw new Error("Remote Session pairing payload expired");let r;try{r=new URL(n.relayUrl).protocol}catch{r=null}if(r!=="ws:"&&r!=="wss:")throw new Error("Remote Session relay must use ws or wss");return n}class ao{constructor(e,n){if(!e||!n)throw new Error("sessionId and localPeerId are required");this.sessionId=e,this.localPeerId=n,this.secretKey=io(),this.publicKey=wt.getPublicKey(this.secretKey),this.key=null,this.sendSequence=0,this.receivedSequences=new Map}publicKeyBase64(){return je(this.publicKey)}pair(e,n){if(!e||!n)throw new Error("Incomplete peer key material");const r=Te(e),o=r.length===lt?r:r.slice(-lt);if(o.length!==lt)throw new Error("Invalid X25519 host public key");const s=wt.getSharedSecret(this.secretKey,o),i=Ut(Ve(n));this.key=Cr(Ut,s,i,Ve(`${kn}:${this.sessionId}`),32)}encrypt(e){if(!this.key)throw new Error("Remote Session is not paired");const n=this.sendSequence+=1,r=so(12),o=Jt(this.key,r,tn(this.sessionId,this.localPeerId,n)).encrypt(Ve(JSON.stringify(e)));return{v:1,sessionId:this.sessionId,senderId:this.localPeerId,sequence:n,nonce:je(r),ciphertext:je(o.slice(0,o.length-16)),tag:je(o.slice(o.length-16))}}decrypt(e){if(e?.v!==1||e.sessionId!==this.sessionId)throw new Error("Invalid encrypted Remote Session envelope");if(!this.key)throw new Error("Remote Session is not paired");const n=this.receivedSequences.get(e.senderId)||0;if(!Number.isSafeInteger(e.sequence)||e.sequence<=n)throw new Error("Remote Session replay or out-of-order envelope rejected");const r=new Uint8Array([...Te(e.ciphertext),...Te(e.tag)]),o=Jt(this.key,Te(e.nonce),tn(this.sessionId,e.senderId,e.sequence)).decrypt(r);return this.receivedSequences.set(e.senderId,e.sequence),JSON.parse(Ln.decode(o))}}const Un="chainlesschain://remote-control/pair#";function fo(t){const e=String(t).replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(e.length+(4-e.length%4)%4,"="),r=atob(n),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}function qn(t){return typeof t=="string"&&t.startsWith(Un)}function dt(t){const e=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(t);if(!e)return!1;const[n,r]=[Number(e[1]),Number(e[2])];return[e[1],e[2],e[3],e[4]].some(o=>Number(o)>255)?!1:n===127||n===10||n===172&&r>=16&&r<=31||n===192&&r===168||n===169&&r===254}function uo(t){const e=String(t||"").toLowerCase().replace(/^\[|\]$/g,"");if(!e)return!1;if(e==="localhost"||dt(e)||e==="::1")return!0;const n=/^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.exec(e);if(n)return dt(n[1]);const r=/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(e);if(r){const o=parseInt(r[1],16),s=parseInt(r[2],16);return dt(`${o>>8&255}.${o&255}.${s>>8&255}.${s&255}`)}return!!(/^fe[89ab]/.test(e)||/^f[cd]/.test(e))}function lo(t){let e;try{e=new URL(String(t))}catch{throw new Error(`Invalid direct pairing endpoint: ${t}`)}if(e.protocol!=="ws:"&&e.protocol!=="wss:")throw new Error(`Direct pairing endpoint must be ws:// or wss:// (got ${e.protocol})`);if(e.protocol==="ws:"&&!uo(e.hostname))throw new Error(`Refusing plaintext ws:// to non-private host "${e.hostname}" — direct pairing is LAN/loopback only; use wss:// for anything else`);return e}function po(t,e=Date.now()){if(!qn(t))throw new Error("Not a remote-control pairing URI");let n;try{n=JSON.parse(fo(t.slice(Un.length)))}catch{throw new Error("Malformed remote-control pairing payload")}if(n.v!==1||n.transport!=="direct")throw new Error(`Unsupported remote-control pairing payload (v=${n.v}, transport=${n.transport})`);if(!n.wsUrl||!n.remoteSessionId||!n.pairingToken)throw new Error("Pairing payload is missing wsUrl/session/token");if(n.expiresAt!=null&&n.expiresAt<=e)throw new Error("Pairing link has expired — generate a new one");return lo(n.wsUrl),{wsUrl:n.wsUrl,serverToken:n.serverToken||null,remoteSessionId:n.remoteSessionId,agentSessionId:n.agentSessionId||null,pairingToken:n.pairingToken,scopes:Array.isArray(n.scopes)?n.scopes:null,expiresAt:n.expiresAt??null}}const ho=1e3,go=3e4,wo=20,yo=15e3;let nn=0;function Ke(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}function mo(){return`web-${Ke()}`}const rn=Cn("remoteSession",()=>{const t=te("idle"),e=te([]),n=te(""),r=te(null),o=te(null),s=te(null),i=te([]);let c=null,f=null,a=null,u=null,l=!1,m=!1,g=0,v=null,E=null,d=0,p=null,y=null,b=new Map,S=0;function R(){v&&(clearTimeout(v),v=null)}function L(h){if(h?.type==="permission.request"){const w=h.requestId||h.approvalId||null;w&&!i.value.some(x=>x.requestId===w)&&(i.value=[...i.value,{requestId:w,tool:h.tool||null,action:h.action||null,detail:h.detail||null,askedAt:h.askedAt||Date.now()}])}else if(h?.type==="permission.resolved"){const w=h.requestId||h.approvalId||null;w&&T(w)}nn+=1,e.value=[...e.value,{...h,_id:nn,_rxAt:Date.now()}].slice(-200)}function T(h){i.value=i.value.filter(w=>w.requestId!==h)}function U(h){!h||!h.requestId||e.value.some(x=>x.type==="permission.resolved"&&x.requestId===h.requestId)||i.value.some(x=>x.requestId===h.requestId)||(i.value=[...i.value,h])}function O(){if(!a)return;const h=new WebSocket(a.relayUrl);c=h,h.addEventListener("open",()=>{h===c&&h.send(JSON.stringify({type:"register",peerId:u,deviceType:"web",deviceInfo:{protocol:"remote-session.e2ee.v1"}}))}),h.addEventListener("message",w=>{h===c&&N(w.data)}),h.addEventListener("close",()=>{h===c&&(c=null,m?t.value="disconnected":H())}),h.addEventListener("error",()=>{h===c&&(n.value="Remote Session relay connection error")})}function H(){if(m||v)return;if(g>=wo){t.value="disconnected",n.value="Remote Session 重连已放弃(中继长时间不可达)— 回到本页可自动重试";return}const h=Math.min(ho*2**g,go);g+=1,t.value="reconnecting",v=setTimeout(()=>{v=null,m||O()},h)}function I(){o.value!=="relay"||!a||m||c||v||(g=0,n.value="",t.value="connecting",O())}function N(h){try{let w=JSON.parse(typeof h=="string"?h:String(h));if(w.type==="offline-message"&&(w=w.originalMessage||{}),w.type==="registered"){l?t.value="connected":(t.value="pairing",B());return}if(w.type!=="message")return;const x=w.payload;if(!x||x.type!=="remote-session.encrypted")return;const q=f.decrypt(x.envelope);q.type==="pair.accepted"?(l=!0,g=0,t.value="connected"):q.type==="session.revoked"?(m=!0,l=!1,R(),c&&c.close(),c=null,t.value="revoked"):L(q)}catch(w){t.value="error",n.value=w?.message||"Remote Session protocol error"}}function D(h,w){return!c||c.readyState!==WebSocket.OPEN||!a?!1:(c.send(JSON.stringify({type:"message",to:a.hostPeerId,payload:{type:h,...w}})),!0)}function B(){const h={type:"pair.join",remoteSessionId:a.remoteSessionId,token:a.pairingToken};E?.token&&(h.pushToken=E.token,h.pushProvider=E.provider||"web"),D("remote-session.pair",{mobilePeerId:u,mobilePublicKey:f.publicKeyBase64(),envelope:f.encrypt(h)})}function k(h){if(!c||c.readyState!==WebSocket.OPEN||!l)return!1;const w={...h,commandId:h.commandId||Ke(),seq:h.seq??++d};return D("remote-session.encrypted",{envelope:f.encrypt(w)})}function $(h){for(const[,w]of b)clearTimeout(w.timer),w.reject(new Error(h));b=new Map}function Q(h,w={}){const x=p;if(!x||x.readyState!==WebSocket.OPEN)return Promise.reject(new Error("not connected"));const q=`web-rc-${++S}-${Ke()}`;return new Promise((nt,He)=>{const De=setTimeout(()=>{b.delete(q),He(new Error(`request "${h}" timed out`))},yo);b.set(q,{resolve:nt,reject:He,timer:De}),x.send(JSON.stringify({id:q,type:h,...w}))})}function j(h){let w;try{w=JSON.parse(typeof h=="string"?h:String(h))}catch{return}const x=w.requestId&&b.has(w.requestId)?w.requestId:w.id&&b.has(w.id)?w.id:null;if(x){const q=b.get(x);b.delete(x),clearTimeout(q.timer),w.type==="error"?q.reject(new Error(w.message||w.payload?.message||"server error")):q.resolve(w);return}if(w.type==="remote-session-event"&&w.remoteSessionId===y?.remoteSessionId){L(w.event||{});return}w.type==="remote-session-revoked"&&w.remoteSessionId===y?.remoteSessionId&&(m=!0,p&&p.close(),p=null,t.value="revoked")}function G(h){y=h,r.value=h.remoteSessionId,o.value="direct",s.value=h.scopes,t.value="connecting";const w=new WebSocket(h.wsUrl);p=w,w.addEventListener("open",async()=>{if(w===p)try{if(t.value="pairing",h.serverToken){const q=await Q("auth",{token:h.serverToken});if(!q.success)throw new Error(q.message||"authentication failed")}const x=await Q("remote-session-join",{remoteSessionId:h.remoteSessionId,token:h.pairingToken});if(w!==p)return;s.value=x.member?.scopes||h.scopes,t.value="connected"}catch(x){if(w!==p)return;t.value="error",n.value=x?.message||"Direct pairing failed";try{w.close()}catch{}p=null}}),w.addEventListener("message",x=>{w===p&&j(x.data)}),w.addEventListener("close",()=>{if(w===p){if(p=null,$("connection closed"),m){t.value!=="revoked"&&(t.value="disconnected");return}(t.value==="connected"||t.value==="pairing")&&(t.value="disconnected",n.value="直连会话已断开 — 配对码为一次性,请在主机端重新生成配对链接")}}),w.addEventListener("error",()=>{w===p&&(n.value="Remote control host connection error")})}function X(h){return Q("remote-session-publish",{remoteSessionId:y.remoteSessionId,commandId:Ke(),seq:++d,event:h}).catch(w=>(n.value=w?.message||"Remote control send failed",null))}function J(h,w={}){we();try{if(n.value="",e.value=[],i.value=[],m=!1,d=0,qn(h))return G(po(h)),!0;const x=co(h);return E=w.pushCredentials||null,u=mo(),f=new ao(x.remoteSessionId,u),f.pair(x.hostPublicKey,x.pairingToken),a=x,r.value=x.remoteSessionId,o.value="relay",s.value=null,l=!1,g=0,t.value="connecting",O(),!0}catch(x){return t.value="error",n.value=x?.message||"Invalid pairing link",!1}}function ne(h){const w=(h||"").trim();if(w){if(o.value==="direct"){p?X({type:"prompt",content:w}):n.value="Remote Session is not connected";return}k({type:"prompt",content:w})||(n.value="Remote Session is not connected")}}function tt(h,w){if(!h)return;const x=i.value.find(q=>q.requestId===h)||null;if(T(h),o.value==="direct"){if(!p){n.value="Remote Session is not connected",U(x);return}X({type:"approval.resolve",requestId:h,answer:w,approved:w}).then(q=>{q===null&&U(x)});return}k({type:"approval.resolve",requestId:h,approved:w})||(n.value="Remote Session is not connected",U(x))}function Se(){if(o.value==="direct"){p&&X({type:"interrupt"});return}k({type:"interrupt"})}function Fe(h,w="web"){if(E=h?{token:h,provider:w}:null,!l)return;const x={type:"push.register"};E?.token&&(x.pushToken=E.token,x.pushProvider=E.provider),k(x)}function we(){if(m=!0,l=!1,R(),c)try{c.close()}catch{}if(c=null,p)try{p.close()}catch{}p=null,y=null,$("disconnected"),t.value!=="revoked"&&(t.value="disconnected")}return{status:t,events:e,error:n,remoteSessionId:r,transport:o,scopes:s,pendingApprovals:i,connect:J,sendPrompt:ne,approve:tt,interrupt:Se,updatePushCredentials:Fe,resumeReconnect:I,disconnect:we}}),bo={__name:"RemoteSession",setup(t,{expose:e}){e();const n=rn();Tt(()=>n.resumeReconnect());const{status:r,events:o,error:s,transport:i,pendingApprovals:c}=kt(n),f=te(""),a=te(""),u=te(!1),l=Be(()=>["connecting","pairing","connected","reconnecting"].includes(r.value)),m=Be(()=>({idle:"未连接",connecting:"连接中",pairing:"配对中",connected:"已连接",reconnecting:"重连中",disconnected:"已断开",revoked:"已被撤销",error:"错误"})[r.value]||r.value),g=Be(()=>r.value==="connected"?"green":["connecting","pairing","reconnecting"].includes(r.value)?"blue":["revoked","error"].includes(r.value)?"red":"default"),v=Be(()=>[...o.value].reverse());function E(I){return String(I?.type||"").includes("approval")}function d(I){return I?.content||I?.payload?.content||I?.message||""}function p(I){return I?.requestId||I?.approvalId||""}function y(){n.connect(f.value.trim())}function b(I){u.value=!1,I&&(f.value=I,n.connect(I))}function S(I){const N=typeof I=="string"?I:a.value;n.sendPrompt(N),a.value=""}function R(I,N){n.approve(p(I),N)}function L(I,N){n.approve(I.requestId,N)}function T(){n.interrupt()}function U(){n.disconnect()}function O(){s.value=""}const H={store:n,status:r,events:o,error:s,transport:i,pendingApprovals:c,pairingLink:f,promptText:a,scannerOpen:u,isActive:l,statusLabel:m,statusColor:g,orderedEvents:v,isApproval:E,eventBody:d,requestIdOf:p,connect:y,onScanned:b,send:S,respond:R,respondPermission:L,interrupt:T,disconnect:U,clearError:O,computed:Be,onMounted:Tt,ref:te,get storeToRefs(){return kt},get LinkOutlined(){return $n},get ScanOutlined(){return Dn},QrScannerModal:Fn,get useRemoteSessionStore(){return rn}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},Eo={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},vo={key:0,class:"page-sub"},xo={key:0,style:{"word-break":"break-all"}},So={key:1,class:"page-sub"};function Io(t,e,n,r,o,s){const i=V("a-tag"),c=V("a-space"),f=V("a-alert"),a=V("a-textarea"),u=V("a-button"),l=V("a-card"),m=V("a-input-search"),g=V("a-spin"),v=V("a-badge"),E=V("a-list-item-meta"),d=V("a-list-item"),p=V("a-list"),y=V("a-empty");return W(),$e("div",null,[Ie("div",Eo,[e[4]||(e[4]=Ie("div",null,[Ie("h2",{class:"page-title"},"远程会话"),Ie("p",{class:"page-sub"}," 扫码或粘贴桌面端的配对链接,接管一个编码会话(观察 / 提示 / 审批 / 中断)——支持中继 E2EE 链接与局域网直连链接 ")],-1)),A(c,null,{default:_(()=>[r.transport?(W(),ie(i,{key:0,color:"purple"},{default:_(()=>[z(ye(r.transport==="direct"?"直连":"中继"),1)]),_:1})):_e("v-if",!0),A(i,{color:r.statusColor},{default:_(()=>[z(ye(r.statusLabel),1)]),_:1},8,["color"])]),_:1})]),r.error?(W(),ie(f,{key:0,type:"error","show-icon":"",style:{"margin-bottom":"16px"},message:r.error,closable:"",onClose:r.clearError},null,8,["message"])):_e("v-if",!0),r.isActive?(W(),ie(l,{key:2,title:"会话控制",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{extra:_(()=>[A(c,null,{default:_(()=>[A(u,{size:"small",onClick:r.interrupt},{default:_(()=>[...e[8]||(e[8]=[z("中断",-1)])]),_:1}),A(u,{size:"small",danger:"",onClick:r.disconnect},{default:_(()=>[...e[9]||(e[9]=[z("断开",-1)])]),_:1})]),_:1})]),default:_(()=>[A(c,{direction:"vertical",style:{width:"100%"},size:8},{default:_(()=>[A(m,{value:r.promptText,"onUpdate:value":e[2]||(e[2]=b=>r.promptText=b),placeholder:"发送提示到远程会话…","enter-button":"发送",disabled:r.status!=="connected",onSearch:r.send},null,8,["value","disabled"]),r.status==="reconnecting"?(W(),ie(g,{key:0,size:"small"},{tip:_(()=>[...e[10]||(e[10]=[z("正在重连…",-1)])]),_:1})):_e("v-if",!0)]),_:1})]),_:1})):(W(),ie(l,{key:1,title:"连接远程会话",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:_(()=>[A(c,{direction:"vertical",style:{width:"100%"},size:12},{default:_(()=>[A(a,{value:r.pairingLink,"onUpdate:value":e[0]||(e[0]=b=>r.pairingLink=b),rows:3,placeholder:"chainlesschain://remote-session/pair#…(中继)或 chainlesschain://remote-control/pair#…(局域网直连)","allow-clear":""},null,8,["value"]),A(c,null,{default:_(()=>[A(u,{type:"primary",disabled:!r.pairingLink.trim(),onClick:r.connect},{icon:_(()=>[A(r.LinkOutlined)]),default:_(()=>[e[5]||(e[5]=z(" 连接 ",-1))]),_:1},8,["disabled"]),A(u,{onClick:e[1]||(e[1]=b=>r.scannerOpen=!0)},{icon:_(()=>[A(r.ScanOutlined)]),default:_(()=>[e[6]||(e[6]=z(" 扫码 ",-1))]),_:1})]),_:1}),e[7]||(e[7]=Ie("p",{class:"page-sub",style:{margin:"0"}}," 链接为一次性配对码,敏感载荷仅在片段(#)中,不会发往服务器。 ",-1))]),_:1})]),_:1})),r.pendingApprovals.length?(W(),ie(l,{key:3,style:{background:"var(--bg-card)","border-color":"var(--warning-color, #faad14)","margin-bottom":"16px"}},{title:_(()=>[e[11]||(e[11]=z(" 待审批权限请求 ",-1)),A(v,{count:r.pendingApprovals.length,style:{"margin-left":"8px"}},null,8,["count"])]),default:_(()=>[A(p,{size:"small","data-source":r.pendingApprovals,"data-testid":"approval-cards"},{renderItem:_(({item:b})=>[A(d,null,{actions:_(()=>[A(u,{type:"primary",size:"small",onClick:S=>r.respondPermission(b,!0)},{default:_(()=>[...e[12]||(e[12]=[z("批准",-1)])]),_:1},8,["onClick"]),A(u,{size:"small",danger:"",onClick:S=>r.respondPermission(b,!1)},{default:_(()=>[...e[13]||(e[13]=[z("拒绝",-1)])]),_:1},8,["onClick"])]),default:_(()=>[A(E,null,{title:_(()=>[A(c,null,{default:_(()=>[A(i,{color:"orange"},{default:_(()=>[z(ye(b.tool||"tool"),1)]),_:2},1024),b.action?(W(),$e("span",vo,ye(b.action),1)):_e("v-if",!0)]),_:2},1024)]),description:_(()=>[b.detail?(W(),$e("code",xo,ye(b.detail),1)):(W(),$e("span",So,"(无详情)"))]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1})):_e("v-if",!0),A(l,{title:"会话事件",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:_(()=>[r.events.length?(W(),ie(p,{key:1,size:"small","data-source":r.orderedEvents},{renderItem:_(({item:b})=>[A(d,null,Nn({default:_(()=>[A(E,{description:r.eventBody(b)},{title:_(()=>[A(i,{color:r.isApproval(b)?"orange":"blue"},{default:_(()=>[z(ye(b.type||"event"),1)]),_:2},1032,["color"])]),_:2},1032,["description"])]),_:2},[r.isApproval(b)?{name:"actions",fn:_(()=>[A(u,{type:"link",size:"small",onClick:S=>r.respond(b,!0)},{default:_(()=>[...e[14]||(e[14]=[z("批准",-1)])]),_:1},8,["onClick"]),A(u,{type:"link",size:"small",danger:"",onClick:S=>r.respond(b,!1)},{default:_(()=>[...e[15]||(e[15]=[z("拒绝",-1)])]),_:1},8,["onClick"])]),key:"0"}:void 0]),1024)]),_:1},8,["data-source"])):(W(),ie(y,{key:0,description:"尚无事件"}))]),_:1}),A(r.QrScannerModal,{open:r.scannerOpen,onScanned:r.onScanned,onCancel:e[3]||(e[3]=b=>r.scannerOpen=!1)},null,8,["open"])])}const To=Hn(bo,[["render",Io],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/views/RemoteSession.vue"]]);export{To as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as F,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S,V as b,o as I,x as V,P as i,Q as k,R as r,F as x,Z as O}from"./vendor-Bn1JzzAn.js";import{u as P,_ as E}from"./index-DnVVYKCE.js";import{R as U}from"./icons-DG5UD-6K.js";const B=F("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){N(),s(),u=setInterval(s,e),C()}function N(){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:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),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)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:T,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return U},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},j={class:"page-header"},q={key:0,class:"error-text"},J={key:1},K={class:"task-header"},M={class:"task-desc"},Q={class:"task-id"},W={class:"task-meta"},Z=["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"),N=p("a-row"),C=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",j,[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",q,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",J,r(t.truncate(String(t.store.lastNotification.result),120)),1)):b("v-if",!0)]),_:1},8,["type"])):b("v-if",!0),n(N,{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(x,null,O(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",Q,r(o.id.slice(0,16)),1)]),_("div",W,[_("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})):b("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,Z)):o.key==="duration"?(i(),c(x,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(x,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(x,{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(x,{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"])):b("v-if",!0)],64)):b("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=E(L,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st 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-DnVVYKCE.js";import{I as z,J as x,U as _,Q as q,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 D,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(L=>({seq:L.seq,data:ae(L.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 L(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 D();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}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;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 K of v)m.write(K.data),t.lastSeq=K.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const J=new ResizeObserver(()=>{try{P.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,D(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function X(){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 X()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{D(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const j={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,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:X,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:D,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},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"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},qe={key:1,class:"terminal-footer"},De={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]=q(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),Q(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[q(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]=q(" 新会话 ",-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]=q(" 刷新 ",-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,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",qe,[_("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",De,"已退出 (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-9tmCqb/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as St,r as h,b as yt,a as v}from"./vendor-Bn1JzzAn.js";import{u as S}from"./index-DnVVYKCE.js";let $=0;function K(a){return $+=1,`msg_${Date.now()}_${$}_${a}`}const C=Object.freeze({USER:"user",ASSISTANT:"assistant",SYSTEM:"system",INTENT_RECOGNITION:"intent-recognition",INTENT_CONFIRMATION:"intent-confirmation",TASK_ANALYSIS:"task-analysis",INTERVIEW:"interview",TASK_PLAN:"task-plan",PROGRESS:"progress",ERROR:"error"}),B=Object.freeze({USER:"user",ASSISTANT:"assistant",SYSTEM:"system"});function Tt(a,s){return{id:K("intent_confirmation"),role:B.ASSISTANT,type:C.INTENT_CONFIRMATION,content:"我理解您的需求如下,请确认:",timestamp:Date.now(),metadata:{originalInput:a,understanding:s||{},status:"pending",correction:null}}}function ht(a,s,f={}){const{reason:c,extractedInfo:m}=f,g={CONTINUE_EXECUTION:"✅ 收到,继续执行任务...",MODIFY_REQUIREMENT:`⚠️ 检测到需求变更:${m||s}`,CLARIFICATION:`📝 已记录补充信息:${m||s}`,CANCEL_TASK:"❌ 任务已取消"};return{id:K("intent_system"),role:B.SYSTEM,type:C.SYSTEM,content:g[a]||"⚠️ 未识别意图",timestamp:Date.now(),metadata:{intent:a,reason:c,userInput:s,extractedInfo:m}}}const k="新对话",P="新 Agent",G="cc.web-panel.chat.contextMode",J=["project","file","global"],X="cc.web-panel.chat.intentDecisions",F=200,z="cc.web-panel.chat.intentEnabled";function Et(){try{const a=typeof localStorage<"u"?localStorage.getItem(G):null;return J.includes(a)?a:null}catch{return null}}function wt(){try{return typeof localStorage>"u"?!1:localStorage.getItem(z)==="true"}catch{return!1}}function V(){try{if(typeof localStorage>"u")return{};const a=localStorage.getItem(X);if(!a)return{};const s=JSON.parse(a);return s&&typeof s=="object"?s:{}}catch{return{}}}function _t(a){try{if(typeof localStorage>"u")return;const s=Object.entries(a);if(s.length>F){s.sort((c,m)=>(c[1]?.ts||0)-(m[1]?.ts||0));const f=s.slice(-F);a=Object.fromEntries(f)}localStorage.setItem(X,JSON.stringify(a))}catch{}}function Q(a,s,f){if(!a||!s)return;const c=V();c[`${a}::${s}`]={...f,ts:Date.now()},_t(c)}function Nt(a,s){return!a||!s?null:V()[`${a}::${s}`]||null}const At={"assistant.delta":"response-token","assistant.final":"response-complete","assistant.message":"response-complete","tool.call.started":"tool-executing","tool.call.completed":"tool-result","tool.call.failed":"tool-result","slot.filling":"question","approval.requested":"question",error:"error"},Dt=St("chat",()=>{const a=h([]),s=h(null),f=v({}),c=v({}),m=v({}),g=v({}),j=(typeof window<"u"&&window.__CC_CONFIG__||{}).mode==="project",W=j?"project":"global",O=Et(),M=h(O==="file"||O==="project"&&!j?"global":O||W);function H(t){if(J.includes(t)){M.value=t;try{typeof localStorage<"u"&&localStorage.setItem(G,t)}catch{}}}const w=h(wt());function Z(t){w.value=!!t;try{typeof localStorage<"u"&&localStorage.setItem(z,w.value?"true":"false")}catch{}}const _="cc.web-panel.chat.customQuickPrompts";function tt(){try{if(typeof localStorage>"u")return null;const t=localStorage.getItem(_);if(!t)return null;const e=JSON.parse(t);if(!Array.isArray(e))return null;const n=e.map(o=>typeof o=="string"?o.trim():"").filter(o=>o.length>0&&o.length<=120).slice(0,12);return n.length>0?n:null}catch{return null}}const I=h(tt());function et(t){if(t==null){I.value=null;try{typeof localStorage<"u"&&localStorage.removeItem(_)}catch{}return}if(!Array.isArray(t))return;const e=t.map(n=>typeof n=="string"?n.trim():"").filter(n=>n.length>0&&n.length<=120).slice(0,12);I.value=e.length>0?e:null;try{typeof localStorage<"u"&&(e.length>0?localStorage.setItem(_,JSON.stringify(e)):localStorage.removeItem(_))}catch{}}const D=h(null);let L=0;function nt({prompt:t,autoSend:e=!0,session:n=null}={}){!t||!String(t).trim()||(L+=1,D.value={prompt:String(t),autoSend:e!==!1,session:n||null,token:`staged::${L}::${Date.now()}`})}function ot(){D.value=null}let U=null;const q=new Set;function y(t){return f[t]||(f[t]=[]),f[t]}function x(t){return!!(t&&g[t])}function T(t,e){t&&(g[t]=!!e)}function b(t){if(!t?.id)return;const e=a.value.find(n=>n.id===t.id);if(e){Object.assign(e,t);return}a.value.unshift(t)}function R(t,e=S()){f[t]||(f[t]=[]),c[t]||(c[t]={content:"",active:!1}),g[t]==null&&(g[t]=!1),!q.has(t)&&(q.add(t),e.onSession(t,n=>st(t,n)))}function N(t=S()){U||(U=t.onRuntimeEvent(e=>{const n=e.payload||{},o=n.record||{};if(e.type==="session:start"){const r=n.sessionType||o.type||"chat";T(n.sessionId,!1),b({id:n.sessionId,type:r,provider:o.provider||null,model:o.model||null,projectRoot:o.projectRoot||null,status:o.status||"created",title:r==="chat"?k:P,createdAt:Date.now(),messageCount:o.messageCount??0})}else if(e.type==="session:resume"){const r=n.sessionId;if(!r)return;Array.isArray(n.history)&&(f[r]=n.history.map(l=>({role:l.role,content:l.content,timestamp:l.timestamp||Date.now()}))),c[r]||(c[r]={content:"",active:!1}),g[r]==null&&(g[r]=!1),b({id:r,type:o.type||null,provider:o.provider||null,model:o.model||null,projectRoot:o.projectRoot||null,status:o.status||"resumed",messageCount:o.messageCount??(Array.isArray(n.history)?n.history.length:0)})}else if(e.type==="session:end"){const r=n.sessionId;a.value=a.value.filter(l=>l.id!==r),delete g[r],s.value===r&&(s.value=a.value[0]?.id||null)}}))}async function rt(){const t=S();N(t),a.value=await t.listSessions(),a.value.forEach(e=>{R(e.id,t)})}async function at(t="chat",e={}){const n=S();N(n);const o=await n.createSession(t,null,e);return b({id:o,type:t,title:t==="chat"?k:P,createdAt:Date.now(),messageCount:0}),T(o,!1),R(o,n),s.value=o,o}function st(t,e){const n=y(t),o=At[e.type]||e.type,r=e.payload||{};if(o==="response-token"){c[t]||(c[t]={content:"",active:!0});const l=e.token||r.token||r.delta||r.content||"";c[t].content+=l,c[t].active=!0,T(t,!0)}else if(o==="response-complete"){const l=e.content||r.content||c[t]?.content||"";n.push({role:"assistant",content:l,timestamp:Date.now()}),c[t]&&(c[t].content="",c[t].active=!1);const u=a.value.find(i=>i.id===t);if(u&&(u.title===k||u.title===P)){const i=n.find(p=>p.role==="user");i&&(u.title=i.content.slice(0,30))}u&&(u.messageCount=n.filter(i=>i.role!=="tool").length),T(t,!1)}else if(o==="tool-executing")n.push({role:"tool",tool:e.tool||r.tool||r.toolName||"unknown",input:e.input||r.input||r.args||null,status:"running",timestamp:Date.now()}),T(t,!0);else if(o==="tool-result"){const l=e.tool||r.tool||r.toolName||"unknown",u=[...n].reverse().find(i=>i.role==="tool"&&i.tool===l);u&&(u.result=e.result||r.result||r.output||null,u.status="done")}else if(o==="question")m[t]={requestId:e.requestId||r.requestId||e.id,question:e.question||r.question||r.message||"",choices:e.choices||r.choices||r.options||[]},T(t,!1);else if(o==="error"){const l=e.message||r.message||"Unknown error";n.push({role:"assistant",content:`Error: ${l}`,timestamp:Date.now()}),T(t,!1),c[t]&&(c[t].active=!1)}}async function E(t,e){const n=S();N(n),y(t).push({role:"user",content:e,timestamp:Date.now()}),c[t]||(c[t]={content:"",active:!1}),c[t].active=!0,T(t,!0),n.sendSessionMessage(t,e)}async function ct(t,e){if(!t||!e?.trim())return;const n=M.value;if(n==="global"||!w.value){await E(t,e);return}const o=S(),r=y(t).filter(d=>d.role==="user"||d.role==="assistant").slice(-5).map(d=>({role:d.role,content:String(d.content||"").slice(0,500)})),l=Tt(e,{});l.metadata.streaming=!0,l.metadata.streamingTokens=0,l.content="理解中…";const u=y(t);u.push(l);const i=u[u.length-1];let p=null;const Y=new AbortController,gt=setTimeout(()=>Y.abort(new Error("Intent understand wall-clock timeout")),9e4);try{const d=await o.sendStream({type:"chat.intent.understand-stream",sessionId:t,userInput:e,contextMode:n,history:r},{onChunk:()=>{i.metadata.streamingTokens=(i.metadata.streamingTokens||0)+1},idleMs:6e4,signal:Y.signal});d?.success&&(p=d)}catch{}finally{clearTimeout(gt)}if(!(p&&(p.correctedInput&&p.correctedInput!==e||Array.isArray(p.keyPoints)&&p.keyPoints.length>0))){const d=u.indexOf(i);d>=0&&u.splice(d,1),await E(t,e);return}i.content="我理解您的需求如下,请确认:",i.metadata.streaming=!1,i.metadata.understanding={correctedInput:p.correctedInput,intent:p.intent,keyPoints:p.keyPoints};const A=Nt(t,i.id);A?.status&&(i.metadata.status=A.status,A.correction&&(i.metadata.correction=A.correction))}async function lt(t,e){const o=y(t).find(l=>l.id===e);if(!o||o.type!==C.INTENT_CONFIRMATION)return;o.metadata&&(o.metadata.status="confirmed"),Q(t,e,{status:"confirmed",correction:null});const r=o.metadata?.originalInput||"";r.trim()&&await E(t,r)}async function it(t,e,n){const r=y(t).find(u=>u.id===e);if(!r||r.type!==C.INTENT_CONFIRMATION)return;r.metadata&&(r.metadata.status="corrected",r.metadata.correction=n),Q(t,e,{status:"corrected",correction:n});const l=(n||"").trim();l&&await E(t,l)}async function ut(t,e,n={}){const o=S();try{return await o.sendRaw({type:"chat.intent.classify-followup",sessionId:t,input:e,context:n},2e4)}catch{return null}}function ft(t,e,n,o={}){y(t).push(ht(e,n,o))}function dt(t,e){const n=S(),o=m[t];o&&(n.answerQuestion(t,o.requestId,e),delete m[t])}async function pt(t){const e=S();if(N(e),s.value=t,R(t,e),!f[t]||f[t].length===0)try{await e.resumeSession(t)}catch{}}const mt=yt(()=>x(s.value));return{sessions:a,currentSessionId:s,messages:f,streaming:c,pendingQuestion:m,loadingBySession:g,isLoading:mt,contextMode:M,setContextMode:H,intentEnabled:w,setIntentEnabled:Z,customQuickPrompts:I,setCustomQuickPrompts:et,pendingAutoSend:D,scheduleAutoSend:nt,clearAutoSend:ot,getIsLoading:x,loadSessions:rt,createSession:at,sendMessage:E,submitUserInput:ct,confirmIntent:lt,correctIntent:it,classifyFollowupIntent:ut,pushFollowupIntentBanner:ft,answerQuestion:dt,switchSession:pt,getMessages:y}});export{C as M,Dt as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-DnVVYKCE.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-Cqu-zCvh.js";import{a0 as t}from"./index-DnVVYKCE.js";import"./vendor-Bn1JzzAn.js";import"./index-D-QkW1fp.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DqAaqqCv.js";import{a0 as t}from"./index-DnVVYKCE.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-BXAIR1r-.js";import"./useFlexGapSupport-CaVD4o99.js";import"./styleChecker-gUd2T206.js";import"./index-D-QkW1fp.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|