chainlesschain 0.166.45 → 0.166.47

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 (230) hide show
  1. package/README.md +6 -4
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-CrMhYNeH.js → AIOps-CDpT0WXV.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DLY5blZ3.js → ActionButton-BNfUljWx.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-C0NhKQB0.js → Analytics-C9323DEx.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DLyepgMq.js → AppLayout-CRrjb2db.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-Depk01Sa.js → Artifacts-Db-DGqJS.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-jKe6NQ3J.js → Audit-CJdHRJ0W.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CG4GKT9s.js → BackgroundAgents-_RSCnTYs.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DYWCkzwM.js → Backup-8GFQi-dM.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xm5vodmJ.js → BaseInput-C87NtgUZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-B20_PNd3.js → Chat-DcTMWS8G.js} +5 -5
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D4d-eh0F.js → ChatBubbleRenderer-5ZDPTW_H.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-CfgwkV_r.js → Checkbox-DM9EmYee.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DbnoWI44.js → Codegen-M2YqDRNN.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CfzzhgGw.js → Col-oB1LLxyf.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BU7mGM8p.js → Community-TcVZK5tF.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DpYim0an.js → Compact-XKmq-3K_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BNJcO6ra.js → Compliance-C6CBiDRy.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CecZ-pWj.js → Cowork-Dz9CGqXH.js} +4 -4
  21. package/src/assets/web-panel/assets/{Cron-BG_C1fe3.js → Cron-CxJDgDVL.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BAeILQLL.js → Crosschain-DMP0JsaQ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-CYqOEkXi.js → DID-I5IQeogb.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-BYU8wmL1.js → Dashboard-BfLW2MXj.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DYlJeTTa.js → Dropdown-BK8EjAlh.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-C0M6py3K.js → EmailListRenderer-C3iqSv5I.js} +1 -1
  27. package/src/assets/web-panel/assets/EvolutionSettings-BJmBzpW6.js +1 -0
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Du90iDch.js → FamilyGuardDashboard-T19rnqm-.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-DkFp_hzB.js → Federation-CozrbPMy.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BGgtGTfG.js → FormItemContext-k1dCLNNJ.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-BIDsSCei.js → GenericCardRenderer-DbaW_Jvt.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git--d3Te93J.js → Git-CQHRyEIt.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-CZwD0vmO.js → Governance-BMJYZgMy.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DiDcSFEW.js → Inference-B7mpNU7V.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Bi0hSfzg.js → KnowledgeGraph-Br0Blg6B.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-C8NHSc0K.js → Logs-HIdk0S6M.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-DfDuADqF.js → MarkdownRenderer-HxeocBHy.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-D6kD0bNf.js → Marketplace-Bkfq69UP.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-mTSamCr5.js → McpTools-dtmx0bHO.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-YQBXfLjU.js → Memory-CrRlOuEf.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-D2awuupp.js → MobileBridge-D4ZIZiAH.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-Bl7lZc_-.js → MobileProjects-C90Rw7GE.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-CBqjLK2Q.js → Mtc-CC6k_uh4.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-C4poRInZ.js → MtcAudit-T_CUIYUy.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-C_J0zXYZ.js → Multisig-N_e0RRWk.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Ci43sWOU.js → NLProgramming-Iq3VzEv0.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-DN7A-GFZ.js → Notes-B5sKJUJt.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-D5jNm71V.js → NotificationSettings-K8UVp8qQ.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-C9UsPOG8.js → OrderTableRenderer-BWNyM-6m.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BapYMJrP.js → Organization-DMO1NJxI.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-BwxwjhFw.js → Overflow-BBY6b31Z.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-TObXXOu3.js → P2P-DmsL0y0v.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-UwJvMbFO.js → PdhVaultBrowser-C65AX_RY.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-Damnxv-O.js → Permissions-CWcpRtWa.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-d_7jlBb-.js → PersonalDataHub--ZNDIdsn.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-DA87VjLw.js → Pipeline-DCdj5NGb.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DzO_UvWn.js → Privacy-BRKu7Q3E.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CwqECDhs.js → ProjectInit-BJ7ozIAb.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CT5YdIl6.js → ProjectSettings-B2cVLiXW.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-D3KdZPCv.js → Projects-Ce9r_W-p.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BjBIS8kk.js → Providers-BDespvGZ.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-mMFqiKkI.js → QrScannerModal-BUNO4fDU.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BwGi9ZU1.js → QuickAsk-D2TUqeBV.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-BY65SR5s.js → Recommend-BNNQPHBH.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BGsVH_XU.js → RemoteSession-D2t1V_Cm.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-DpPbxSgI.js → Reputation-DVK5hEqI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-B5YBYoVz.js → Row-BB9RTwmE.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DvM5jaoh.js → RssFeed-DmEO7liZ.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-6RX39EPO.js → Search-UwEYjnDB.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Beal-7cM.js → Security-DebqSsMp.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-D6rjVLe-.js → Services-CuuPts3C.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-Dur7R7vz.js → Skeleton-DbWpmbgf.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-D1QkGwMk.js → Skills-BaK7SxzT.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-3ObrX8Es.js → Sla-BFHv51Jb.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-DG_KAiH1.js → SpeechSettings-B9b1R6uK.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-BaHq0SJ2.js → SyncSettings-BnO0CN02.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-BDpAkBAB.js → Tasks-Dy01Vq49.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-tYdoRd-c.js → Templates-BCy2AMHc.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-yGS5zIQ1.js → Tenant-4Tx9y_Y1.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B3QbmVFa.js → Terminal-CPOoUH8J.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-B_7Pr5dS.js → TimelineRenderer-C85GlJzu.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-DPvpDa53.js → Tokens-_xneFBGF.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-DcSAD0GZ.js → Trigger-BizG4rTr.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BBzEq-uy.js → Trust-Dh8EIn3n.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Dssav7-5.js → UkeySign-C5NWoHWQ.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CPOZf4yi.js → VideoEditing-0YfrySL6.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BzBVRXEq.js → Wallet-BZVH8Ags.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DdSGaCCh.js → WebAuthn-kNofa6vm.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CKjBFoSs.js → WorkflowEditor-BNO34_j0.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-B9aMGLg0.js → chat-ifQ2FlwD.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-GFCMctSV.js → colors-1TL8H6EH.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BqSDFAYJ.js → compact-item-DBfRjs_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BwUm3Ffp.js → createContext-Bs6V4iBf.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BHnbnuYL.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DN1kMJOT.js → hasIn-Bz6LMY_0.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B4dI_csl.js → index--WvT2Il3.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-B7Yu5wwV.js → index-84mi5rsv.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DAK28GY8.js → index-B5SJCUZ7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CmEHzOsw.js → index-B6RClMZl.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-By9GbJhu.js → index-BB1Af7Fv.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-7W1e9Vi4.js → index-BQL_tldd.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BDL2MwxN.js → index-BXJXMaZe.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CEMl-Qte.js → index-BhPDhmvN.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BCnbC2z7.js → index-BiZ7Nz5-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cwih67e8.js → index-BoCTDcn6.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DI90Wo_P.js → index-BxqC3LiO.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-THsr_UUJ.js → index-C6c0j-Ki.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-PKwZkQDC.js → index-C7d6QlfR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-rCTtYCGu.js → index-C9QYxq61.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Ci0zIpSX.js → index-CBh48_Mh.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-tMF_deZb.js → index-CNKHoXWI.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-B9Pe-EyB.js → index-CXVBQ82k.js} +3 -3
  113. package/src/assets/web-panel/assets/{index-B4MfxM5W.js → index-CXtiLagi.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DaFr7XB1.js → index-Cn7EIWmI.js} +1 -1
  115. package/src/assets/web-panel/assets/index-CsRz9-ZH.js +1 -0
  116. package/src/assets/web-panel/assets/{index-D8jcp9Rj.js → index-CtB45Hok.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Cli0VREv.js → index-Cu_V6ZJH.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DO-IKERp.js → index-Cykt9BbN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-y7cfh9rP.js → index-DDhy4eCS.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CH2wK5dx.js → index-DEPPzM8I.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BeycSy7n.js → index-DMVktlxG.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BwssFWI1.js → index-DOww5Qny.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-PJt1Zrx2.js → index-DWPp-d07.js} +1 -1
  124. package/src/assets/web-panel/assets/index-DnjMFf3m.js +1 -0
  125. package/src/assets/web-panel/assets/{index-BPGlcDvs.js → index-DvM2xBUA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BL_0ndQc.js → index-EK3XtMxA.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DnJt9DaX.js → index-XJIV7HEw.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BpiR6uzH.js → index-cNwsev6n.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-bwb4cg_D.js → index-f_7L9GvP.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DbDhKroq.js → index-lUL3bD2z.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DvvJWwT8.js → index-pOUFfRdN.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BBMW8bQO.js → index-rGhS02f8.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CRikhGgx.js → index-vHtnQsnV.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BHUxz4dy.js → index-vb1XIxEB.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-B6e5CZ5p.js → initDefaultProps-DpRIjwTt.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-riMM1KfJ.js → motion-CG4_9o-Z.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-C1NSDMjc.js → move-Dku1fXtf.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Bibuny9B.js → mtc-parser-BvAVeX-3.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Cmf6FoRn.js → omit-DFu0x78D.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-BSsYBUCY.js → pickAttrs-CmI-FNcK.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-gSB7-GAS.js → placementArrow-CGERYewB.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-qaqttvKa.js → responsiveObserve-D7G8bF5J.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-RX2gxl3k.js → slide-B2sXwWXy.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DEJmkhqw.js → statusUtils-DI5yh0n3.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CIWmJ78O.js → styleChecker-deGJ5dp_.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-D-UPSQBE.js → useFlexGapSupport-OqHBXEmi.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-9QFtqADc.js → useFs-Dqgx0Qv_.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DM6kyift.js → usePersonalDataHub-Be-lveh2.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-C-q6FNSJ.js → vnode-CFxB876W.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-D4WJY2m8.js → zoom-BFOYrl4e.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +3 -3
  153. package/src/commands/agent.js +11 -7
  154. package/src/commands/background-session.js +31 -3
  155. package/src/commands/chat.js +5 -1
  156. package/src/commands/eval.js +86 -28
  157. package/src/commands/llm.js +104 -1
  158. package/src/commands/plugin.js +130 -1
  159. package/src/commands/sandbox.js +121 -2
  160. package/src/commands/serve.js +11 -2
  161. package/src/commands/skill.js +29 -0
  162. package/src/data/changelog.json +26 -0
  163. package/src/gateways/ws/session-protocol.js +13 -0
  164. package/src/gateways/ws/ws-agent-handler.js +17 -0
  165. package/src/gateways/ws/ws-server.js +3 -0
  166. package/src/gateways/ws/ws-session-state.js +131 -0
  167. package/src/generated/cc-agent-protocol.schema.json +4 -0
  168. package/src/lazy-dispatch.js +8 -1
  169. package/src/lib/agent-sandbox.js +337 -53
  170. package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
  171. package/src/lib/app-server/server.js +93 -0
  172. package/src/lib/background-agent-keeper-client.js +2 -0
  173. package/src/lib/background-agent-keeper-protocol.js +7 -0
  174. package/src/lib/background-agent-supervisor.js +194 -47
  175. package/src/lib/codex-app-server-adapter.js +81 -27
  176. package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
  177. package/src/lib/context-memory-kernel/provider-context.js +53 -19
  178. package/src/lib/deferred-question-context.js +122 -0
  179. package/src/lib/eval/evidence.js +202 -64
  180. package/src/lib/eval/plugin-suite.js +917 -0
  181. package/src/lib/eval/runner.js +10 -3
  182. package/src/lib/evolution/agent-evolution-ingress.js +60 -8
  183. package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
  184. package/src/lib/evolution/agent-model-projection.js +97 -1
  185. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
  186. package/src/lib/evolution/evolution-artifact-ports.js +6 -0
  187. package/src/lib/evolution/evolution-deployment-loader.js +188 -10
  188. package/src/lib/evolution/evolution-eval-gate.js +8 -0
  189. package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
  190. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
  191. package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
  192. package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
  193. package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
  194. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
  195. package/src/lib/evolution/evolution-ledger.js +57 -1
  196. package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
  197. package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
  198. package/src/lib/evolution/governed-hub-llm.js +238 -5
  199. package/src/lib/evolution/governed-hub-resolver.js +82 -4
  200. package/src/lib/evolution/governed-hub-skill.js +11 -5
  201. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
  202. package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
  203. package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
  204. package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
  205. package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
  206. package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
  207. package/src/lib/goal-context.js +14 -5
  208. package/src/lib/interaction-adapter.js +166 -1
  209. package/src/lib/model-capabilities.js +271 -0
  210. package/src/lib/model-context-catalog.js +105 -0
  211. package/src/lib/model-context-window.js +4 -49
  212. package/src/lib/openai-responses.js +428 -0
  213. package/src/lib/plugin-runtime/scopes.js +7 -1
  214. package/src/lib/remote-read-loop-guard.js +2 -2
  215. package/src/lib/runtime-usage-ledger.js +16 -0
  216. package/src/lib/skill-loader.js +12 -0
  217. package/src/lib/with-file-lock.js +3 -1
  218. package/src/repl/agent-repl.js +6 -2
  219. package/src/runtime/agent-core.js +357 -44
  220. package/src/runtime/agent-runtime.js +7 -0
  221. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  222. package/src/runtime/headless-runner.js +4 -1
  223. package/src/runtime/headless-stream.js +133 -44
  224. package/src/runtime/runtime-factory.js +26 -2
  225. package/src/workers/background-agent-keeper.js +23 -13
  226. package/src/workers/background-agent-worker.js +27 -13
  227. package/src/assets/web-panel/assets/EvolutionSettings-_QnjPFZJ.js +0 -1
  228. package/src/assets/web-panel/assets/devWarning-LxtRBsCm.js +0 -1
  229. package/src/assets/web-panel/assets/index-36hxBH-o.js +0 -1
  230. package/src/assets/web-panel/assets/index-C0b78zWZ.js +0 -1
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { assertEvolutionContentContainsNoKnownSecrets } from "./evolution-evidence-projector.js";
2
3
 
3
4
  export const WIKI_STATE_SCHEMA = "chainlesschain.evolution-wiki-state/v1";
4
5
  export const WIKI_EVIDENCE_SCHEMA = "chainlesschain.evolution-wiki-evidence/v1";
@@ -126,6 +127,105 @@ function assertMetadataOnly(value, path = "data") {
126
127
  }
127
128
  }
128
129
 
130
+ function assertWikiPlaintextSafe(value) {
131
+ const isDecisionDigestRef = (candidate) =>
132
+ typeof candidate === "string" &&
133
+ candidate.startsWith("decision:") &&
134
+ DIGEST.test(candidate.slice("decision:".length));
135
+ const isBoundMaintenanceRequestMapKey = (path, key, child) =>
136
+ path.length === 1 &&
137
+ path[0] === "maintenanceRequests" &&
138
+ MAINTENANCE_REQUEST_ID.test(key) &&
139
+ child &&
140
+ typeof child === "object" &&
141
+ !Array.isArray(child) &&
142
+ DIGEST.test(child.requestDigest ?? "") &&
143
+ key === `wiki-maintenance:${child.requestDigest.slice("sha256:".length)}`;
144
+ const isBoundProposalDecisionEvidence = (path, key, child) =>
145
+ path.length === 1 &&
146
+ path[0] === "evidence" &&
147
+ isDecisionDigestRef(key) &&
148
+ child &&
149
+ typeof child === "object" &&
150
+ !Array.isArray(child) &&
151
+ child.kind === "proposal-decision" &&
152
+ child.ref === key;
153
+ const isProposalDecisionEvidenceRecord = (path, item) =>
154
+ path.length === 2 &&
155
+ path[0] === "evidence" &&
156
+ isDecisionDigestRef(path[1]) &&
157
+ item?.kind === "proposal-decision" &&
158
+ item.ref === path[1];
159
+ const isBoundProposalDecisionArtifactRef = (path, item, key, child) =>
160
+ key === "artifactRef" &&
161
+ isProposalDecisionEvidenceRecord(path, item) &&
162
+ DIGEST.test(item.data?.releaseDigest ?? "") &&
163
+ child ===
164
+ `artifact://${item.tenantId}/trusted/${item.data.releaseDigest.slice("sha256:".length)}`;
165
+ const isBoundProposalDecisionReceiptRef = (path, item, key, child) =>
166
+ path.length === 4 &&
167
+ path[0] === "skillImpact" &&
168
+ path[2] === "decisions" &&
169
+ path[3] === "[]" &&
170
+ key === "receiptRef" &&
171
+ DIGEST.test(item.candidateId ?? "") &&
172
+ child === `decision:${item.candidateId}`;
173
+ const isProposalImpactCandidateSubject = (path, item, key, child) =>
174
+ path.length === 2 &&
175
+ path[0] === "evolutionLog" &&
176
+ path[1] === "[]" &&
177
+ key === "subjectId" &&
178
+ item.type === "proposal-impact-recorded" &&
179
+ DIGEST.test(child ?? "");
180
+ const isBoundProtocolValue = (path, item, key, child) =>
181
+ (key.endsWith("Digest") && DIGEST.test(child ?? "")) ||
182
+ (key === "candidateId" && DIGEST.test(child ?? "")) ||
183
+ isProposalImpactCandidateSubject(path, item, key, child) ||
184
+ isBoundProposalDecisionReceiptRef(path, item, key, child) ||
185
+ isBoundProposalDecisionArtifactRef(path, item, key, child) ||
186
+ (isProposalDecisionEvidenceRecord(path, item) &&
187
+ key === "ref" &&
188
+ child === path[1]) ||
189
+ (key === "revisionId" && REVISION_ID.test(child ?? "")) ||
190
+ (key === "requestId" && MAINTENANCE_REQUEST_ID.test(child ?? ""));
191
+ const inspect = (item, path = []) => {
192
+ if (typeof item === "string") {
193
+ assertEvolutionContentContainsNoKnownSecrets(item);
194
+ } else if (Array.isArray(item)) {
195
+ item.forEach((child) => inspect(child, [...path, "[]"]));
196
+ } else if (item && typeof item === "object") {
197
+ for (const [key, child] of Object.entries(item)) {
198
+ // Maintenance requests are stored under their validated, digest-bound
199
+ // request ID. The map key is opaque protocol metadata, not model text;
200
+ // inspecting random hash bytes as prose can falsely match PII patterns.
201
+ // Restrict the exemption to the state map and inspect its complete
202
+ // record so an untrusted lookalike key cannot bypass this boundary.
203
+ if (
204
+ !isBoundMaintenanceRequestMapKey(path, key, child) &&
205
+ !isBoundProposalDecisionEvidence(path, key, child)
206
+ )
207
+ assertEvolutionContentContainsNoKnownSecrets(key);
208
+ // Protocol metadata can carry random hash bytes that accidentally match
209
+ // a PII detector. Every exemption is bound to its state path, schema and
210
+ // sibling fields; prose and lookalikes still go through the detector.
211
+ if (isBoundProtocolValue(path, item, key, child)) continue;
212
+ if (["string", "number"].includes(typeof child))
213
+ assertEvolutionContentContainsNoKnownSecrets(`${key}=${child}`);
214
+ inspect(child, [...path, key]);
215
+ }
216
+ }
217
+ };
218
+ try {
219
+ inspect(value);
220
+ } catch (cause) {
221
+ const error = new Error("Wiki revision contains secret or PII plaintext", {
222
+ cause,
223
+ });
224
+ error.code = "WIKI_MAINTAINER_SECRET_LEAK";
225
+ throw error;
226
+ }
227
+ }
228
+
129
229
  export function createEmptyWikiState(tenantId) {
130
230
  return freeze({
131
231
  schema: WIKI_STATE_SCHEMA,
@@ -301,6 +401,36 @@ function evidenceUsable(item, effectiveAt) {
301
401
  );
302
402
  }
303
403
 
404
+ // Corroboration needs distinct content AND distinct trust domains. Counting
405
+ // either set alone lets the same observation be repeated under new identities.
406
+ // A bounded bipartite matching also handles policies requiring >2 sources,
407
+ // where min(unique contents, unique domains) can still overcount independence.
408
+ function independentSourceCount(evidence) {
409
+ const domains = new Map();
410
+ for (const item of evidence) {
411
+ if (!domains.has(item.trustDomain))
412
+ domains.set(item.trustDomain, new Set());
413
+ domains.get(item.trustDomain).add(item.sourceDigest);
414
+ }
415
+ const matchedSources = new Map();
416
+ const match = (domain, visited) => {
417
+ for (const source of domains.get(domain)) {
418
+ if (visited.has(source)) continue;
419
+ visited.add(source);
420
+ if (
421
+ !matchedSources.has(source) ||
422
+ match(matchedSources.get(source), visited)
423
+ ) {
424
+ matchedSources.set(source, domain);
425
+ return true;
426
+ }
427
+ }
428
+ return false;
429
+ };
430
+ for (const domain of domains.keys()) match(domain, new Set());
431
+ return matchedSources.size;
432
+ }
433
+
304
434
  function rebuildDerivedState(state, effectiveAt, descriptor) {
305
435
  const dependents = {};
306
436
  for (const pattern of Object.values(state.patterns)) {
@@ -352,7 +482,10 @@ function rebuildDerivedState(state, effectiveAt, descriptor) {
352
482
  pattern.status = WIKI_PATTERN_STATUS.STALE;
353
483
  } else if (negative.length > 0 || pattern.contradicts.length > 0)
354
484
  pattern.status = WIKI_PATTERN_STATUS.CONTRADICTED;
355
- else if (hasGrader || domains.length >= descriptor.minCorroboratingSources)
485
+ else if (
486
+ hasGrader ||
487
+ independentSourceCount(positive) >= descriptor.minCorroboratingSources
488
+ )
356
489
  pattern.status = WIKI_PATTERN_STATUS.CORROBORATED;
357
490
  else pattern.status = WIKI_PATTERN_STATUS.HYPOTHESIS;
358
491
  pattern.trustDomains = domains;
@@ -735,6 +868,10 @@ export class EvidenceBackedWikiMaintainer {
735
868
  revisionId: state.revisionId,
736
869
  };
737
870
  }
871
+ // Trusted inputs do not make a model's derived output safe to persist.
872
+ // Inspect the complete outgoing state, including reasons, index and log,
873
+ // before publishing any revision artifact. Share the Raw/Skill policy.
874
+ assertWikiPlaintextSafe(state);
738
875
  const stateDigest = hash(state);
739
876
  const revision = freeze({
740
877
  ...revisionPayload,
@@ -742,6 +879,22 @@ export class EvidenceBackedWikiMaintainer {
742
879
  stateDigest,
743
880
  state: freeze(clone(state)),
744
881
  });
882
+ // Derivation may await a model or another worker. Re-resolve through the
883
+ // trusted evidence boundary immediately before writing: prior read success
884
+ // is not permission to publish after revocation, deletion, or expiry. A
885
+ // changed but valid envelope requires fresh derivation, never a silent swap.
886
+ for (const ref of refs) {
887
+ const current = verifyEvidence(
888
+ await this._ports.resolveEvidence(ref),
889
+ this.descriptor.tenantId,
890
+ ref,
891
+ );
892
+ if (current.envelopeDigest !== evidenceByRef.get(ref).envelopeDigest) {
893
+ const error = new Error("Wiki evidence changed during derivation");
894
+ error.code = "WIKI_MAINTAINER_EVIDENCE_CHANGED";
895
+ throw error;
896
+ }
897
+ }
745
898
  const committed = await this._ports.commitRevision(
746
899
  freeze({ expectedStateDigest: priorStateDigest, revision }),
747
900
  );
@@ -78,6 +78,8 @@ export const EVOLUTION_ARTIFACT_LEDGER_RETENTION_TYPES = Object.freeze([
78
78
  "skill-registry-transition-request",
79
79
  "skill-registry-transition-settlement",
80
80
  "skill-retrieval-revocation-state",
81
+ "skill-runtime-revalidation-state",
82
+ "evolution-ledger-v2-journal",
81
83
  "evolution-run-event",
82
84
  "evolution-eval-child-evidence",
83
85
  "evolution-raw-deletion-receipt",
@@ -177,6 +179,8 @@ export const EVOLUTION_ARTIFACT_TYPES = Object.freeze([
177
179
  "skill-registry-transition-request",
178
180
  "skill-registry-transition-settlement",
179
181
  "skill-retrieval-revocation-state",
182
+ "skill-runtime-revalidation-state",
183
+ "evolution-ledger-v2-journal",
180
184
  "skill-release-finalization",
181
185
  "skill-release-state-migration",
182
186
  "structured-memory-authority-receipt",
@@ -381,6 +385,8 @@ const LEDGER_RETENTION_PURPOSES_BY_TYPE = new Map([
381
385
  ["skill-registry-transition-request", new Set(["evolution-ledger"])],
382
386
  ["skill-registry-transition-settlement", new Set(["evolution-ledger"])],
383
387
  ["skill-retrieval-revocation-state", new Set(["evolution-ledger"])],
388
+ ["skill-runtime-revalidation-state", new Set(["evolution-ledger"])],
389
+ ["evolution-ledger-v2-journal", new Set(["evolution-ledger"])],
384
390
  ["wiki-pruning-journal", new Set(["evolution-ledger"])],
385
391
  ["wiki-pruning-retrieval-projection", new Set(["evolution-ledger"])],
386
392
  ["evolution-run-event", new Set(["evolution-ledger"])],
@@ -27,6 +27,7 @@ const SUPPORTED_COMMANDS = new Set([
27
27
  "marketplace",
28
28
  "orchestrate",
29
29
  "serve",
30
+ "skill",
30
31
  "stream",
31
32
  "ui",
32
33
  ]);
@@ -128,11 +129,129 @@ function dependencies(value, commandName) {
128
129
  throw new TypeError(
129
130
  `evolution deployment returned invalid dependencies for ${commandName}`,
130
131
  );
131
- return Object.freeze({ ...value });
132
+ return Object.freeze({
133
+ ...value,
134
+ ...(["agent", "skill", "chat", "serve"].includes(commandName)
135
+ ? { skillRuntimeAdmissionRequired: true }
136
+ : {}),
137
+ });
138
+ }
139
+
140
+ function deniedAgentDependencies(commandName, code, message, source = null) {
141
+ if (commandName !== "agent") return null;
142
+ const evolutionCompositionFactory = Object.freeze(async () => {
143
+ const error = new Error(message);
144
+ error.code = code;
145
+ throw error;
146
+ });
147
+ if (
148
+ source === null ||
149
+ typeof source !== "object" ||
150
+ Array.isArray(source) ||
151
+ utilTypes.isProxy(source)
152
+ ) {
153
+ return Object.freeze({ evolutionCompositionFactory });
154
+ }
155
+ const descriptors = Object.getOwnPropertyDescriptors(source);
156
+ const result = {};
157
+ for (const [name, descriptor] of Object.entries(descriptors)) {
158
+ if (name === "evolutionCompositionFactory" || !("value" in descriptor)) {
159
+ continue;
160
+ }
161
+ Object.defineProperty(result, name, {
162
+ value: descriptor.value,
163
+ enumerable: descriptor.enumerable,
164
+ configurable: false,
165
+ writable: false,
166
+ });
167
+ }
168
+ Object.defineProperty(result, "evolutionCompositionFactory", {
169
+ value: evolutionCompositionFactory,
170
+ enumerable: true,
171
+ configurable: false,
172
+ writable: false,
173
+ });
174
+ return Object.freeze(result);
175
+ }
176
+
177
+ function authenticatedDependencies(value, commandName) {
178
+ if (commandName !== "agent") return dependencies(value, commandName);
179
+ if (
180
+ value === null ||
181
+ typeof value !== "object" ||
182
+ Array.isArray(value) ||
183
+ utilTypes.isProxy(value)
184
+ ) {
185
+ return deniedAgentDependencies(
186
+ commandName,
187
+ "EVOLUTION_DEPLOYMENT_INVALID_DEPENDENCIES",
188
+ "Authenticated agent deployment returned invalid dependencies",
189
+ );
190
+ }
191
+ const descriptor = Object.getOwnPropertyDescriptor(
192
+ value,
193
+ "evolutionCompositionFactory",
194
+ );
195
+ if (
196
+ !descriptor ||
197
+ !("value" in descriptor) ||
198
+ typeof descriptor.value !== "function" ||
199
+ descriptor.enumerable !== true
200
+ ) {
201
+ return deniedAgentDependencies(
202
+ commandName,
203
+ "EVOLUTION_DEPLOYMENT_INVALID_DEPENDENCIES",
204
+ "Authenticated agent deployment did not provide an evolution composition factory",
205
+ value,
206
+ );
207
+ }
208
+ return dependencies(value, commandName);
132
209
  }
133
210
 
134
211
  async function loadBuiltInFactories(commandName) {
135
212
  const factories = {};
213
+ if (
214
+ ["agent", "skill", "chat", "serve", "evolution", "learning"].includes(
215
+ commandName,
216
+ )
217
+ ) {
218
+ const [
219
+ runtime,
220
+ adapter,
221
+ registry,
222
+ ledgerPorts,
223
+ artifactPorts,
224
+ ledgerBackend,
225
+ artifactStore,
226
+ manifest,
227
+ ] = await Promise.all([
228
+ import("./skill-runtime-revalidation.js"),
229
+ import("./skill-runtime-revalidation-ledger-adapter.js"),
230
+ import("./skill-release-registry.js"),
231
+ import("./evolution-ledger-ports.js"),
232
+ import("./evolution-artifact-ports.js"),
233
+ import("./evolution-ledger-file-backend.js"),
234
+ import("../artifact-store.js"),
235
+ import("./skill-execution-manifest.js"),
236
+ ]);
237
+ Object.assign(factories, {
238
+ createSkillRuntimeRevalidationAuthority:
239
+ runtime.createSkillRuntimeRevalidationAuthority,
240
+ createSkillRuntimeRevalidationLedgerAdapter: (options) =>
241
+ new adapter.SkillRuntimeRevalidationLedgerAdapter(options),
242
+ createSkillReleaseRegistry: (options) =>
243
+ new registry.SkillReleaseRegistry(options),
244
+ createEvolutionLedgerPorts: ledgerPorts.createEvolutionLedgerPorts,
245
+ createEvolutionArtifactPorts: (options) =>
246
+ new artifactPorts.EvolutionArtifactPorts(options),
247
+ createEvolutionLedgerFileBackend:
248
+ ledgerBackend.createEvolutionLedgerFileBackend,
249
+ createArtifactStore: (options) =>
250
+ new artifactStore.ArtifactStore(options),
251
+ buildSkillRuntimeManifest: manifest.buildSkillRuntimeManifest,
252
+ buildSkillDependencyLock: manifest.buildSkillDependencyLock,
253
+ });
254
+ }
136
255
  if (commandName === "learning") {
137
256
  const [
138
257
  { createGovernedSkillSynthesisCliHost },
@@ -229,9 +348,7 @@ async function loadBuiltInFactories(commandName) {
229
348
  import("./evolution-eval-process-supervisor.js"),
230
349
  import("./governed-skill-synthesis-attestor-trust-approval-client.js"),
231
350
  import("./governed-skill-synthesis-attestor-trust-operations-client.js"),
232
- import(
233
- "./governed-skill-synthesis-attestor-trust-operations-cli-host.js"
234
- ),
351
+ import("./governed-skill-synthesis-attestor-trust-operations-cli-host.js"),
235
352
  ]);
236
353
  factories.createEvolutionWorkbenchCliHost = createEvolutionWorkbenchCliHost;
237
354
  factories.createEvolutionWorkbenchReviewRuntime =
@@ -346,6 +463,7 @@ async function loadBuiltInFactories(commandName) {
346
463
  }
347
464
  if (
348
465
  commandName === "agent" ||
466
+ commandName === "learning" ||
349
467
  commandName === "ask" ||
350
468
  commandName === "chat" ||
351
469
  commandName === "compact" ||
@@ -355,14 +473,47 @@ async function loadBuiltInFactories(commandName) {
355
473
  commandName === "cowork" ||
356
474
  commandName === "orchestrate" ||
357
475
  commandName === "serve" ||
476
+ commandName === "skill" ||
358
477
  commandName === "stream" ||
359
478
  commandName === "ui"
360
479
  ) {
361
- const { createAgentEvolutionRuntimeComposition } = await import(
362
- "./agent-evolution-runtime-composition.js"
363
- );
480
+ const {
481
+ assembleAgentSkillOutcomeIndexFromCatalog,
482
+ createAgentEvolutionRuntimeComposition,
483
+ } = await import("./agent-evolution-runtime-composition.js");
364
484
  factories.createAgentEvolutionRuntimeComposition =
365
485
  createAgentEvolutionRuntimeComposition;
486
+ const [
487
+ { createEvolutionEvalRuntimeComposition },
488
+ { EvolutionEvalGate, EvolutionEvalReceiptVerifier },
489
+ { createEvolutionEvalProcessSupervisor },
490
+ ] = await Promise.all([
491
+ import("./evolution-eval-runtime-composition.js"),
492
+ import("./evolution-eval-gate.js"),
493
+ import("./evolution-eval-process-supervisor.js"),
494
+ ]);
495
+ Object.assign(factories, {
496
+ createEvolutionEvalRuntimeComposition,
497
+ createEvolutionEvalGate: (options) => new EvolutionEvalGate(options),
498
+ createEvolutionEvalReceiptVerifier: (options) =>
499
+ new EvolutionEvalReceiptVerifier(options),
500
+ createEvolutionEvalProcessSupervisor,
501
+ });
502
+ if (commandName === "skill") {
503
+ const [
504
+ { createSkillOutcomeSourceCatalogAuthority },
505
+ { createSkillVectorProcessAuthority },
506
+ ] = await Promise.all([
507
+ import("./skill-outcome-source-catalog-authority.js"),
508
+ import("../skill-vector-process-authority.js"),
509
+ ]);
510
+ factories.assembleAgentSkillOutcomeIndexFromCatalog =
511
+ assembleAgentSkillOutcomeIndexFromCatalog;
512
+ factories.createSkillOutcomeSourceCatalogAuthority =
513
+ createSkillOutcomeSourceCatalogAuthority;
514
+ factories.createSkillVectorProcessAuthority =
515
+ createSkillVectorProcessAuthority;
516
+ }
366
517
  }
367
518
  return Object.freeze(factories);
368
519
  }
@@ -382,6 +533,7 @@ function bindFactoriesToModule(factories, moduleDigest) {
382
533
  "createWikiSkillBenchmarkGrader",
383
534
  "createWikiSkillBenchmarkReportAttestor",
384
535
  "createWikiSkillBenchmarkRunner",
536
+ "createEvolutionEvalRuntimeComposition",
385
537
  ];
386
538
  for (const name of providerFactories) {
387
539
  if (typeof factories[name] !== "function") continue;
@@ -494,6 +646,20 @@ export async function loadEvolutionDeploymentCommandDependencies(
494
646
  let saved = null;
495
647
  if (!descriptorPath && !trustRootPath) {
496
648
  saved = await readEvolutionDeploymentProfile({ env });
649
+ if (saved.error) {
650
+ return deniedAgentDependencies(
651
+ commandName,
652
+ "EVOLUTION_DEPLOYMENT_PROFILE_INVALID",
653
+ "Saved evolution deployment profile is invalid",
654
+ );
655
+ }
656
+ if (saved.profile && !saved.profile.enabled) {
657
+ return deniedAgentDependencies(
658
+ commandName,
659
+ "EVOLUTION_DEPLOYMENT_DISABLED",
660
+ "Saved evolution deployment profile is disabled",
661
+ );
662
+ }
497
663
  if (!saved.error && saved.profile?.enabled) {
498
664
  descriptorPath = saved.profile.descriptorPath;
499
665
  trustRootPath = saved.profile.trustRootPath;
@@ -531,11 +697,23 @@ export async function loadEvolutionDeploymentCommandDependencies(
531
697
  // governed capabilities fail-closed while allowing `deployment status`,
532
698
  // `configure`, and `disable` to start so the operator can recover. Explicit
533
699
  // environment overrides remain strict and surface the error immediately.
534
- if (fromSavedProfile) return null;
700
+ if (fromSavedProfile) {
701
+ return deniedAgentDependencies(
702
+ commandName,
703
+ error?.code || "EVOLUTION_DEPLOYMENT_NOT_VERIFIED",
704
+ `Saved evolution deployment could not be verified: ${error?.message || String(error)}`,
705
+ );
706
+ }
535
707
  throw error;
536
708
  }
537
709
  const { descriptor, moduleBytes } = verified;
538
- if (!descriptor.commands.includes(commandName)) return null;
710
+ if (!descriptor.commands.includes(commandName)) {
711
+ return deniedAgentDependencies(
712
+ commandName,
713
+ "EVOLUTION_DEPLOYMENT_COMMAND_NOT_ALLOWED",
714
+ `Signed evolution deployment does not admit command: ${commandName}`,
715
+ );
716
+ }
539
717
  // Import the exact bytes that were authenticated. Importing modulePath here
540
718
  // would reopen a pathname-replacement window between hashing and execution.
541
719
  // Deployment entrypoints are therefore single-file ESM bundles; any external
@@ -578,7 +756,7 @@ export async function loadEvolutionDeploymentCommandDependencies(
578
756
  "additional evolution deployment factories are invalid",
579
757
  );
580
758
  }
581
- return dependencies(
759
+ return authenticatedDependencies(
582
760
  await loaded.createChainlessChainCommandDependencies(
583
761
  Object.freeze({
584
762
  commandName,
@@ -6437,6 +6437,14 @@ export class EvolutionEvalReceiptVerifier {
6437
6437
  Object.freeze(EvolutionEvalGate.prototype);
6438
6438
  Object.freeze(EvolutionEvalReceiptVerifier.prototype);
6439
6439
 
6440
+ export function isEvolutionEvalGate(value) {
6441
+ return GATE_INSTANCES.has(value);
6442
+ }
6443
+
6444
+ export function isEvolutionEvalReceiptVerifier(value) {
6445
+ return RECEIPT_VERIFIER_INSTANCES.has(value);
6446
+ }
6447
+
6440
6448
  export async function runEvolutionEvalGate(gate, request) {
6441
6449
  if (!GATE_INSTANCES.has(gate)) {
6442
6450
  throw evalError(