chainlesschain 0.166.15 → 0.166.17

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 (202) hide show
  1. package/README.md +3 -3
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +2 -2
  7. package/src/assets/web-panel/assets/{AIOps-To-6rimH.js → AIOps-CVW2n2rh.js} +1 -1
  8. package/src/assets/web-panel/assets/{ActionButton-CpdCnTv3.js → ActionButton-DtuM163O.js} +1 -1
  9. package/src/assets/web-panel/assets/{Analytics-DK7VNES_.js → Analytics-BXvl_qHu.js} +3 -3
  10. package/src/assets/web-panel/assets/{AppLayout-NZ5FvhCx.js → AppLayout-VDBTFKOp.js} +5 -5
  11. package/src/assets/web-panel/assets/{Artifacts-NXceQPmN.js → Artifacts-BNz2xCiG.js} +1 -1
  12. package/src/assets/web-panel/assets/{Audit-B2d64DH2.js → Audit-DTu9Hn9P.js} +1 -1
  13. package/src/assets/web-panel/assets/{BackgroundAgents-ByYgvEVY.js → BackgroundAgents-D2OCPzLe.js} +1 -1
  14. package/src/assets/web-panel/assets/{Backup-BXvQLDvN.js → Backup-C9M-vG7G.js} +1 -1
  15. package/src/assets/web-panel/assets/{BaseInput-C4GZk-As.js → BaseInput-BUkCNiUQ.js} +1 -1
  16. package/src/assets/web-panel/assets/{Chat-CvPuohL8.js → Chat-OJ2ajF7l.js} +5 -5
  17. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DTftcclX.js → ChatBubbleRenderer-BdZt76Ab.js} +1 -1
  18. package/src/assets/web-panel/assets/{Checkbox-C8dQGIqD.js → Checkbox-C1gXKDsc.js} +1 -1
  19. package/src/assets/web-panel/assets/{Codegen-DRM6S1W4.js → Codegen-BXbznLg7.js} +1 -1
  20. package/src/assets/web-panel/assets/{Col-BDM8l-r5.js → Col-CbCq5N0i.js} +1 -1
  21. package/src/assets/web-panel/assets/{Community-Bvmfi1fX.js → Community-V8Ks6Yun.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compact-DGQTCima.js → Compact-DkeHQTpQ.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compliance-D_0C-2P6.js → Compliance-JeLKwn4Q.js} +1 -1
  24. package/src/assets/web-panel/assets/{Cowork-3C_q99ok.js → Cowork-azfetcBz.js} +3 -3
  25. package/src/assets/web-panel/assets/{Cron-CIiMQ1Hl.js → Cron-Q691i_Gp.js} +2 -2
  26. package/src/assets/web-panel/assets/{Crosschain-peebGnES.js → Crosschain-BLjDRbr_.js} +1 -1
  27. package/src/assets/web-panel/assets/{DID-OkX4KB9T.js → DID-D8ptXplK.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dashboard-D9lm0Wxa.js → Dashboard-Ctj2VVZL.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dropdown-CitActXx.js → Dropdown-D8VgkMJ8.js} +1 -1
  30. package/src/assets/web-panel/assets/EmailListRenderer-CQPe5S6q.js +1 -0
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CBWAi8XL.js → FamilyGuardDashboard-ySA-7SiN.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-afj8jDcp.js → Federation-1PMD-fBf.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-Dabt59KY.js → FormItemContext-C_jr6U4Q.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-BQpXA9kj.js → GenericCardRenderer-Bu3bKf2B.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-D2p2Moo1.js → Git-Dv4Fa_T5.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-DkFfPykv.js → Governance-DOEy1n1k.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-C1DKpeN2.js → Inference-DkvqzWcJ.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-CjfVg4oQ.js → KnowledgeGraph-DdUJK949.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-D-zMvdSf.js → Logs-CRelcdUZ.js} +2 -2
  40. package/src/assets/web-panel/assets/{MarkdownRenderer-jzEpGkbc.js → MarkdownRenderer-0AHbbTA4.js} +1 -1
  41. package/src/assets/web-panel/assets/{Marketplace-DfAjJLyS.js → Marketplace-BuuBKsev.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-BGDHQES1.js → McpTools-DlgpEmA1.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-BYqrGAPS.js → Memory-DTfdqUGy.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-CQ6FEtty.js → MobileBridge-CXLE5ZFO.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-BpMvh5JW.js → MobileProjects-Dz25OB0n.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-CWH25SrU.js → Mtc-kEL0fhgD.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-D6DiLmei.js → MtcAudit-BE4UvFJU.js} +2 -2
  48. package/src/assets/web-panel/assets/{Multisig-BSxRN4jD.js → Multisig-CSApSn8c.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-C0FDPKT4.js → NLProgramming-D11FpKWx.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-VKR78bH-.js → Notes-CDL-D2CS.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-DLSklSZB.js → NotificationSettings-C0Q6lO-c.js} +1 -1
  52. package/src/assets/web-panel/assets/OrderTableRenderer-ZRE0OKbj.js +1 -0
  53. package/src/assets/web-panel/assets/{Organization-BB3pB27e.js → Organization-Dc-maVAq.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-Cr7bzwcs.js → Overflow-B5mUpSvi.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-D1fkMMzI.js → P2P-TjXV53wq.js} +2 -2
  56. package/src/assets/web-panel/assets/PdhVaultBrowser-DvV2btIr.js +7 -0
  57. package/src/assets/web-panel/assets/{Permissions-c3Ijv0v4.js → Permissions-DKRzQ2O6.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-BJwbh3P2.js → PersonalDataHub-Dx2eqft8.js} +4 -4
  59. package/src/assets/web-panel/assets/{Pipeline-C4fhXafB.js → Pipeline-CnYZMB5p.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-DzSx3CD-.js → Privacy-BonKpPnp.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-D9fL5fED.js → ProjectInit-DWO0Du3J.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-CB5FVrOR.js → ProjectSettings-C9jqyYRv.js} +2 -2
  63. package/src/assets/web-panel/assets/{Projects-DWhwdgfY.js → Projects-CYpKwXbz.js} +1 -1
  64. package/src/assets/web-panel/assets/{Providers-B9ZH4faS.js → Providers-CW-fkwJq.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-BLKDHT8_.js → QrScannerModal-Cw0J3Zud.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-D1oYUcSY.js → QuickAsk-BH4A4IpR.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-CC2nmrOD.js → Recommend-CDwMwJus.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-qW9QF4-r.js → RemoteSession-DKIPwzTf.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-BDWqfzcr.js → Reputation-CklDj7qS.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-BBV2iCjT.js → Row-DJWZKsH0.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-CcwrNwZB.js → RssFeed-BfSLCewo.js} +3 -3
  72. package/src/assets/web-panel/assets/{Search-Dr6fZ0D_.js → Search-B0IST--x.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-BPzaoCU6.js → Security-h1sYNWtt.js} +4 -4
  74. package/src/assets/web-panel/assets/{Services-BoKUU1I_.js → Services-Gh0-oxI_.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-C8lT8GUg.js → Skeleton-CNDV_jOs.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-DPpWeicz.js → Skills-ByCLTh1n.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-UiijzpMU.js → Sla-BfyrJTJz.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-DoofrLwS.js → SpeechSettings-BQzo9kNX.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-DXnyfTDw.js → SyncSettings-B6fS6z_1.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-g_WHjKeg.js → Tasks-C-uKCP-l.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-DRuCh9g2.js → Templates-D6oDy7wL.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-QHIq1pH1.js → Tenant-D3LT2wNQ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-G0fuI216.js → Terminal-BteLcv_O.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-4MT7SpGk.js → TimelineRenderer-DHHuxfqH.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-B5xT5umA.js → Tokens-BRQeykXw.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-D7HPbNgc.js → Trigger-p2XaFWEu.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-CxH69dU5.js → Trust-BxadBMft.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-CPPosveH.js → UkeySign-DRBP7LDk.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-Du5lGwAt.js → VideoEditing-CZ3NZkh7.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-BBIGNESK.js → Wallet-C3NTBN7G.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-Cc3HSGmv.js → WebAuthn-C7LVgMlb.js} +5 -5
  92. package/src/assets/web-panel/assets/{WorkflowEditor-DBoVPNCh.js → WorkflowEditor-0_Iveog7.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-DHcjgiem.js → chat-DzzluYo3.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-DrRrvJIV.js → colors-DSMYXpaj.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-BuY_sAoN.js → compact-item-W76u1VSV.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-CepH1Fha.js → createContext-otsESjb5.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-BztaXF84.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-Dh80Ot6o.js → hasIn-3sNLrvug.js} +1 -1
  99. package/src/assets/web-panel/assets/index-4jP_hG_4.js +1 -0
  100. package/src/assets/web-panel/assets/{index-LBkSOwky.js → index-B1I1AYJs.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B0rvJjId.js → index-B5LOYdYm.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-D6tOVlq-.js → index-B9X_jqXe.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D7lstbTh.js → index-BA8mZxd-.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPDEOOlA.js → index-BDlDO2px.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DuSUCH7h.js → index-BJsQio5O.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CEfVkKIY.js → index-BRsD1PT2.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CYydOga6.js → index-BXLx9HfA.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DkZP_QaB.js → index-BcGJtmHM.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BnVIvc15.js → index-BdtmEKat.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DuRYBWrj.js → index-BpcQYzP7.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-By0qqC3S.js → index-C2aht9-M.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C10033eO.js → index-CE7tSow-.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-9crgJ3Id.js → index-CENWwjef.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CNQK9DIr.js → index-CKoFyHYQ.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DUNyTmkS.js → index-Cg86EzNp.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CnRK8_Dd.js → index-ClOFeZ-t.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BW9Pycxh.js → index-CtFOt5x1.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-D5_K3GKu.js → index-D7A5U2IH.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DRy3_beb.js → index-DH4cl52p.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DWANFMlq.js → index-DLDh1OW3.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-C5vhNRqS.js → index-DMmdIpLA.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Ca5d64IH.js → index-DS9WYDMf.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-zGH9zH3w.js → index-DTA8Iavv.js} +3 -3
  124. package/src/assets/web-panel/assets/{index-BoRy2yup.js → index-DZKAzEge.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cx21_p3m.js → index-DdU7IkKX.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-B9Gh-SOn.js → index-Ddd4mird.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CiUx-tkV.js → index-DmpaC2yk.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DYN49m7k.js → index-GlIOE4ja.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CUnd5hyp.js → index-MhQQ3h8q.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CW_23-gU.js → index-NaO9AE-F.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-0TYLnd11.js → index-UUHCwfNq.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-NS9dW1F1.js → index-pVm_iUre.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-hYaigdGm.js → index-q7ftLqNt.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-A5lVwYVq.js → index-uSCkbpZH.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BtqigRzf.js → index-vBKPcmAP.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BiZQooWK.js → index-vUmYkqmu.js} +1 -1
  137. package/src/assets/web-panel/assets/index-zxwuAXL5.js +1 -0
  138. package/src/assets/web-panel/assets/{initDefaultProps-nI_X3wKl.js → initDefaultProps-DF6llUXV.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-LUHbQu_R.js → motion-vtDV8_5K.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-DHI_KvJt.js → move-B6c0bdy2.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-AYdL_7Mo.js → mtc-parser-DlLYWuBK.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-CtV3HRKa.js → omit-BH0zOxLN.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-CcJLTOu4.js → pickAttrs-D9di8_In.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-DHbiLUps.js → placementArrow-BDSngufM.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-BC2DGkWP.js → responsiveObserve-C_EawMvP.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-B4ga4pPY.js → slide-B_4wShxA.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-hzphgKfH.js → statusUtils-CbQu6qJ-.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-IfN9Bxoi.js → styleChecker-CvXJWYXb.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-pcGKJ4pT.js → useFlexGapSupport-jjY1XknO.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-COXhQpTG.js → useFs-CMXBdsK_.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-xp9F9szv.js → usePersonalDataHub-YbAhhPXx.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-BdSQy1Ve.js → vnode-BFCTKc0H.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-CHCt5P55.js → zoom-CY9aBl5O.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/command-help-index.json +2 -2
  156. package/src/command-manifest.json +2 -2
  157. package/src/commands/evolution.js +30 -17
  158. package/src/commands/learning.js +95 -9
  159. package/src/commands/team.js +5 -0
  160. package/src/data/changelog.json +28 -2
  161. package/src/lib/agent-team/task-lease.js +12 -1
  162. package/src/lib/capability-manifest.js +212 -1
  163. package/src/lib/evolution/bounded-skill-improvement-pilot.js +498 -0
  164. package/src/lib/evolution/evolution-artifact-ports.js +3277 -0
  165. package/src/lib/evolution/evolution-eval-gate.js +6442 -0
  166. package/src/lib/evolution/evolution-evidence-projector.js +3786 -0
  167. package/src/lib/evolution/evolution-ledger-ports.js +2689 -0
  168. package/src/lib/evolution/evolution-ledger.js +4280 -0
  169. package/src/lib/evolution/evolution-run-runtime-adapter.js +5 -0
  170. package/src/lib/evolution/skill-candidate-registry.js +2258 -0
  171. package/src/lib/evolution/skill-evaluated-promotion-durability.js +899 -0
  172. package/src/lib/evolution/skill-evaluated-promotion.js +481 -0
  173. package/src/lib/evolution/skill-execution-manifest.js +942 -0
  174. package/src/lib/evolution/skill-mutation-authority.js +1677 -0
  175. package/src/lib/evolution/skill-promotion-controller.js +618 -0
  176. package/src/lib/evolution/skill-release-registry.js +3277 -0
  177. package/src/lib/evolution/skill-target-matrix-eval.js +3233 -0
  178. package/src/lib/evolution/skill-writer-inventory-manifest.js +998 -0
  179. package/src/lib/evolution/skill-writer-inventory-validator.js +816 -0
  180. package/src/lib/evolution/wiki-informed-skill-proposer.js +343 -0
  181. package/src/lib/formal-quality-eval-runtime.js +100 -0
  182. package/src/lib/graph-kernel/cutover-contract.js +7 -0
  183. package/src/lib/graph-kernel/cutover-ledger.js +8 -7
  184. package/src/lib/graph-kernel/evidence-digest.js +47 -0
  185. package/src/lib/graph-kernel/evolution-run-runtime-adapter.js +5 -0
  186. package/src/lib/graph-kernel/graph-runtime-surfaces.json +8 -1
  187. package/src/lib/graph-kernel/production-cutover-evidence.js +342 -15
  188. package/src/lib/graph-kernel/production-source-evidence.js +1599 -0
  189. package/src/lib/graph-kernel/retirement-evidence.js +15 -5
  190. package/src/lib/graph-kernel/runtime-surface-manifest.js +67 -2
  191. package/src/lib/headless-manifest.js +3 -1
  192. package/src/lib/hooks-v2-runtime.js +20 -0
  193. package/src/lib/learning/skill-improver.js +311 -43
  194. package/src/lib/learning/skill-synthesizer.js +236 -16
  195. package/src/lib/secure-fs.js +20 -0
  196. package/src/runtime/agent-core.js +68 -0
  197. package/src/assets/web-panel/assets/EmailListRenderer-DSmFkNKV.js +0 -1
  198. package/src/assets/web-panel/assets/OrderTableRenderer-Dpj7D6tC.js +0 -1
  199. package/src/assets/web-panel/assets/PdhVaultBrowser-BiDEbLNA.js +0 -7
  200. package/src/assets/web-panel/assets/devWarning-DIb8j04q.js +0 -1
  201. package/src/assets/web-panel/assets/index-BJc3t4PC.js +0 -1
  202. package/src/assets/web-panel/assets/index-CkksSUnI.js +0 -1
@@ -12,8 +12,8 @@
12
12
  * 1. Find eligible trajectories
13
13
  * 2. Check for duplicates (tool chain fingerprint)
14
14
  * 3. Send to LLM for pattern extraction
15
- * 4. Generate SKILL.md
16
- * 5. Write to workspace skill layer
15
+ * 4. Generate and evaluate a candidate SKILL.md
16
+ * 5. Persist the accepted candidate to an isolated candidate registry
17
17
  */
18
18
 
19
19
  import fs from "fs";
@@ -24,6 +24,8 @@ import path from "path";
24
24
 
25
25
  const _deps = { fs, path };
26
26
 
27
+ export const SYNTHESIS_UNAVAILABLE_CODE = "LEARNING_SYNTHESIS_UNAVAILABLE";
28
+
27
29
  // ── Helpers ─────────────────────────────────────────────
28
30
 
29
31
  /**
@@ -79,6 +81,42 @@ export function generateSkillName(userIntent) {
79
81
  );
80
82
  }
81
83
 
84
+ /**
85
+ * Skill names become path segments in the candidate registry. Keep the
86
+ * accepted grammar deliberately small so an LLM response cannot escape the
87
+ * configured registry root.
88
+ * @param {string} skillName
89
+ * @returns {boolean}
90
+ */
91
+ export function isSafeSkillName(skillName) {
92
+ return (
93
+ typeof skillName === "string" &&
94
+ /^[\p{L}\p{N}][\p{L}\p{N}._-]{0,127}$/u.test(skillName) &&
95
+ skillName !== "." &&
96
+ skillName !== ".." &&
97
+ !skillName.includes("..")
98
+ );
99
+ }
100
+
101
+ function rootContains(parentRoot, childRoot) {
102
+ if (!parentRoot || !childRoot) return false;
103
+ const parent = path.resolve(parentRoot);
104
+ const child = path.resolve(childRoot);
105
+ const relative = path.relative(parent, child);
106
+ return (
107
+ relative === "" ||
108
+ (relative !== ".." &&
109
+ !relative.startsWith(`..${path.sep}`) &&
110
+ !path.isAbsolute(relative))
111
+ );
112
+ }
113
+
114
+ function rootsOverlap(firstRoot, secondRoot) {
115
+ return (
116
+ rootContains(firstRoot, secondRoot) || rootContains(secondRoot, firstRoot)
117
+ );
118
+ }
119
+
82
120
  // ── LLM prompt template ─────────────────────────────────
83
121
 
84
122
  /**
@@ -167,7 +205,7 @@ export class SkillSynthesizer {
167
205
  * @param {import("better-sqlite3").Database} db
168
206
  * @param {function} llmChat — async (messages) => string (LLM response)
169
207
  * @param {import("./trajectory-store.js").TrajectoryStore} trajectoryStore
170
- * @param {{minToolCount?:number, minScore?:number, minSimilar?:number, outputDir?:string}} [config]
208
+ * @param {{minToolCount?:number, minScore?:number, minSimilar?:number, candidateOutputDir?:string, activeSkillsDirs?:string[], evaluateCandidate?:function}} [config]
171
209
  */
172
210
  constructor(db, llmChat, trajectoryStore, config = {}) {
173
211
  this.db = db;
@@ -176,14 +214,80 @@ export class SkillSynthesizer {
176
214
  this.minToolCount = config.minToolCount ?? 5;
177
215
  this.minScore = config.minScore ?? 0.7;
178
216
  this.minSimilar = config.minSimilar ?? 2;
179
- this.outputDir = config.outputDir || null;
217
+ this.candidateOutputDir = config.candidateOutputDir || null;
218
+ const configuredActiveSkillsDirs = Array.isArray(config.activeSkillsDirs)
219
+ ? config.activeSkillsDirs
220
+ : [];
221
+ this.activeSkillsDirs = configuredActiveSkillsDirs.filter(
222
+ (root) => typeof root === "string" && root.trim().length > 0,
223
+ );
224
+ this.activeSkillsDirsInvalid =
225
+ configuredActiveSkillsDirs.length !== this.activeSkillsDirs.length;
226
+ this.evaluateCandidate =
227
+ typeof config.evaluateCandidate === "function"
228
+ ? config.evaluateCandidate
229
+ : null;
230
+ }
231
+
232
+ /**
233
+ * Report whether this instance can truthfully create persisted candidates.
234
+ * No trajectory is queried or mutated while the synthesizer is unavailable.
235
+ * @returns {{available:boolean, missingDependencies:string[], blockers:string[]}}
236
+ */
237
+ getAvailability() {
238
+ const missingDependencies = [];
239
+ const blockers = [];
240
+ if (typeof this.llmChat !== "function") missingDependencies.push("llm");
241
+ if (!this.candidateOutputDir) {
242
+ missingDependencies.push("candidate-output-registry");
243
+ }
244
+ if (typeof this.evaluateCandidate !== "function") {
245
+ missingDependencies.push("candidate-evaluator");
246
+ }
247
+ if (this.activeSkillsDirs.length === 0) {
248
+ missingDependencies.push("active-skill-registry-roots");
249
+ }
250
+ if (this.activeSkillsDirsInvalid) {
251
+ blockers.push("active-skill-registry-roots-invalid");
252
+ }
253
+ if (
254
+ this.candidateOutputDir &&
255
+ this.activeSkillsDirs.some((activeRoot) =>
256
+ rootsOverlap(activeRoot, this.candidateOutputDir),
257
+ )
258
+ ) {
259
+ blockers.push("candidate-output-overlaps-active-skill-tree");
260
+ }
261
+ return {
262
+ available: missingDependencies.length === 0 && blockers.length === 0,
263
+ missingDependencies,
264
+ blockers,
265
+ };
180
266
  }
181
267
 
182
268
  /**
183
269
  * Scan for eligible trajectories and synthesize skills.
184
- * @returns {Promise<{created: string[], skipped: string[]}>}
270
+ * @returns {Promise<{status:string, created: string[], skipped: string[], errors?:string[], code?:string, reason?:string, missingDependencies?:string[], blockers?:string[]}>}
185
271
  */
186
272
  async synthesize() {
273
+ const availability = this.getAvailability();
274
+ if (!availability.available) {
275
+ const issues = [
276
+ ...availability.missingDependencies.map((item) => `missing ${item}`),
277
+ ...availability.blockers,
278
+ ];
279
+ const reason = `Synthesis unavailable: ${issues.join(", ")}`;
280
+ return {
281
+ status: "unavailable",
282
+ code: SYNTHESIS_UNAVAILABLE_CODE,
283
+ reason,
284
+ missingDependencies: availability.missingDependencies,
285
+ blockers: availability.blockers,
286
+ created: [],
287
+ skipped: [],
288
+ };
289
+ }
290
+
187
291
  const candidates = this.trajectoryStore.findComplexUnprocessed({
188
292
  minToolCount: this.minToolCount,
189
293
  minScore: this.minScore,
@@ -192,6 +296,7 @@ export class SkillSynthesizer {
192
296
 
193
297
  const created = [];
194
298
  const skipped = [];
299
+ const errors = [];
195
300
 
196
301
  for (const traj of candidates) {
197
302
  try {
@@ -225,25 +330,56 @@ export class SkillSynthesizer {
225
330
 
226
331
  // Generate and persist
227
332
  const skillName = pattern.name || generateSkillName(traj.userIntent);
333
+ if (!isSafeSkillName(skillName)) {
334
+ skipped.push(`${traj.id}: invalid candidate skill name`);
335
+ continue;
336
+ }
228
337
  const content = generateSkillMd(
229
338
  pattern,
230
339
  traj.id,
231
340
  traj.outcomeScore || 0.7,
232
341
  );
233
342
 
234
- if (this.outputDir) {
235
- await this._persistSkill(skillName, content);
343
+ const evaluation = await this.evaluateCandidate({
344
+ skillName,
345
+ content,
346
+ pattern,
347
+ trajectory: traj,
348
+ });
349
+ const accepted =
350
+ evaluation === true ||
351
+ (evaluation &&
352
+ typeof evaluation === "object" &&
353
+ evaluation.accepted === true);
354
+ if (!accepted) {
355
+ const evaluationReason =
356
+ evaluation && typeof evaluation === "object"
357
+ ? evaluation.reason
358
+ : null;
359
+ skipped.push(
360
+ `${traj.id}: evaluator rejected candidate${evaluationReason ? ` - ${evaluationReason}` : ""}`,
361
+ );
362
+ continue;
236
363
  }
237
364
 
238
- // Mark trajectory as synthesized
365
+ await this._persistSkill(skillName, content);
366
+
367
+ // Only durable, evaluated candidates count as synthesized.
239
368
  this.trajectoryStore.markSynthesized(traj.id, skillName);
240
369
  created.push(skillName);
241
370
  } catch (err) {
242
- skipped.push(`${traj.id}: error - ${err.message}`);
371
+ const message = `${traj.id}: error - ${err.message}`;
372
+ skipped.push(message);
373
+ errors.push(message);
243
374
  }
244
375
  }
245
376
 
246
- return { created, skipped };
377
+ return {
378
+ status: errors.length > 0 ? "error" : "completed",
379
+ created,
380
+ skipped,
381
+ errors,
382
+ };
247
383
  }
248
384
 
249
385
  /**
@@ -297,19 +433,103 @@ export class SkillSynthesizer {
297
433
  }
298
434
 
299
435
  /**
300
- * Write SKILL.md to the output directory.
436
+ * Write SKILL.md to the isolated candidate output registry.
301
437
  * @param {string} skillName
302
438
  * @param {string} content
303
439
  * @returns {Promise<{skillDir:string, skillFile:string}>}
304
440
  */
305
441
  async _persistSkill(skillName, content) {
306
- const skillDir = _deps.path.join(this.outputDir, skillName);
307
- const skillFile = _deps.path.join(skillDir, "SKILL.md");
442
+ if (!this.candidateOutputDir) {
443
+ throw new Error("candidate output registry is unavailable");
444
+ }
445
+ if (!isSafeSkillName(skillName)) {
446
+ throw new Error("invalid candidate skill name");
447
+ }
448
+ const availability = this.getAvailability();
449
+ if (!availability.available) {
450
+ throw new Error(
451
+ `candidate output boundary unavailable: ${[
452
+ ...availability.missingDependencies,
453
+ ...availability.blockers,
454
+ ].join(", ")}`,
455
+ );
456
+ }
457
+ this._assertCandidateFilesystemSupport();
458
+ const candidateRoot = await this._ensurePrivateDirectory(
459
+ this.candidateOutputDir,
460
+ { recursive: true },
461
+ );
462
+ await this._assertRealpathIsolation(candidateRoot);
463
+
464
+ const skillNamespace = _deps.path.join(this.candidateOutputDir, skillName);
465
+ const canonicalSkillNamespace =
466
+ await this._ensurePrivateDirectory(skillNamespace);
467
+ this._assertPathWithinCandidateRoot(candidateRoot, canonicalSkillNamespace);
468
+ const skillDir = _deps.path.join(canonicalSkillNamespace, "1.0.0");
469
+ const canonicalSkillDir = await this._ensurePrivateDirectory(skillDir);
470
+ this._assertPathWithinCandidateRoot(candidateRoot, canonicalSkillDir);
471
+ const skillFile = _deps.path.join(canonicalSkillDir, "SKILL.md");
472
+
473
+ await _deps.fs.promises.writeFile(skillFile, content, {
474
+ encoding: "utf-8",
475
+ flag: "wx",
476
+ });
477
+
478
+ return { skillDir: canonicalSkillDir, skillFile };
479
+ }
308
480
 
309
- await _deps.fs.promises.mkdir(skillDir, { recursive: true });
310
- await _deps.fs.promises.writeFile(skillFile, content, "utf-8");
481
+ _assertCandidateFilesystemSupport() {
482
+ if (
483
+ typeof _deps.fs.promises.realpath !== "function" ||
484
+ typeof _deps.fs.promises.lstat !== "function"
485
+ ) {
486
+ throw new Error(
487
+ "candidate filesystem identity support unavailable; refusing write",
488
+ );
489
+ }
490
+ }
491
+
492
+ async _ensurePrivateDirectory(directory, options = {}) {
493
+ let stat;
494
+ try {
495
+ stat = await _deps.fs.promises.lstat(directory);
496
+ } catch (error) {
497
+ if (error?.code !== "ENOENT") throw error;
498
+ try {
499
+ await _deps.fs.promises.mkdir(directory, {
500
+ recursive: options.recursive === true,
501
+ mode: 0o700,
502
+ });
503
+ } catch (mkdirError) {
504
+ if (mkdirError?.code !== "EEXIST") throw mkdirError;
505
+ }
506
+ stat = await _deps.fs.promises.lstat(directory);
507
+ }
508
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
509
+ throw new Error(
510
+ `candidate directory is not a trusted directory: ${directory}`,
511
+ );
512
+ }
513
+ return _deps.fs.promises.realpath(directory);
514
+ }
311
515
 
312
- return { skillDir, skillFile };
516
+ async _assertRealpathIsolation(candidateRoot) {
517
+ const activeRoots = await Promise.all(
518
+ this.activeSkillsDirs.map((root) => _deps.fs.promises.realpath(root)),
519
+ );
520
+ if (activeRoots.some((root) => rootsOverlap(root, candidateRoot))) {
521
+ throw new Error(
522
+ "candidate output resolves into an active skill tree; refusing write",
523
+ );
524
+ }
525
+ }
526
+
527
+ _assertPathWithinCandidateRoot(candidateRoot, candidatePath) {
528
+ if (!rootContains(candidateRoot, candidatePath)) {
529
+ throw new Error(
530
+ "candidate parent resolves outside the candidate root; refusing write",
531
+ );
532
+ }
313
533
  }
314
534
  }
315
535
 
@@ -9,6 +9,7 @@ import {
9
9
  win32,
10
10
  posix,
11
11
  } from "node:path";
12
+ import { isFormalQualityHermeticRuntime } from "./formal-quality-eval-runtime.js";
12
13
 
13
14
  export const PRIVATE_DIRECTORY_MODE = 0o700;
14
15
  export const PRIVATE_FILE_MODE = 0o600;
@@ -608,6 +609,21 @@ const WINDOWS_ACL_BATCH_SIZE = 500;
608
609
  const WINDOWS_ACL_TIMEOUT_ENV = "CC_SECURE_FS_WINDOWS_ACL_TIMEOUT_MS";
609
610
  const MAX_WINDOWS_ACL_TIMEOUT_MS = 5 * 60_000;
610
611
 
612
+ export function _windowsAclWorkingDirectory(
613
+ environment = process.env,
614
+ filesystem = fs,
615
+ ) {
616
+ if (!isFormalQualityHermeticRuntime(environment)) return null;
617
+ const configuredHome = resolve(String(environment.CHAINLESSCHAIN_HOME));
618
+ try {
619
+ const entry = filesystem.lstatSync(configuredHome);
620
+ if (!entry.isDirectory() || entry.isSymbolicLink()) return null;
621
+ } catch {
622
+ return null;
623
+ }
624
+ return configuredHome;
625
+ }
626
+
611
627
  // Windows hosted runners can need more than the normal 15/30 second allowance
612
628
  // to cold-start PowerShell and load the access-control types. A trusted harness
613
629
  // may raise (but never lower) that allowance; the cap prevents an inherited
@@ -636,6 +652,7 @@ function repairWindowsAclOnce(target, deps, options) {
636
652
  }
637
653
 
638
654
  function windowsAcl(target, operation, deps) {
655
+ const workingDirectory = _windowsAclWorkingDirectory(process.env, deps.fs);
639
656
  const result = deps.spawnSync(
640
657
  "powershell.exe",
641
658
  [
@@ -653,6 +670,7 @@ function windowsAcl(target, operation, deps) {
653
670
  encoding: "utf8",
654
671
  windowsHide: true,
655
672
  timeout: _resolveWindowsAclTimeout(15_000),
673
+ ...(workingDirectory ? { cwd: workingDirectory } : {}),
656
674
  },
657
675
  );
658
676
  let details = null;
@@ -679,6 +697,7 @@ function windowsAcl(target, operation, deps) {
679
697
 
680
698
  function windowsAclBatch(targets, operation, deps, expectedKind = null) {
681
699
  if (targets.length === 0) return [];
700
+ const workingDirectory = _windowsAclWorkingDirectory(process.env, deps.fs);
682
701
  const result = deps.spawnSync(
683
702
  "powershell.exe",
684
703
  [
@@ -700,6 +719,7 @@ function windowsAclBatch(targets, operation, deps, expectedKind = null) {
700
719
  windowsHide: true,
701
720
  timeout: _resolveWindowsAclTimeout(30_000),
702
721
  maxBuffer: 4 * 1024 * 1024,
722
+ ...(workingDirectory ? { cwd: workingDirectory } : {}),
703
723
  },
704
724
  );
705
725
  let details = [];
@@ -19,7 +19,10 @@ import path from "path";
19
19
  import broker from "../lib/process-execution-broker/index.js";
20
20
  import os from "os";
21
21
  import { createHash, randomUUID } from "node:crypto";
22
+ import skillInvocationReceipt from "@chainlesschain/session-core/skill-invocation-receipt";
22
23
  import { isProxy } from "node:util/types";
24
+
25
+ const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
23
26
  import sharedCodingAgentPolicy from "./coding-agent-policy.cjs";
24
27
  import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
25
28
  import sharedPermissionRules from "../lib/permission-rules.cjs";
@@ -3570,6 +3573,8 @@ export async function executeTool(name, args, context = {}) {
3570
3573
  onProviderReceipt: context.onProviderReceipt || null,
3571
3574
  onToolCallBoundary: context.onToolCallBoundary || null,
3572
3575
  onToolCallSettlement: context.onToolCallSettlement || null,
3576
+ hookTraceId: context.hookTraceId || null,
3577
+ skillLifecycleMode: context.skillLifecycleMode || "active",
3573
3578
  backgroundUsageFailureState: context.backgroundUsageFailureState || null,
3574
3579
  planManager,
3575
3580
  permissionRules: context.permissionRules || null,
@@ -3707,6 +3712,7 @@ export async function executeTool(name, args, context = {}) {
3707
3712
  { cwd, broker },
3708
3713
  )
3709
3714
  : null,
3715
+ skipAsyncWithoutDispatcher: true,
3710
3716
  },
3711
3717
  );
3712
3718
  for (const hookResult of outcome.results || []) {
@@ -5151,6 +5157,7 @@ async function executeToolInner(
5151
5157
  // Hook-envelope tracing: this run's trace id, threaded into child loops
5152
5158
  // (spawn_sub_agent / isolated run_skill) as their parent_id.
5153
5159
  hookTraceId = null,
5160
+ skillLifecycleMode = "active",
5154
5161
  },
5155
5162
  ) {
5156
5163
  const localToolDescriptor =
@@ -7866,6 +7873,63 @@ async function executeToolInner(
7866
7873
  });
7867
7874
  }
7868
7875
 
7876
+ const selectedSkillDigest =
7877
+ match.executionIdentity?.contentDigest ||
7878
+ `sha256:${createHash("sha256").update(admittedSkillBody).digest("hex")}`;
7879
+ const toolSetDigest = `sha256:${createHash("sha256")
7880
+ .update(
7881
+ JSON.stringify(
7882
+ [...(effectiveAllowedToolNames || [])].map(String).sort(),
7883
+ ),
7884
+ )
7885
+ .digest("hex")}`;
7886
+ const policyDigest = `sha256:${createHash("sha256")
7887
+ .update(
7888
+ JSON.stringify({
7889
+ hasApprovalGate: Boolean(approvalGate),
7890
+ hasPermissionRules: Boolean(permissionRules),
7891
+ hasSandbox: Boolean(sandbox),
7892
+ hermeticExecution: hermeticExecution === true,
7893
+ }),
7894
+ )
7895
+ .digest("hex")}`;
7896
+ const invocationStartedAt = Date.now();
7897
+ const invocationStart = startSkillInvocation({
7898
+ attributionRequired: ["automatic-candidate", "canary"].includes(
7899
+ skillLifecycleMode,
7900
+ ),
7901
+ evolutionRunId: workflowEffectId || sessionId,
7902
+ traceId: hookTraceId || sessionId,
7903
+ trajectorySegmentId: turnId || toolCallId,
7904
+ selectedSkillDigest,
7905
+ routerCandidates: [
7906
+ {
7907
+ digest: selectedSkillDigest,
7908
+ score: 1,
7909
+ reason: "explicit-run_skill",
7910
+ },
7911
+ ],
7912
+ providerModelVersion:
7913
+ llmOptions?.provider && llmOptions?.model
7914
+ ? `${llmOptions.provider}:${llmOptions.model}`
7915
+ : null,
7916
+ toolSetDigest,
7917
+ osSandboxPermissionPolicyDigest: policyDigest,
7918
+ taskCohort: "cli:run_skill",
7919
+ });
7920
+ const settleInvocation = (executionStatus, result = {}) =>
7921
+ settleSkillInvocation(invocationStart, {
7922
+ executionStatus,
7923
+ graderReceipts: result.graderReceipts || [],
7924
+ userCorrectionRef: result.userCorrectionRef || null,
7925
+ tokensInput:
7926
+ result.usage?.inputTokens || result.usage?.tokensInput || 0,
7927
+ tokensOutput:
7928
+ result.usage?.outputTokens || result.usage?.tokensOutput || 0,
7929
+ costUsd: result.usage?.costUsd || result.costUsd || 0,
7930
+ latencyMs: Date.now() - invocationStartedAt,
7931
+ });
7932
+
7869
7933
  // Check if skill requests isolation (via SKILL.md frontmatter)
7870
7934
  const skillIsolation = match.isolation === true;
7871
7935
  if (skillIsolation) {
@@ -8066,6 +8130,7 @@ async function executeToolInner(
8066
8130
  success: false,
8067
8131
  isolated: true,
8068
8132
  skill: args.skill_name,
8133
+ invocationReceipt: settleInvocation("failed", result),
8069
8134
  code: result?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
8070
8135
  error: `Isolated skill execution failed: ${failureDetail}`,
8071
8136
  ...(result?.summary ? { summary: result.summary } : {}),
@@ -8075,6 +8140,7 @@ async function executeToolInner(
8075
8140
  success: true,
8076
8141
  isolated: true,
8077
8142
  skill: args.skill_name,
8143
+ invocationReceipt: settleInvocation("completed", result),
8078
8144
  summary: result.summary,
8079
8145
  toolsUsed: result.toolsUsed,
8080
8146
  });
@@ -8096,6 +8162,7 @@ async function executeToolInner(
8096
8162
  success: false,
8097
8163
  isolated: true,
8098
8164
  skill: args.skill_name,
8165
+ invocationReceipt: settleInvocation("failed"),
8099
8166
  code: err?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
8100
8167
  error: `Isolated skill execution failed: ${err.message}`,
8101
8168
  });
@@ -8112,6 +8179,7 @@ async function executeToolInner(
8112
8179
  return attachDescriptor({
8113
8180
  error: `Skill "${args.skill_name}" cannot execute handler.js directly. Add isolation: true and use the controlled agent-tool path.`,
8114
8181
  code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
8182
+ invocationReceipt: settleInvocation("blocked"),
8115
8183
  policy: { decision: "blocked", via: "skill-execution-boundary" },
8116
8184
  });
8117
8185
  }
@@ -1 +0,0 @@
1
- import{I as C,P as c,J as f,U as r,c as g,_ as k,R as n,V as l,K as d,Q as u,S as h,b as t}from"./vendor-Bn1JzzAn.js";import{_ as j}from"./index-zGH9zH3w.js";import{aH as w}from"./icons-DG5UD-6K.js";const M={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),s=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:s,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return w}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},N={class:"email-row"},O={class:"left"},V={class:"body"},A={class:"head"},B={class:"from"},D={class:"time"},E={class:"subject"},L={key:0,class:"snippet"},R={class:"meta"};function U(_,m,a,e,i,p){const s=C("a-tag");return c(),f("div",N,[r("div",O,[g(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",V,[r("div",A,[r("span",B,n(e.fromText),1),r("span",D,n(e.formattedTime),1)]),r("div",E,n(e.subjectText),1),e.snippetText?(c(),f("div",L,n(e.snippetText),1)):l("v-if",!0),r("div",R,[g(s,{color:"blue",class:"src"},{default:d(()=>[u(n(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),h(s,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+n(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),h(s,{key:1},{default:d(()=>[u(n(e.category),1)]),_:1})):l("v-if",!0)])])])}const P=j(M,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{P as default};
@@ -1 +0,0 @@
1
- import{I as k,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-Bn1JzzAn.js";import{_ as w}from"./index-zGH9zH3w.js";import"./icons-DG5UD-6K.js";const S={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},D={class:"val"},R={class:"row"},B={class:"val"},I={class:"row amount-row"},j={class:"val amount"},q={key:0,class:"row"},A={class:"val mono"},F={key:1,class:"row"};function L(p,r,o,e,d,m){const c=k("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",D,n(e.merchantText),1)]),s("div",R,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",B,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",q,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=w(S,[["render",L],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
@@ -1,7 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-DTftcclX.js","./vendor-Bn1JzzAn.js","./index-zGH9zH3w.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-Dpj7D6tC.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-4MT7SpGk.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-DSmFkNKV.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-BQpXA9kj.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
2
- import{E as ue,r as R,b as w,I as y,P as u,J as O,U as v,c,S as C,V as E,_ as M,F as V,Z as se,a0 as ae,R as L,K as m,Q as b,W as j,o as J}from"./vendor-Bn1JzzAn.js";import{u as U}from"./usePersonalDataHub-xp9F9szv.js";import{_ as F,e as A,d as q}from"./index-zGH9zH3w.js";import{aa as P,ag as Q,M as z,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 ge,R as _e}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),a=R(null),l=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,g=null;const x=w(()=>t.value.length>0),D=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 _(){const S=++d;e.value=!0,a.value=null;const p=U();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:B})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(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=U();try{const p=await S.searchEvents(h({cursor:n.value,limit:B}));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},g&&clearTimeout(g),g=setTimeout(()=>{g=null,_()},Z)}function ie(S){return r.value={...I,...S},g&&(clearTimeout(g),g=null),_()}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:x,canLoadMore:D,search:_,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ye=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["meeting-","system"],["vscode","system"],["vscodium","system"],["jetbrains-ide","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["hbuilderx","system"],["local-files","system"],["cursor","ai-chat"],["claude-code","ai-chat"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:K,shopping:H,travel:G,system:z,"ai-chat":Q,other:P};function a(i){return o[i]||P}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 P},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return G},get MobileOutlined(){return z},get RobotOutlined(){return Q},get CATEGORIES(){return ye},get categoryLabel(){return N}};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=y("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(V,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,L(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=F(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-LDgqkb/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((_,k)=>k[1]-_[1]).map(([_,k])=>({value:_,label:`${_} (${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 g(h){o("set-filter","q",h||"")}function x(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[_,k]=h;o("set-filter","since",_?+_:null),o("set-filter","until",k?+k:null)}const D={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:g,onDateChange:x,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}},Re={class:"pdh-filter-bar"},Le={key:1,class:"hint"},xe={key:2,class:"hint"};function De(r,t,n,e,o,a){const l=y("a-input-search"),s=y("a-select"),i=y("a-range-picker"),d=y("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]=g=>r.$emit("set-filter","adapter",g||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]=g=>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",Le,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",xe,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):E("v-if",!0)])}const je=F(Ee,[["render",De],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Ae={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=j(()=>A(()=>import("./ChatBubbleRenderer-DTftcclX.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=j(()=>A(()=>import("./OrderTableRenderer-Dpj7D6tC.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=j(()=>A(()=>import("./TimelineRenderer-4MT7SpGk.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=j(()=>A(()=>import("./EmailListRenderer-DSmFkNKV.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=j(()=>A(()=>import("./GenericCardRenderer-BQpXA9kj.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const g=d&&d.source&&d.source.adapter;switch($(g)){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:j,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function Fe(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=F(Ae,[["render",Fe],["__file","/tmp/cc-web-panel-LDgqkb/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 qe={__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),g=oe(i,n.category);re(d,g,o[i]),q.success(`已导出 ${n.events.length} 条到 ${g}`)}catch(d){q.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:a,onClick:l,computed:w,get DownloadOutlined(){return ge},get DownOutlined(){return me},get message(){return q},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 Pe(r,t,n,e,o,a){const l=y("a-button"),s=y("a-menu-item"),i=y("a-menu"),d=y("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(" 导出 ("+L(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=F(qe,[["render",Pe],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function a(s,i){n.setFilter(s,i)}J(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:J,computed:w,get ReloadOutlined(){return _e},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:je,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Je={class:"main-pane"},Ue={class:"results-summary"},Qe={key:0},ze={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=y("a-tag"),s=y("a-button"),i=y("a-space"),d=y("a-col"),g=y("a-spin"),x=y("a-alert"),D=y("a-empty"),h=y("a-row");return u(),O("div",Ne,[v("div",Me,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(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]=_=>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",Je,[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]=_=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Ue,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",Qe,[c(g,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(V,{key:1},[v("strong",null,L(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",ze,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,L(e.categoryLabel(e.store.filters.category)),1),v("strong",null,L(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,L(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):E("v-if",!0),v("span",He," / 已显示 "+L(e.store.results.length),1)],64))]),e.store.error?(u(),C(x,{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(D,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):E("v-if",!0),v("div",Ke,[(u(!0),O(V,null,se(e.store.results,(_,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${_.id}`,event:_},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=_=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):E("v-if",!0)])]),_:1})]),_:1})])}const nt=F(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-zGH9zH3w.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-BBV2iCjT.js";import{a0 as t}from"./index-zGH9zH3w.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-BC2DGkWP.js";import"./useFlexGapSupport-pcGKJ4pT.js";import"./styleChecker-IfN9Bxoi.js";import"./index-B9Gh-SOn.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-BDM8l-r5.js";import{a0 as t}from"./index-zGH9zH3w.js";import"./vendor-Bn1JzzAn.js";import"./index-B9Gh-SOn.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};