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.
Files changed (232) hide show
  1. package/README.md +6 -4
  2. package/package.json +4 -2
  3. package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-BLGEffkh.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-Cz1z2VGD.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C3j9cf6q.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-BR9ERuCA.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-CozJCm4y.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-DC5g9Ra2.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-B1zrQ0dW.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-ChVnfjpm.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-8_vLQsLf.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-Dct9bm6L.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-BvoSsCKh.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DZQIsCIC.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-CdzHxmnq.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-DdAN8LeW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-CNgjT9MA.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-BtQiX6G-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-OGX5ma3j.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-CgugQnGM.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-Bpg7cPFD.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-D1hsuswf.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-miDRsMBw.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-CGcl8htP.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BFaxTdVE.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-BQdGLZIO.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-BqpG3XHV.js → EvolutionSettings-bMvgBk6r.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-c1WVC_--.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-DyAcFrQY.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-CfwpfD2B.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DkJcbBpS.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-DgYIrPJh.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BF1tYPJ6.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-BFkwRIrU.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-DpCoqhBa.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-DU2qAJmD.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-QWv7UJLq.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Dz9NUrfo.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-B67I3d5v.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-crkElJSy.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-BO20VbdX.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-Ba-3gZZd.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-BAHZM084.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-CL3DzajL.js} +4 -4
  45. package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-BSWWzvWH.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-fnxqXM_3.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-6F8EarNN.js → Notes-qUZPIQXT.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-x9Xrixqu.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-gVgXQWdc.js → OrderTableRenderer-BtMtQUt7.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-C946Hzna.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BYf8KIts.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-Cbqf5dnv.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-rmxp0cuF.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CZBw45EW.js} +3 -3
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub-BKwUAt43.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DmFD2QW4.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-KpuwWvt5.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-Bt8UheX6.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-2ZeAn9CP.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-zBuet8Zs.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-DcEAnw6L.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-qF7liYG9.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-qiESlVBJ.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-Bk-cQyi9.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-CwrekErS.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-Bmw_UQtW.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-CPdqZIUX.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-D_W-xxvS.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-Hu0oDFj_.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DeRxUwmq.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CsNmHFkf.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-gv_Vz0tN.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-Dgg-_rCB.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-Bpu-bsEJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-CrhleHuF.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-JHjUN6I9.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-DKRWKkl9.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-leiWntLq.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant--1bYulvn.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-C0y6FvSS.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-CQK4PVv4.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-DbIvF-DV.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-CkXJ2vuq.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-B02WXJPw.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-VPMkfzmw.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-C5ezUnah.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-CYfvYRrY.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-DtKl-kpr.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-DACITF-u.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-qnygfnLi.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-D4mISLBD.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-BBPfxYGL.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Byx4ndHp.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-DBy6gsuI.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-CGjLkkn3.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index-B8UpadHC.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BD0w-888.js → index-B9jH-h4X.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BN7_TSgU.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-BNe2lCk6.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-B_fHPZ8E.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BfEDXk_E.js +1 -0
  102. package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-BklGH3YI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-BmKYaaGP.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BxQF1wCU.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-ByA1NyFP.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-0200QxC4.js → index-BzeBBAl5.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-C3abGsSW.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-C9tcHs46.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-CD5Btq6p.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-CFMWjuav.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-CMj8qmpX.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-CVUJjQAT.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-CWhI8G14.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CZjNamSU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-CmHE-lY_.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-CoA8WsVr.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-Cpg3AWRy.js} +1 -1
  118. package/src/assets/web-panel/assets/index-CrxUwNM8.js +1 -0
  119. package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-CsVuQsY1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-CydHMjwc.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CPYshcic.js → index-DH6iC5b2.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-DZXhKAk9.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-D_g9mA1N.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-DboTeuPF.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-DfgpKd64.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-Dmfe0L2Z.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-Dzni_5Qw.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-J5JkStvY.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-Ne8UGllV.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-O09jXbir.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-Y7el_3WS.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-c_tBkIlU.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-lKJWAmd4.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-xzRKTy0R.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-XuhfEIhB.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-Cbxh6AxO.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-C7IEnFly.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-lLADx4LL.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-mIbic_k-.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-_xIYEqu3.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-ClB-E0ny.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D36Bg2ut.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-CUuO08Bl.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-BKahwLbv.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-2pT-T8vy.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-DyH5g7Rg.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-CTOauB3X.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-B02JYIMe.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-Do22wQrc.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BfnL7rit.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +3 -3
  153. package/src/commands/agent.js +8 -0
  154. package/src/commands/background-session.js +31 -3
  155. package/src/commands/chat.js +5 -1
  156. package/src/commands/eval.js +86 -28
  157. package/src/commands/llm.js +104 -1
  158. package/src/commands/plugin.js +161 -1
  159. package/src/commands/sandbox.js +121 -2
  160. package/src/commands/serve.js +11 -2
  161. package/src/commands/skill.js +29 -0
  162. package/src/data/changelog.json +26 -0
  163. package/src/gateways/ws/session-protocol.js +13 -0
  164. package/src/gateways/ws/ws-agent-handler.js +17 -0
  165. package/src/gateways/ws/ws-server.js +3 -0
  166. package/src/gateways/ws/ws-session-state.js +131 -0
  167. package/src/generated/cc-agent-protocol.schema.json +48 -1
  168. package/src/lazy-dispatch.js +8 -1
  169. package/src/lib/agent-sandbox.js +337 -53
  170. package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
  171. package/src/lib/app-server/server.js +93 -0
  172. package/src/lib/background-agent-keeper-client.js +2 -0
  173. package/src/lib/background-agent-keeper-protocol.js +7 -0
  174. package/src/lib/background-agent-list-index.js +222 -0
  175. package/src/lib/background-agent-supervisor.js +232 -47
  176. package/src/lib/codex-app-server-adapter.js +82 -27
  177. package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
  178. package/src/lib/context-memory-kernel/provider-context.js +118 -19
  179. package/src/lib/deferred-question-context.js +278 -0
  180. package/src/lib/eval/evidence.js +202 -64
  181. package/src/lib/eval/plugin-suite.js +1181 -0
  182. package/src/lib/eval/runner.js +10 -3
  183. package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
  184. package/src/lib/evolution/agent-model-projection.js +97 -1
  185. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
  186. package/src/lib/evolution/evolution-artifact-ports.js +6 -0
  187. package/src/lib/evolution/evolution-deployment-loader.js +87 -3
  188. package/src/lib/evolution/evolution-eval-gate.js +8 -0
  189. package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
  190. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
  191. package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
  192. package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
  193. package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
  194. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
  195. package/src/lib/evolution/evolution-ledger.js +57 -1
  196. package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
  197. package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
  198. package/src/lib/evolution/governed-hub-llm.js +238 -5
  199. package/src/lib/evolution/governed-hub-resolver.js +82 -4
  200. package/src/lib/evolution/governed-hub-skill.js +11 -5
  201. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
  202. package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
  203. package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
  204. package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
  205. package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
  206. package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
  207. package/src/lib/goal-context.js +14 -5
  208. package/src/lib/interaction-adapter.js +166 -1
  209. package/src/lib/model-capabilities.js +271 -0
  210. package/src/lib/model-context-catalog.js +105 -0
  211. package/src/lib/model-context-window.js +4 -49
  212. package/src/lib/openai-responses.js +428 -0
  213. package/src/lib/plugin-runtime/scopes.js +7 -1
  214. package/src/lib/remote-read-loop-guard.js +2 -2
  215. package/src/lib/runtime-usage-ledger.js +16 -0
  216. package/src/lib/session-host-snapshot.js +16 -0
  217. package/src/lib/skill-loader.js +12 -0
  218. package/src/lib/with-file-lock.js +3 -1
  219. package/src/repl/agent-repl.js +5 -1
  220. package/src/runtime/agent-core.js +348 -23
  221. package/src/runtime/agent-runtime.js +7 -0
  222. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  223. package/src/runtime/headless-runner.js +4 -1
  224. package/src/runtime/headless-stream.js +283 -45
  225. package/src/runtime/runtime-factory.js +26 -2
  226. package/src/workers/background-agent-keeper.js +23 -13
  227. package/src/workers/background-agent-worker.js +27 -13
  228. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
  229. package/src/assets/web-panel/assets/PdhVaultBrowser-fYmQzmTA.js +0 -7
  230. package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
  231. package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
  232. 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
- let questionSeq = 0;
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({ type: "question_resolved", id, via, session_id: sessionId });
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
- emit({ type: "question_resolved", id, via, session_id: sessionId });
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({ type: "question_resolved", id, via, session_id: sessionId });
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
- const error = new Error(`ask_user_question ${via}`);
2525
- error.code = "USER_TIMEOUT";
2526
- pending.reject(error);
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 interactionAskUser = ({
2530
- question,
2531
- options: qOptions,
2532
- multiSelect,
2533
- timeoutMs,
2534
- metadata,
2535
- sessionId: requestedSessionId,
2536
- turnId,
2537
- toolUseId,
2538
- } = {}) =>
2539
- new Promise((resolve, reject) => {
2540
- const id = `q-${++questionSeq}`;
2541
- const binding = normalizeInteractionBinding({
2542
- sessionId: requestedSessionId ?? sessionId,
2543
- turnId,
2544
- toolUseId,
2545
- sequence: questionSeq,
2546
- });
2547
- const ms = Number(timeoutMs) > 0 ? Number(timeoutMs) : questionTimeoutMs;
2548
- const timer = setTimeout(() => failQuestion(id, "timeout"), ms);
2549
- timer.unref?.();
2550
- pendingQuestions.set(id, { resolve, reject, timer, binding });
2551
- emit({
2552
- type: "question_request",
2553
- id,
2554
- session_id: sessionId,
2555
- binding,
2556
- ...(binding.turnId ? { turn_id: binding.turnId } : {}),
2557
- ...(binding.toolUseId ? { tool_use_id: binding.toolUseId } : {}),
2558
- question: typeof question === "string" ? question : "",
2559
- options: Array.isArray(qOptions) ? qOptions : null,
2560
- multiSelect: multiSelect === true,
2561
- ...(metadata && typeof metadata === "object" ? { metadata } : {}),
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) streamInteraction.askUser = interactionAskUser;
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: goalPrepareCallFn,
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 a BLOCKED ask_user_question — never queued. A null
3591
- // value (user cancelled the QuickPick) → user_timeout (model proceeds).
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
- persistKeeper({ keeperHeartbeatAt: currentTime });
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(job.id, (current) => {
460
- if (
461
- !current ||
462
- current.workerGeneration !== job.workerGeneration ||
463
- current.keeperGeneration !== job.keeperGeneration ||
464
- Number(current.keeperPid) !== process.pid
465
- ) {
466
- return null;
467
- }
468
- return { ...current, ...patch };
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(job.id, {
539
- workerGeneration: job.workerGeneration,
540
- pid: process.pid,
541
- workerPid: process.pid,
542
- ...(child?.pid ? { agentPid: child.pid } : {}),
543
- ...(turnLaunchUncertainty || {}),
544
- heartbeatAt: Date.now(),
545
- // Re-assert the transport endpoint so a launcher write racing the
546
- // worker's initial merge self-heals within one heartbeat.
547
- ...(transportState ? { transport: transportState } : {}),
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 (!writeHeartbeat()) {
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};