chainlesschain 0.166.38 → 0.166.39

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 (196) hide show
  1. package/package.json +6 -1
  2. package/scripts/governed-learning-local-attestor-service.mjs +222 -0
  3. package/scripts/governed-learning-local-attestor-trust-approval-service.mjs +338 -0
  4. package/scripts/governed-learning-local-attestor-trust-operations-service.mjs +575 -0
  5. package/scripts/governed-learning-windows-secure-pipe-broker.ps1 +375 -0
  6. package/src/assets/web-panel/assets/{AIOps-DBbcVPqB.js → AIOps-qWUdiFr5.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-D5vETPOk.js → ActionButton-B_f7go3E.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-WVhas3Fw.js → Analytics-hSGFlSkB.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-CSTRI93Q.js → AppLayout-CCYGgj71.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-BZT8FOoE.js → Artifacts-BdS1H9gq.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-CT2-Tsby.js → Audit-Cck9IebC.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-BWA5LNBe.js → BackgroundAgents-DZzoM_QS.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-B-zEbldA.js → Backup-D8H_QtGu.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-BAEwtdNT.js → BaseInput-CTsNF_pu.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-BT1-y6t1.js → Chat-CcEiTYY8.js} +6 -6
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BVijMHeO.js → ChatBubbleRenderer-9BY1DPuc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-B8IJYZsD.js → Checkbox-BPB9NNJx.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-DEt453nL.js → Codegen-CKKMf7jD.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-DWuVSmZv.js → Col-DpSSB4Uu.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-CcoNuU33.js → Community-CfR6ikoH.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BKtuIYWA.js → Compact-CqnkGGjK.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-bHzxGq3P.js → Compliance-9IzhdVQb.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-BY2Kb15t.js → Cowork-eXsgH33N.js} +2 -2
  24. package/src/assets/web-panel/assets/{Cron-DC-j0jvp.js → Cron-DvkzHFRi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-CzEuAHQz.js → Crosschain--az9d9f7.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-7QUNq6Fz.js → DID-_Eb4kpnJ.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-CT6RiEFl.js → Dashboard-aDVisdXj.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-CW8IPY7r.js → Dropdown-oQ54XzS9.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-Zt8WOLuN.js → EmailListRenderer-BUPdMau1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B6aymxi7.js → FamilyGuardDashboard-DtQTOCQI.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BiuFrRq0.js → Federation-Cpnb3Moe.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DaiOAkHa.js → FormItemContext-DmsrJkeU.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-D1KbDpXs.js → GenericCardRenderer-CpFDYnh3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BILl0huA.js → Git-HFG17p7Q.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-CLyhrPrh.js → Governance-D5Z5c7N8.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DyNhiIpK.js → Inference-DH159h74.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Bor_ye4m.js → KnowledgeGraph-DuL1pcJD.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-ZDqbu8kg.js → Logs-Gqn8hFsM.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-NHJaejHI.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DbDi29dH.js → Marketplace-BArcWifg.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DfU8dWbV.js → McpTools-Q1BfBSnd.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-DeAz-2-6.js → Memory-Cz8nRL7N.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-ws3TJXal.js → MobileBridge-CRuxLRJw.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-CGwVfeTv.js → MobileProjects-B1CQIAGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-BtJjJJpl.js → Mtc-CFhXZbPk.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-BNZwipXs.js → MtcAudit-C69LqcZ5.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-9mSOrKWA.js → Multisig-y7yZeTTG.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-gz1lEDED.js → NLProgramming-DgjhoWea.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BeufuOVX.js → Notes-DRc2WTDh.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-CbFyi9jZ.js → NotificationSettings-CLPx24yn.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-CMSNA4CO.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-DKBKNViH.js → Organization-Dm6LIyhZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{Overflow-CvPfKE1x.js → Overflow-DP4DOYd-.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-DjL2q8og.js → P2P-HFwvtFI1.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-D9gPfKRM.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-BUoNho3w.js → Permissions-Bdtxniwh.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-C4Iu2Pic.js → PersonalDataHub-Dgl2AbES.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-BiDrIlwr.js → Pipeline-DpZrzYwK.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BnvU6vGp.js → Privacy-EQ551c0t.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DDzoyhnH.js → ProjectInit-xUSeczsM.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-CV6b43H0.js → ProjectSettings-B66Sr_t8.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-B0k1907g.js → Projects-B4zikj95.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DaeuFo-x.js → Providers-DjLbqQPh.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-C03Bll1h.js → QrScannerModal-KVsAQCd_.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-Cn9nLaen.js → QuickAsk-C4noJXu8.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BXfkC8Ts.js → Recommend-Cn15clqY.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DNj6D_LI.js → RemoteSession-DdonMFwH.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-DDDIwiUI.js → Reputation-Bqe3NwWN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-JukNm-id.js → Row-CnxBgjkD.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-B1AhzL2z.js → RssFeed-CSRrgZyK.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-B5y6_DVm.js → Search-DTUYUfFx.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-C2pvv32x.js → Security-BHExHVIm.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-DBka7ppY.js → Services-B_IWqPes.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DfPwNTSh.js → Skeleton-C_oAtzmX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-Cs4ntp-l.js → Skills-maJNokSL.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-CrUJ0guM.js → Sla-CMM_ZsLH.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-BFbokLV1.js → SpeechSettings-D7w_oNwK.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-CSnh1o3D.js → SyncSettings-D0Zl3NIr.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-CQZppIPo.js → Tasks-Bs0H0ctR.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BqLeHq7Z.js → Templates-C6T6oCpR.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CkzPA-ri.js → Tenant-ByL-kAYO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-D5IRhnu6.js → Terminal-6JXNhc3b.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-ICdiYzgz.js → TimelineRenderer-KiuUtCsl.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-89CaZBwe.js → Tokens-C0TWTIER.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-Di251qR1.js → Trigger-DpC5aaJu.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-M4sC3Mv6.js → Trust-lqqflCwv.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-BL7EUWxj.js → UkeySign-BYSlVfBc.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BV5Se5il.js → VideoEditing-DX08oo_R.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-IoY13rov.js → Wallet-CcIFPvzL.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DKFPq0uV.js → WebAuthn-D8DfxfVT.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-oizkYeQD.js → WorkflowEditor-Csadpaln.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-Du6ZthE5.js → chat-CewHWc_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-I2ie73HS.js → colors-B8at89r3.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-C-02XOOx.js → compact-item-v_gxtF5-.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DgP09zg2.js → createContext-BOwFpJqA.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DenB_kSS.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-kWDasRib.js → hasIn-DjHUzt7E.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-HH3Zccc0.js → index-1Tfwr_GA.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-M9mzJo6V.js → index-5qmLo1us.js} +1 -1
  100. package/src/assets/web-panel/assets/index-B8bNwM9U.js +1 -0
  101. package/src/assets/web-panel/assets/{index-CDM6OO4D.js → index-BC20EQ7h.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cokjvq67.js → index-BGrmPk8T.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-5Ll5Fdqb.js → index-BPJ7uL2Q.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-H_31JkaZ.js → index-BRNyE3Kb.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D9HwtJX5.js → index-BVPsegMN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Bpz5RnQy.js → index-B_egGFcR.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-CjuJ1FYZ.js → index-BdZLA7k9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cx5dAdFu.js → index-Bk_Te9OR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CHSghc3j.js → index-Bz8C8VXx.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-RwcHDSqP.js → index-C7MHbmwn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CtbMRqD-.js → index-CFL1Hewx.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D0EQSoEb.js → index-CV1SgaBd.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C3D5NSjS.js → index-CXIPAeAB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BZ6bWk4x.js → index-Ca8YZU2B.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AtAiEmjM.js → index-Caf9UjhG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DKJ-d5F1.js → index-Cb1uNDOv.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-mF8UmKqp.js → index-CquUCUzS.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CpOQeTac.js → index-CwHoF-TP.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Na5QA1LE.js → index-Cxk0mCoQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BUvpjPMv.js → index-D3o-pacB.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BZcdP3id.js → index-DA3n0Y28.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DC0cpgIP.js +1 -0
  123. package/src/assets/web-panel/assets/{index-LLQQqj9B.js → index-DRRK_8Eg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D5LV04FO.js → index-DUMvVGyf.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BkcCllZ7.js → index-DdHdbXpy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-OYyn8GoU.js → index-Ddw05Myq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CgogPjKJ.js → index-Dfrb3Prv.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CbHEQTU6.js → index-DiKaYIdo.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CQCdk4dn.js → index-DmZLZsyC.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-uHI8QHu4.js → index-FgUrhq_H.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-I4A_y2Ee.js → index-Khw7wzVk.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BSlTGxUJ.js → index-San3zacc.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BYxia8nl.js → index-coOi37of.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CkP2DW3a.js → index-hyeBuocp.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Ryflob2W.js → index-uk59xr0W.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DcVj7YJB.js → index-wjvn8-9F.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BPHGo-UX.js → initDefaultProps-Id2dFdjh.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BBr8JvWc.js → motion-DRxtwxng.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CdKWToz7.js → move-BDYvdTb6.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-B8tkkKBs.js → mtc-parser-cz8LGI8Z.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DN4aP33H.js → omit-DHJeh6tH.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CoHRkRJq.js → pickAttrs-XJEQIp7e.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DpGGGAPa.js → placementArrow-AFcf8lEn.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-BabRsZo5.js → responsiveObserve-CDEeBxs1.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DJjyrwqK.js → slide-CvbVfi6T.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BaRVkO5S.js → statusUtils-DtCyuEnq.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-HcMYUjTR.js → styleChecker--UgmTsGY.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-c3IBzp2l.js → useFlexGapSupport-D9i1as-Y.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-DD7igwyF.js → useFs-CJx3zw01.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-GEF0hhnd.js → usePersonalDataHub-ZsIKYdZv.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-D51u7zqF.js → vnode-B2RGEQG4.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-tXG23Lc9.js → zoom-ob-0px2z.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/evolution-attestor-trust.js +113 -0
  156. package/src/commands/evolution.js +2 -0
  157. package/src/commands/learning.js +34 -5
  158. package/src/data/changelog.json +13 -0
  159. package/src/lib/evolution/evolution-artifact-ports.js +21 -0
  160. package/src/lib/evolution/evolution-deployment-loader.js +56 -0
  161. package/src/lib/evolution/evolution-immutable-ledger-segment-store.js +812 -0
  162. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +218 -0
  163. package/src/lib/evolution/evolution-ledger-manifest-catalog.js +472 -0
  164. package/src/lib/evolution/evolution-ledger-manifest-chain.js +997 -0
  165. package/src/lib/evolution/evolution-ledger-manifest-head-store.js +408 -0
  166. package/src/lib/evolution/evolution-ledger-manifest-witness-adapter.js +554 -0
  167. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +460 -0
  168. package/src/lib/evolution/governed-skill-synthesis-attestor-ipc-endpoint.js +94 -0
  169. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-approval-client.js +485 -0
  170. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ipc-capability.js +200 -0
  171. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ledger.js +1222 -0
  172. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-cli-host.js +802 -0
  173. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-client.js +445 -0
  174. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations.js +1082 -0
  175. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operator-registry.js +1453 -0
  176. package/src/lib/evolution/governed-skill-synthesis-candidate-evaluator.js +147 -0
  177. package/src/lib/evolution/governed-skill-synthesis-cli-host.js +115 -0
  178. package/src/lib/evolution/governed-skill-synthesis-evaluation-ledger-adapter.js +715 -0
  179. package/src/lib/evolution/governed-skill-synthesis-external-attestor.js +499 -0
  180. package/src/lib/evolution/governed-skill-synthesis-model-evaluator.js +514 -0
  181. package/src/lib/evolution/governed-skill-synthesis-process-attestor-worker.mjs +208 -0
  182. package/src/lib/evolution/governed-skill-synthesis-process-attestor.js +557 -0
  183. package/src/lib/evolution/governed-skill-synthesis-process-grader-worker.mjs +143 -0
  184. package/src/lib/evolution/governed-skill-synthesis-process-grader.js +444 -0
  185. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +220 -0
  186. package/src/lib/evolution/governed-skill-synthesis-windows-secure-pipe-host.js +236 -0
  187. package/src/lib/hook-audit-store.js +68 -2
  188. package/src/lib/hooks-v2-runtime.js +52 -26
  189. package/src/lib/learning/skill-synthesizer.js +66 -5
  190. package/src/lib/remote-read-loop-guard.js +30 -3
  191. package/src/assets/web-panel/assets/MarkdownRenderer-DnSfkf98.js +0 -1
  192. package/src/assets/web-panel/assets/OrderTableRenderer-CFbhBT44.js +0 -1
  193. package/src/assets/web-panel/assets/PdhVaultBrowser-Cv9PLMWJ.js +0 -7
  194. package/src/assets/web-panel/assets/devWarning-CxKkOIjh.js +0 -1
  195. package/src/assets/web-panel/assets/index-b5a6l3Uu.js +0 -1
  196. package/src/assets/web-panel/assets/index-xt-BOyp_.js +0 -1
@@ -0,0 +1,236 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const READY_SCHEMA = "chainlesschain.windows-secure-pipe-broker-ready/v1";
7
+ const REQUEST_SCHEMA = "chainlesschain.windows-secure-pipe-broker-request/v1";
8
+ const RESPONSE_SCHEMA = "chainlesschain.windows-secure-pipe-broker-response/v1";
9
+ const SECURITY_KEYS = new Set([
10
+ "acl",
11
+ "aclDigest",
12
+ "peerIdentity",
13
+ "principalDigest",
14
+ "remoteClients",
15
+ ]);
16
+ const PIPE_PREFIX = "\\\\.\\pipe\\";
17
+ const PIPE_NAME =
18
+ /^cc-evolution-attestor-trust-(?:approval|ops)-[a-f0-9]{16,64}$/u;
19
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
20
+
21
+ function exact(value, keys) {
22
+ return (
23
+ value &&
24
+ typeof value === "object" &&
25
+ !Array.isArray(value) &&
26
+ Object.getPrototypeOf(value) === Object.prototype &&
27
+ Reflect.ownKeys(value).length === keys.size &&
28
+ Reflect.ownKeys(value).every(
29
+ (key) => typeof key === "string" && keys.has(key),
30
+ )
31
+ );
32
+ }
33
+
34
+ function normalizeSecurity(value) {
35
+ if (
36
+ !exact(value, SECURITY_KEYS) ||
37
+ value.acl !== "protected-current-logon-dacl" ||
38
+ value.peerIdentity !== "client-process-token-user-and-logon-sid" ||
39
+ value.remoteClients !== false ||
40
+ !DIGEST.test(value.aclDigest ?? "") ||
41
+ !DIGEST.test(value.principalDigest ?? "")
42
+ ) {
43
+ throw new Error(
44
+ "Windows secure pipe broker security descriptor is invalid",
45
+ );
46
+ }
47
+ return Object.freeze({ ...value });
48
+ }
49
+
50
+ function powershellPath() {
51
+ const windowsRoot = process.env.SystemRoot || process.env.WINDIR;
52
+ if (typeof windowsRoot !== "string" || windowsRoot.length < 3) {
53
+ throw new Error("Windows secure pipe broker cannot locate PowerShell");
54
+ }
55
+ return path.join(
56
+ windowsRoot,
57
+ "System32",
58
+ "WindowsPowerShell",
59
+ "v1.0",
60
+ "powershell.exe",
61
+ );
62
+ }
63
+
64
+ export async function createGovernedSkillSynthesisWindowsSecurePipeHost({
65
+ endpoint,
66
+ maxFrameBytes,
67
+ onRequest,
68
+ }) {
69
+ if (process.platform !== "win32") {
70
+ throw new Error("Windows secure pipe host is only available on Windows");
71
+ }
72
+ const pipeName = endpoint.startsWith(PIPE_PREFIX)
73
+ ? endpoint.slice(PIPE_PREFIX.length)
74
+ : "";
75
+ if (
76
+ !PIPE_NAME.test(pipeName) ||
77
+ !Number.isSafeInteger(maxFrameBytes) ||
78
+ maxFrameBytes < 1024 ||
79
+ maxFrameBytes > 1024 * 1024 ||
80
+ typeof onRequest !== "function"
81
+ ) {
82
+ throw new TypeError("Windows secure pipe host configuration is invalid");
83
+ }
84
+
85
+ const scriptPath = fileURLToPath(
86
+ new URL(
87
+ "../../../scripts/governed-learning-windows-secure-pipe-broker.ps1",
88
+ import.meta.url,
89
+ ),
90
+ );
91
+ const child = spawn(
92
+ powershellPath(),
93
+ [
94
+ "-NoLogo",
95
+ "-NoProfile",
96
+ "-NonInteractive",
97
+ "-ExecutionPolicy",
98
+ "Bypass",
99
+ "-File",
100
+ scriptPath,
101
+ "-PipeName",
102
+ pipeName,
103
+ "-MaxFrameBytes",
104
+ String(maxFrameBytes),
105
+ ],
106
+ {
107
+ windowsHide: true,
108
+ stdio: ["pipe", "pipe", "pipe"],
109
+ },
110
+ );
111
+ child.stdin.setDefaultEncoding("utf8");
112
+ let stderr = "";
113
+ child.stderr.on("data", (chunk) => {
114
+ if (stderr.length < 32 * 1024) stderr += chunk.toString("utf8");
115
+ });
116
+
117
+ let ready = false;
118
+ let settled = false;
119
+ let resolveReady;
120
+ let rejectReady;
121
+ const readyPromise = new Promise((resolve, reject) => {
122
+ resolveReady = resolve;
123
+ rejectReady = reject;
124
+ });
125
+ const lines = createInterface({ input: child.stdout, crlfDelay: Infinity });
126
+
127
+ const failReady = (error) => {
128
+ if (settled) return;
129
+ settled = true;
130
+ rejectReady(error);
131
+ };
132
+ child.once("error", failReady);
133
+ child.once("exit", (code, signal) => {
134
+ if (!ready) {
135
+ failReady(
136
+ new Error(
137
+ `Windows secure pipe broker exited before ready (${code ?? signal ?? "unknown"}): ${stderr.trim()}`,
138
+ ),
139
+ );
140
+ }
141
+ });
142
+ lines.on("line", async (line) => {
143
+ let message;
144
+ try {
145
+ message = JSON.parse(line);
146
+ } catch {
147
+ failReady(new Error("Windows secure pipe broker returned invalid JSON"));
148
+ child.kill();
149
+ return;
150
+ }
151
+ if (!ready) {
152
+ try {
153
+ if (
154
+ !exact(message, new Set(["ok", "schema", "security"])) ||
155
+ message.schema !== READY_SCHEMA ||
156
+ message.ok !== true
157
+ ) {
158
+ throw new Error("Windows secure pipe broker readiness is invalid");
159
+ }
160
+ const security = normalizeSecurity(message.security);
161
+ ready = true;
162
+ settled = true;
163
+ resolveReady(security);
164
+ } catch (error) {
165
+ failReady(error);
166
+ child.kill();
167
+ }
168
+ return;
169
+ }
170
+ let response;
171
+ try {
172
+ if (
173
+ !exact(
174
+ message,
175
+ new Set([
176
+ "clientPrincipalDigest",
177
+ "clientProcessId",
178
+ "connectionId",
179
+ "frame",
180
+ "schema",
181
+ ]),
182
+ ) ||
183
+ message.schema !== REQUEST_SCHEMA ||
184
+ !/^[a-f0-9]{32}$/u.test(message.connectionId ?? "") ||
185
+ !Number.isSafeInteger(message.clientProcessId) ||
186
+ message.clientProcessId < 1 ||
187
+ !DIGEST.test(message.clientPrincipalDigest ?? "") ||
188
+ typeof message.frame !== "string" ||
189
+ Buffer.byteLength(message.frame, "utf8") > maxFrameBytes
190
+ ) {
191
+ throw new Error("Windows secure pipe broker request is invalid");
192
+ }
193
+ response = await onRequest({
194
+ frame: message.frame,
195
+ peer: Object.freeze({
196
+ processId: message.clientProcessId,
197
+ principalDigest: message.clientPrincipalDigest,
198
+ }),
199
+ });
200
+ } catch {
201
+ response = { ok: false, requestId: null, code: "request_denied" };
202
+ }
203
+ if (!child.stdin.destroyed) {
204
+ child.stdin.write(
205
+ `${JSON.stringify({
206
+ schema: RESPONSE_SCHEMA,
207
+ connectionId: message.connectionId,
208
+ frame: `${JSON.stringify(response)}\n`,
209
+ })}\n`,
210
+ );
211
+ }
212
+ });
213
+
214
+ const security = await readyPromise;
215
+ return Object.freeze({
216
+ security,
217
+ close() {
218
+ return new Promise((resolve) => {
219
+ if (child.exitCode !== null || child.signalCode !== null) {
220
+ resolve();
221
+ return;
222
+ }
223
+ const timer = setTimeout(() => {
224
+ child.kill();
225
+ resolve();
226
+ }, 2_000);
227
+ timer.unref?.();
228
+ child.once("exit", () => {
229
+ clearTimeout(timer);
230
+ resolve();
231
+ });
232
+ child.kill();
233
+ });
234
+ },
235
+ });
236
+ }
@@ -35,7 +35,7 @@ function digestToken(value) {
35
35
  }
36
36
 
37
37
  function normalizeRecord(record = {}) {
38
- return {
38
+ const normalized = {
39
39
  schema: HOOK_AUDIT_RECORD_SCHEMA,
40
40
  timestamp: safeToken(record.timestamp || new Date().toISOString(), 64),
41
41
  phase: safeToken(record.phase, 32),
@@ -58,6 +58,23 @@ function normalizeRecord(record = {}) {
58
58
  : null,
59
59
  errorCode: safeToken(record.errorCode, 96),
60
60
  };
61
+ if (record.phase === "no-hooks") {
62
+ normalized.firstTimestamp = safeToken(
63
+ record.firstTimestamp || normalized.timestamp,
64
+ 64,
65
+ );
66
+ normalized.occurrences = Math.max(
67
+ 1,
68
+ Math.min(
69
+ Number.MAX_SAFE_INTEGER,
70
+ Number.isSafeInteger(Number(record.occurrences))
71
+ ? Number(record.occurrences)
72
+ : 1,
73
+ ),
74
+ );
75
+ normalized.eventDigest = digestToken(record.eventDigest || record.eventId);
76
+ }
77
+ return normalized;
61
78
  }
62
79
 
63
80
  function hashRecord(prevHash, record) {
@@ -67,6 +84,13 @@ function hashRecord(prevHash, record) {
67
84
  );
68
85
  }
69
86
 
87
+ function extendNoHookEventDigest(current, eventId) {
88
+ return sha256(
89
+ "chainlesschain.hook-audit-no-hooks.v1",
90
+ `${current || "genesis"}\n${eventId || "unknown"}`,
91
+ );
92
+ }
93
+
70
94
  function validateStore(store) {
71
95
  if (Object.keys(store).length === 0) {
72
96
  return {
@@ -103,13 +127,55 @@ export class HookAuditStore {
103
127
  }
104
128
 
105
129
  append(record) {
106
- const normalized = normalizeRecord({
130
+ let normalized = normalizeRecord({
107
131
  ...record,
108
132
  timestamp: record?.timestamp || this.now(),
109
133
  });
134
+ if (normalized.phase === "no-hooks") {
135
+ normalized = {
136
+ ...normalized,
137
+ eventDigest: extendNoHookEventDigest(null, normalized.eventId),
138
+ };
139
+ }
110
140
  return mutateSecurityStore(this.filePath, "Hook runtime audit", (draft) => {
111
141
  const store = validateStore(draft);
112
142
  if (Object.keys(draft).length === 0) Object.assign(draft, store);
143
+ const last = draft.records.at(-1);
144
+ if (
145
+ normalized.phase === "no-hooks" &&
146
+ last?.record?.phase === "no-hooks" &&
147
+ last.record.event === normalized.event &&
148
+ last.record.status === normalized.status &&
149
+ last.record.decision === normalized.decision
150
+ ) {
151
+ const coalesced = {
152
+ ...normalized,
153
+ firstTimestamp:
154
+ last.record.firstTimestamp ||
155
+ last.record.timestamp ||
156
+ normalized.timestamp,
157
+ occurrences: Math.min(
158
+ Number.MAX_SAFE_INTEGER,
159
+ Math.max(1, Number(last.record.occurrences) || 1) + 1,
160
+ ),
161
+ eventDigest: extendNoHookEventDigest(
162
+ last.record.eventDigest,
163
+ normalized.eventId,
164
+ ),
165
+ };
166
+ const hash = hashRecord(last.prevHash || null, coalesced);
167
+ draft.records[draft.records.length - 1] = {
168
+ record: coalesced,
169
+ prevHash: last.prevHash || null,
170
+ hash,
171
+ };
172
+ draft.headHash = hash;
173
+ return Object.freeze({
174
+ ...coalesced,
175
+ prevHash: last.prevHash || null,
176
+ hash,
177
+ });
178
+ }
113
179
  const prevHash = draft.headHash || draft.anchorHash || null;
114
180
  const hash = hashRecord(prevHash, normalized);
115
181
  draft.records.push({ record: normalized, prevHash, hash });
@@ -611,16 +611,6 @@ class HooksV2Runtime extends EventEmitter {
611
611
  const contract = validateHookEvent(eventName, context);
612
612
  const eventId = context.event_id || context.eventId || crypto.randomUUID();
613
613
  const auditRequired = options.auditRequired === true || this.requireAudit;
614
- this._appendAudit(
615
- {
616
- phase: "dispatch",
617
- event: eventName,
618
- eventId,
619
- status: "accepted",
620
- decision: "continue",
621
- },
622
- { required: auditRequired && contract.decisionCapable },
623
- );
624
614
  const suppliedHooks = Array.isArray(options.additionalHooks)
625
615
  ? options.additionalHooks.map((hook) => normalizeHookDefinition(hook))
626
616
  : [];
@@ -631,6 +621,56 @@ class HooksV2Runtime extends EventEmitter {
631
621
  (hook) =>
632
622
  eventName !== "FileChanged" || fileChangedHookMatches(hook, context),
633
623
  );
624
+ // Resolve and de-duplicate candidates before writing the audit boundary.
625
+ // A lifecycle event with no executable hook is still fail-closed audited
626
+ // at decision gates, but adjacent no-op events are represented by one
627
+ // authenticated aggregate in HookAuditStore instead of two ever-growing
628
+ // records per turn. This keeps repeated no-hook lifecycle events bounded
629
+ // in long-lived IDE/stream sessions without hiding an actual execution.
630
+ const uniqueHooks = [];
631
+ const seen = new Set();
632
+ for (const hook of hooks) {
633
+ if (seen.has(hook.id)) continue;
634
+ seen.add(hook.id);
635
+ uniqueHooks.push(hook);
636
+ }
637
+ uniqueHooks.sort(
638
+ (left, right) =>
639
+ normalizeHookPriority(left.priority) -
640
+ normalizeHookPriority(right.priority) ||
641
+ String(left.id).localeCompare(String(right.id)),
642
+ );
643
+ if (uniqueHooks.length === 0) {
644
+ this._appendAudit(
645
+ {
646
+ phase: "no-hooks",
647
+ event: eventName,
648
+ eventId,
649
+ status: "success",
650
+ decision: "continue",
651
+ },
652
+ { required: auditRequired && contract.decisionCapable },
653
+ );
654
+ return {
655
+ success: true,
656
+ results: [],
657
+ blocked: false,
658
+ requiresApproval: false,
659
+ decision: "continue",
660
+ blockingResult: null,
661
+ schemaVersion: HOOK_EVENT_SCHEMA_VERSION,
662
+ };
663
+ }
664
+ this._appendAudit(
665
+ {
666
+ phase: "dispatch",
667
+ event: eventName,
668
+ eventId,
669
+ status: "accepted",
670
+ decision: "continue",
671
+ },
672
+ { required: auditRequired && contract.decisionCapable },
673
+ );
634
674
  // Reserve the durable record for the inline producer before executing any
635
675
  // hook. A process-level EventRuntimeHost may observe the same store, but it
636
676
  // cannot reclaim this record until the longest declared hook timeout plus
@@ -682,22 +722,8 @@ class HooksV2Runtime extends EventEmitter {
682
722
  pending: true,
683
723
  };
684
724
  }
685
- // Hooks are parallel by default. De-duplicate by id so a reload or layered
686
- // config cannot execute the same handler twice. `parallel:false` remains a
687
- // deterministic compatibility mode for callers that require ordering.
688
- const uniqueHooks = [];
689
- const seen = new Set();
690
- for (const hook of hooks) {
691
- if (seen.has(hook.id)) continue;
692
- seen.add(hook.id);
693
- uniqueHooks.push(hook);
694
- }
695
- uniqueHooks.sort(
696
- (left, right) =>
697
- normalizeHookPriority(left.priority) -
698
- normalizeHookPriority(right.priority) ||
699
- String(left.id).localeCompare(String(right.id)),
700
- );
725
+ // Hooks are parallel by default. `parallel:false` remains a deterministic
726
+ // compatibility mode for callers that require ordering.
701
727
  const runOne = async (
702
728
  hook,
703
729
  { forceObserveOnly = false, dispatcher = null } = {},
@@ -16,15 +16,20 @@
16
16
  * 5. Persist the accepted candidate to an isolated candidate registry
17
17
  */
18
18
 
19
+ import { createHash } from "node:crypto";
19
20
  import fs from "fs";
20
21
  import { firstBalancedJson } from "../json-schema-output.js";
21
22
  import path from "path";
23
+ import { isGovernedSkillSynthesisEvaluationReceipt } from "../evolution/governed-skill-synthesis-model-evaluator.js";
24
+ import { isGovernedSkillSynthesisEvaluationPersistenceReceipt } from "../evolution/governed-skill-synthesis-evaluation-ledger-adapter.js";
22
25
 
23
26
  // ── _deps for test injection ────────────────────────────
24
27
 
25
28
  const _deps = { fs, path };
26
29
 
27
30
  export const SYNTHESIS_UNAVAILABLE_CODE = "LEARNING_SYNTHESIS_UNAVAILABLE";
31
+ export const SYNTHESIS_EVALUATION_DOCUMENT_SCHEMA =
32
+ "chainlesschain.learning-synthesis-evaluation-document/v1";
28
33
 
29
34
  // ── Helpers ─────────────────────────────────────────────
30
35
 
@@ -145,6 +150,7 @@ Output ONLY valid JSON with these fields:
145
150
  "verification": "How to confirm success",
146
151
  "tools": ["tool_name_1", "tool_name_2"]
147
152
  }
153
+ Every value in "tools" MUST be copied exactly from a tool name present in the trajectory.
148
154
  If the trajectory is too specific or not reusable, respond with: {"not_applicable": true}`,
149
155
  },
150
156
  {
@@ -362,7 +368,7 @@ export class SkillSynthesizer {
362
368
  continue;
363
369
  }
364
370
 
365
- await this._persistSkill(skillName, content);
371
+ await this._persistSkill(skillName, content, evaluation);
366
372
 
367
373
  // Only durable, evaluated candidates count as synthesized.
368
374
  this.trajectoryStore.markSynthesized(traj.id, skillName);
@@ -436,9 +442,10 @@ export class SkillSynthesizer {
436
442
  * Write SKILL.md to the isolated candidate output registry.
437
443
  * @param {string} skillName
438
444
  * @param {string} content
439
- * @returns {Promise<{skillDir:string, skillFile:string}>}
445
+ * @param {object|boolean} evaluation
446
+ * @returns {Promise<{skillDir:string, skillFile:string,evaluationFile:string|null}>}
440
447
  */
441
- async _persistSkill(skillName, content) {
448
+ async _persistSkill(skillName, content, evaluation = null) {
442
449
  if (!this.candidateOutputDir) {
443
450
  throw new Error("candidate output registry is unavailable");
444
451
  }
@@ -468,14 +475,68 @@ export class SkillSynthesizer {
468
475
  const skillDir = _deps.path.join(canonicalSkillNamespace, "1.0.0");
469
476
  const canonicalSkillDir = await this._ensurePrivateDirectory(skillDir);
470
477
  this._assertPathWithinCandidateRoot(candidateRoot, canonicalSkillDir);
471
- const skillFile = _deps.path.join(canonicalSkillDir, "SKILL.md");
478
+ let evaluationFile = null;
479
+ if (
480
+ evaluation &&
481
+ typeof evaluation === "object" &&
482
+ evaluation.receipt !== undefined
483
+ ) {
484
+ if (!isGovernedSkillSynthesisEvaluationReceipt(evaluation.receipt)) {
485
+ throw new Error("candidate evaluation receipt is not governed");
486
+ }
487
+ const contentDigest = `sha256:${createHash("sha256")
488
+ .update(content, "utf8")
489
+ .digest("hex")}`;
490
+ if (
491
+ evaluation.receipt.skillName !== skillName ||
492
+ evaluation.receipt.candidateDigest !== contentDigest
493
+ ) {
494
+ throw new Error(
495
+ "candidate evaluation receipt does not bind the persisted candidate",
496
+ );
497
+ }
498
+ if (
499
+ !isGovernedSkillSynthesisEvaluationPersistenceReceipt(
500
+ evaluation.persistence,
501
+ ) ||
502
+ evaluation.persistence.authenticated !== true ||
503
+ evaluation.persistence.durable !== true ||
504
+ evaluation.persistence.persisted !== true ||
505
+ evaluation.persistence.receiptDigest !==
506
+ evaluation.receipt.receiptDigest ||
507
+ evaluation.persistence.candidateDigest !==
508
+ evaluation.receipt.candidateDigest
509
+ ) {
510
+ throw new Error(
511
+ "candidate evaluation receipt is not durably persisted",
512
+ );
513
+ }
514
+ const serialized = JSON.stringify(
515
+ {
516
+ schema: SYNTHESIS_EVALUATION_DOCUMENT_SCHEMA,
517
+ receipt: evaluation.receipt,
518
+ persistence: evaluation.persistence,
519
+ },
520
+ null,
521
+ 2,
522
+ );
523
+ if (!serialized || Buffer.byteLength(serialized, "utf8") > 128 * 1024) {
524
+ throw new Error("candidate evaluation receipt is invalid or oversized");
525
+ }
526
+ evaluationFile = _deps.path.join(canonicalSkillDir, "EVALUATION.json");
527
+ await _deps.fs.promises.writeFile(evaluationFile, `${serialized}\n`, {
528
+ encoding: "utf-8",
529
+ flag: "wx",
530
+ });
531
+ }
472
532
 
533
+ const skillFile = _deps.path.join(canonicalSkillDir, "SKILL.md");
473
534
  await _deps.fs.promises.writeFile(skillFile, content, {
474
535
  encoding: "utf-8",
475
536
  flag: "wx",
476
537
  });
477
538
 
478
- return { skillDir: canonicalSkillDir, skillFile };
539
+ return { skillDir: canonicalSkillDir, skillFile, evaluationFile };
479
540
  }
480
541
 
481
542
  _assertCandidateFilesystemSupport() {
@@ -48,6 +48,28 @@ function urlTarget(value) {
48
48
  };
49
49
  }
50
50
 
51
+ function localCiLogTarget(command) {
52
+ if (
53
+ !/(?:^|[\s;&|])(?:findstr(?:\.exe)?|grep|rg|select-string)\b/iu.test(
54
+ command,
55
+ )
56
+ )
57
+ return null;
58
+ const matches = [
59
+ ...command.matchAll(
60
+ /[%$()A-Za-z0-9_:.\\/-]*(?:gh|github|action|ci)[A-Za-z0-9_.-]*\.(?:log|txt|xml)\b/giu,
61
+ ),
62
+ ];
63
+ const file = matches.at(-1)?.[0];
64
+ if (!file) return null;
65
+ const normalized = file.replaceAll("\\", "/").toLowerCase();
66
+ return {
67
+ key: `local-ci-log:${createHash("sha256").update(normalized).digest("hex")}`,
68
+ github: true,
69
+ localLog: true,
70
+ };
71
+ }
72
+
51
73
  /** Classification only; never parse, rewrite, cache or authorize shell execution. */
52
74
  export function remoteReadTarget(tool, args = {}) {
53
75
  if (tool === "web_search")
@@ -97,7 +119,7 @@ export function remoteReadTarget(tool, args = {}) {
97
119
  );
98
120
  if (api) return githubTarget(api[1], api[2], api[3], api[4]);
99
121
  }
100
- return null;
122
+ return localCiLogTarget(command);
101
123
  }
102
124
 
103
125
  function failedResult(result) {
@@ -107,7 +129,8 @@ function failedResult(result) {
107
129
  result.success === false ||
108
130
  result.isError === true ||
109
131
  result.statusCode >= 400 ||
110
- (Number.isInteger(result.exitCode) && result.exitCode !== 0)
132
+ (Number.isInteger(result.exitCode) && result.exitCode !== 0) ||
133
+ (Number.isInteger(result.exit_code) && result.exit_code !== 0)
111
134
  );
112
135
  }
113
136
 
@@ -234,6 +257,7 @@ export class RemoteReadLoopGuard {
234
257
  return (
235
258
  "Remote-read loop recovery: repeated failures or unchanged GitHub Actions logs detected. " +
236
259
  "Stop repeating the same download, including switching between web_fetch, gh run view and gh api for the same run/job. " +
260
+ "Repeated findstr, grep, rg or Select-String misses against the same saved CI log are also one stalled read: exit code 1 means no match, not a new CI failure. " +
237
261
  "Use the retained evidence for the user's task. For implementation, inspect/fix the relevant local files; for research/review, synthesize the findings without making unsolicited edits. For a missing CI detail, use one authenticated gh run view <run-id> --job <job-id> --log-failed --repo <owner/repo>, save the result once and search that local log. " +
238
262
  "If the overall run is still active but the required job has completed, fetch that job's log directly with gh api repos/<owner>/<repo>/actions/jobs/<job-id>/logs; gh run view may withhold logs until the whole run finishes. " +
239
263
  "Check auth, rate limits or command errors before another attempt. If access remains unavailable, report the exact blocker and useful findings; the task is not complete. " +
@@ -262,9 +286,12 @@ export class RemoteReadLoopGuard {
262
286
  evidence,
263
287
  lastSuccess,
264
288
  page,
289
+ localLog,
265
290
  }) => ({
266
291
  source: github
267
- ? "GitHub Actions logs"
292
+ ? localLog
293
+ ? "saved GitHub Actions log"
294
+ : "GitHub Actions logs"
268
295
  : tool === "web_search"
269
296
  ? "web_search"
270
297
  : "web_fetch",
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-Bpz5RnQy.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function u(t,o,e,r,n,m){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",u],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-ReJu1o/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as w,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 o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-Bpz5RnQy.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{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=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{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=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.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:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},R={class:"row"},V={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},J={key:1,class:"row"};function M(p,r,a,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",R,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",V,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",J,[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 K=S(k,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-ReJu1o/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K as default};