chainlesschain 0.166.46 → 0.166.48
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 +6 -4
- package/package.json +4 -2
- package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-BLGEffkh.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-Cz1z2VGD.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C3j9cf6q.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-BR9ERuCA.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-CozJCm4y.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-DC5g9Ra2.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-B1zrQ0dW.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-ChVnfjpm.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-8_vLQsLf.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-Dct9bm6L.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BvoSsCKh.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DZQIsCIC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-CdzHxmnq.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-DdAN8LeW.js} +1 -1
- package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-CNgjT9MA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-BtQiX6G-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-OGX5ma3j.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-CgugQnGM.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-Bpg7cPFD.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-D1hsuswf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-miDRsMBw.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-CGcl8htP.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BFaxTdVE.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-BQdGLZIO.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BqpG3XHV.js → EvolutionSettings-bMvgBk6r.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-c1WVC_--.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-DyAcFrQY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-CfwpfD2B.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DkJcbBpS.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-DgYIrPJh.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BF1tYPJ6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-BFkwRIrU.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-DpCoqhBa.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-DU2qAJmD.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-QWv7UJLq.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Dz9NUrfo.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-B67I3d5v.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-crkElJSy.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-BO20VbdX.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-Ba-3gZZd.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-BAHZM084.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-CL3DzajL.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-BSWWzvWH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-fnxqXM_3.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-6F8EarNN.js → Notes-qUZPIQXT.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-x9Xrixqu.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-gVgXQWdc.js → OrderTableRenderer-BtMtQUt7.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-C946Hzna.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BYf8KIts.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-Cbqf5dnv.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-rmxp0cuF.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CZBw45EW.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub-BKwUAt43.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DmFD2QW4.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-KpuwWvt5.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-Bt8UheX6.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-2ZeAn9CP.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-zBuet8Zs.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-DcEAnw6L.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-qF7liYG9.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-qiESlVBJ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-Bk-cQyi9.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-CwrekErS.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-Bmw_UQtW.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-CPdqZIUX.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-D_W-xxvS.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-Hu0oDFj_.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DeRxUwmq.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CsNmHFkf.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-gv_Vz0tN.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-Dgg-_rCB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-Bpu-bsEJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-CrhleHuF.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-JHjUN6I9.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-DKRWKkl9.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-leiWntLq.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant--1bYulvn.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-C0y6FvSS.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-CQK4PVv4.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-DbIvF-DV.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-CkXJ2vuq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-B02WXJPw.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-VPMkfzmw.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-C5ezUnah.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-CYfvYRrY.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-DtKl-kpr.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-DACITF-u.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-qnygfnLi.js} +1 -1
- package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-D4mISLBD.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-BBPfxYGL.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Byx4ndHp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DBy6gsuI.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-CGjLkkn3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index-B8UpadHC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BD0w-888.js → index-B9jH-h4X.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BN7_TSgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-BNe2lCk6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-B_fHPZ8E.js} +1 -1
- package/src/assets/web-panel/assets/index-BfEDXk_E.js +1 -0
- package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-BklGH3YI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-BmKYaaGP.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BxQF1wCU.js} +1 -1
- package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-ByA1NyFP.js} +1 -1
- package/src/assets/web-panel/assets/{index-0200QxC4.js → index-BzeBBAl5.js} +1 -1
- package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-C3abGsSW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-C9tcHs46.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-CD5Btq6p.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-CFMWjuav.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-CMj8qmpX.js} +1 -1
- package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-CVUJjQAT.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-CWhI8G14.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CZjNamSU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-CmHE-lY_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-CoA8WsVr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-Cpg3AWRy.js} +1 -1
- package/src/assets/web-panel/assets/index-CrxUwNM8.js +1 -0
- package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-CsVuQsY1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-CydHMjwc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPYshcic.js → index-DH6iC5b2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-DZXhKAk9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-D_g9mA1N.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-DboTeuPF.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-DfgpKd64.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-Dmfe0L2Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-Dzni_5Qw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-J5JkStvY.js} +1 -1
- package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-Ne8UGllV.js} +3 -3
- package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-O09jXbir.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-Y7el_3WS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-c_tBkIlU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-lKJWAmd4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-xzRKTy0R.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-XuhfEIhB.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-Cbxh6AxO.js} +1 -1
- package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-C7IEnFly.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-lLADx4LL.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-mIbic_k-.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-_xIYEqu3.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-ClB-E0ny.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D36Bg2ut.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-CUuO08Bl.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-BKahwLbv.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-2pT-T8vy.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-DyH5g7Rg.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-CTOauB3X.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-B02JYIMe.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-Do22wQrc.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BfnL7rit.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +8 -0
- package/src/commands/background-session.js +31 -3
- package/src/commands/chat.js +5 -1
- package/src/commands/eval.js +86 -28
- package/src/commands/llm.js +104 -1
- package/src/commands/plugin.js +161 -1
- package/src/commands/sandbox.js +121 -2
- package/src/commands/serve.js +11 -2
- package/src/commands/skill.js +29 -0
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/session-protocol.js +13 -0
- package/src/gateways/ws/ws-agent-handler.js +17 -0
- package/src/gateways/ws/ws-server.js +3 -0
- package/src/gateways/ws/ws-session-state.js +131 -0
- package/src/generated/cc-agent-protocol.schema.json +48 -1
- package/src/lazy-dispatch.js +8 -1
- package/src/lib/agent-sandbox.js +337 -53
- package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
- package/src/lib/app-server/server.js +93 -0
- package/src/lib/background-agent-keeper-client.js +2 -0
- package/src/lib/background-agent-keeper-protocol.js +7 -0
- package/src/lib/background-agent-list-index.js +222 -0
- package/src/lib/background-agent-supervisor.js +232 -47
- package/src/lib/codex-app-server-adapter.js +82 -27
- package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
- package/src/lib/context-memory-kernel/provider-context.js +118 -19
- package/src/lib/deferred-question-context.js +278 -0
- package/src/lib/eval/evidence.js +202 -64
- package/src/lib/eval/plugin-suite.js +1181 -0
- package/src/lib/eval/runner.js +10 -3
- package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
- package/src/lib/evolution/agent-model-projection.js +97 -1
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
- package/src/lib/evolution/evolution-artifact-ports.js +6 -0
- package/src/lib/evolution/evolution-deployment-loader.js +87 -3
- package/src/lib/evolution/evolution-eval-gate.js +8 -0
- package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
- package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
- package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
- package/src/lib/evolution/evolution-ledger.js +57 -1
- package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
- package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
- package/src/lib/evolution/governed-hub-llm.js +238 -5
- package/src/lib/evolution/governed-hub-resolver.js +82 -4
- package/src/lib/evolution/governed-hub-skill.js +11 -5
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
- package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
- package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
- package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
- package/src/lib/goal-context.js +14 -5
- package/src/lib/interaction-adapter.js +166 -1
- package/src/lib/model-capabilities.js +271 -0
- package/src/lib/model-context-catalog.js +105 -0
- package/src/lib/model-context-window.js +4 -49
- package/src/lib/openai-responses.js +428 -0
- package/src/lib/plugin-runtime/scopes.js +7 -1
- package/src/lib/remote-read-loop-guard.js +2 -2
- package/src/lib/runtime-usage-ledger.js +16 -0
- package/src/lib/session-host-snapshot.js +16 -0
- package/src/lib/skill-loader.js +12 -0
- package/src/lib/with-file-lock.js +3 -1
- package/src/repl/agent-repl.js +5 -1
- package/src/runtime/agent-core.js +348 -23
- package/src/runtime/agent-runtime.js +7 -0
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/headless-runner.js +4 -1
- package/src/runtime/headless-stream.js +283 -45
- package/src/runtime/runtime-factory.js +26 -2
- package/src/workers/background-agent-keeper.js +23 -13
- package/src/workers/background-agent-worker.js +27 -13
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-fYmQzmTA.js +0 -7
- package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
- package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
- package/src/assets/web-panel/assets/index-D-4tFek3.js +0 -1
|
@@ -32,6 +32,13 @@ import {
|
|
|
32
32
|
normalizeInteractionBinding,
|
|
33
33
|
sameInteractionBinding,
|
|
34
34
|
} from "../lib/interaction-binding.js";
|
|
35
|
+
import {
|
|
36
|
+
DEFERRED_QUESTION_EVENTS,
|
|
37
|
+
DeferredQuestionContext,
|
|
38
|
+
normalizeDeferredQuestionAnswer,
|
|
39
|
+
normalizeDeferredQuestionRequest,
|
|
40
|
+
} from "../lib/deferred-question-context.js";
|
|
41
|
+
import { composePrepareCall } from "../lib/goal-context.js";
|
|
35
42
|
import {
|
|
36
43
|
addHooksV2EventObserver,
|
|
37
44
|
emitHooksV2Event,
|
|
@@ -82,6 +89,7 @@ import {
|
|
|
82
89
|
} from "../lib/evolution/agent-evolution-ingress.js";
|
|
83
90
|
import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
84
91
|
import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
|
|
92
|
+
import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
|
|
85
93
|
import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
|
|
86
94
|
import {
|
|
87
95
|
resolveAgentMcp,
|
|
@@ -1681,6 +1689,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1681
1689
|
let canonicalResume = null;
|
|
1682
1690
|
let canonicalResumeMessages = null;
|
|
1683
1691
|
let canonicalMcpCallRecovery = null;
|
|
1692
|
+
let canonicalDeferredQuestions = [];
|
|
1693
|
+
let canonicalDeferredAnswers = [];
|
|
1694
|
+
let canonicalDeferredQuestionSequence = 0;
|
|
1684
1695
|
if (persist) {
|
|
1685
1696
|
const readResumeState =
|
|
1686
1697
|
deps.readSessionHostResumeState || readSessionHostResumeState;
|
|
@@ -1783,6 +1794,21 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1783
1794
|
);
|
|
1784
1795
|
}
|
|
1785
1796
|
canonicalResumeMessages = [...canonicalResume.messages];
|
|
1797
|
+
canonicalDeferredQuestions = Array.isArray(
|
|
1798
|
+
canonicalResume.deferredQuestions,
|
|
1799
|
+
)
|
|
1800
|
+
? [...canonicalResume.deferredQuestions]
|
|
1801
|
+
: [];
|
|
1802
|
+
canonicalDeferredAnswers = Array.isArray(
|
|
1803
|
+
canonicalResume.deferredAnswers,
|
|
1804
|
+
)
|
|
1805
|
+
? [...canonicalResume.deferredAnswers]
|
|
1806
|
+
: [];
|
|
1807
|
+
canonicalDeferredQuestionSequence = Number.isSafeInteger(
|
|
1808
|
+
canonicalResume.deferredQuestionSequence,
|
|
1809
|
+
)
|
|
1810
|
+
? canonicalResume.deferredQuestionSequence
|
|
1811
|
+
: 0;
|
|
1786
1812
|
const notice = formatMcpLedgerRecoveryNotice(canonicalResume.recovery);
|
|
1787
1813
|
if (notice) {
|
|
1788
1814
|
canonicalMcpCallRecovery = {
|
|
@@ -2468,7 +2494,23 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2468
2494
|
options.interactiveQuestions === true ||
|
|
2469
2495
|
process.env.CC_INTERACTIVE_QUESTIONS === "1";
|
|
2470
2496
|
const pendingQuestions = new Map();
|
|
2471
|
-
|
|
2497
|
+
const persistDeferredQuestionEvent = (type, data) => {
|
|
2498
|
+
if (!persist) return true;
|
|
2499
|
+
requireSynchronousRecoveryResult(
|
|
2500
|
+
store.appendAuthorityEvent(sessionId, type, data),
|
|
2501
|
+
type,
|
|
2502
|
+
);
|
|
2503
|
+
return true;
|
|
2504
|
+
};
|
|
2505
|
+
const deferredQuestionContext = new DeferredQuestionContext({
|
|
2506
|
+
sessionId,
|
|
2507
|
+
initialAnswers: canonicalDeferredAnswers,
|
|
2508
|
+
onConsumed: (questionIds) =>
|
|
2509
|
+
persistDeferredQuestionEvent(DEFERRED_QUESTION_EVENTS.CONSUMED, {
|
|
2510
|
+
questionIds,
|
|
2511
|
+
}),
|
|
2512
|
+
});
|
|
2513
|
+
let questionSeq = canonicalDeferredQuestionSequence;
|
|
2472
2514
|
const questionTimeoutMs =
|
|
2473
2515
|
Number(process.env.CC_QUESTION_TIMEOUT_MS) > 0
|
|
2474
2516
|
? Number(process.env.CC_QUESTION_TIMEOUT_MS)
|
|
@@ -2476,9 +2518,52 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2476
2518
|
const settleQuestion = (id, answer, via) => {
|
|
2477
2519
|
const p = pendingQuestions.get(id);
|
|
2478
2520
|
if (!p) return;
|
|
2521
|
+
let durableAnswer = null;
|
|
2522
|
+
if (p.mode === "deferred") {
|
|
2523
|
+
durableAnswer = normalizeDeferredQuestionAnswer(
|
|
2524
|
+
{
|
|
2525
|
+
questionId: id,
|
|
2526
|
+
question: p.question,
|
|
2527
|
+
answer,
|
|
2528
|
+
options: p.options,
|
|
2529
|
+
multiSelect: p.multiSelect,
|
|
2530
|
+
purpose: p.purpose,
|
|
2531
|
+
binding: p.binding,
|
|
2532
|
+
requestedRevision: p.contextRevision,
|
|
2533
|
+
resolvedRevision: turns,
|
|
2534
|
+
},
|
|
2535
|
+
sessionId,
|
|
2536
|
+
);
|
|
2537
|
+
try {
|
|
2538
|
+
if (!durableAnswer) throw new Error("invalid deferred answer binding");
|
|
2539
|
+
persistDeferredQuestionEvent(
|
|
2540
|
+
DEFERRED_QUESTION_EVENTS.RESOLVED,
|
|
2541
|
+
durableAnswer,
|
|
2542
|
+
);
|
|
2543
|
+
} catch {
|
|
2544
|
+
emit({
|
|
2545
|
+
type: "question_response_rejected",
|
|
2546
|
+
id,
|
|
2547
|
+
reason: "persistence_failed",
|
|
2548
|
+
session_id: sessionId,
|
|
2549
|
+
});
|
|
2550
|
+
return;
|
|
2551
|
+
}
|
|
2552
|
+
}
|
|
2479
2553
|
pendingQuestions.delete(id);
|
|
2480
2554
|
clearTimeout(p.timer);
|
|
2481
|
-
emit({
|
|
2555
|
+
emit({
|
|
2556
|
+
type: "question_resolved",
|
|
2557
|
+
id,
|
|
2558
|
+
via,
|
|
2559
|
+
mode: p.mode,
|
|
2560
|
+
blocking: p.mode === "blocking",
|
|
2561
|
+
session_id: sessionId,
|
|
2562
|
+
});
|
|
2563
|
+
if (p.mode === "deferred") {
|
|
2564
|
+
deferredQuestionContext.record(durableAnswer);
|
|
2565
|
+
return;
|
|
2566
|
+
}
|
|
2482
2567
|
p.resolve(answer);
|
|
2483
2568
|
};
|
|
2484
2569
|
const failQuestion = (id, via) => {
|
|
@@ -2486,7 +2571,28 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2486
2571
|
if (!p) return;
|
|
2487
2572
|
pendingQuestions.delete(id);
|
|
2488
2573
|
clearTimeout(p.timer);
|
|
2489
|
-
|
|
2574
|
+
if (
|
|
2575
|
+
p.mode === "deferred" &&
|
|
2576
|
+
!["pipe-closed", "session-closed", "stdin-closed"].includes(via)
|
|
2577
|
+
) {
|
|
2578
|
+
try {
|
|
2579
|
+
persistDeferredQuestionEvent(DEFERRED_QUESTION_EVENTS.EXPIRED, {
|
|
2580
|
+
questionId: id,
|
|
2581
|
+
});
|
|
2582
|
+
} catch {
|
|
2583
|
+
// The unresolved request remains in the durable transcript and can be
|
|
2584
|
+
// surfaced again after the persistence boundary recovers.
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
emit({
|
|
2588
|
+
type: "question_resolved",
|
|
2589
|
+
id,
|
|
2590
|
+
via,
|
|
2591
|
+
mode: p.mode,
|
|
2592
|
+
blocking: p.mode === "blocking",
|
|
2593
|
+
session_id: sessionId,
|
|
2594
|
+
});
|
|
2595
|
+
if (p.mode === "deferred") return;
|
|
2490
2596
|
const e = new Error(`ask_user_question ${via}`);
|
|
2491
2597
|
e.code = "USER_TIMEOUT"; // handler → user_timeout (model proceeds, not a failure)
|
|
2492
2598
|
p.reject(e);
|
|
@@ -2517,50 +2623,172 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2517
2623
|
pendingQuestions.delete(id);
|
|
2518
2624
|
clearTimeout(pending.timer);
|
|
2519
2625
|
try {
|
|
2520
|
-
emit({
|
|
2626
|
+
emit({
|
|
2627
|
+
type: "question_resolved",
|
|
2628
|
+
id,
|
|
2629
|
+
via,
|
|
2630
|
+
mode: pending.mode,
|
|
2631
|
+
blocking: pending.mode === "blocking",
|
|
2632
|
+
session_id: sessionId,
|
|
2633
|
+
});
|
|
2521
2634
|
} catch {
|
|
2522
2635
|
// Best-effort cleanup notification.
|
|
2523
2636
|
}
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2637
|
+
if (pending.mode === "blocking") {
|
|
2638
|
+
const error = new Error(`ask_user_question ${via}`);
|
|
2639
|
+
error.code = "USER_TIMEOUT";
|
|
2640
|
+
pending.reject(error);
|
|
2641
|
+
}
|
|
2527
2642
|
}
|
|
2643
|
+
deferredQuestionContext.clear();
|
|
2528
2644
|
});
|
|
2529
|
-
const
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2645
|
+
const restoredQuestionEvents = [];
|
|
2646
|
+
// An opted-out/legacy pipe must not receive a newly introduced interactive
|
|
2647
|
+
// event. Keep its durable request untouched so a capable reconnect can
|
|
2648
|
+
// surface it later; already-resolved answers can still be consumed as data.
|
|
2649
|
+
for (const value of interactiveQuestions ? canonicalDeferredQuestions : []) {
|
|
2650
|
+
const restored = normalizeDeferredQuestionRequest(value, sessionId);
|
|
2651
|
+
if (!restored) continue;
|
|
2652
|
+
questionSeq = Math.max(questionSeq, restored.binding.sequence);
|
|
2653
|
+
const timer = setTimeout(
|
|
2654
|
+
() => failQuestion(restored.questionId, "timeout"),
|
|
2655
|
+
questionTimeoutMs,
|
|
2656
|
+
);
|
|
2657
|
+
timer.unref?.();
|
|
2658
|
+
pendingQuestions.set(restored.questionId, {
|
|
2659
|
+
resolve: null,
|
|
2660
|
+
reject: null,
|
|
2661
|
+
timer,
|
|
2662
|
+
binding: restored.binding,
|
|
2663
|
+
mode: "deferred",
|
|
2664
|
+
purpose: restored.purpose,
|
|
2665
|
+
question: restored.question,
|
|
2666
|
+
options: restored.options,
|
|
2667
|
+
multiSelect: restored.multiSelect,
|
|
2668
|
+
contextRevision: restored.requestedRevision,
|
|
2669
|
+
});
|
|
2670
|
+
restoredQuestionEvents.push({
|
|
2671
|
+
type: "question_request",
|
|
2672
|
+
id: restored.questionId,
|
|
2673
|
+
session_id: sessionId,
|
|
2674
|
+
binding: restored.binding,
|
|
2675
|
+
...(restored.binding.turnId ? { turn_id: restored.binding.turnId } : {}),
|
|
2676
|
+
...(restored.binding.toolUseId
|
|
2677
|
+
? { tool_use_id: restored.binding.toolUseId }
|
|
2678
|
+
: {}),
|
|
2679
|
+
mode: "deferred",
|
|
2680
|
+
blocking: false,
|
|
2681
|
+
purpose: restored.purpose,
|
|
2682
|
+
context_revision: restored.requestedRevision,
|
|
2683
|
+
question: restored.question,
|
|
2684
|
+
options: restored.options,
|
|
2685
|
+
multiSelect: restored.multiSelect,
|
|
2686
|
+
restored: true,
|
|
2687
|
+
});
|
|
2688
|
+
}
|
|
2689
|
+
const registerInteractiveQuestion = (
|
|
2690
|
+
{
|
|
2691
|
+
question,
|
|
2692
|
+
options: qOptions,
|
|
2693
|
+
multiSelect,
|
|
2694
|
+
timeoutMs,
|
|
2695
|
+
metadata,
|
|
2696
|
+
purpose = "decision",
|
|
2697
|
+
sessionId: requestedSessionId,
|
|
2698
|
+
turnId,
|
|
2699
|
+
toolUseId,
|
|
2700
|
+
} = {},
|
|
2701
|
+
mode = "blocking",
|
|
2702
|
+
) => {
|
|
2703
|
+
let resolve = null;
|
|
2704
|
+
let reject = null;
|
|
2705
|
+
const promise =
|
|
2706
|
+
mode === "blocking"
|
|
2707
|
+
? new Promise((resolvePromise, rejectPromise) => {
|
|
2708
|
+
resolve = resolvePromise;
|
|
2709
|
+
reject = rejectPromise;
|
|
2710
|
+
})
|
|
2711
|
+
: null;
|
|
2712
|
+
const id = `q-${++questionSeq}`;
|
|
2713
|
+
const binding = normalizeInteractionBinding({
|
|
2714
|
+
sessionId: requestedSessionId ?? sessionId,
|
|
2715
|
+
turnId,
|
|
2716
|
+
toolUseId,
|
|
2717
|
+
sequence: questionSeq,
|
|
2718
|
+
});
|
|
2719
|
+
const ms = Number(timeoutMs) > 0 ? Number(timeoutMs) : questionTimeoutMs;
|
|
2720
|
+
const timer = setTimeout(() => failQuestion(id, "timeout"), ms);
|
|
2721
|
+
timer.unref?.();
|
|
2722
|
+
const pending = {
|
|
2723
|
+
resolve,
|
|
2724
|
+
reject,
|
|
2725
|
+
timer,
|
|
2726
|
+
binding,
|
|
2727
|
+
mode,
|
|
2728
|
+
purpose,
|
|
2729
|
+
question: typeof question === "string" ? question : "",
|
|
2730
|
+
options: Array.isArray(qOptions) ? qOptions : null,
|
|
2731
|
+
multiSelect: multiSelect === true,
|
|
2732
|
+
contextRevision: turns,
|
|
2733
|
+
};
|
|
2734
|
+
if (mode === "deferred") {
|
|
2735
|
+
const durableRequest = normalizeDeferredQuestionRequest(
|
|
2736
|
+
{
|
|
2737
|
+
questionId: id,
|
|
2738
|
+
question: pending.question,
|
|
2739
|
+
options: pending.options,
|
|
2740
|
+
multiSelect: pending.multiSelect,
|
|
2741
|
+
purpose,
|
|
2742
|
+
binding,
|
|
2743
|
+
requestedRevision: turns,
|
|
2744
|
+
},
|
|
2745
|
+
sessionId,
|
|
2746
|
+
);
|
|
2747
|
+
try {
|
|
2748
|
+
if (!durableRequest)
|
|
2749
|
+
throw new Error("invalid deferred question binding");
|
|
2750
|
+
persistDeferredQuestionEvent(
|
|
2751
|
+
DEFERRED_QUESTION_EVENTS.REQUESTED,
|
|
2752
|
+
durableRequest,
|
|
2753
|
+
);
|
|
2754
|
+
} catch (error) {
|
|
2755
|
+
clearTimeout(timer);
|
|
2756
|
+
throw error;
|
|
2757
|
+
}
|
|
2758
|
+
}
|
|
2759
|
+
pendingQuestions.set(id, pending);
|
|
2760
|
+
emit({
|
|
2761
|
+
type: "question_request",
|
|
2762
|
+
id,
|
|
2763
|
+
session_id: sessionId,
|
|
2764
|
+
binding,
|
|
2765
|
+
...(binding.turnId ? { turn_id: binding.turnId } : {}),
|
|
2766
|
+
...(binding.toolUseId ? { tool_use_id: binding.toolUseId } : {}),
|
|
2767
|
+
mode,
|
|
2768
|
+
blocking: mode === "blocking",
|
|
2769
|
+
purpose,
|
|
2770
|
+
context_revision: turns,
|
|
2771
|
+
question: typeof question === "string" ? question : "",
|
|
2772
|
+
options: Array.isArray(qOptions) ? qOptions : null,
|
|
2773
|
+
multiSelect: multiSelect === true,
|
|
2774
|
+
...(metadata && typeof metadata === "object" ? { metadata } : {}),
|
|
2563
2775
|
});
|
|
2776
|
+
return mode === "blocking"
|
|
2777
|
+
? promise
|
|
2778
|
+
: Object.freeze({
|
|
2779
|
+
questionId: id,
|
|
2780
|
+
status: "pending",
|
|
2781
|
+
mode: "deferred",
|
|
2782
|
+
purpose,
|
|
2783
|
+
authorization: false,
|
|
2784
|
+
binding,
|
|
2785
|
+
contextRevision: turns,
|
|
2786
|
+
});
|
|
2787
|
+
};
|
|
2788
|
+
const interactionAskUser = (request = {}) =>
|
|
2789
|
+
registerInteractiveQuestion(request, "blocking");
|
|
2790
|
+
const interactionDeferUserQuestion = (request = {}) =>
|
|
2791
|
+
registerInteractiveQuestion(request, "deferred");
|
|
2564
2792
|
|
|
2565
2793
|
// --output-style (or settings.json `outputStyle`) persona, appended.
|
|
2566
2794
|
let outputStyleBody = null;
|
|
@@ -2852,6 +3080,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2852
3080
|
additional_directories: additionalDirectories,
|
|
2853
3081
|
resumed_messages: resumedMessages,
|
|
2854
3082
|
});
|
|
3083
|
+
for (const event of restoredQuestionEvents) emit(event);
|
|
2855
3084
|
|
|
2856
3085
|
// P0-2 visible recovery notice: same `raw` info-line contract as
|
|
2857
3086
|
// provider_fallback / version_skew (the shipped IDE panels map `raw` → an
|
|
@@ -3173,7 +3402,10 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3173
3402
|
}
|
|
3174
3403
|
|
|
3175
3404
|
const streamInteraction = {};
|
|
3176
|
-
if (interactiveQuestions)
|
|
3405
|
+
if (interactiveQuestions) {
|
|
3406
|
+
streamInteraction.askUser = interactionAskUser;
|
|
3407
|
+
streamInteraction.deferUserQuestion = interactionDeferUserQuestion;
|
|
3408
|
+
}
|
|
3177
3409
|
if (options.includeHookEvents === true) {
|
|
3178
3410
|
streamInteraction.emit = (kind, payload = {}) => {
|
|
3179
3411
|
const subAgentId =
|
|
@@ -3257,6 +3489,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3257
3489
|
cwd,
|
|
3258
3490
|
additionalDirectories,
|
|
3259
3491
|
...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
|
|
3492
|
+
...captureSkillRuntimeDependencies(options, evolutionIngress?.tenantId),
|
|
3260
3493
|
...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
|
|
3261
3494
|
...(skillRetrievalRevocationReader === null
|
|
3262
3495
|
? {}
|
|
@@ -3294,7 +3527,10 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3294
3527
|
// Absent → agent-core returns user_not_reachable (graceful proceed).
|
|
3295
3528
|
interaction:
|
|
3296
3529
|
Object.keys(streamInteraction).length > 0 ? streamInteraction : undefined,
|
|
3297
|
-
prepareCall:
|
|
3530
|
+
prepareCall: composePrepareCall([
|
|
3531
|
+
goalPrepareCallFn,
|
|
3532
|
+
() => deferredQuestionContext.prepareCall({ currentRevision: turns }),
|
|
3533
|
+
]),
|
|
3298
3534
|
// --mcp-config wiring (tool defs + dispatch map + live client).
|
|
3299
3535
|
mcpClient: mcp?.mcpClient || null,
|
|
3300
3536
|
mcpHostClient: mcpRecoveryRuntime.client || mcp?.mcpClient || null,
|
|
@@ -3587,8 +3823,10 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3587
3823
|
continue;
|
|
3588
3824
|
}
|
|
3589
3825
|
if (parsed.answer) {
|
|
3590
|
-
// Answers settle
|
|
3591
|
-
// value (user cancelled the
|
|
3826
|
+
// Answers settle their bound ask_user_question out of band and are
|
|
3827
|
+
// never queued as a new turn. A null value (user cancelled the UI)
|
|
3828
|
+
// resolves as user_timeout for blocking questions and as no context
|
|
3829
|
+
// for deferred questions.
|
|
3592
3830
|
const pending = pendingQuestions.get(parsed.answer.id);
|
|
3593
3831
|
if (
|
|
3594
3832
|
!pending ||
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
captureAgentSkillOutcomeIndex,
|
|
6
6
|
} from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
7
7
|
import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
|
|
8
|
+
import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
|
|
8
9
|
import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
|
|
9
10
|
import {
|
|
10
11
|
resolveAgentPolicy,
|
|
@@ -18,6 +19,8 @@ export function createAgentRuntimeFactory({
|
|
|
18
19
|
evolutionComposition = null,
|
|
19
20
|
skillOutcomeIndex = null,
|
|
20
21
|
skillVectorAuthority = null,
|
|
22
|
+
skillRuntimeAdmission = null,
|
|
23
|
+
skillRuntimeAdmissionRequired = false,
|
|
21
24
|
skillRetrievalRevocationReader = null,
|
|
22
25
|
} = {}) {
|
|
23
26
|
const composition =
|
|
@@ -57,6 +60,23 @@ export function createAgentRuntimeFactory({
|
|
|
57
60
|
}
|
|
58
61
|
const retrievalTenant =
|
|
59
62
|
composition?.tenantId ?? outcomeIndex?.tenantId ?? null;
|
|
63
|
+
if (
|
|
64
|
+
skillRuntimeAdmission &&
|
|
65
|
+
deps.skillRuntimeAdmission &&
|
|
66
|
+
skillRuntimeAdmission !== deps.skillRuntimeAdmission
|
|
67
|
+
)
|
|
68
|
+
throw new TypeError(
|
|
69
|
+
"Skill runtime admission cannot be overridden through deps",
|
|
70
|
+
);
|
|
71
|
+
const runtimeAdmissionDependencies = captureSkillRuntimeDependencies(
|
|
72
|
+
{
|
|
73
|
+
skillRuntimeAdmission:
|
|
74
|
+
skillRuntimeAdmission ?? deps.skillRuntimeAdmission,
|
|
75
|
+
skillRuntimeAdmissionRequired:
|
|
76
|
+
skillRuntimeAdmissionRequired || deps.skillRuntimeAdmissionRequired,
|
|
77
|
+
},
|
|
78
|
+
retrievalTenant,
|
|
79
|
+
);
|
|
60
80
|
if (
|
|
61
81
|
retrievalTenant !== null &&
|
|
62
82
|
vectorAuthority !== null &&
|
|
@@ -95,10 +115,12 @@ export function createAgentRuntimeFactory({
|
|
|
95
115
|
composition === null &&
|
|
96
116
|
outcomeIndex === null &&
|
|
97
117
|
vectorAuthority === null &&
|
|
98
|
-
revocationReader === null
|
|
118
|
+
revocationReader === null &&
|
|
119
|
+
Object.keys(runtimeAdmissionDependencies).length === 0
|
|
99
120
|
? deps
|
|
100
121
|
: Object.freeze({
|
|
101
122
|
...deps,
|
|
123
|
+
...runtimeAdmissionDependencies,
|
|
102
124
|
...(composition === null
|
|
103
125
|
? {}
|
|
104
126
|
: { evolutionIngress: composition.evolutionIngress }),
|
|
@@ -113,10 +135,12 @@ export function createAgentRuntimeFactory({
|
|
|
113
135
|
const serverDeps =
|
|
114
136
|
outcomeIndex === null &&
|
|
115
137
|
vectorAuthority === null &&
|
|
116
|
-
revocationReader === null
|
|
138
|
+
revocationReader === null &&
|
|
139
|
+
Object.keys(runtimeAdmissionDependencies).length === 0
|
|
117
140
|
? deps
|
|
118
141
|
: Object.freeze({
|
|
119
142
|
...deps,
|
|
143
|
+
...runtimeAdmissionDependencies,
|
|
120
144
|
...(outcomeIndex === null ? {} : { skillOutcomeIndex: outcomeIndex }),
|
|
121
145
|
...(vectorAuthority === null
|
|
122
146
|
? {}
|
|
@@ -183,7 +183,13 @@ export function runBackgroundAgentKeeperHeartbeat({
|
|
|
183
183
|
return false;
|
|
184
184
|
}
|
|
185
185
|
try {
|
|
186
|
-
|
|
186
|
+
// A heartbeat is advisory liveness telemetry. Keep ownership strict but
|
|
187
|
+
// never wait behind another state writer or invoke the synchronous Windows
|
|
188
|
+
// owner probe; the next one-second heartbeat retries if the lock is busy.
|
|
189
|
+
persistKeeper(
|
|
190
|
+
{ keeperHeartbeatAt: currentTime },
|
|
191
|
+
{ timeoutMs: 0, probeLockOwner: false },
|
|
192
|
+
);
|
|
187
193
|
return true;
|
|
188
194
|
} catch (error) {
|
|
189
195
|
try {
|
|
@@ -455,18 +461,22 @@ export async function runBackgroundAgentKeeper(jobFile, options = {}) {
|
|
|
455
461
|
finishResolve = resolvePromise;
|
|
456
462
|
});
|
|
457
463
|
|
|
458
|
-
const persistKeeper = (patch) =>
|
|
459
|
-
mutateBackgroundAgentState(
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
464
|
+
const persistKeeper = (patch, options = {}) =>
|
|
465
|
+
mutateBackgroundAgentState(
|
|
466
|
+
job.id,
|
|
467
|
+
(current) => {
|
|
468
|
+
if (
|
|
469
|
+
!current ||
|
|
470
|
+
current.workerGeneration !== job.workerGeneration ||
|
|
471
|
+
current.keeperGeneration !== job.keeperGeneration ||
|
|
472
|
+
Number(current.keeperPid) !== process.pid
|
|
473
|
+
) {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
return { ...current, ...patch };
|
|
477
|
+
},
|
|
478
|
+
options,
|
|
479
|
+
);
|
|
470
480
|
|
|
471
481
|
const finishForWorkerDisconnect = () => {
|
|
472
482
|
if (finishing) return false;
|
|
@@ -75,6 +75,11 @@ const TURN_BOOTSTRAP_MODULE_URL = new URL(
|
|
|
75
75
|
import.meta.url,
|
|
76
76
|
).href;
|
|
77
77
|
const TURN_BOOTSTRAP_IMPORT_ARGUMENT = `--import=${TURN_BOOTSTRAP_MODULE_URL}`;
|
|
78
|
+
// A periodic heartbeat is telemetry, not a turn-ownership transition. On a
|
|
79
|
+
// busy Windows runner it must never block the worker's IPC loop long enough to
|
|
80
|
+
// starve a keeper ARM/RETIRE reply; startup and terminal claims keep the
|
|
81
|
+
// supervisor's full strict-lock deadline.
|
|
82
|
+
const PERIODIC_HEARTBEAT_STATE_LOCK_TIMEOUT_MS = 0;
|
|
78
83
|
|
|
79
84
|
const jobFile = process.argv[2];
|
|
80
85
|
let job;
|
|
@@ -534,18 +539,22 @@ function mergeState(patch) {
|
|
|
534
539
|
})).state;
|
|
535
540
|
}
|
|
536
541
|
|
|
537
|
-
function writeHeartbeat() {
|
|
538
|
-
const mutation = claimBackgroundAgentHeartbeat(
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
542
|
+
function writeHeartbeat(options = {}) {
|
|
543
|
+
const mutation = claimBackgroundAgentHeartbeat(
|
|
544
|
+
job.id,
|
|
545
|
+
{
|
|
546
|
+
workerGeneration: job.workerGeneration,
|
|
547
|
+
pid: process.pid,
|
|
548
|
+
workerPid: process.pid,
|
|
549
|
+
...(child?.pid ? { agentPid: child.pid } : {}),
|
|
550
|
+
...(turnLaunchUncertainty || {}),
|
|
551
|
+
heartbeatAt: Date.now(),
|
|
552
|
+
// Re-assert the transport endpoint so a launcher write racing the
|
|
553
|
+
// worker's initial merge self-heals within one heartbeat.
|
|
554
|
+
...(transportState ? { transport: transportState } : {}),
|
|
555
|
+
},
|
|
556
|
+
options,
|
|
557
|
+
);
|
|
549
558
|
const applied =
|
|
550
559
|
mutation.applied &&
|
|
551
560
|
mutation.state?.status === "running" &&
|
|
@@ -1798,7 +1807,12 @@ async function main() {
|
|
|
1798
1807
|
}
|
|
1799
1808
|
heartbeat = setInterval(() => {
|
|
1800
1809
|
try {
|
|
1801
|
-
if (
|
|
1810
|
+
if (
|
|
1811
|
+
!writeHeartbeat({
|
|
1812
|
+
timeoutMs: PERIODIC_HEARTBEAT_STATE_LOCK_TIMEOUT_MS,
|
|
1813
|
+
probeLockOwner: false,
|
|
1814
|
+
})
|
|
1815
|
+
) {
|
|
1802
1816
|
if (turnLaunchSettlement) {
|
|
1803
1817
|
// The owned tree is already in explicit settlement. Keep the worker
|
|
1804
1818
|
// alive until confirmed termination evidence is durably recorded;
|
|
@@ -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-OBhlHSMN.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"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={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",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,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 z=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-m2bzbN/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{z as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-Bi2SY9E_.js","./vendor-Bn1JzzAn.js","./index-OBhlHSMN.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-gVgXQWdc.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-D3JrGSPb.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-rartVC-k.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-ilRa-ueg.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 O,U as v,c,S as C,V as E,_ as M,F as B,Z as se,a0 as ae,R as x,K as m,Q as b,W as L,o as z}from"./vendor-Bn1JzzAn.js";import{u as J}from"./usePersonalDataHub-BGkdLryu.js";import{_ as D,e as F,d as P}from"./index-OBhlHSMN.js";import{aa as q,ag as U,M as Q,aI as G,v as H,aH as K,aq as W,ac as Y,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}),N=50,Z=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),a=R(null),l=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(S={}){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,...S}}async function y(){const S=++d;e.value=!0,a.value=null;const p=J();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:N})),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(S!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,l.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(S!==d)return;a.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,a.value=null;const S=J();try{const p=await S.searchEvents(h({cursor:n.value,limit:N}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,l.value=p.mode||l.value}catch(p){a.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function le(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,y()},Z)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),y()}function ce(){r.value={...I},t.value=[],n.value=null,a.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:a,mode:l,shortQuery:s,facets:i,hasResults:j,canLoadMore:A,search:y,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:N,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 V(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:Y,social:W,email:K,shopping:H,travel:G,system:Q,"ai-chat":U,other:q};function a(i){return o[i]||q}function l(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:a,badgeStyle:l,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return G},get MobileOutlined(){return Q},get RobotOutlined(){return U},get CATEGORIES(){return ge},get categoryLabel(){return V}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Se={class:"pdh-sidebar"},Oe=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,a){const l=g("a-badge");return u(),O("div",Se,[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(l,{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),O(B,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(ae(e.iconFor(s)),{class:"icon"})),v("span",we,x(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(l,{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,Oe))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-m2bzbN/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,a=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),l=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:a,adapterOptions:l,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,a){const l=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),O("div",Re,[c(l,{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(),O("span",xe,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("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-m2bzbN/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-Bi2SY9E_.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-gVgXQWdc.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-D3JrGSPb.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=L(()=>F(()=>import("./EmailListRenderer-rartVC-k.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=L(()=>F(()=>import("./GenericCardRenderer-ilRa-ueg.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 a;default:return l}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:a,GenericCardRenderer:l,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-m2bzbN/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 a=Number.isFinite(o.occurredAt)?o.occurredAt:null,l=a?new Date(a).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",a!=null?String(a):"",l,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),a=document.createElement("a");return a.href=o,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),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"),a=String(n.getDate()).padStart(2,"0"),l=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${a}${s}.${l}`}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 a(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 l({key:i}){try{const d=a(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:a,onClick:l,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,a){const l=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(l,{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 Ne=D(Pe,[["render",qe],["__file","/tmp/cc-web-panel-m2bzbN/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Be={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${V(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function a(s,i){n.setFilter(s,i)}z(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:z,computed:w,get ReloadOutlined(){return ye},get usePdhBrowserStore(){return X},get categoryLabel(){return V},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:Ne};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ve={class:"pdh-browser-page"},Me={class:"page-header"},ze={class:"main-pane"},Je={class:"results-summary"},Ue={key:0},Qe={key:0},Ge={key:1},He={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,a){const l=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(),O("div",Ve,[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(l,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(l,{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",ze,[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(),O("span",Ue,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(B,{key:1},[v("strong",null,x(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",Qe,[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(),O("span",Ge,[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",He," / 已显示 "+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",Ke,[(u(!0),O(B,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(),O("div",We,[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(Be,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-m2bzbN/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-OBhlHSMN.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|