chainlesschain 0.166.46 → 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 (232) hide show
  1. package/README.md +6 -4
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-CDpT0WXV.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-BNfUljWx.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C9323DEx.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-CRrjb2db.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-Db-DGqJS.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-CJdHRJ0W.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-_RSCnTYs.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-8GFQi-dM.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-C87NtgUZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-DcTMWS8G.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-5ZDPTW_H.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DM9EmYee.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-M2YqDRNN.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-oB1LLxyf.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-TcVZK5tF.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-XKmq-3K_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-C6CBiDRy.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-Dz9CGqXH.js} +4 -4
  21. package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-CxJDgDVL.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-DMP0JsaQ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-I5IQeogb.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-BfLW2MXj.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BK8EjAlh.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.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-DgUdFvw1.js → FamilyGuardDashboard-T19rnqm-.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-CozrbPMy.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-k1dCLNNJ.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DbaW_Jvt.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-CQHRyEIt.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BMJYZgMy.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-B7mpNU7V.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-Br0Blg6B.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-HIdk0S6M.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-HxeocBHy.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Bkfq69UP.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-dtmx0bHO.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-CrRlOuEf.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-D4ZIZiAH.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-C90Rw7GE.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-CC6k_uh4.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-T_CUIYUy.js} +4 -4
  45. package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-N_e0RRWk.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-Iq3VzEv0.js} +1 -1
  47. package/src/assets/web-panel/assets/Notes-B5sKJUJt.js +7 -0
  48. package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-K8UVp8qQ.js} +1 -1
  49. package/src/assets/web-panel/assets/OrderTableRenderer-BWNyM-6m.js +1 -0
  50. package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-DMO1NJxI.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BBY6b31Z.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-DmsL0y0v.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-fYmQzmTA.js → PdhVaultBrowser-C65AX_RY.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CWcpRtWa.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub--ZNDIdsn.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DCdj5NGb.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-BRKu7Q3E.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-BJ7ozIAb.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-B2cVLiXW.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-Ce9r_W-p.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-BDespvGZ.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-BUNO4fDU.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-D2TUqeBV.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-BNNQPHBH.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-D2t1V_Cm.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-DVK5hEqI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-BB9RTwmE.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-DmEO7liZ.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-UwEYjnDB.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DebqSsMp.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CuuPts3C.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-DbWpmbgf.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-BaK7SxzT.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-BFHv51Jb.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-B9b1R6uK.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-BnO0CN02.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-Dy01Vq49.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-BCy2AMHc.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant-4Tx9y_Y1.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-CPOoUH8J.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-C85GlJzu.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-_xneFBGF.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-BizG4rTr.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-Dh8EIn3n.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-C5NWoHWQ.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-0YfrySL6.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-BZVH8Ags.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-kNofa6vm.js} +3 -3
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-BNO34_j0.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-ifQ2FlwD.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-1TL8H6EH.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-DBfRjs_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-B_V5fjcX.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-DSL-c_hr.js → hasIn-Bz6LMY_0.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index--WvT2Il3.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-84mi5rsv.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-B5SJCUZ7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-B6RClMZl.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BB1Af7Fv.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-BQL_tldd.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-BXJXMaZe.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-BhPDhmvN.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BiZ7Nz5-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-BoCTDcn6.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-BxqC3LiO.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-C6c0j-Ki.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-C7d6QlfR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-C9QYxq61.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CPYshcic.js → index-CBh48_Mh.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-CNKHoXWI.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-CXVBQ82k.js} +3 -3
  113. package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CXtiLagi.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CNytQuFq.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-BIDCNwy6.js → index-CtB45Hok.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-Cu_V6ZJH.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-Cykt9BbN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-DDhy4eCS.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-DEPPzM8I.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BD0w-888.js → index-DMVktlxG.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-DOww5Qny.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Tg3yl8wc.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-DVgTf7CZ.js → index-DvM2xBUA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-EK3XtMxA.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-XJIV7HEw.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-0200QxC4.js → index-cNwsev6n.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-f_7L9GvP.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-lUL3bD2z.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-pOUFfRdN.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-rGhS02f8.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-vHtnQsnV.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-vb1XIxEB.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-DpRIjwTt.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-CG4_9o-Z.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-Dku1fXtf.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-BvAVeX-3.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-DFu0x78D.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-CmI-FNcK.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-CGERYewB.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D7G8bF5J.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-B2sXwWXy.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-DI5yh0n3.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-deGJ5dp_.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-OqHBXEmi.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-Dqgx0Qv_.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-Be-lveh2.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-CFxB876W.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BfVC9iUs.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 +8 -0
  154. package/src/commands/background-session.js +31 -3
  155. package/src/commands/chat.js +5 -1
  156. package/src/commands/eval.js +86 -28
  157. package/src/commands/llm.js +104 -1
  158. package/src/commands/plugin.js +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 +13 -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-runtime-composition.js +236 -1
  183. package/src/lib/evolution/agent-model-projection.js +97 -1
  184. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
  185. package/src/lib/evolution/evolution-artifact-ports.js +6 -0
  186. package/src/lib/evolution/evolution-deployment-loader.js +87 -3
  187. package/src/lib/evolution/evolution-eval-gate.js +8 -0
  188. package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
  189. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
  190. package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
  191. package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
  192. package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
  193. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
  194. package/src/lib/evolution/evolution-ledger.js +57 -1
  195. package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
  196. package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
  197. package/src/lib/evolution/governed-hub-llm.js +238 -5
  198. package/src/lib/evolution/governed-hub-resolver.js +82 -4
  199. package/src/lib/evolution/governed-hub-skill.js +11 -5
  200. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
  201. package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
  202. package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
  203. package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
  204. package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
  205. package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
  206. package/src/lib/goal-context.js +14 -5
  207. package/src/lib/interaction-adapter.js +166 -1
  208. package/src/lib/model-capabilities.js +271 -0
  209. package/src/lib/model-context-catalog.js +105 -0
  210. package/src/lib/model-context-window.js +4 -49
  211. package/src/lib/openai-responses.js +428 -0
  212. package/src/lib/plugin-runtime/scopes.js +7 -1
  213. package/src/lib/remote-read-loop-guard.js +2 -2
  214. package/src/lib/runtime-usage-ledger.js +16 -0
  215. package/src/lib/skill-loader.js +12 -0
  216. package/src/lib/with-file-lock.js +3 -1
  217. package/src/repl/agent-repl.js +5 -1
  218. package/src/runtime/agent-core.js +348 -23
  219. package/src/runtime/agent-runtime.js +7 -0
  220. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  221. package/src/runtime/headless-runner.js +4 -1
  222. package/src/runtime/headless-stream.js +133 -44
  223. package/src/runtime/runtime-factory.js +26 -2
  224. package/src/workers/background-agent-keeper.js +23 -13
  225. package/src/workers/background-agent-worker.js +27 -13
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
  227. package/src/assets/web-panel/assets/EvolutionSettings-BqpG3XHV.js +0 -1
  228. package/src/assets/web-panel/assets/Notes-6F8EarNN.js +0 -7
  229. package/src/assets/web-panel/assets/OrderTableRenderer-gVgXQWdc.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
  231. package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
  232. package/src/assets/web-panel/assets/index-D-4tFek3.js +0 -1
@@ -42,6 +42,10 @@ import { createHash, randomUUID } from "node:crypto";
42
42
  import skillInvocationReceipt from "@chainlesschain/session-core/skill-invocation-receipt";
43
43
  import { isProxy } from "node:util/types";
44
44
  import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
45
+ import {
46
+ assertSkillRuntimeAdmission,
47
+ captureSkillRuntimeDependencies,
48
+ } from "../lib/evolution/skill-runtime-revalidation.js";
45
49
  import { isEvolutionIngressFailure } from "../lib/model-failure-policy.js";
46
50
 
47
51
  const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
@@ -50,7 +54,17 @@ import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
50
54
  import sharedPermissionRules from "../lib/permission-rules.cjs";
51
55
  import sharedSettingsHooks from "../lib/settings-hooks.cjs";
52
56
  import sharedHookEvents from "../lib/settings-hook-events.js";
53
- import { mergeProviderOptions } from "../lib/provider-options.js";
57
+ import {
58
+ resolveAgentOutputBudget,
59
+ resolveModelCapabilityProfile,
60
+ } from "../lib/model-capabilities.js";
61
+ import {
62
+ createOpenAIResponsesBody,
63
+ createOpenAIResponsesStreamState,
64
+ finalizeOpenAIResponsesStream,
65
+ normalizeOpenAIResponsesResponse,
66
+ reduceOpenAIResponsesStreamLine,
67
+ } from "../lib/openai-responses.js";
54
68
  import { applyCredentialProxy } from "../lib/credential-proxy.js";
55
69
  import {
56
70
  commitShellApprovalSideEffects,
@@ -1261,7 +1275,9 @@ export function buildSystemPrompt(cwd, opts = {}) {
1261
1275
 
1262
1276
  // Append auto-activated persona skills
1263
1277
  try {
1264
- const loader = opts.skillLoader || new CLISkillLoader();
1278
+ const loader =
1279
+ opts.skillLoader ||
1280
+ new CLISkillLoader(captureSkillRuntimeDependencies(opts));
1265
1281
  const personaSkills = loader.getAutoActivatedPersonas({
1266
1282
  sessionId: opts.sessionId,
1267
1283
  turnId: opts.turnId,
@@ -2604,7 +2620,11 @@ export async function executeTool(name, args, context = {}) {
2604
2620
  }
2605
2621
  }
2606
2622
  const hookDb = context.hookDb || null;
2607
- const skillLoader = context.skillLoader || _defaultSkillLoader;
2623
+ const skillLoader =
2624
+ context.skillLoader ||
2625
+ (context.skillRuntimeAdmission || context.skillRuntimeAdmissionRequired
2626
+ ? new CLISkillLoader(captureSkillRuntimeDependencies(context))
2627
+ : _defaultSkillLoader);
2608
2628
  // Keep the authority-bearing workspace root distinct from the command's
2609
2629
  // requested cwd. A command may run in a nested directory, but Plugin policy
2610
2630
  // discovery and strong-sandbox issuance must remain anchored to the host
@@ -3604,6 +3624,8 @@ export async function executeTool(name, args, context = {}) {
3604
3624
  skillAllowlist: context.skillAllowlist ?? null,
3605
3625
  skillOutcomeIndex: context.skillOutcomeIndex,
3606
3626
  skillVectorAuthority: context.skillVectorAuthority,
3627
+ skillRuntimeAdmission: context.skillRuntimeAdmission,
3628
+ skillRuntimeAdmissionRequired: context.skillRuntimeAdmissionRequired,
3607
3629
  skillRetrievalRevocationReader: context.skillRetrievalRevocationReader,
3608
3630
  cwd,
3609
3631
  parentMessages: context.parentMessages,
@@ -5157,6 +5179,8 @@ async function executeToolInner(
5157
5179
  skillAllowlist = null,
5158
5180
  skillOutcomeIndex,
5159
5181
  skillVectorAuthority,
5182
+ skillRuntimeAdmission,
5183
+ skillRuntimeAdmissionRequired = false,
5160
5184
  skillRetrievalRevocationReader,
5161
5185
  cwd,
5162
5186
  parentMessages,
@@ -6652,6 +6676,7 @@ async function executeToolInner(
6652
6676
  }
6653
6677
  const common = {
6654
6678
  sandbox: sandboxSummary(shellSandbox),
6679
+ sandboxCapabilities: result.sandboxCapabilities || null,
6655
6680
  shellCommandPolicy: shellPolicy,
6656
6681
  approval: approvalOutcome,
6657
6682
  policyTrace: ["shell-policy", "approval", "sandbox"],
@@ -6907,6 +6932,7 @@ async function executeToolInner(
6907
6932
  encoding: "utf8",
6908
6933
  timeout: 60000,
6909
6934
  maxBuffer: 1024 * 1024,
6935
+ shell: false,
6910
6936
  windowsHide: true,
6911
6937
  origin: "agent-core:git-command",
6912
6938
  policy: "allow",
@@ -7035,6 +7061,8 @@ async function executeToolInner(
7035
7061
  sessionId,
7036
7062
  llmOptions,
7037
7063
  evolutionIngress,
7064
+ skillRuntimeAdmission,
7065
+ skillRuntimeAdmissionRequired,
7038
7066
  workflowEffectId,
7039
7067
  workflowChildEffectId,
7040
7068
  workflowChildSequence,
@@ -7241,6 +7269,62 @@ async function executeToolInner(
7241
7269
  }
7242
7270
 
7243
7271
  case "ask_user_question": {
7272
+ const questionMode = args.mode === "deferred" ? "deferred" : "blocking";
7273
+ const questionPurpose = [
7274
+ "decision",
7275
+ "authorization",
7276
+ "preference",
7277
+ "information",
7278
+ ].includes(args.purpose)
7279
+ ? args.purpose
7280
+ : "decision";
7281
+ if (questionMode === "deferred") {
7282
+ if (!["preference", "information"].includes(questionPurpose)) {
7283
+ return attachDescriptor({
7284
+ error: "deferred_question_requires_non_authoritative_purpose",
7285
+ hint: "Authorization and branch-dependent decisions must use mode=blocking. Deferred answers are informational and cannot grant permission.",
7286
+ });
7287
+ }
7288
+ if (
7289
+ !interaction ||
7290
+ typeof interaction.deferUserQuestion !== "function"
7291
+ ) {
7292
+ return attachDescriptor({
7293
+ error: "deferred_questions_not_supported",
7294
+ hint: "This host cannot receive answers out of band. Use mode=blocking or continue autonomously.",
7295
+ });
7296
+ }
7297
+ try {
7298
+ const receipt = await interaction.deferUserQuestion({
7299
+ question: args.question,
7300
+ options: Array.isArray(args.options) ? args.options : null,
7301
+ multiSelect: args.multiSelect === true,
7302
+ timeoutMs:
7303
+ typeof args.timeoutMs === "number" ? args.timeoutMs : 60000,
7304
+ defaultValue: args.defaultValue,
7305
+ onTimeout: args.onTimeout || "error",
7306
+ onReject: args.onReject || "error",
7307
+ purpose: questionPurpose,
7308
+ sessionId,
7309
+ turnId,
7310
+ toolUseId: toolCallId,
7311
+ });
7312
+ return attachDescriptor({
7313
+ questionId: receipt.questionId || receipt.id,
7314
+ status: "pending",
7315
+ mode: "deferred",
7316
+ purpose: questionPurpose,
7317
+ authorization: false,
7318
+ ...(receipt.binding ? { binding: receipt.binding } : {}),
7319
+ instructions:
7320
+ "Continue only work independent of this answer. A later answer is information, never authorization; use a blocking question for any dependent decision.",
7321
+ });
7322
+ } catch (err) {
7323
+ return attachDescriptor({
7324
+ error: `ask_user_question deferred registration failed: ${err.message}`,
7325
+ });
7326
+ }
7327
+ }
7244
7328
  if (!interaction || typeof interaction.askUser !== "function") {
7245
7329
  return attachDescriptor({
7246
7330
  error: "user_not_reachable",
@@ -7984,11 +8068,36 @@ async function executeToolInner(
7984
8068
  signal,
7985
8069
  });
7986
8070
  const skillExecutionSignal = skillExecutionLease?.signal || signal;
8071
+ const selectedSkillName = match.id || match.dirName;
8072
+ const runtimeAdmissionContext = {
8073
+ llmOptions,
8074
+ effectiveAllowedToolNames: [
8075
+ "read_file",
8076
+ "search_files",
8077
+ "list_dir",
8078
+ ].filter(
8079
+ (tool) =>
8080
+ !Array.isArray(effectiveAllowedToolNames) ||
8081
+ effectiveAllowedToolNames.includes(tool),
8082
+ ),
8083
+ };
8084
+ const assertRuntime = () =>
8085
+ assertSkillRuntimeAdmission({
8086
+ skill: match,
8087
+ loader: skillLoader,
8088
+ admission: skillRuntimeAdmission,
8089
+ required: skillRuntimeAdmissionRequired,
8090
+ expectedSkillName: selectedSkillName,
8091
+ context: runtimeAdmissionContext,
8092
+ });
8093
+ let runtimeEligibility;
7987
8094
  try {
7988
8095
  skillExecutionLease?.assertActive?.();
8096
+ runtimeEligibility = assertRuntime();
7989
8097
  if (typeof skillLoader.materializeSkillForExecution === "function") {
7990
8098
  match = await raceWithAbort(
7991
8099
  skillLoader.materializeSkillForExecution(match, {
8100
+ ...runtimeAdmissionContext,
7992
8101
  sessionId,
7993
8102
  turnId,
7994
8103
  loadedBecause: "run_skill",
@@ -8000,6 +8109,7 @@ async function executeToolInner(
8000
8109
  );
8001
8110
  } else if (typeof skillLoader.materializeSkill === "function") {
8002
8111
  match = skillLoader.materializeSkill(match, {
8112
+ ...runtimeAdmissionContext,
8003
8113
  sessionId,
8004
8114
  turnId,
8005
8115
  loadedBecause: "run_skill",
@@ -8008,6 +8118,7 @@ async function executeToolInner(
8008
8118
  });
8009
8119
  }
8010
8120
  skillExecutionLease?.assertActive?.();
8121
+ runtimeEligibility = assertRuntime();
8011
8122
  throwIfAborted(
8012
8123
  skillExecutionSignal,
8013
8124
  "run_skill interrupted during materialization",
@@ -8196,6 +8307,7 @@ async function executeToolInner(
8196
8307
  let subCtx;
8197
8308
  try {
8198
8309
  skillExecutionLease?.assertActive?.();
8310
+ runtimeEligibility = assertRuntime();
8199
8311
  subCtx = SubAgentContext.create({
8200
8312
  role: `skill-${args.skill_name}`,
8201
8313
  task:
@@ -8268,11 +8380,13 @@ async function executeToolInner(
8268
8380
  }
8269
8381
  skillSubRef = subCtx;
8270
8382
  try {
8383
+ runtimeEligibility = assertRuntime();
8271
8384
  const result = await raceWithAbort(
8272
8385
  subCtx.run(args.input),
8273
8386
  skillExecutionSignal,
8274
8387
  "run_skill interrupted while the isolated child was running",
8275
8388
  );
8389
+ runtimeEligibility = assertRuntime();
8276
8390
  skillExecutionLease?.assertActive?.();
8277
8391
  throwIfAborted(
8278
8392
  skillExecutionSignal,
@@ -8302,6 +8416,7 @@ async function executeToolInner(
8302
8416
  success: true,
8303
8417
  isolated: true,
8304
8418
  skill: args.skill_name,
8419
+ runtimeEligibility,
8305
8420
  invocationReceipt: settleInvocation("completed", result),
8306
8421
  summary: result.summary,
8307
8422
  toolsUsed: result.toolsUsed,
@@ -10212,6 +10327,13 @@ async function _executeSpawnSubAgent(args, ctx) {
10212
10327
  const parentLlm = ctx.llmOptions || {};
10213
10328
  const subLlmOptions = {
10214
10329
  ...parentLlm,
10330
+ ...(ctx.skillRuntimeAdmission
10331
+ ? { skillRuntimeAdmission: ctx.skillRuntimeAdmission }
10332
+ : {}),
10333
+ ...(ctx.skillRuntimeAdmissionRequired
10334
+ ? { skillRuntimeAdmissionRequired: true }
10335
+ : {}),
10336
+ ...(ctx.skillLoader ? { skillLoader: ctx.skillLoader } : {}),
10215
10337
  ...(ctx.evolutionIngress != null
10216
10338
  ? { evolutionIngress: ctx.evolutionIngress }
10217
10339
  : {}),
@@ -11114,21 +11236,20 @@ export async function chatWithTools(rawMessages, options) {
11114
11236
  };
11115
11237
  }
11116
11238
 
11117
- // Model-aware max_tokens (Opus → 16384, Haiku → 4096, else 8192) via
11118
- // provider-options. We read ONLY maxTokens: the module's `temperature`
11119
- // default is never forwarded (400s on Opus 4.7/4.8).
11239
+ // Model-aware max_tokens (Opus → 16384, Haiku → 4096, else 8192).
11240
+ // The shared budget resolver reads only provider maxTokens; its unrelated
11241
+ // temperature default is never forwarded (400s on Opus 4.7/4.8).
11120
11242
  // Fallback to the CURRENT Sonnet, not a retired snapshot:
11121
11243
  // claude-sonnet-4-20250514 was retired 2026-06-15 and would 404 here.
11122
11244
  const effModel = model || "claude-sonnet-4-6";
11123
- const { maxTokens: anthropicMaxTokens } = mergeProviderOptions(
11124
- "anthropic",
11125
- effModel,
11126
- );
11245
+ const anthropicOutputBudget = resolveAgentOutputBudget({
11246
+ provider: "anthropic",
11247
+ model: effModel,
11248
+ maxOutputTokens: options.maxOutputTokens,
11249
+ });
11127
11250
  const body = {
11128
11251
  model: effModel,
11129
- max_tokens: options.maxOutputTokens
11130
- ? Math.min(anthropicMaxTokens || 8192, options.maxOutputTokens)
11131
- : anthropicMaxTokens || 8192,
11252
+ max_tokens: anthropicOutputBudget.requestMaxOutputTokens,
11132
11253
  // Convert cc's internal OpenAI-shaped history (role:"tool" results,
11133
11254
  // assistant tool_calls[]) into Anthropic content blocks. Without this,
11134
11255
  // multi-turn tool use 400s on turn 2 (Anthropic rejects role:"tool" and
@@ -11296,6 +11417,85 @@ export async function chatWithTools(rawMessages, options) {
11296
11417
  gemini: "gemini-2.0-flash",
11297
11418
  volcengine: "deepseek-v4-flash-ga-260731",
11298
11419
  };
11420
+ const effectiveModel = model || defaultModels[provider] || "gpt-4o-mini";
11421
+ const modelProfile = resolveModelCapabilityProfile({
11422
+ provider,
11423
+ model: effectiveModel,
11424
+ baseUrl: url,
11425
+ maxOutputTokens: options.maxOutputTokens,
11426
+ });
11427
+ const useOpenAIResponses =
11428
+ provider === "openai" &&
11429
+ modelProfile.runtimeProtocol === "openai-responses";
11430
+
11431
+ if (useOpenAIResponses) {
11432
+ const responseBody = createOpenAIResponsesBody({
11433
+ model: effectiveModel,
11434
+ messages,
11435
+ tools,
11436
+ maxOutputTokens: options.maxOutputTokens,
11437
+ reasoning: _openAIResponsesReasoningParams(options),
11438
+ stream: typeof options.onToken === "function",
11439
+ });
11440
+ if (typeof options.onToken === "function") {
11441
+ return await _retryStreamingChat(
11442
+ (attempt = 0) =>
11443
+ _chatOpenAIResponsesStreaming(
11444
+ `${url}/responses`,
11445
+ responseBody,
11446
+ key,
11447
+ options.onToken,
11448
+ signal,
11449
+ options.onThinking,
11450
+ options.onStall,
11451
+ options.streamStallMs,
11452
+ options.streamStallTimeoutMs,
11453
+ supportsOpenAIRequestIdentity
11454
+ ? _physicalProviderRequestId(providerRequestId, attempt)
11455
+ : null,
11456
+ ),
11457
+ {
11458
+ signal,
11459
+ retries: options.workflowEffectId ? 0 : undefined,
11460
+ strictRetryObserver: options.strictUsageTelemetry === true,
11461
+ ...(typeof options.onStreamRetry === "function"
11462
+ ? {
11463
+ onRetry: (attempt, error, telemetry) =>
11464
+ options.onStreamRetry(attempt, error, {
11465
+ ...telemetry,
11466
+ provider,
11467
+ model: effectiveModel,
11468
+ }),
11469
+ }
11470
+ : {}),
11471
+ },
11472
+ );
11473
+ }
11474
+
11475
+ const response = await fetch(`${url}/responses`, {
11476
+ method: "POST",
11477
+ headers: {
11478
+ "Content-Type": "application/json",
11479
+ Authorization: `Bearer ${key}`,
11480
+ ...(supportsOpenAIRequestIdentity && providerRequestId
11481
+ ? { "X-Client-Request-Id": providerRequestId }
11482
+ : {}),
11483
+ },
11484
+ signal,
11485
+ body: JSON.stringify(responseBody),
11486
+ });
11487
+ if (!response.ok) {
11488
+ throw new Error(await formatProviderResponseError(provider, response));
11489
+ }
11490
+ const data = await response.json();
11491
+ const out = normalizeOpenAIResponsesResponse(data);
11492
+ delete out.responseId;
11493
+ const providerReceipt = supportsOpenAIRequestIdentity
11494
+ ? _openAIProviderRequestReceipt(response, data, providerRequestId)
11495
+ : null;
11496
+ if (providerReceipt) out.providerReceipt = providerReceipt;
11497
+ return out;
11498
+ }
11299
11499
 
11300
11500
  // Real token streaming (--include-partial-messages) for every OpenAI-compatible
11301
11501
  // provider (openai / deepseek / dashscope / mistral / gemini / volcengine):
@@ -11307,7 +11507,7 @@ export async function chatWithTools(rawMessages, options) {
11307
11507
  _chatOpenAIStreaming(
11308
11508
  `${url}/chat/completions`,
11309
11509
  {
11310
- model: model || defaultModels[provider] || "gpt-4o-mini",
11510
+ model: effectiveModel,
11311
11511
  messages,
11312
11512
  tools,
11313
11513
  stream: true,
@@ -11337,7 +11537,7 @@ export async function chatWithTools(rawMessages, options) {
11337
11537
  options.onStreamRetry(attempt, error, {
11338
11538
  ...telemetry,
11339
11539
  provider,
11340
- model: model || defaultModels[provider] || "gpt-4o-mini",
11540
+ model: effectiveModel,
11341
11541
  }),
11342
11542
  }
11343
11543
  : {}),
@@ -11356,7 +11556,7 @@ export async function chatWithTools(rawMessages, options) {
11356
11556
  },
11357
11557
  signal,
11358
11558
  body: JSON.stringify({
11359
- model: model || defaultModels[provider] || "gpt-4o-mini",
11559
+ model: effectiveModel,
11360
11560
  messages,
11361
11561
  tools,
11362
11562
  ...(options.maxOutputTokens
@@ -12271,6 +12471,83 @@ async function _chatOpenAIStreaming(
12271
12471
  return out;
12272
12472
  }
12273
12473
 
12474
+ async function _chatOpenAIResponsesStreaming(
12475
+ apiUrl,
12476
+ body,
12477
+ apiKey,
12478
+ onToken,
12479
+ signal,
12480
+ onThinking,
12481
+ onStall,
12482
+ stallMs,
12483
+ stallTimeoutMs,
12484
+ providerRequestId = null,
12485
+ ) {
12486
+ const response = await fetch(apiUrl, {
12487
+ method: "POST",
12488
+ headers: {
12489
+ "Content-Type": "application/json",
12490
+ Authorization: `Bearer ${apiKey}`,
12491
+ ...(providerRequestId
12492
+ ? { "X-Client-Request-Id": providerRequestId }
12493
+ : {}),
12494
+ },
12495
+ signal,
12496
+ body: JSON.stringify(body),
12497
+ });
12498
+ if (!response.ok) {
12499
+ throw new Error(await formatProviderResponseError("openai", response));
12500
+ }
12501
+ const state = createOpenAIResponsesStreamState();
12502
+ const ui = _streamUiCallbacks(onToken, onThinking);
12503
+ const reader = response.body.getReader();
12504
+ const decoder = new TextDecoder();
12505
+ let buf = "";
12506
+ try {
12507
+ for await (const value of _iterateStreamWithStall(reader, {
12508
+ onStall,
12509
+ stallMs,
12510
+ stallTimeoutMs,
12511
+ })) {
12512
+ buf += decoder.decode(value, { stream: true });
12513
+ const lines = buf.split("\n");
12514
+ buf = lines.pop() || "";
12515
+ for (const line of lines) {
12516
+ reduceOpenAIResponsesStreamLine(state, line, ui.onToken, ui.onThinking);
12517
+ await ui.settle();
12518
+ }
12519
+ }
12520
+ if (buf.trim()) {
12521
+ reduceOpenAIResponsesStreamLine(state, buf, ui.onToken, ui.onThinking);
12522
+ await ui.settle();
12523
+ }
12524
+ } catch (error) {
12525
+ if (_streamErrorDisposition(error, signal, state.text) === "rethrow") {
12526
+ throw error;
12527
+ }
12528
+ const out = _finalizeTruncatedStream(finalizeOpenAIResponsesStream, state);
12529
+ const responseId = out.responseId || state.responseId;
12530
+ delete out.responseId;
12531
+ const providerReceipt = _openAIProviderRequestReceipt(
12532
+ response,
12533
+ { id: responseId },
12534
+ providerRequestId,
12535
+ );
12536
+ if (providerReceipt) out.providerReceipt = providerReceipt;
12537
+ return out;
12538
+ }
12539
+ const out = finalizeOpenAIResponsesStream(state);
12540
+ const responseId = out.responseId || state.responseId;
12541
+ delete out.responseId;
12542
+ const providerReceipt = _openAIProviderRequestReceipt(
12543
+ response,
12544
+ { id: responseId },
12545
+ providerRequestId,
12546
+ );
12547
+ if (providerReceipt) out.providerReceipt = providerReceipt;
12548
+ return out;
12549
+ }
12550
+
12274
12551
  /**
12275
12552
  * Convert cc's internal OpenAI-shaped messages into Anthropic content-block
12276
12553
  * messages. Internal shape: {role:"user"|"assistant"|"tool", content,
@@ -12371,6 +12648,31 @@ function _intensityToEffort(want) {
12371
12648
  }
12372
12649
  }
12373
12650
 
12651
+ /** Build an opt-in Responses reasoning request without changing default cost. */
12652
+ export function _openAIResponsesReasoningParams(options = {}) {
12653
+ const want = options?.thinking;
12654
+ if (!want || want === "off" || want === "none") return null;
12655
+ const allowed = new Set([
12656
+ "none",
12657
+ "minimal",
12658
+ "low",
12659
+ "medium",
12660
+ "high",
12661
+ "xhigh",
12662
+ ]);
12663
+ const requested =
12664
+ typeof options.thinkingEffort === "string"
12665
+ ? options.thinkingEffort.toLowerCase()
12666
+ : null;
12667
+ return {
12668
+ effort:
12669
+ requested && allowed.has(requested)
12670
+ ? requested
12671
+ : _intensityToEffort(want),
12672
+ summary: "auto",
12673
+ };
12674
+ }
12675
+
12374
12676
  /**
12375
12677
  * Decide the Anthropic `thinking` request params for a model. Returns null
12376
12678
  * (off) unless the caller opts in via options.thinking (true | "think" |
@@ -13608,9 +13910,15 @@ export async function* agentLoop(messages, options) {
13608
13910
  const toolContext = {
13609
13911
  readFileCache: new Map(),
13610
13912
  hookDb: hermeticExecution ? null : options.hookDb || null,
13611
- skillLoader: options.skillLoader || _defaultSkillLoader,
13913
+ skillLoader:
13914
+ options.skillLoader ||
13915
+ (options.skillRuntimeAdmission || options.skillRuntimeAdmissionRequired
13916
+ ? new CLISkillLoader(captureSkillRuntimeDependencies(options))
13917
+ : _defaultSkillLoader),
13612
13918
  skillOutcomeIndex: options.skillOutcomeIndex,
13613
13919
  skillVectorAuthority: options.skillVectorAuthority,
13920
+ skillRuntimeAdmission: options.skillRuntimeAdmission,
13921
+ skillRuntimeAdmissionRequired: options.skillRuntimeAdmissionRequired,
13614
13922
  skillRetrievalRevocationReader: options.skillRetrievalRevocationReader,
13615
13923
  // Hook-envelope tracing (P2 unified event bus): every settings-hook payload
13616
13924
  // fired during this run carries trace_id = this run's id; a spawned child
@@ -14750,6 +15058,15 @@ export async function* agentLoop(messages, options) {
14750
15058
  ];
14751
15059
  contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14752
15060
  }
15061
+ if (hook && typeof hook.userContext === "string" && hook.userContext) {
15062
+ // User-originated asynchronous context must remain user authority.
15063
+ // In particular, deferred question answers cannot become a trusted
15064
+ // system instruction merely because they arrive between iterations.
15065
+ callMessages = [
15066
+ ...callMessages,
15067
+ { role: "user", content: hook.userContext },
15068
+ ];
15069
+ }
14753
15070
  } catch (_e) {
14754
15071
  // prepareCall failures are non-critical — proceed with original messages
14755
15072
  }
@@ -15100,7 +15417,9 @@ export async function* agentLoop(messages, options) {
15100
15417
  .map((b) => b.thinking || "")
15101
15418
  .join("")
15102
15419
  .trim()
15103
- : "";
15420
+ : typeof msg._openaiReasoningSummary === "string"
15421
+ ? msg._openaiReasoningSummary.trim()
15422
+ : "";
15104
15423
  // Claude Code 2.1.183 parity: a turn that produced ONLY extended-thinking
15105
15424
  // (no visible text, no tool calls) would otherwise complete silently with
15106
15425
  // an empty answer — the user sees nothing. Re-prompt the model ONCE to
@@ -15197,11 +15516,17 @@ export async function* agentLoop(messages, options) {
15197
15516
  // before it chose these tool calls. Streaming consumers already get it live
15198
15517
  // via onThinking, so only surface it as an event for non-streaming consumers
15199
15518
  // (the REPL) — keeps it out of the --include-partial-messages stream.
15200
- if (!options.onThinking && Array.isArray(msg._thinkingBlocks)) {
15201
- const _stepThinking = msg._thinkingBlocks
15202
- .map((b) => b.thinking || "")
15203
- .join("")
15204
- .trim();
15519
+ if (
15520
+ !options.onThinking &&
15521
+ (Array.isArray(msg._thinkingBlocks) ||
15522
+ typeof msg._openaiReasoningSummary === "string")
15523
+ ) {
15524
+ const _stepThinking = Array.isArray(msg._thinkingBlocks)
15525
+ ? msg._thinkingBlocks
15526
+ .map((b) => b.thinking || "")
15527
+ .join("")
15528
+ .trim()
15529
+ : msg._openaiReasoningSummary.trim();
15205
15530
  if (_stepThinking) yield { type: "thinking", text: _stepThinking };
15206
15531
  }
15207
15532
 
@@ -41,6 +41,7 @@ import {
41
41
  } from "../lib/evolution/agent-evolution-session-lifecycle.js";
42
42
  import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
43
43
  import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
44
+ import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
44
45
  import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
45
46
 
46
47
  const {
@@ -77,6 +78,10 @@ export class AgentRuntime {
77
78
  deps.evolutionIngress == null
78
79
  ? null
79
80
  : captureAgentEvolutionIngress(deps.evolutionIngress);
81
+ this.runtimeAdmissionDependencies = captureSkillRuntimeDependencies(
82
+ deps,
83
+ this.evolutionIngress?.tenantId,
84
+ );
80
85
  this.skillOutcomeIndex =
81
86
  deps.skillOutcomeIndex == null
82
87
  ? null
@@ -343,6 +348,7 @@ export class AgentRuntime {
343
348
  });
344
349
  const result = await this.deps.startAgentRepl({
345
350
  ...this.policy,
351
+ ...this.runtimeAdmissionDependencies,
346
352
  ...(this.memoryPolicyReceiptWriter === null
347
353
  ? {}
348
354
  : { memoryPolicyReceiptWriter: this.memoryPolicyReceiptWriter }),
@@ -551,6 +557,7 @@ export class AgentRuntime {
551
557
  }
552
558
 
553
559
  const server = this.deps.createServer({
560
+ ...this.runtimeAdmissionDependencies,
554
561
  port,
555
562
  host,
556
563
  token,
@@ -966,7 +966,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
966
966
  kind: "interaction",
967
967
  tier: "extension",
968
968
  description:
969
- "Pause the agent and ask the user a structured question. In non-interactive contexts (headless, WS gateway), returns an error so the agent can proceed autonomously.",
969
+ "Ask the user a structured question. blocking (default) waits for a decision; deferred returns a pending receipt so independent work can continue and is restricted to non-authoritative preference/information collection. Deferred answers never grant permission or approve a branch.",
970
970
  inputSchema: {
971
971
  type: "object",
972
972
  properties: {
@@ -984,6 +984,18 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
984
984
  type: "boolean",
985
985
  description: "Allow multiple selections (default: false)",
986
986
  },
987
+ mode: {
988
+ type: "string",
989
+ enum: ["blocking", "deferred"],
990
+ description:
991
+ "blocking waits for the answer (default). deferred immediately returns a pending receipt and may only be used for independent preference/information collection",
992
+ },
993
+ purpose: {
994
+ type: "string",
995
+ enum: ["decision", "authorization", "preference", "information"],
996
+ description:
997
+ "Why the answer is needed. decision/authorization questions are always blocking; deferred requires preference or information",
998
+ },
987
999
  timeoutMs: {
988
1000
  type: "number",
989
1001
  description: "Max wait for user reply in ms (default: 60000)",
@@ -123,6 +123,7 @@ import { withQuietStdout } from "./quiet-stdout.js";
123
123
  import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
124
124
  import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
125
125
  import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
126
+ import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
126
127
  import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
127
128
  import { CostBudget } from "../lib/cost-budget.js";
128
129
  import { estimateTokens } from "../harness/prompt-compressor.js";
@@ -1777,7 +1778,8 @@ async function runAgentHeadlessInWorkspace(
1777
1778
  let _skillCacheLedger = null;
1778
1779
  const _runtimeSkillLoader = hermeticExecution
1779
1780
  ? HERMETIC_SKILL_LOADER
1780
- : options.skillLoader || new CLISkillLoader();
1781
+ : options.skillLoader ||
1782
+ new CLISkillLoader(captureSkillRuntimeDependencies(options));
1781
1783
  const systemContent = hermeticExecution
1782
1784
  ? composeSystemPrompt(
1783
1785
  "You are a hermetic code fixer. The exposed file tools are the complete tool surface. Inspect and mutate only the exact paths authorized in the user request, then return a concise completion message.",
@@ -2511,6 +2513,7 @@ async function runAgentHeadlessInWorkspace(
2511
2513
  apiKey,
2512
2514
  cwd,
2513
2515
  skillLoader: _runtimeSkillLoader,
2516
+ ...captureSkillRuntimeDependencies(options, evolutionIngress?.tenantId),
2514
2517
  ...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
2515
2518
  ...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
2516
2519
  ...(skillRetrievalRevocationReader === null