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,10 +1,11 @@
1
1
  /**
2
2
  * Plugin management commands
3
- * chainlesschain plugin list|install|remove|enable|disable|update|info|search|registry|summary
3
+ * chainlesschain plugin list|install|remove|enable|disable|update|info|search|registry|summary|eval
4
4
  */
5
5
 
6
6
  import chalk from "chalk";
7
7
  import fs from "node:fs";
8
+ import path from "node:path";
8
9
  import { logger } from "../lib/logger.js";
9
10
  import {
10
11
  enforcePluginPolicy,
@@ -1435,6 +1436,134 @@ export function registerPluginCommand(program) {
1435
1436
  // component it contributes (skills/agents/hooks/mcp/lsp/monitors/bin/settings),
1436
1437
  // plus path-traversal / schema problems. Optional signature/hash verification
1437
1438
  // reuses the real crypto in plugin-security. No DB, no install — pure inspection.
1439
+ plugin
1440
+ .command("eval <dir>")
1441
+ .description(
1442
+ "Run a local control/candidate effectiveness eval for a plugin",
1443
+ )
1444
+ .option(
1445
+ "--suite <file>",
1446
+ "Suite JSON inside the plugin root (default: evals/suite.json)",
1447
+ )
1448
+ .option("--provider <provider>", "Fixed provider for both eval arms")
1449
+ .option("--model <model>", "Fixed model for both eval arms")
1450
+ .option(
1451
+ "--min-pass-rate-delta <pct>",
1452
+ "Override the suite's minimum candidate gain in percentage points",
1453
+ )
1454
+ .option("--json", "Output the bound report as JSON")
1455
+ .option("--html <file>", "Write a local HTML report")
1456
+ .option("--keep", "Keep per-task temporary workspaces")
1457
+ .option(
1458
+ "--dry-run",
1459
+ "Validate and exercise both arms without a model (never passes the evidence gate)",
1460
+ )
1461
+ .action(async (dir, options) => {
1462
+ try {
1463
+ if (!options.dryRun && (!options.provider || !options.model)) {
1464
+ throw new Error(
1465
+ "plugin eval requires explicit --provider and --model for comparable real runs",
1466
+ );
1467
+ }
1468
+ let minPassRateDelta;
1469
+ if (options.minPassRateDelta !== undefined) {
1470
+ const percentage = Number(options.minPassRateDelta);
1471
+ if (
1472
+ !Number.isFinite(percentage) ||
1473
+ percentage < -100 ||
1474
+ percentage > 100
1475
+ ) {
1476
+ throw new Error(
1477
+ "--min-pass-rate-delta must be between -100 and 100",
1478
+ );
1479
+ }
1480
+ minPassRateDelta = percentage / 100;
1481
+ }
1482
+ const {
1483
+ loadPluginEvalDefinition,
1484
+ renderPluginEvalHtml,
1485
+ runPluginEval,
1486
+ } = await import("../lib/eval/plugin-suite.js");
1487
+ const { makeHeadlessRunAgent } = await import("./eval.js");
1488
+ const definition = loadPluginEvalDefinition(dir, {
1489
+ suiteFile: options.suite,
1490
+ });
1491
+ const dryRunAgent = async () => ({
1492
+ ok: true,
1493
+ output: `${JSON.stringify({
1494
+ type: "result",
1495
+ subtype: "success",
1496
+ is_error: false,
1497
+ result: "(dry-run: no agent)",
1498
+ tool_calls: [],
1499
+ usage: {},
1500
+ total_cost_usd: 0,
1501
+ num_turns: 0,
1502
+ })}\n`,
1503
+ });
1504
+ const shared = {
1505
+ provider: options.provider,
1506
+ model: options.model,
1507
+ ephemeral: true,
1508
+ };
1509
+ const controlRunAgent = options.dryRun
1510
+ ? dryRunAgent
1511
+ : makeHeadlessRunAgent({
1512
+ ...shared,
1513
+ env: { CC_PLUGINS: "0", CC_PLUGIN_SCOPES: "" },
1514
+ });
1515
+ const candidateRunAgent = options.dryRun
1516
+ ? dryRunAgent
1517
+ : makeHeadlessRunAgent({
1518
+ ...shared,
1519
+ env: { CC_PLUGINS: "1", CC_PLUGIN_SCOPES: "project" },
1520
+ });
1521
+ const report = await runPluginEval(definition, {
1522
+ controlRunAgent,
1523
+ candidateRunAgent,
1524
+ provider: options.provider || null,
1525
+ model: options.model || null,
1526
+ dryRun: options.dryRun === true,
1527
+ keepWorkspaces: options.keep === true,
1528
+ ...(minPassRateDelta === undefined ? {} : { minPassRateDelta }),
1529
+ onResult: options.json
1530
+ ? undefined
1531
+ : ({ arm, result }) =>
1532
+ logger.info(
1533
+ ` ${arm.padEnd(9)} ${result.pass ? "✔" : "✗"} ${result.id} (${result.ms}ms)`,
1534
+ ),
1535
+ });
1536
+ if (options.html) {
1537
+ fs.writeFileSync(
1538
+ path.resolve(options.html),
1539
+ renderPluginEvalHtml(report),
1540
+ "utf8",
1541
+ );
1542
+ }
1543
+ if (options.json) {
1544
+ console.log(JSON.stringify(report, null, 2));
1545
+ } else {
1546
+ logger.log(
1547
+ `\nPlugin eval: ${report.status} (${report.comparison.outcome}, delta ${(report.comparison.passRateDelta * 100).toFixed(1)} points)`,
1548
+ );
1549
+ logger.log(
1550
+ ` Control: ${report.arms.control.effectivePassed}/${report.arms.control.total}; Candidate: ${report.arms.candidate.effectivePassed}/${report.arms.candidate.total}`,
1551
+ );
1552
+ logger.log(` Payload: ${report.plugin.payloadDigest}`);
1553
+ logger.log(` Suite: ${report.suite.digest}`);
1554
+ if (report.reasons.length) {
1555
+ logger.warn(` Reasons: ${report.reasons.join(", ")}`);
1556
+ }
1557
+ if (options.html)
1558
+ logger.info(` HTML: ${path.resolve(options.html)}`);
1559
+ }
1560
+ if (!report.passed) process.exitCode = 1;
1561
+ } catch (error) {
1562
+ logger.error(`Plugin eval failed: ${error.message}`);
1563
+ process.exitCode = 1;
1564
+ }
1565
+ });
1566
+
1438
1567
  plugin
1439
1568
  .command("validate <dir>")
1440
1569
  .description("Validate a plugin manifest and list its components")
@@ -4,10 +4,15 @@
4
4
  */
5
5
 
6
6
  import chalk from "chalk";
7
- import { intArg, floatArg } from "../lib/cli-arg.js";
7
+ import { intArg } from "../lib/cli-arg.js";
8
8
  import ora from "ora";
9
9
  import { logger } from "../lib/logger.js";
10
10
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
11
+ import {
12
+ assessAgentSandboxCapabilities,
13
+ normalizeAgentSandboxMode,
14
+ probeSandboxAvailability,
15
+ } from "../lib/agent-sandbox.js";
11
16
  import {
12
17
  createSandbox,
13
18
  acquireSandbox,
@@ -38,11 +43,125 @@ import {
38
43
  getSandboxStatsV2,
39
44
  } from "../lib/sandbox-v2.js";
40
45
 
41
- export function registerSandboxCommand(program) {
46
+ function csvList(value) {
47
+ return String(value || "")
48
+ .split(",")
49
+ .map((entry) => entry.trim())
50
+ .filter(Boolean);
51
+ }
52
+
53
+ function printCapabilityEntries(label, entries) {
54
+ logger.log(`${chalk.bold(label)} (${entries.length})`);
55
+ if (entries.length === 0) {
56
+ logger.log(" none");
57
+ return;
58
+ }
59
+ for (const entry of entries) {
60
+ const suffix = entry.message
61
+ ? ` — ${entry.message}`
62
+ : entry.enforcement
63
+ ? ` — ${entry.enforcement}`
64
+ : entry.entries
65
+ ? ` — ${entry.entries} rule(s)`
66
+ : "";
67
+ logger.log(` ${entry.id}${suffix}`);
68
+ }
69
+ }
70
+
71
+ export function registerSandboxCommand(program, dependencies = {}) {
42
72
  const sandbox = program
43
73
  .command("sandbox")
44
74
  .description("Security sandbox v2 — isolated agent execution environments");
45
75
 
76
+ // sandbox capabilities — read-only agent-shell backend preflight
77
+ sandbox
78
+ .command("capabilities")
79
+ .description(
80
+ "Report requested, enforceable, applied, and unsupported agent-shell sandbox capabilities",
81
+ )
82
+ .option(
83
+ "--engine <engine>",
84
+ "Agent shell backend (docker|bubblewrap)",
85
+ "docker",
86
+ )
87
+ .option(
88
+ "--mode <mode>",
89
+ "Agent sandbox posture (off|workspace-write|strict)",
90
+ "workspace-write",
91
+ )
92
+ .option("--network", "Request unrestricted network access")
93
+ .option("--allow-read <paths>", "Comma-separated additional read paths")
94
+ .option("--deny-read <paths>", "Comma-separated denied read paths")
95
+ .option("--allow-write <paths>", "Comma-separated additional write paths")
96
+ .option("--deny-write <paths>", "Comma-separated denied write paths")
97
+ .option("--allowed-domains <domains>", "Comma-separated allowed domains")
98
+ .option("--denied-domains <domains>", "Comma-separated denied domains")
99
+ .option("--no-probe", "Do not probe backend availability")
100
+ .option("--json", "Output the versioned report as JSON")
101
+ .action((options) => {
102
+ try {
103
+ const sandboxConfig = normalizeAgentSandboxMode(
104
+ options.mode,
105
+ options.mode === "off" ? false : true,
106
+ {
107
+ cwd: process.cwd(),
108
+ network: options.network === true,
109
+ settings: {
110
+ engine: options.engine,
111
+ filesystem: {
112
+ allowRead: csvList(options.allowRead),
113
+ denyRead: csvList(options.denyRead),
114
+ allowWrite: csvList(options.allowWrite),
115
+ denyWrite: csvList(options.denyWrite),
116
+ },
117
+ network: {
118
+ allowedDomains: csvList(options.allowedDomains),
119
+ deniedDomains: csvList(options.deniedDomains),
120
+ },
121
+ },
122
+ },
123
+ );
124
+ const availability =
125
+ sandboxConfig && options.probe !== false
126
+ ? (
127
+ dependencies.probeSandboxAvailability ||
128
+ probeSandboxAvailability
129
+ )(sandboxConfig)
130
+ : null;
131
+ const report = assessAgentSandboxCapabilities(sandboxConfig, {
132
+ availability,
133
+ host: dependencies.host,
134
+ });
135
+
136
+ if (options.json) {
137
+ console.log(JSON.stringify(report, null, 2));
138
+ } else {
139
+ logger.log(chalk.bold("Agent Shell Sandbox Capabilities"));
140
+ logger.log(
141
+ ` Host: ${report.host.platform} ${report.host.release} (${report.host.arch})`,
142
+ );
143
+ logger.log(
144
+ ` Backend: ${report.backend.engine || "none"} (${report.backend.availabilityChecked ? (report.backend.available ? "available" : "unavailable") : "not probed"})`,
145
+ );
146
+ logger.log(` Status: ${report.status}`);
147
+ logger.log(
148
+ ` Execution observed: ${report.execution.observed ? "yes" : "no"}`,
149
+ );
150
+ printCapabilityEntries("Requested", report.requested);
151
+ printCapabilityEntries("Enforceable", report.enforceable);
152
+ printCapabilityEntries("Applied", report.applied);
153
+ printCapabilityEntries("Unsupported", report.unsupported);
154
+ }
155
+
156
+ if (["unsupported", "unavailable"].includes(report.status)) {
157
+ process.exitCode = 2;
158
+ }
159
+ } catch (error) {
160
+ logger.error(`Failed: ${error.message}`);
161
+ process.exitCode = 2;
162
+ }
163
+ });
164
+
46
165
  // sandbox create <agent-id>
47
166
  sandbox
48
167
  .command("create")
@@ -5,6 +5,7 @@
5
5
 
6
6
  import { logger } from "../lib/logger.js";
7
7
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
8
+ import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
8
9
  import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
9
10
  import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
10
11
  import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
@@ -184,7 +185,11 @@ export function registerServeCommand(program, dependencies = {}) {
184
185
  tlsKeyPath: opts.appServerTlsKey,
185
186
  maxConnections: parseInt(opts.maxConnections, 10),
186
187
  store,
187
- kernelFactory: () => new CliAgentKernelAdapter({ cwd }),
188
+ kernelFactory: () =>
189
+ new CliAgentKernelAdapter({
190
+ cwd,
191
+ sessionOptions: captureSkillRuntimeDependencies(dependencies),
192
+ }),
188
193
  evolutionCompositionFactory,
189
194
  skillOutcomeIndex,
190
195
  skillVectorAuthority,
@@ -218,7 +223,10 @@ export function registerServeCommand(program, dependencies = {}) {
218
223
  try {
219
224
  await runStdioAppServer({
220
225
  store,
221
- kernel: new CliAgentKernelAdapter({ cwd }),
226
+ kernel: new CliAgentKernelAdapter({
227
+ cwd,
228
+ sessionOptions: captureSkillRuntimeDependencies(dependencies),
229
+ }),
222
230
  evolutionCompositionFactory,
223
231
  skillOutcomeIndex,
224
232
  skillVectorAuthority,
@@ -232,6 +240,7 @@ export function registerServeCommand(program, dependencies = {}) {
232
240
  return;
233
241
  }
234
242
  const runtime = createAgentRuntimeFactory({
243
+ ...captureSkillRuntimeDependencies(dependencies),
235
244
  deps:
236
245
  evolutionCompositionFactory === null
237
246
  ? {}
@@ -61,6 +61,10 @@ import { CLI_PACK_DOMAINS } from "../lib/skill-packs/schema.js";
61
61
  import { registerRecordReplayCommands } from "./record-replay.js";
62
62
  import { routeSkillDescriptors } from "../lib/skill-retrieval-router.js";
63
63
  import { resolveSkillOutcomeAuthority } from "../lib/skill-outcome-authority.js";
64
+ import {
65
+ assertSkillRuntimeAdmission,
66
+ captureSkillRuntimeDependencies,
67
+ } from "../lib/evolution/skill-runtime-revalidation.js";
64
68
  import {
65
69
  captureSkillVectorAuthority,
66
70
  unavailableSkillVectorEvidence,
@@ -277,6 +281,8 @@ export async function runControlledSkill(options = {}) {
277
281
  loader,
278
282
  executeTool = null,
279
283
  llmOptions = null,
284
+ skillRuntimeAdmission = null,
285
+ skillRuntimeAdmissionRequired = false,
280
286
  signal = null,
281
287
  } = options;
282
288
  throwIfAborted(signal, "Skill command interrupted before discovery");
@@ -299,8 +305,24 @@ export async function runControlledSkill(options = {}) {
299
305
  }
300
306
  const executionLease = loader.acquireSkillExecution?.(skill, { signal });
301
307
  const executionSignal = executionLease?.signal || signal;
308
+ const selectedSkillName = skill.id || skill.dirName;
309
+ const runtimeAdmissionContext = {
310
+ llmOptions,
311
+ effectiveAllowedToolNames: ["read_file", "search_files", "list_dir"],
312
+ };
313
+ const assertRuntime = () =>
314
+ assertSkillRuntimeAdmission({
315
+ skill,
316
+ loader,
317
+ admission: skillRuntimeAdmission,
318
+ required: skillRuntimeAdmissionRequired,
319
+ expectedSkillName: selectedSkillName,
320
+ context: runtimeAdmissionContext,
321
+ });
302
322
  try {
323
+ assertRuntime();
303
324
  const executionContext = {
325
+ ...runtimeAdmissionContext,
304
326
  loadedBecause: "run_skill",
305
327
  bodyIncluded: false,
306
328
  signal: executionSignal,
@@ -315,6 +337,7 @@ export async function runControlledSkill(options = {}) {
315
337
  skill = loader.materializeSkill(skill, executionContext);
316
338
  }
317
339
  executionLease?.assertActive?.();
340
+ assertRuntime();
318
341
  if (skill.isolation !== true) {
319
342
  return {
320
343
  error:
@@ -343,6 +366,8 @@ export async function runControlledSkill(options = {}) {
343
366
  {
344
367
  cwd,
345
368
  skillLoader: loader,
369
+ skillRuntimeAdmission,
370
+ skillRuntimeAdmissionRequired,
346
371
  ...(executionSignal ? { signal: executionSignal } : {}),
347
372
  ...(llmOptions ? { llmOptions: { ...llmOptions } } : {}),
348
373
  },
@@ -369,6 +394,8 @@ export async function runControlledSkill(options = {}) {
369
394
  }
370
395
 
371
396
  export function registerSkillCommand(program, dependencies = {}) {
397
+ const runtimeAdmissionDependencies =
398
+ captureSkillRuntimeDependencies(dependencies);
372
399
  const skillVectorAuthority =
373
400
  dependencies.skillVectorAuthority == null
374
401
  ? null
@@ -641,6 +668,7 @@ export function registerSkillCommand(program, dependencies = {}) {
641
668
  .option("-y, --yes", "Authorize the current isolated skill digest")
642
669
  .action(async (name, inputParts, options) => {
643
670
  const runLoader = new CLISkillLoader({
671
+ ...runtimeAdmissionDependencies,
644
672
  reauthorizeSkill: createCliSkillReauthorizer({
645
673
  assumeYes: options.yes === true,
646
674
  }),
@@ -654,6 +682,7 @@ export function registerSkillCommand(program, dependencies = {}) {
654
682
  cwd: process.cwd(),
655
683
  loader: runLoader,
656
684
  llmOptions,
685
+ ...runtimeAdmissionDependencies,
657
686
  });
658
687
  } catch (error) {
659
688
  result = {
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.47",
7
+ "cliVersions": ["0.166.47"],
8
+ "date": null,
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.47: govern Evolution runtime and scale background sessions",
13
+ "body": "- Add the durable Evolution ledger v2, evidence-bound Wiki maintenance, and\n runtime revalidation so governed learning and deployment decisions retain\n verifiable state across restarts.\n- Add native OpenAI Responses transport together with versioned model\n capability profiles, explicit model-egress inventory, and bounded runtime\n capability reporting.\n- Add bound plugin-evaluation and deferred-question flows for Agent sessions,\n while keeping deployment and evidence admission fail-closed.\n- Paginate `cc background session list` so installations with large background\n session histories can navigate results without loading the entire list."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.46",
20
+ "cliVersions": ["0.166.46"],
21
+ "date": null,
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed - cc CLI 0.166.46: restore Agent chat before Evolution deployment",
26
+ "body": "- Restore ordinary Agent and IDE stream chat for installations with no\n Evolution deployment configured.\n- Continue authenticating configured deployments and reject invalid, disabled,\n or unauthorized Agent deployments without falling back to ordinary chat.\n- Refresh public npm metadata during release verification retries."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": "v5.0.3.137",
6
32
  "cliVersion": "0.166.45",
@@ -535,9 +535,21 @@ async function ensureSessionHandler(
535
535
  const { WebSocketInteractionAdapter } =
536
536
  await import("../../lib/interaction-adapter.js");
537
537
  const enablePhase5Envelopes = await _isPhase5EnvelopesEnabled();
538
+ const stateSnapshot =
539
+ typeof server.sessionManager.getSessionStateSnapshot === "function"
540
+ ? server.sessionManager.getSessionStateSnapshot(session.id)
541
+ : null;
538
542
  session.interaction = new WebSocketInteractionAdapter(ws, session.id, {
539
543
  enablePhase5Envelopes,
540
544
  envelopeBus: server.envelopeBus || null,
545
+ deferredState: stateSnapshot,
546
+ onDeferredQuestionChange: ({ type, payload }) => {
547
+ server.sessionManager?.recordSessionStateEvent?.(
548
+ session.id,
549
+ type,
550
+ payload,
551
+ );
552
+ },
541
553
  onPendingApprovalChange: ({ type, payload }) => {
542
554
  if (
543
555
  server.sessionManager &&
@@ -651,6 +663,7 @@ async function ensureSessionHandler(
651
663
  evolutionCompositionFactory: server.evolutionCompositionFactory,
652
664
  skillOutcomeIndex: server.skillOutcomeIndex,
653
665
  skillVectorAuthority: server.skillVectorAuthority,
666
+ ...server.runtimeAdmissionDependencies,
654
667
  });
655
668
  sessionHostLease = null;
656
669
  sessionBudgetRoot = null;
@@ -76,6 +76,7 @@ import {
76
76
  import { sessionBudgetAdmissionError } from "../../lib/session-budget-production-root.js";
77
77
  import { captureAgentSkillOutcomeIndex } from "../../lib/evolution/agent-evolution-runtime-composition-brand.js";
78
78
  import { captureSkillVectorAuthority } from "../../lib/skill-vector-authority.js";
79
+ import { captureSkillRuntimeDependencies } from "../../lib/evolution/skill-runtime-revalidation.js";
79
80
  import {
80
81
  beginSessionBudgetUsage,
81
82
  markSessionBudgetUsageUnknown,
@@ -84,6 +85,7 @@ import {
84
85
  } from "../../lib/session-budget-usage.js";
85
86
  import { HostResourceBudget } from "../../lib/host-resource-budget.js";
86
87
  import { captureAgentEvolutionRuntimeComposition } from "../../lib/evolution/agent-evolution-runtime-composition-brand.js";
88
+ import { composePrepareCall } from "../../lib/goal-context.js";
87
89
 
88
90
  const CANONICAL_WS_TURN_QUEUES = new Map();
89
91
  const CANONICAL_WS_CLAIM_CAS_ATTEMPTS = 4;
@@ -182,8 +184,14 @@ export class WSAgentHandler {
182
184
  evolutionCompositionFactory = null,
183
185
  skillOutcomeIndex = null,
184
186
  skillVectorAuthority = null,
187
+ skillRuntimeAdmission = null,
188
+ skillRuntimeAdmissionRequired = false,
185
189
  }) {
186
190
  this.session = session;
191
+ this._runtimeAdmissionDependencies = captureSkillRuntimeDependencies({
192
+ skillRuntimeAdmission,
193
+ skillRuntimeAdmissionRequired,
194
+ });
187
195
  this.interaction = interaction;
188
196
  this.db = db || null;
189
197
  this._processing = false;
@@ -371,6 +379,10 @@ export class WSAgentHandler {
371
379
  "WebSocket evolution composition and Skill vector authority must share one tenant",
372
380
  );
373
381
  }
382
+ captureSkillRuntimeDependencies(
383
+ this._runtimeAdmissionDependencies,
384
+ composition.tenantId,
385
+ );
374
386
  await composition.evolutionIngress.start();
375
387
  return composition;
376
388
  } catch (cause) {
@@ -1373,6 +1385,7 @@ export class WSAgentHandler {
1373
1385
  }
1374
1386
 
1375
1387
  this._processing = true;
1388
+ this.interaction.beginContextRevision?.();
1376
1389
  const abortController = new AbortController();
1377
1390
  const turnSignal = this._turnSignal(abortController.signal);
1378
1391
  this._abortController = abortController;
@@ -1539,9 +1552,13 @@ export class WSAgentHandler {
1539
1552
  shellPolicyOverrides: session.shellPolicyOverrides || null,
1540
1553
  slotFiller,
1541
1554
  interaction: this.interaction,
1555
+ prepareCall: composePrepareCall([
1556
+ this.interaction.createDeferredPrepareCall?.(),
1557
+ ]),
1542
1558
  ...(this._skillOutcomeIndex === null
1543
1559
  ? {}
1544
1560
  : { skillOutcomeIndex: this._skillOutcomeIndex }),
1561
+ ...this._runtimeAdmissionDependencies,
1545
1562
  ...(this._skillVectorAuthority === null
1546
1563
  ? {}
1547
1564
  : { skillVectorAuthority: this._skillVectorAuthority }),
@@ -17,6 +17,7 @@ import { dirname, join } from "node:path";
17
17
  import { WebSocketServer } from "ws";
18
18
  import { captureAgentSkillOutcomeIndex } from "../../lib/evolution/agent-evolution-runtime-composition-brand.js";
19
19
  import { captureSkillVectorAuthority } from "../../lib/skill-vector-authority.js";
20
+ import { captureSkillRuntimeDependencies } from "../../lib/evolution/skill-runtime-revalidation.js";
20
21
  import {
21
22
  createEnvelope,
22
23
  envelopeFromStreamEvent,
@@ -332,6 +333,8 @@ export class ChainlessChainWSServer extends EventEmitter {
332
333
  }
333
334
  this.evolutionCompositionFactory =
334
335
  options.evolutionCompositionFactory || null;
336
+ this.runtimeAdmissionDependencies =
337
+ captureSkillRuntimeDependencies(options);
335
338
  this.skillOutcomeIndex =
336
339
  options.skillOutcomeIndex == null
337
340
  ? null