chainlesschain 0.162.188 → 0.162.193
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -11
- package/bin/chainlesschain.js +7 -52
- package/completions/_cc +209 -0
- package/completions/cc.bash +18 -0
- package/completions/cc.fish +13 -0
- package/completions/cc.ps1 +226 -0
- package/package.json +10 -2
- package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DBLkaTje.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-BAy-Qebo.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-Dfb1Mlau.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-BbFkN8m0.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-kM4-cEEH.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-BSQfYWf3.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-CWDbI_fG.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BxLPbq_Q.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-DuIbdrp6.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-NEmjGahU.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CaoeG3Ns.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-BFf_g3xY.js} +1 -1
- package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CNOd8mdQ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-BhpDqz-i.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-CQ42T7Z6.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-DI5PcLMN.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-wYYZe0wR.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-Dlq03DD_.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BzqS8PP3.js} +1 -1
- package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-It55Yem7.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-9HkH6oxn.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-00e2YWRB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-By-ugRDL.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-BME5sbZY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-B4TEZCr-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-BrS6WVSr.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-BMdCWnKF.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-Bcp3vzcA.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-D-W_6x09.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DElGPxCZ.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-Dzn2guvI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-uPict-KL.js} +6 -6
- package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-BCw43kOb.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-DmV8Wv7F.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-COBbEOlj.js → MobileProjects-C-HaCmSM.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-C6jxJ34Y.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-Za8ExwhQ.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-KKDbuEgb.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-Dj97zbCk.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DBXvMraU.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-DOxITLYl.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D1i73mjb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-kW6Q3rvg.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-C-v_8p2v.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-tUbbY64W.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-DkHxEZ58.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-DWuMPGrK.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-30IYXWWm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-DZNQ4RrH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-De2MCElf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-5uHk9wsC.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-XjDfrFLb.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-Bgwj6gcE.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-gKql9umv.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-BWvmwkh7.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-Uok4hZPd.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-oOVIv9wq.js → RemoteSession-DLJzTk9a.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-ZVwIPMSO.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CN04HxWR.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BdSrEG4g.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-5PwVd0IR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-DdBo4zjN.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-D3letU7M.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton--Jb83f1v.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-Bg-CulHX.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-7QOa7S-X.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-DQwppjRw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-dNPQGL-s.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-Ggs-Z48q.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-78TYHgRO.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-xHwwv9vO.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BJXSJfm4.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-fLbjRhJw.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-oMSBSBmB.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-CfnY_wX_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-AdyTgYKO.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-C5K_81dS.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-vcGVDqki.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-hhOc3hlY.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-CVloC11s.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-CYeE32R5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-CNROR5bN.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-Cjx-cnwU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-DOIfelvD.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-DfA7UZ8u.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-BMSCzcfM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-5-HXgOX5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-AWg-0M1S.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-B4iYzpkL.js} +1 -1
- package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-B5Udeb_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-B7gf77CJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-BEMwBBHk.js} +1 -1
- package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-BM1y_9hM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-BUonmKSE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-BbQ2eQ8H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-BemJ2u_E.js} +1 -1
- package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-BolaOQxx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-BxOk9vkG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-By61ojUx.js} +1 -1
- package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-C2K9SNVX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-C3L5gdiD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-C7xn0Nub.js} +1 -1
- package/src/assets/web-panel/assets/{index-COG61sRv.js → index-CAnvhwg6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CEKMcOyU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-CNC5onm4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CVL27kXC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-CVm1_i3t.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-CdYBye8B.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-ClNMrqEY.js} +1 -1
- package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-Cs6l7uRu.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-CshQbilz.js} +1 -1
- package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-Cyweh0Hy.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-DBpWXFed.js} +3 -3
- package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-DHtpHZAQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-DLmn0BoK.js} +1 -1
- package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-DPAWBrMf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-DjEsxO5h.js} +1 -1
- package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-FBc_CJBd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Icdoqmzt.js} +1 -1
- package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
- package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
- package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-dCd8cSUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-m2vG9gG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaslYch6.js → index-mTpHoEzr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-ti_lnTWl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-s3iVK41k.js} +1 -1
- package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-B6B-E5Jz.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-BiYgTidA.js} +1 -1
- package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-pU1RdUDA.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-Cdoq_SeM.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-DIuvAn2K.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-8w16YR2D.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-VZ01cZe3.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-lh8YMN8Z.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-CmDyreec.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-Thnu-Iaj.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-Cg6lFY_X.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-DVfsR1YO.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/cli-help.js +181 -0
- package/src/command-help-index.json +181 -0
- package/src/command-manifest.json +1107 -175
- package/src/command-surface-policy.js +197 -0
- package/src/commands/agent.js +98 -33
- package/src/commands/artifacts.js +400 -2
- package/src/commands/background-session.js +41 -3
- package/src/commands/checkpoint-managed.js +1059 -0
- package/src/commands/checkpoint-restore-recovery.js +1476 -0
- package/src/commands/checkpoint.js +950 -22
- package/src/commands/compact.js +101 -25
- package/src/commands/config.js +506 -20
- package/src/commands/doctor.js +4 -1
- package/src/commands/hub.js +1 -1
- package/src/commands/mcp.js +688 -24
- package/src/commands/pack.js +16 -2
- package/src/commands/plugin.js +20 -12
- package/src/commands/session-mcp-recovery.js +218 -0
- package/src/commands/session.js +470 -110
- package/src/commands/setup.js +36 -10
- package/src/commands/skill.js +181 -110
- package/src/commands/status.js +21 -5
- package/src/commands/team-distributed.js +3324 -0
- package/src/commands/team.js +1130 -74
- package/src/commands/update.js +68 -6
- package/src/constants.js +11 -0
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/action-protocol.js +10 -0
- package/src/gateways/ws/session-protocol.js +555 -27
- package/src/gateways/ws/ws-agent-handler.js +541 -14
- package/src/gateways/ws/ws-session-gateway.js +129 -22
- package/src/gateways/ws/ws-session-state.js +431 -0
- package/src/harness/background-task-manager.js +233 -36
- package/src/harness/jsonl-session-store.js +2551 -167
- package/src/harness/mcp-client.js +802 -61
- package/src/harness/prompt-compressor.js +227 -27
- package/src/harness/session-index.js +89 -38
- package/src/harness/session-list-index.js +254 -0
- package/src/harness/structured-handoff.js +410 -0
- package/src/lazy-dispatch.js +747 -84
- package/src/lib/__tests__/logger.test.js +50 -2
- package/src/lib/advisor-runtime.js +1047 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +120 -26
- package/src/lib/agent-session-export.js +20 -0
- package/src/lib/agent-team/task-lease.js +271 -3
- package/src/lib/agent-team/team-adjudication.js +1501 -0
- package/src/lib/agent-team/team-budget.js +4 -1
- package/src/lib/agent-team/team-control-store.js +582 -0
- package/src/lib/agent-team/team-distributed-queue.js +5246 -0
- package/src/lib/agent-team/team-process-checkpoint.js +211 -0
- package/src/lib/agent-team/team-runner.js +543 -24
- package/src/lib/agent-team/team-worktree.js +1403 -95
- package/src/lib/artifact-store.js +131 -8
- package/src/lib/background-agent-supervisor.js +185 -13
- package/src/lib/background-interaction-journal.js +37 -9
- package/src/lib/background-launch-profile.js +1058 -0
- package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
- package/src/lib/checkpoint-restore-orchestrator.js +987 -0
- package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
- package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
- package/src/lib/checkpoint-restore-recovery.js +884 -0
- package/src/lib/checkpoint-restore-retention.js +126 -0
- package/src/lib/checkpoint-restore-saga.js +5079 -0
- package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
- package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
- package/src/lib/checkpoint-store.js +1688 -97
- package/src/lib/checkpoint-timeline-authority.js +522 -0
- package/src/lib/checkpoint-timeline.js +642 -0
- package/src/lib/config-keys.js +18 -119
- package/src/lib/config-manager.js +446 -27
- package/src/lib/config-redaction.js +57 -0
- package/src/lib/config-schema.js +853 -0
- package/src/lib/cowork-mcp-tools.js +5 -0
- package/src/lib/cowork-task-runner.js +458 -63
- package/src/lib/delivery-coordinator.js +1234 -0
- package/src/lib/delivery-evidence.js +450 -0
- package/src/lib/doctor-checkup.js +199 -14
- package/src/lib/executable-path.js +34 -0
- package/src/lib/fatal-handler.js +16 -0
- package/src/lib/file-checkpoint.js +4909 -186
- package/src/lib/file-lines.js +125 -0
- package/src/lib/headless-config-command.js +16 -5
- package/src/lib/hook-runner.cjs +139 -38
- package/src/lib/hooks-v2-workspace-context.js +10 -0
- package/src/lib/impacted-gate-selector.js +424 -0
- package/src/lib/interaction-adapter.js +62 -0
- package/src/lib/jsonl-session-store.js +1 -35
- package/src/lib/logger.js +66 -14
- package/src/lib/managed-checkpoint-render.js +60 -0
- package/src/lib/managed-tool-checkpoint.js +194 -0
- package/src/lib/mcp-call-ledger-store.js +1069 -0
- package/src/lib/mcp-call-ledger.js +747 -0
- package/src/lib/mcp-client.js +5 -0
- package/src/lib/mcp-conflict-scheduler.js +468 -0
- package/src/lib/mcp-effect-contract.js +102 -0
- package/src/lib/mcp-headers-helper-trust.js +145 -0
- package/src/lib/mcp-headers-helper.js +616 -0
- package/src/lib/mcp-host-recovery-runtime.js +131 -0
- package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
- package/src/lib/mcp-recovery-adjudication.js +443 -0
- package/src/lib/output-context.js +86 -0
- package/src/lib/packer/file-identity.js +170 -0
- package/src/lib/packer/index.js +3 -0
- package/src/lib/packer/native-update-state.js +277 -0
- package/src/lib/packer/pack-update-applier.js +1983 -136
- package/src/lib/packer/pack-update-checker.js +34 -0
- package/src/lib/packer/pack-update-downloader.js +875 -86
- package/src/lib/packer/pack-update-signature.js +86 -0
- package/src/lib/packer/pkg-config-generator.js +6 -0
- package/src/lib/paths.js +65 -10
- package/src/lib/plan-mode.js +831 -14
- package/src/lib/plan-persistence.js +540 -0
- package/src/lib/plugin-runtime/hooks.js +227 -69
- package/src/lib/plugin-runtime/plugin-options.js +189 -44
- package/src/lib/pr-automation-policy.js +146 -8
- package/src/lib/process-execution-broker/credential-agent.js +7 -0
- package/src/lib/process-execution-broker/index.js +491 -13
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
- package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
- 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 +284 -19
- package/src/lib/process-execution-broker/workspace-transaction.js +4459 -0
- package/src/lib/project-instructions.js +165 -29
- package/src/lib/project-mcp-trust.js +67 -0
- package/src/lib/public-ide-capability-manifest.js +272 -0
- package/src/lib/public-ide-capability-validation.js +351 -0
- package/src/lib/secret-store.js +267 -43
- package/src/lib/secure-file-identity.js +433 -0
- package/src/lib/secure-fs.js +1089 -0
- package/src/lib/security-audit.js +58 -0
- package/src/lib/service-manager.js +34 -13
- package/src/lib/session-budget-runtime.js +1452 -0
- package/src/lib/session-host-snapshot.js +388 -0
- package/src/lib/session-message-provenance.js +429 -0
- package/src/lib/session-projection.js +804 -0
- package/src/lib/session-resource-budget.js +1495 -0
- package/src/lib/settings-hooks.cjs +138 -22
- package/src/lib/settings-loader.cjs +25 -2
- package/src/lib/side-effect-ledger-store.js +45 -23
- package/src/lib/skill-execution-identity.js +217 -0
- package/src/lib/skill-loader.js +299 -18
- package/src/lib/sub-agent-context.js +236 -28
- package/src/lib/sub-agent-registry.js +5 -0
- package/src/lib/subagent-contract.js +94 -0
- package/src/lib/todo-manager.js +185 -18
- package/src/lib/todo-persistence.js +417 -0
- package/src/lib/turn-binding-store.js +41 -23
- package/src/lib/turn-binding.js +160 -2
- package/src/lib/with-file-lock.js +165 -24
- package/src/lib/ws-chat-handler.js +21 -0
- package/src/program-base.js +18 -0
- package/src/repl/advisor-command.js +103 -0
- package/src/repl/agent-repl.js +2175 -146
- package/src/repl/btw-command.js +93 -10
- package/src/repl/clipboard-image.js +119 -0
- package/src/repl/config-summary.js +64 -108
- package/src/repl/prompt-editor.js +233 -0
- package/src/repl/prompt-interactions.js +344 -0
- package/src/repl/prompt-stash.js +354 -0
- package/src/repl/prompt-suggestions.js +312 -0
- package/src/repl/repl-keybindings.js +227 -0
- package/src/repl/session-recap.js +217 -0
- package/src/repl/slash-command-registry.js +22 -0
- package/src/repl/terminal-layout.js +88 -0
- package/src/runtime/agent-core.js +1630 -447
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
- package/src/runtime/diagnostics.js +32 -13
- package/src/runtime/headless-runner.js +310 -118
- package/src/runtime/headless-stream.js +356 -95
- package/src/runtime/mcp-config.js +148 -14
- package/src/runtime/policies/agent-policy.js +14 -0
- package/src/runtime/status-diagnostics-lite.js +137 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BU2Yqq5H.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-69ca_WeR.js +0 -7
- package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
- package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
- package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import fs from "fs";
|
|
18
18
|
import path from "path";
|
|
19
|
-
import { MCPClient } from "../harness/mcp-client.js";
|
|
19
|
+
import { MCPClient, redactMcpUrl } from "../harness/mcp-client.js";
|
|
20
20
|
import { projectRootBase } from "../lib/project-root.cjs";
|
|
21
21
|
import {
|
|
22
22
|
discoverIdeServer,
|
|
@@ -35,6 +35,13 @@ import {
|
|
|
35
35
|
} from "../lib/jetbrains-bridge.js";
|
|
36
36
|
import { collectPluginMcpServers } from "../lib/plugin-runtime/mcp.js";
|
|
37
37
|
import { EventRuntimeStore } from "../lib/event-runtime-store.js";
|
|
38
|
+
import { mcpEffectDescriptorFields } from "../lib/mcp-effect-contract.js";
|
|
39
|
+
|
|
40
|
+
function headersHelperField(value) {
|
|
41
|
+
return typeof value === "string" && value.trim()
|
|
42
|
+
? { headersHelper: value }
|
|
43
|
+
: {};
|
|
44
|
+
}
|
|
38
45
|
|
|
39
46
|
/**
|
|
40
47
|
* Normalize a parsed config object into a `{ name: serverConfig }` map.
|
|
@@ -57,11 +64,32 @@ export function parseMcpServers(raw) {
|
|
|
57
64
|
transport: cfg.transport,
|
|
58
65
|
headers:
|
|
59
66
|
cfg.headers && typeof cfg.headers === "object" ? cfg.headers : {},
|
|
67
|
+
...headersHelperField(cfg.headersHelper),
|
|
68
|
+
...(cfg.configScope ? { configScope: cfg.configScope } : {}),
|
|
69
|
+
...(cfg.configSource ? { configSource: cfg.configSource } : {}),
|
|
60
70
|
};
|
|
61
71
|
}
|
|
62
72
|
return out;
|
|
63
73
|
}
|
|
64
74
|
|
|
75
|
+
/** Load organization-provisioned MCP servers as the highest-precedence layer. */
|
|
76
|
+
export async function loadManagedMcp(settings, deps = {}) {
|
|
77
|
+
const block = settings?.managedMcpServers || settings?.mcpServers;
|
|
78
|
+
if (!block || typeof block !== "object" || Array.isArray(block)) {
|
|
79
|
+
return deps.into || null;
|
|
80
|
+
}
|
|
81
|
+
const servers = parseMcpServers({ mcpServers: block });
|
|
82
|
+
for (const config of Object.values(servers)) {
|
|
83
|
+
config.configScope = "managed";
|
|
84
|
+
config.configSource = deps.managedFile || "managed-settings";
|
|
85
|
+
}
|
|
86
|
+
if (Object.keys(servers).length === 0) return deps.into || null;
|
|
87
|
+
(deps.writeErr || (() => {}))(
|
|
88
|
+
` mcp: ${Object.keys(servers).length} managed server(s) from ${deps.managedFile || "managed settings"}\n`,
|
|
89
|
+
);
|
|
90
|
+
return setupMcpFromConfig(servers, deps);
|
|
91
|
+
}
|
|
92
|
+
|
|
65
93
|
function managedServerNames(value) {
|
|
66
94
|
if (!Array.isArray(value)) return null;
|
|
67
95
|
return new Set(
|
|
@@ -136,7 +164,8 @@ export function mcpAuthHint(url, errMessage) {
|
|
|
136
164
|
/\bunauthor/i.test(m) ||
|
|
137
165
|
/\bforbidden\b/i.test(m);
|
|
138
166
|
if (!isAuth) return null;
|
|
139
|
-
|
|
167
|
+
const safeUrl = redactMcpUrl(url);
|
|
168
|
+
return ` → "${safeUrl}" requires authentication; run: cc mcp login ${safeUrl}\n`;
|
|
140
169
|
}
|
|
141
170
|
|
|
142
171
|
/**
|
|
@@ -319,6 +348,17 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
319
348
|
// plugin-provided MCP tool from a user/project MCP server.
|
|
320
349
|
source: cfg.pluginId ? `plugin:${cfg.pluginId}` : name,
|
|
321
350
|
...(cfg.pluginVersion ? { version: cfg.pluginVersion } : {}),
|
|
351
|
+
...mcpEffectDescriptorFields(t, {
|
|
352
|
+
// This records source identity trust only. It does NOT authorize the
|
|
353
|
+
// server-declared effect for Plan mode or unattended execution.
|
|
354
|
+
sourceTrusted:
|
|
355
|
+
cfg.configScope === "managed" ||
|
|
356
|
+
Boolean(cfg.pluginId && cfg.pluginWorkspaceAuthority),
|
|
357
|
+
provenance:
|
|
358
|
+
cfg.configSource ||
|
|
359
|
+
cfg.pluginSource ||
|
|
360
|
+
(cfg.configScope ? `${cfg.configScope}:${name}` : `mcp:${name}`),
|
|
361
|
+
}),
|
|
322
362
|
};
|
|
323
363
|
}
|
|
324
364
|
}
|
|
@@ -405,12 +445,44 @@ export function registerMcpResourceTools(result) {
|
|
|
405
445
|
kind: "mcp-resource",
|
|
406
446
|
category: "mcp",
|
|
407
447
|
source: "mcp",
|
|
448
|
+
isReadOnly: true,
|
|
449
|
+
riskLevel: "low",
|
|
450
|
+
effectContract: {
|
|
451
|
+
version: 1,
|
|
452
|
+
declaredEffect: "read",
|
|
453
|
+
authorizedEffect: "read",
|
|
454
|
+
riskLevel: "low",
|
|
455
|
+
sourceTrusted: true,
|
|
456
|
+
provenance: "host:mcp-resource-wrapper",
|
|
457
|
+
annotations: {
|
|
458
|
+
readOnlyHint: true,
|
|
459
|
+
destructiveHint: false,
|
|
460
|
+
idempotentHint: true,
|
|
461
|
+
openWorldHint: false,
|
|
462
|
+
},
|
|
463
|
+
},
|
|
408
464
|
};
|
|
409
465
|
externalToolDescriptors.read_mcp_resource = {
|
|
410
466
|
name: "read_mcp_resource",
|
|
411
467
|
kind: "mcp-resource",
|
|
412
468
|
category: "mcp",
|
|
413
469
|
source: "mcp",
|
|
470
|
+
isReadOnly: true,
|
|
471
|
+
riskLevel: "low",
|
|
472
|
+
effectContract: {
|
|
473
|
+
version: 1,
|
|
474
|
+
declaredEffect: "read",
|
|
475
|
+
authorizedEffect: "read",
|
|
476
|
+
riskLevel: "low",
|
|
477
|
+
sourceTrusted: true,
|
|
478
|
+
provenance: "host:mcp-resource-wrapper",
|
|
479
|
+
annotations: {
|
|
480
|
+
readOnlyHint: true,
|
|
481
|
+
destructiveHint: false,
|
|
482
|
+
idempotentHint: true,
|
|
483
|
+
openWorldHint: true,
|
|
484
|
+
},
|
|
485
|
+
},
|
|
414
486
|
};
|
|
415
487
|
}
|
|
416
488
|
|
|
@@ -460,7 +532,9 @@ export async function loadRegisteredMcp(rawDb, deps = {}) {
|
|
|
460
532
|
make = (db) => new MCPServerConfig(db);
|
|
461
533
|
}
|
|
462
534
|
const cfg = make(rawDb);
|
|
463
|
-
|
|
535
|
+
const visibility = { cwd: deps.cwd || process.cwd() };
|
|
536
|
+
if (deps.scope) visibility.scope = deps.scope;
|
|
537
|
+
rows = deps.all ? cfg.list(visibility) : cfg.getAutoConnect(visibility);
|
|
464
538
|
} catch {
|
|
465
539
|
return deps.into || null; // registry unavailable — non-fatal
|
|
466
540
|
}
|
|
@@ -474,6 +548,10 @@ export async function loadRegisteredMcp(rawDb, deps = {}) {
|
|
|
474
548
|
url: r.url,
|
|
475
549
|
transport: r.transport,
|
|
476
550
|
headers: r.headers,
|
|
551
|
+
...headersHelperField(r.headersHelper),
|
|
552
|
+
configScope: r.configScope,
|
|
553
|
+
configSource: r.configSource,
|
|
554
|
+
projectPath: r.projectPath,
|
|
477
555
|
};
|
|
478
556
|
}
|
|
479
557
|
if (Object.keys(servers).length === 0) return deps.into || null;
|
|
@@ -704,6 +782,28 @@ export async function loadProjectMcp(opts = {}, deps = {}) {
|
|
|
704
782
|
}
|
|
705
783
|
const parsed = parseMcpServers(raw);
|
|
706
784
|
if (Object.keys(parsed).length > 0) {
|
|
785
|
+
for (const [name, config] of Object.entries(parsed)) {
|
|
786
|
+
config.configScope = "project";
|
|
787
|
+
config.configSource = file;
|
|
788
|
+
config.projectPath = path.dirname(file);
|
|
789
|
+
if (config.headersHelper) {
|
|
790
|
+
if (typeof trust.issueProjectMcpWorkspaceAuthority !== "function") {
|
|
791
|
+
writeErr(
|
|
792
|
+
` mcp: SKIPPING project headersHelper "${name}" — project execution authority is unavailable.\n`,
|
|
793
|
+
);
|
|
794
|
+
delete parsed[name];
|
|
795
|
+
continue;
|
|
796
|
+
}
|
|
797
|
+
config.projectMcpWorkspaceAuthority =
|
|
798
|
+
trust.issueProjectMcpWorkspaceAuthority({
|
|
799
|
+
file,
|
|
800
|
+
content,
|
|
801
|
+
workspaceRoot: path.dirname(file),
|
|
802
|
+
serverName: name,
|
|
803
|
+
config,
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
}
|
|
707
807
|
Object.assign(servers, parsed); // later file (cwd) overrides earlier (root)
|
|
708
808
|
seenFiles.push(file);
|
|
709
809
|
}
|
|
@@ -741,6 +841,16 @@ export async function loadPluginMcp(opts = {}, deps = {}) {
|
|
|
741
841
|
} catch {
|
|
742
842
|
return deps.into || null;
|
|
743
843
|
}
|
|
844
|
+
servers = Object.fromEntries(
|
|
845
|
+
Object.entries(servers || {}).map(([name, config]) => {
|
|
846
|
+
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
847
|
+
return [name, config];
|
|
848
|
+
}
|
|
849
|
+
const rest = { ...config };
|
|
850
|
+
delete rest.headersHelper;
|
|
851
|
+
return [name, { ...rest, ...headersHelperField(config.headersHelper) }];
|
|
852
|
+
}),
|
|
853
|
+
);
|
|
744
854
|
const names = Object.keys(servers || {});
|
|
745
855
|
if (names.length === 0) return deps.into || null;
|
|
746
856
|
writeErr(
|
|
@@ -768,6 +878,7 @@ export async function loadPluginMcp(opts = {}, deps = {}) {
|
|
|
768
878
|
*/
|
|
769
879
|
export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
770
880
|
const doFile = deps.loadMcpConfig || loadMcpConfig;
|
|
881
|
+
const doManaged = deps.loadManagedMcp || loadManagedMcp;
|
|
771
882
|
const doReg = deps.loadRegisteredMcp || loadRegisteredMcp;
|
|
772
883
|
const doProject = deps.loadProjectMcp || loadProjectMcp;
|
|
773
884
|
const doPlugin = deps.loadPluginMcp || loadPluginMcp;
|
|
@@ -784,23 +895,34 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
|
784
895
|
// Thread the agent session id down to setupMcpFromConfig so spawned stdio MCP
|
|
785
896
|
// servers get CC_SESSION_ID / CLAUDE_CODE_SESSION_ID (Claude-Code parity).
|
|
786
897
|
let mcpPolicy = deps.mcpPolicy || null;
|
|
898
|
+
let managedLoaded = {
|
|
899
|
+
settings: mcpPolicy,
|
|
900
|
+
file: args.managedSettingsFile || null,
|
|
901
|
+
};
|
|
787
902
|
if (!mcpPolicy) {
|
|
788
903
|
const { loadManagedSettings } = await import("../lib/settings-loader.cjs");
|
|
789
|
-
|
|
904
|
+
managedLoaded = loadManagedSettings({
|
|
790
905
|
env: args.env || process.env,
|
|
791
906
|
managedSettingsFile: args.managedSettingsFile,
|
|
792
907
|
});
|
|
793
|
-
mcpPolicy =
|
|
908
|
+
mcpPolicy = managedLoaded.settings;
|
|
794
909
|
}
|
|
795
910
|
const fwd = {
|
|
796
911
|
...deps,
|
|
912
|
+
cwd: args.cwd || deps.cwd || process.cwd(),
|
|
797
913
|
...(args.sessionId != null ? { sessionId: args.sessionId } : {}),
|
|
798
914
|
...(eventRuntimeStore ? { eventRuntimeStore } : {}),
|
|
799
915
|
mcpPolicy,
|
|
800
916
|
};
|
|
801
|
-
let result =
|
|
917
|
+
let result = await doManaged(managedLoaded.settings, {
|
|
918
|
+
...fwd,
|
|
919
|
+
managedFile: managedLoaded.file,
|
|
920
|
+
});
|
|
802
921
|
if (args.mcpConfigPath) {
|
|
803
|
-
result = await doFile(args.mcpConfigPath,
|
|
922
|
+
result = await doFile(args.mcpConfigPath, {
|
|
923
|
+
...fwd,
|
|
924
|
+
into: result || undefined,
|
|
925
|
+
}); // fail-fast on bad file
|
|
804
926
|
}
|
|
805
927
|
// --strict-mcp-config: use ONLY the explicit --mcp-config servers; ignore the
|
|
806
928
|
// registered (cc mcp add) set and IDE-bridge auto-discovery so the run's MCP
|
|
@@ -808,24 +930,36 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
|
808
930
|
if (args.strict) {
|
|
809
931
|
return result;
|
|
810
932
|
}
|
|
811
|
-
|
|
933
|
+
const loadRegisteredScope = async (scope) => {
|
|
934
|
+
if (args.includeRegistered === false || !args.db) return;
|
|
812
935
|
result = await doReg(args.db, {
|
|
813
936
|
...fwd,
|
|
814
937
|
all: args.allRegistered === true,
|
|
938
|
+
scope,
|
|
815
939
|
into: result || undefined,
|
|
816
940
|
});
|
|
817
|
-
}
|
|
818
|
-
//
|
|
819
|
-
//
|
|
820
|
-
//
|
|
821
|
-
//
|
|
822
|
-
|
|
941
|
+
};
|
|
942
|
+
// Runtime precedence must match `cc mcp list/get`: managed and explicit
|
|
943
|
+
// --mcp-config entries are already connected above, then local > project >
|
|
944
|
+
// user. Split the registered rows around the trusted project-file layer so
|
|
945
|
+
// a user row cannot silently shadow a same-name project server at runtime.
|
|
946
|
+
await loadRegisteredScope("local");
|
|
947
|
+
// Project-scoped `.mcp.json` (Claude-Code parity). After --mcp-config and
|
|
948
|
+
// registered local scope (those win on a name clash), before registered
|
|
949
|
+
// project/user scopes and IDE auto-discovery. Skipped under
|
|
950
|
+
// --strict-mcp-config (returned above). OPT-IN: loadProjectMcp is a no-op
|
|
951
|
+
// unless --project-mcp / CC_PROJECT_MCP=1 is set (default-off — a checked-in
|
|
952
|
+
// .mcp.json can spawn commands). `projectMcp:false` hard-skips it.
|
|
823
953
|
if (args.projectMcp !== false) {
|
|
824
954
|
result = await doProject(
|
|
825
955
|
{ cwd: args.cwd, env: args.env || process.env },
|
|
826
956
|
{ ...fwd, into: result || undefined },
|
|
827
957
|
);
|
|
828
958
|
}
|
|
959
|
+
// Older databases may still contain project-scoped rows. They share the
|
|
960
|
+
// project tier but yield to the canonical `.mcp.json` source loaded above.
|
|
961
|
+
await loadRegisteredScope("project");
|
|
962
|
+
await loadRegisteredScope("user");
|
|
829
963
|
// Installed-plugin `.mcp.json` servers (Claude-Code parity). Loads by default
|
|
830
964
|
// (no opt-in flag): unlike a project `.mcp.json`, a plugin only contributes
|
|
831
965
|
// when it is installed AND trusted (trust-gated inside collectPluginMcpServers)
|
|
@@ -33,6 +33,20 @@ export function resolveAgentPolicy({
|
|
|
33
33
|
: [],
|
|
34
34
|
sandbox: overrides.sandbox || null,
|
|
35
35
|
autoCheckpoint: overrides.autoCheckpoint === true,
|
|
36
|
+
// Managed workspace checkpoints are consumed by both headless runners and
|
|
37
|
+
// the interactive REPL. Keep these explicit because this policy is an
|
|
38
|
+
// allowlist; dropping them would silently disable the requested safety
|
|
39
|
+
// boundary for interactive tool execution.
|
|
40
|
+
managedCheckpoint: overrides.managedCheckpoint === true,
|
|
41
|
+
managedCheckpointStateDir:
|
|
42
|
+
overrides.managedCheckpointStateDir == null
|
|
43
|
+
? null
|
|
44
|
+
: String(overrides.managedCheckpointStateDir),
|
|
45
|
+
managedCheckpointExclusions: Array.isArray(
|
|
46
|
+
overrides.managedCheckpointExclusions,
|
|
47
|
+
)
|
|
48
|
+
? [...overrides.managedCheckpointExclusions]
|
|
49
|
+
: [],
|
|
36
50
|
worktreeId:
|
|
37
51
|
overrides.worktreeId == null ? null : String(overrides.worktreeId),
|
|
38
52
|
systemPrompt: overrides.systemPrompt || null,
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/** Lightweight, read-only collector used by default `cc status`. */
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { createConnection } from "node:net";
|
|
6
|
+
import {
|
|
7
|
+
CONFIG_DIR_NAME,
|
|
8
|
+
DEFAULT_CONFIG,
|
|
9
|
+
DEFAULT_PORTS,
|
|
10
|
+
VERSION,
|
|
11
|
+
} from "../constants.js";
|
|
12
|
+
import { isExecutableOnPath } from "../lib/executable-path.js";
|
|
13
|
+
|
|
14
|
+
function checkPort(port, host, timeoutMs, connect = createConnection) {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const socket = connect({ port, host, timeout: timeoutMs });
|
|
17
|
+
socket.on("connect", () => {
|
|
18
|
+
socket.destroy();
|
|
19
|
+
resolve(true);
|
|
20
|
+
});
|
|
21
|
+
socket.on("error", () => resolve(false));
|
|
22
|
+
socket.on("timeout", () => {
|
|
23
|
+
socket.destroy();
|
|
24
|
+
resolve(false);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function readJson(path, deps) {
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(deps.readFile(path, "utf8"));
|
|
32
|
+
} catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function findComposeFile(searchPaths, exists = existsSync) {
|
|
38
|
+
for (const directory of searchPaths) {
|
|
39
|
+
for (const name of [
|
|
40
|
+
"docker-compose.yml",
|
|
41
|
+
"docker-compose.yaml",
|
|
42
|
+
"compose.yml",
|
|
43
|
+
"compose.yaml",
|
|
44
|
+
]) {
|
|
45
|
+
const candidate = join(directory, name);
|
|
46
|
+
if (exists(candidate)) return candidate;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function readAppState(home, deps) {
|
|
53
|
+
const pidFile = join(home, "state", "app.pid");
|
|
54
|
+
if (!deps.exists(pidFile)) return { running: false, pid: null };
|
|
55
|
+
let pid = null;
|
|
56
|
+
try {
|
|
57
|
+
const parsed = Number.parseInt(deps.readFile(pidFile, "utf8").trim(), 10);
|
|
58
|
+
if (Number.isInteger(parsed) && parsed > 0) pid = parsed;
|
|
59
|
+
} catch {
|
|
60
|
+
// A partial/corrupt PID file is reported as stopped; status stays read-only.
|
|
61
|
+
}
|
|
62
|
+
if (pid === null) return { running: false, pid: null };
|
|
63
|
+
try {
|
|
64
|
+
deps.processKill(pid, 0);
|
|
65
|
+
return { running: true, pid };
|
|
66
|
+
} catch {
|
|
67
|
+
return { running: false, pid: null };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function collectQuickStatusReport(options = {}) {
|
|
72
|
+
const env = options.env || process.env;
|
|
73
|
+
const cwd = options.cwd || process.cwd();
|
|
74
|
+
const timeoutMs = Number.isFinite(options.probeTimeoutMs)
|
|
75
|
+
? Math.max(1, options.probeTimeoutMs)
|
|
76
|
+
: 500;
|
|
77
|
+
const deps = {
|
|
78
|
+
exists: options.exists || existsSync,
|
|
79
|
+
readFile: options.readFile || readFileSync,
|
|
80
|
+
processKill: options.processKill || process.kill.bind(process),
|
|
81
|
+
home: options.home || homedir,
|
|
82
|
+
executableCheck: options.executableCheck || isExecutableOnPath,
|
|
83
|
+
connect: options.connect || createConnection,
|
|
84
|
+
};
|
|
85
|
+
const home = env.CHAINLESSCHAIN_HOME || join(deps.home(), CONFIG_DIR_NAME);
|
|
86
|
+
const config = readJson(join(home, "config.json"), deps) || {};
|
|
87
|
+
const llm = { ...DEFAULT_CONFIG.llm, ...(config.llm || {}) };
|
|
88
|
+
const setupCompleted = config.setupCompleted === true;
|
|
89
|
+
const dockerAvailable = deps.executableCheck("docker", { env });
|
|
90
|
+
const composePath = dockerAvailable
|
|
91
|
+
? findComposeFile([cwd, join(cwd, "backend", "docker")], deps.exists)
|
|
92
|
+
: null;
|
|
93
|
+
const ports = await Promise.all(
|
|
94
|
+
Object.entries(DEFAULT_PORTS).map(async ([name, port]) => ({
|
|
95
|
+
name,
|
|
96
|
+
port,
|
|
97
|
+
open: await checkPort(port, "127.0.0.1", timeoutMs, deps.connect),
|
|
98
|
+
})),
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
let eventRuntime = { enabled: false, health: null, error: null };
|
|
102
|
+
if (env.CC_EVENT_RUNTIME_DURABLE === "1") {
|
|
103
|
+
const { collectEventRuntimeStatus } = await import("./diagnostics.js");
|
|
104
|
+
eventRuntime = collectEventRuntimeStatus({ env });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
schema: "chainlesschain.status.v1",
|
|
109
|
+
probeMode: "quick",
|
|
110
|
+
version: VERSION,
|
|
111
|
+
generatedAt: new Date().toISOString(),
|
|
112
|
+
app: readAppState(home, deps),
|
|
113
|
+
setup: setupCompleted
|
|
114
|
+
? {
|
|
115
|
+
completed: true,
|
|
116
|
+
completedAt: config.completedAt || null,
|
|
117
|
+
edition: config.edition || DEFAULT_CONFIG.edition || null,
|
|
118
|
+
llm: {
|
|
119
|
+
provider: llm.provider || null,
|
|
120
|
+
model: llm.model || null,
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
: { completed: false },
|
|
124
|
+
docker: {
|
|
125
|
+
available: dockerAvailable,
|
|
126
|
+
composePath,
|
|
127
|
+
services: null,
|
|
128
|
+
note: dockerAvailable
|
|
129
|
+
? composePath
|
|
130
|
+
? "Service details skipped (run with --deep)"
|
|
131
|
+
: "docker-compose.yml not found"
|
|
132
|
+
: "Docker not available",
|
|
133
|
+
},
|
|
134
|
+
ports,
|
|
135
|
+
eventRuntime,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-D3Oq-DLL.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function l(t,o,e,r,n,m){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",l],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as d,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-D3Oq-DLL.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),l=a(()=>o.event.extra||{}),m=a(()=>l.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>l.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:l,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},M={key:1,class:"row"};function P(p,r,o,e,l,m){const c=w("a-tag");return d(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(d(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(d(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const H=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{H as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-1v6aMS1m.js","./vendor-Bn1JzzAn.js","./index-D3Oq-DLL.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-BU2Yqq5H.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-Df48iveY.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-Bufv638J.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-NAJaFKxc.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as R,b as w,I as g,P as u,J as S,U as v,c,S as C,V as E,_ as M,F as V,Z as se,a0 as le,R as x,K as m,Q as b,W as L,o as Q}from"./vendor-Bn1JzzAn.js";import{u as J}from"./usePersonalDataHub-CRmxb9l3.js";import{_ as D,e as F,d as P}from"./index-D3Oq-DLL.js";import{aa as q,ag as U,M as z,aI as Y,v as G,aH as H,aq as K,ac as W,e as de,d as fe,k as pe,ai as me,aA as _e,R as ye}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),l=R(null),a=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const j=w(()=>t.value.length>0),A=w(()=>n.value!=null);function h(O={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...O}}async function y(){const O=++d;e.value=!0,l.value=null;const p=J();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:B})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(O!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,a.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(O!==d)return;l.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{O===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,l.value=null;const O=J();try{const p=await O.searchEvents(h({cursor:n.value,limit:B}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,a.value=p.mode||a.value}catch(p){l.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function ae(O,p){if(!(O in I))throw new Error(`pdhBrowser.setFilter: unknown key "${O}"`);r.value={...r.value,[O]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,y()},Z)}function ie(O){return r.value={...I,...O},_&&(clearTimeout(_),_=null),y()}function ce(){r.value={...I},t.value=[],n.value=null,l.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:l,mode:a,shortQuery:s,facets:i,hasResults:j,canLoadMore:A,search:y,loadMore:k,setFilter:ae,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ge=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["meeting-","system"],["vscode","system"],["vscodium","system"],["jetbrains-ide","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["hbuilderx","system"],["local-files","system"],["cursor","ai-chat"],["claude-code","ai-chat"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:W,social:K,email:H,shopping:G,travel:Y,system:z,"ai-chat":U,other:q};function l(i){return o[i]||q}function a(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:l,badgeStyle:a,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return W},get PlayCircleOutlined(){return K},get MailOutlined(){return H},get ShoppingOutlined(){return G},get CarOutlined(){return Y},get MobileOutlined(){return z},get RobotOutlined(){return U},get CATEGORIES(){return ge},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Oe={class:"pdh-sidebar"},Se=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,l){const a=g("a-badge");return u(),S("div",Oe,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:M(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(a,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],2),(u(!0),S(V,null,se(e.CATEGORIES,s=>(u(),S("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(le(e.iconFor(s)),{class:"icon"})),v("span",we,x(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(a,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],10,Se))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),Ee={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,l=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),a=w(()=>Object.entries(e.facets.byAdapter||{}).sort((y,k)=>k[1]-y[1]).map(([y,k])=>({value:y,label:`${y} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function j(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[y,k]=h;o("set-filter","since",y?+y:null),o("set-filter","until",k?+k:null)}const A={props:e,emit:o,placeholderText:l,adapterOptions:a,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:j,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},Re={class:"pdh-filter-bar"},xe={key:1,class:"hint"},je={key:2,class:"hint"};function Ae(r,t,n,e,o,l){const a=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),S("div",Re,[c(a,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>r.$emit("set-filter","adapter",_||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=_=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):E("v-if",!0),n.shortQuery?(u(),S("span",xe,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),S("span",je,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):E("v-if",!0)])}const Le=D(Ee,[["render",Ae],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Fe={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=L(()=>F(()=>import("./ChatBubbleRenderer-1v6aMS1m.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-BU2Yqq5H.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-Df48iveY.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),l=L(()=>F(()=>import("./EmailListRenderer-Bufv638J.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),a=L(()=>F(()=>import("./GenericCardRenderer-NAJaFKxc.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const _=d&&d.source&&d.source.adapter;switch($(_)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return l;default:return a}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:l,GenericCardRenderer:a,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,l){return u(),C(le(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const l=Number.isFinite(o.occurredAt)?o.occurredAt:null,a=l?new Date(l).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",l!=null?String(l):"",a,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
|
|
5
|
-
`)+`
|
|
6
|
-
`}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
|
|
7
|
-
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),l=document.createElement("a");return l.href=o,l.download=t,document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),l=String(n.getDate()).padStart(2,"0"),a=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${l}${s}.${a}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function l(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function a({key:i}){try{const d=l(i),_=oe(i,n.category);re(d,_,o[i]),P.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:l,onClick:a,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function qe(r,t,n,e,o,l){const a=g("a-button"),s=g("a-menu-item"),i=g("a-menu"),d=g("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(a,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+x(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=D(Pe,[["render",qe],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function l(s,i){n.setFilter(s,i)}Q(()=>{!n.hasResults&&!n.isLoading&&n.search()});const a={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:l,onMounted:Q,computed:w,get ReloadOutlined(){return ye},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Qe={class:"main-pane"},Je={class:"results-summary"},Ue={key:0},ze={key:0},Ye={key:1},Ge={class:"loaded-of"},He={class:"results-list"},Ke={key:2,class:"load-more"};function We(r,t,n,e,o,l){const a=g("a-tag"),s=g("a-button"),i=g("a-space"),d=g("a-col"),_=g("a-spin"),j=g("a-alert"),A=g("a-empty"),h=g("a-row");return u(),S("div",Ne,[v("div",Me,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(a,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(a,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):E("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=y=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",Qe,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=y=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Je,[e.store.isLoading&&e.store.results.length===0?(u(),S("span",Ue,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),S(V,{key:1},[v("strong",null,x(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),S("span",ze,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,x(e.categoryLabel(e.store.filters.category)),1),v("strong",null,x(e.store.facets.byCategory[e.store.filters.category]||0),1)])):E("v-if",!0),e.store.filters.q?(u(),S("span",Ye,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,x(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):E("v-if",!0),v("span",Ge," / 已显示 "+x(e.store.results.length),1)],64))]),e.store.error?(u(),C(j,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):E("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(A,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):E("v-if",!0),v("div",He,[(u(!0),S(V,null,se(e.store.results,(y,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${y.id}`,event:y},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),S("div",Ke,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=y=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):E("v-if",!0)])]),_:1})]),_:1})])}const nt=D(Ve,[["render",We],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-O3l5QY/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-D3Oq-DLL.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DzmOdJU7.js";import{a0 as t}from"./index-D3Oq-DLL.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DKQHS41p.js";import"./useFlexGapSupport-DhZngk62.js";import"./styleChecker-zK5cyLby.js";import"./index-BdXnYMCZ.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-tGt_JDEr.js";import{a0 as t}from"./index-D3Oq-DLL.js";import"./vendor-Bn1JzzAn.js";import"./index-BdXnYMCZ.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|