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
@@ -8,8 +8,9 @@
8
8
  * runEvalSuite gives each task a fresh temp workspace, runs `setup` to lay down
9
9
  * the starting files, hands `prompt` to the agent (via an injected `runAgent` so
10
10
  * the harness is testable without a live LLM), then runs `check` to decide
11
- * pass/fail deterministically. The score is the fraction of tasks whose check
12
- * passed — a verifiable success-rate metric, per the plan's north star.
11
+ * artifacts deterministically. Task success requires both a passing artifact
12
+ * check and an explicitly successful execution; failed runs can retain useful
13
+ * artifact-check results without inflating the reliability score.
13
14
  *
14
15
  * The real `cc eval` command wires `runAgent` to a headless `cc agent -p` run;
15
16
  * unit tests inject a fake runAgent to exercise scoring/report logic offline.
@@ -146,9 +147,15 @@ export async function runEvalSuite(tasks, opts = {}) {
146
147
  // and still run check() (the workspace may be partially done).
147
148
  rec.error = `agent error: ${agentErr.message}`;
148
149
  }
149
- rec.executionSucceeded = agentResult?.ok === true && !rec.error;
150
+ rec.executionSucceeded =
151
+ agentResult?.ok === true &&
152
+ !rec.error &&
153
+ (agentResult.error == null || agentResult.error === "");
150
154
  rec.agentOk = rec.executionSucceeded;
151
155
  rec.executionEvidence = agentResult?.executionEvidence || null;
156
+ if (agentResult?.evaluationMetrics !== undefined) {
157
+ rec.evaluationMetrics = agentResult.evaluationMetrics;
158
+ }
152
159
  if (!rec.executionSucceeded && !rec.error) {
153
160
  rec.error = `agent error: ${agentResult?.error || "execution did not report success"}`;
154
161
  }
@@ -23,6 +23,14 @@ export const AGENT_EVOLUTION_INGRESS_SCHEMA =
23
23
  export const AGENT_EVOLUTION_INGRESS_FAILED_CODE =
24
24
  "CC_AGENT_EVOLUTION_INGRESS_FAILED";
25
25
 
26
+ const RESPONSE_CACHE_RECORD_SCHEMA =
27
+ "chainlesschain.model-response-cache/v2";
28
+ const LEGACY_RESPONSE_CACHE_RECORD_SCHEMA =
29
+ "chainlesschain.model-response-cache/v1";
30
+ const RESPONSE_CACHE_IDENTIFIER_BINDING_SCHEMA =
31
+ "chainlesschain.model-response-cache-identifier-binding/v1";
32
+ const HEX_ALPHA = "abcdefghijklmnop";
33
+
26
34
  const INGRESSES = new WeakSet();
27
35
  const CORE_EVENT_KINDS = new Map([
28
36
  ["tool-executing", "tool-requested"],
@@ -101,6 +109,22 @@ function digest(value) {
101
109
  return `sha256:${crypto.createHash("sha256").update(canonical(value)).digest("hex")}`;
102
110
  }
103
111
 
112
+ function cacheIdentifierBinding(kind, value) {
113
+ const input = requiredString(value, `Cache ${kind}`);
114
+ const bytes = crypto
115
+ .createHash("sha256")
116
+ .update(
117
+ `${RESPONSE_CACHE_IDENTIFIER_BINDING_SCHEMA}\0${kind}\0${input}`,
118
+ "utf8",
119
+ )
120
+ .digest();
121
+ let encoded = "";
122
+ for (const byte of bytes) {
123
+ encoded += HEX_ALPHA[byte >>> 4] + HEX_ALPHA[byte & 0x0f];
124
+ }
125
+ return encoded;
126
+ }
127
+
104
128
  function timestamp(value, label) {
105
129
  const date = new Date(value);
106
130
  if (!Number.isFinite(date.getTime()) || date.toISOString() !== value) {
@@ -263,10 +287,21 @@ export function createAgentEvolutionIngress({
263
287
  throw new Error("Cache receipt requires a recorded model response");
264
288
  const payload = cacheRecord
265
289
  ? {
266
- schema: "chainlesschain.model-response-cache/v1",
267
- requestKey: evidence.requestKey,
268
- sourceRunId: descriptor.runId,
269
- sourceEventId: lastModelResponse.eventId,
290
+ schema: RESPONSE_CACHE_RECORD_SCHEMA,
291
+ identifierBindingSchema:
292
+ RESPONSE_CACHE_IDENTIFIER_BINDING_SCHEMA,
293
+ requestKeyBinding: cacheIdentifierBinding(
294
+ "request key",
295
+ evidence.requestKey,
296
+ ),
297
+ sourceRunIdBinding: cacheIdentifierBinding(
298
+ "source Run ID",
299
+ descriptor.runId,
300
+ ),
301
+ sourceEventIdBinding: cacheIdentifierBinding(
302
+ "source event ID",
303
+ lastModelResponse.eventId,
304
+ ),
270
305
  responseEvent: clone(lastModelResponse.event),
271
306
  }
272
307
  : (modelRequest ?? clone(evidence));
@@ -433,6 +468,18 @@ export function createAgentEvolutionIngress({
433
468
  );
434
469
  const projection = resolved.bundle.modelProjection;
435
470
  const record = projection.content;
471
+ const legacyRecord =
472
+ record?.schema === LEGACY_RESPONSE_CACHE_RECORD_SCHEMA;
473
+ const currentRecord =
474
+ record?.schema === RESPONSE_CACHE_RECORD_SCHEMA &&
475
+ record.identifierBindingSchema ===
476
+ RESPONSE_CACHE_IDENTIFIER_BINDING_SCHEMA &&
477
+ record.requestKeyBinding ===
478
+ cacheIdentifierBinding("request key", requestKey) &&
479
+ record.sourceRunIdBinding ===
480
+ cacheIdentifierBinding("source Run ID", receipt.runId) &&
481
+ typeof record.sourceEventIdBinding === "string" &&
482
+ /^[a-p]{64}$/u.test(record.sourceEventIdBinding);
436
483
  if (
437
484
  resolved.verification.verified !== true ||
438
485
  resolved.verification.tenantId !== descriptor.tenantId ||
@@ -440,16 +487,21 @@ export function createAgentEvolutionIngress({
440
487
  projection.visibility !== "model-visible" ||
441
488
  projection.truncated ||
442
489
  projection.injectionFindings.length !== 0 ||
443
- record?.schema !== "chainlesschain.model-response-cache/v1" ||
444
- record.requestKey !== requestKey ||
445
- record.sourceRunId !== receipt.runId ||
490
+ (!currentRecord &&
491
+ (!legacyRecord ||
492
+ record.requestKey !== requestKey ||
493
+ record.sourceRunId !== receipt.runId)) ||
446
494
  record.responseEvent?.type !== "response-complete"
447
495
  )
448
496
  throw new Error(
449
497
  "Cache response projection is not safe or request-bound",
450
498
  );
451
499
  const responseEvent = loaded.events.find(
452
- (item) => item.eventId === record.sourceEventId,
500
+ (item) =>
501
+ legacyRecord
502
+ ? item.eventId === record.sourceEventId
503
+ : cacheIdentifierBinding("source event ID", item.eventId) ===
504
+ record.sourceEventIdBinding,
453
505
  );
454
506
  if (
455
507
  responseEvent?.data?.evidenceKind !== "response-completed" ||
@@ -11,6 +11,7 @@ import {
11
11
  import {
12
12
  EvolutionEvidenceBundleVerifier,
13
13
  EvolutionEvidenceProjector,
14
+ EvolutionEvidenceReader,
14
15
  } from "./evolution-evidence-projector.js";
15
16
  import { EvolutionArtifactPorts } from "./evolution-artifact-ports.js";
16
17
  import {
@@ -18,12 +19,17 @@ import {
18
19
  createEvolutionLedgerFileBackend,
19
20
  } from "./evolution-ledger-file-backend.js";
20
21
  import { EvolutionRunLedgerAdapter } from "./evolution-run-ledger-adapter.js";
22
+ import { createEvolutionRunWikiEvidenceResolver } from "./evolution-run-wiki-evidence-resolver.js";
23
+ import { WikiMaintainerLedgerAdapter } from "./wiki-maintainer-ledger-adapter.js";
24
+ import { EvidenceBackedWikiMaintainer } from "./evidence-backed-wiki-maintainer.js";
25
+ import { createWikiEvidenceCommitGuard } from "./wiki-evidence-commit-guard.js";
21
26
  import { EvolutionWorkbenchMetricsLedgerAdapter } from "./evolution-workbench-metrics-ledger-adapter.js";
22
27
  import { EvolutionReleaseTrainLedgerAdapter } from "./evolution-release-train-ledger-adapter.js";
23
28
  import { WikiSkillProposalLedgerAdapter } from "./wiki-skill-proposal-ledger-adapter.js";
24
29
  import { EvolutionReleaseTrainStageOutputLedgerAdapter } from "./evolution-release-train-stage-output-ledger-adapter.js";
25
30
  import { createEvolutionReleaseTrainDomainStages } from "./evolution-release-train-domain-stages.js";
26
31
  import { createEvolutionReleaseTrain } from "./evolution-release-train.js";
32
+ import { createEvolutionEvalRuntimeStageConfiguration } from "./evolution-eval-runtime-composition.js";
27
33
  import { captureSkillOutcomeSourceCatalogAuthority } from "./skill-outcome-source-catalog-authority.js";
28
34
  import {
29
35
  captureAgentEvolutionIngress,
@@ -62,6 +68,36 @@ const SKILL_OUTCOME_CATALOG_ENTRY_KEYS = new Set(["runId", "skillNames"]);
62
68
  const MAX_SKILL_OUTCOME_SOURCES = 128;
63
69
  const RELEASE_TRAIN_STAGE_KEYS = new Set(["plan", "stages"]);
64
70
  const RELEASE_TRAIN_DOMAIN_KEYS = new Set(["plan", "domain"]);
71
+ const WIKI_MAINTENANCE_KEYS = new Set([
72
+ "principalEnvelope",
73
+ "schemaPolicies",
74
+ "readAuthorities",
75
+ "commitCoordinator",
76
+ "maintainer",
77
+ ]);
78
+ const WIKI_READ_AUTHORITY_KEYS = new Set([
79
+ "evidenceState",
80
+ "principalResolver",
81
+ "accessPolicy",
82
+ ]);
83
+ const WIKI_COMMIT_COORDINATOR_KEYS = new Set(["acquireCurrentEvidence"]);
84
+ const WIKI_MAINTAINER_KEYS = new Set([
85
+ "maintainerModel",
86
+ "rulesDigest",
87
+ "minCorroboratingSources",
88
+ "derive",
89
+ ]);
90
+ const WIKI_STAGE_KEYS = new Set(["request", "usage"]);
91
+ const DOMAIN_STAGE_KEYS = new Set([
92
+ "wiki-maintain",
93
+ "propose",
94
+ "candidate",
95
+ "eval",
96
+ "review",
97
+ "pilot",
98
+ "promotion",
99
+ "wiki-impact",
100
+ ]);
65
101
 
66
102
  function exactRecord(value, keys, label) {
67
103
  if (
@@ -191,6 +227,7 @@ export function createAgentEvolutionRuntimeComposition({
191
227
  evidenceIdGenerator,
192
228
  ingressIdGenerator,
193
229
  wikiMaintenanceProducer = null,
230
+ wikiMaintenance: wikiMaintenanceInput = null,
194
231
  releaseTrain: releaseTrainInput = null,
195
232
  completionTriggerKind,
196
233
  secure = true,
@@ -199,7 +236,18 @@ export function createAgentEvolutionRuntimeComposition({
199
236
  random,
200
237
  lockTimeoutMs,
201
238
  witnessMaximumBytes,
239
+ ledgerV2: ledgerV2Input = null,
202
240
  } = {}) {
241
+ const ledgerV2 =
242
+ ledgerV2Input === null
243
+ ? null
244
+ : Object.freeze({
245
+ ...exactRecord(
246
+ ledgerV2Input,
247
+ new Set(["createBackend", "minimumRetainedUntil"]),
248
+ "ledger v2 production composition",
249
+ ),
250
+ });
203
251
  const tenantId = identifier(tenantIdInput, "tenantId");
204
252
  const runId = identifier(runIdInput, "runId");
205
253
  const audience = identifier(audienceInput, "audience");
@@ -218,6 +266,79 @@ export function createAgentEvolutionRuntimeComposition({
218
266
  "authorities.artifact",
219
267
  );
220
268
  const clock = normalizeClock(clockInput);
269
+ let wikiConfiguration = null;
270
+ if (wikiMaintenanceInput !== null) {
271
+ const input = exactRecord(
272
+ wikiMaintenanceInput,
273
+ WIKI_MAINTENANCE_KEYS,
274
+ "wikiMaintenance",
275
+ );
276
+ const readers = exactRecord(
277
+ input.readAuthorities,
278
+ WIKI_READ_AUTHORITY_KEYS,
279
+ "wikiMaintenance.readAuthorities",
280
+ );
281
+ const maintainer = exactRecord(
282
+ input.maintainer,
283
+ WIKI_MAINTAINER_KEYS,
284
+ "wikiMaintenance.maintainer",
285
+ );
286
+ const coordinator = exactRecord(
287
+ input.commitCoordinator,
288
+ WIKI_COMMIT_COORDINATOR_KEYS,
289
+ "wikiMaintenance.commitCoordinator",
290
+ );
291
+ if (
292
+ utilTypes.isAsyncFunction(coordinator.acquireCurrentEvidence) ||
293
+ utilTypes.isGeneratorFunction(coordinator.acquireCurrentEvidence)
294
+ ) {
295
+ throw new TypeError("Wiki commit coordinator must be synchronous");
296
+ }
297
+ const commitCoordinator = Object.freeze({
298
+ acquireCurrentEvidence: capture(
299
+ coordinator,
300
+ "acquireCurrentEvidence",
301
+ "Wiki commit coordinator",
302
+ ),
303
+ });
304
+ if (
305
+ !Number.isSafeInteger(maintainer.minCorroboratingSources) ||
306
+ maintainer.minCorroboratingSources < 2 ||
307
+ maintainer.minCorroboratingSources > 128
308
+ ) {
309
+ throw new TypeError(
310
+ "Wiki corroboration threshold must be between 2 and 128",
311
+ );
312
+ }
313
+ wikiConfiguration = Object.freeze({
314
+ principalEnvelope: input.principalEnvelope,
315
+ schemaPolicies: input.schemaPolicies,
316
+ commitCoordinator,
317
+ descriptor: Object.freeze({
318
+ tenantId,
319
+ evolutionRunId: runId,
320
+ maintainerModel: maintainer.maintainerModel,
321
+ rulesDigest: maintainer.rulesDigest,
322
+ minCorroboratingSources: maintainer.minCorroboratingSources,
323
+ }),
324
+ derive: capture(maintainer, "derive", "Wiki maintainer"),
325
+ evidenceState: captureAuthority(
326
+ readers.evidenceState,
327
+ "resolve",
328
+ "Wiki evidence state",
329
+ ),
330
+ principalResolver: captureAuthority(
331
+ readers.principalResolver,
332
+ "resolve",
333
+ "Wiki principal resolver",
334
+ ),
335
+ accessPolicy: captureAuthority(
336
+ readers.accessPolicy,
337
+ "authorize",
338
+ "Wiki access policy",
339
+ ),
340
+ });
341
+ }
221
342
  if (
222
343
  typeof evidenceIdGenerator !== "function" ||
223
344
  utilTypes.isProxy(evidenceIdGenerator)
@@ -342,6 +463,15 @@ export function createAgentEvolutionRuntimeComposition({
342
463
  ledgerAuthority: authorities.ledger,
343
464
  witnessAuthority: authorities.witness,
344
465
  artifactResolver: ledgerArtifactResolver,
466
+ ...(ledgerV2 === null
467
+ ? {}
468
+ : {
469
+ manifestV2: {
470
+ ...ledgerV2,
471
+ artifactPorts,
472
+ descriptor: { tenantId, artifactTenantId: tenantId, audience },
473
+ },
474
+ }),
345
475
  secure,
346
476
  clock,
347
477
  ...(fsImpl === undefined ? {} : { fsImpl }),
@@ -384,6 +514,66 @@ export function createAgentEvolutionRuntimeComposition({
384
514
  ledgerArtifactResolver,
385
515
  now: clock,
386
516
  });
517
+ let wikiMaintenance = null;
518
+ let wikiMaintainer = null;
519
+ if (wikiConfiguration !== null) {
520
+ const evidenceReader = new EvolutionEvidenceReader({
521
+ attestationVerifier: ports.attestationVerifier,
522
+ evidenceState: wikiConfiguration.evidenceState,
523
+ principalResolver: wikiConfiguration.principalResolver,
524
+ accessPolicy: wikiConfiguration.accessPolicy,
525
+ now: () => new Date(clock()),
526
+ });
527
+ const wikiEvidence = createEvolutionRunWikiEvidenceResolver({
528
+ runAdapter,
529
+ evidenceAdapter,
530
+ evidenceReader,
531
+ principalEnvelope: wikiConfiguration.principalEnvelope,
532
+ schemaPolicies: wikiConfiguration.schemaPolicies,
533
+ });
534
+ const wikiAdapter = new WikiMaintainerLedgerAdapter({
535
+ descriptor: {
536
+ tenantId,
537
+ artifactTenantId: tenantId,
538
+ evolutionRunId: runId,
539
+ audience,
540
+ purpose: "evolution-ledger",
541
+ },
542
+ artifactPorts,
543
+ ledger: backend.ledger,
544
+ ledgerArtifactResolver,
545
+ });
546
+ const wikiCommit = createWikiEvidenceCommitGuard({
547
+ wikiAdapter,
548
+ commitCoordinator: wikiConfiguration.commitCoordinator,
549
+ principalEnvelope: wikiConfiguration.principalEnvelope,
550
+ clock,
551
+ });
552
+ wikiMaintainer = new EvidenceBackedWikiMaintainer({
553
+ descriptor: wikiConfiguration.descriptor,
554
+ policy: {
555
+ trustedProjectionRead: true,
556
+ rawEvidenceRead: false,
557
+ activeSkillWrite: false,
558
+ shell: false,
559
+ network: false,
560
+ secretRead: false,
561
+ },
562
+ ports: {
563
+ ...wikiAdapter.maintainerPorts({
564
+ resolveEvidence: wikiEvidence.resolveEvidence,
565
+ derive: wikiConfiguration.derive,
566
+ }),
567
+ commitRevision: wikiCommit.commitRevision,
568
+ },
569
+ });
570
+ // The host receives only scoped maintenance and authenticated Wiki reads,
571
+ // never a Raw store, caller-supplied bundle, or write/approval capability.
572
+ wikiMaintenance = Object.freeze({
573
+ maintain: Object.freeze(wikiMaintainer.maintain.bind(wikiMaintainer)),
574
+ loadWiki: Object.freeze(() => wikiAdapter.loadWiki()),
575
+ });
576
+ }
387
577
  const skillOutcomeReaders = new Map();
388
578
  const createSkillOutcomeReader = Object.freeze((skillNameInput) => {
389
579
  const skillName = identifier(skillNameInput, "skillName");
@@ -415,6 +605,14 @@ export function createAgentEvolutionRuntimeComposition({
415
605
  releaseTrainKeys,
416
606
  "releaseTrain",
417
607
  );
608
+ if (
609
+ wikiMaintainer !== null &&
610
+ !Object.hasOwn(releaseTrainConfig, "domain")
611
+ ) {
612
+ throw new TypeError(
613
+ "authorized Wiki maintenance requires production release train domain stages",
614
+ );
615
+ }
418
616
  if (
419
617
  releaseTrainConfig.plan?.tenantId !== tenantId ||
420
618
  typeof releaseTrainConfig.plan?.skillId !== "string"
@@ -463,8 +661,35 @@ export function createAgentEvolutionRuntimeComposition({
463
661
  ledger: backend.ledger,
464
662
  ledgerArtifactResolver,
465
663
  });
664
+ let domain = releaseTrainConfig.domain;
665
+ exactRecord(domain, DOMAIN_STAGE_KEYS, "releaseTrain.domain");
666
+ domain = {
667
+ ...domain,
668
+ eval: createEvolutionEvalRuntimeStageConfiguration({
669
+ configuration: domain.eval,
670
+ tenantId,
671
+ runId,
672
+ artifactPorts,
673
+ ledger: backend.ledger,
674
+ ledgerArtifactResolver,
675
+ audience,
676
+ now: clock,
677
+ }),
678
+ };
679
+ if (wikiMaintainer !== null) {
680
+ exactRecord(domain, DOMAIN_STAGE_KEYS, "releaseTrain.domain");
681
+ const wikiStage = exactRecord(
682
+ domain["wiki-maintain"],
683
+ WIKI_STAGE_KEYS,
684
+ "authorized wiki-maintain stage",
685
+ );
686
+ domain = {
687
+ ...domain,
688
+ "wiki-maintain": { ...wikiStage, maintainer: wikiMaintainer },
689
+ };
690
+ }
466
691
  stages = createEvolutionReleaseTrainDomainStages({
467
- domain: releaseTrainConfig.domain,
692
+ domain,
468
693
  proposalLedger,
469
694
  outputLedger,
470
695
  });
@@ -513,6 +738,15 @@ export function createAgentEvolutionRuntimeComposition({
513
738
  ledgerAuthority: cacheSourceAuthorities.ledger,
514
739
  witnessAuthority: cacheSourceAuthorities.witness,
515
740
  artifactResolver: sourceResolver,
741
+ ...(ledgerV2 === null
742
+ ? {}
743
+ : {
744
+ manifestV2: {
745
+ ...ledgerV2,
746
+ artifactPorts: sourcePorts,
747
+ descriptor: { tenantId, artifactTenantId: tenantId, audience },
748
+ },
749
+ }),
516
750
  secure,
517
751
  clock,
518
752
  ...(fsImpl === undefined ? {} : { fsImpl }),
@@ -553,6 +787,7 @@ export function createAgentEvolutionRuntimeComposition({
553
787
  runId,
554
788
  evolutionIngress,
555
789
  createSkillOutcomeReader,
790
+ wikiMaintenance,
556
791
  loadRun: Object.freeze(() => runAdapter.load()),
557
792
  ledgerDescriptor: backend.descriptor,
558
793
  storage,
@@ -11,6 +11,8 @@ const MESSAGE_KEYS = new Set([
11
11
  "tool_call_id",
12
12
  "name",
13
13
  "_thinkingBlocks",
14
+ "_openaiReasoningItems",
15
+ "_openaiReasoningSummary",
14
16
  ]);
15
17
  const OPAQUE_BLOCK_SCHEMA =
16
18
  "chainlesschain.evolution-agent-opaque-transport-block/v1";
@@ -124,6 +126,9 @@ function opaqueKind(value, path) {
124
126
  if (/^messages\.\d+\._thinkingBlocks\.\d+$/u.test(path)) {
125
127
  return thinkingBlock(value) ? value.type : null;
126
128
  }
129
+ if (/^messages\.\d+\._openaiReasoningItems\.\d+$/u.test(path)) {
130
+ return openAIReasoningItem(value) ? "openai_reasoning" : null;
131
+ }
127
132
  return null;
128
133
  }
129
134
 
@@ -142,13 +147,70 @@ function isOpaqueBlock(value) {
142
147
  return (
143
148
  exactKeys(value, OPAQUE_BLOCK_KEYS) &&
144
149
  value.schema === OPAQUE_BLOCK_SCHEMA &&
145
- ["image", "thinking", "redacted_thinking"].includes(value.kind) &&
150
+ ["image", "thinking", "redacted_thinking", "openai_reasoning"].includes(
151
+ value.kind,
152
+ ) &&
146
153
  /^sha256:[a-f0-9]{64}$/u.test(value.digest) &&
147
154
  Number.isSafeInteger(value.byteLength) &&
148
155
  value.byteLength > 0
149
156
  );
150
157
  }
151
158
 
159
+ function openAIReasoningItem(value) {
160
+ if (
161
+ !value ||
162
+ typeof value !== "object" ||
163
+ Array.isArray(value) ||
164
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
165
+ value.type !== "reasoning" ||
166
+ Object.keys(value).some(
167
+ (key) =>
168
+ !["type", "id", "encrypted_content", "summary", "status"].includes(key),
169
+ )
170
+ ) {
171
+ return null;
172
+ }
173
+ if (
174
+ Object.hasOwn(value, "id") &&
175
+ (typeof value.id !== "string" ||
176
+ !/^[A-Za-z0-9._:-]{1,256}$/u.test(value.id))
177
+ ) {
178
+ return null;
179
+ }
180
+ if (
181
+ Object.hasOwn(value, "encrypted_content") &&
182
+ (typeof value.encrypted_content !== "string" ||
183
+ value.encrypted_content.length < 1 ||
184
+ value.encrypted_content.length > 256 * 1024 ||
185
+ !/^[\x21-\x7e]+$/u.test(value.encrypted_content))
186
+ ) {
187
+ return null;
188
+ }
189
+ if (Object.hasOwn(value, "summary")) {
190
+ if (
191
+ !Array.isArray(value.summary) ||
192
+ value.summary.length < 1 ||
193
+ value.summary.length > 16 ||
194
+ value.summary.some(
195
+ (part) =>
196
+ !exactKeys(part, new Set(["type", "text"])) ||
197
+ part.type !== "summary_text" ||
198
+ typeof part.text !== "string" ||
199
+ part.text.length > 8192,
200
+ )
201
+ ) {
202
+ return null;
203
+ }
204
+ }
205
+ if (
206
+ Object.hasOwn(value, "status") &&
207
+ !["completed", "in_progress", "incomplete"].includes(value.status)
208
+ ) {
209
+ return null;
210
+ }
211
+ return Object.keys(value).length > 1 ? value : null;
212
+ }
213
+
152
214
  function assertContentBlock(value, path, allowOpaqueTransportBlocks) {
153
215
  if (allowOpaqueTransportBlocks && isOpaqueBlock(value)) return;
154
216
  if (
@@ -214,6 +276,36 @@ function assertMessageShape(message, index, allowOpaqueTransportBlocks) {
214
276
  }
215
277
  });
216
278
  }
279
+ if (Object.hasOwn(message, "_openaiReasoningItems")) {
280
+ if (
281
+ message.role !== "assistant" ||
282
+ !Array.isArray(message._openaiReasoningItems) ||
283
+ !message._openaiReasoningItems.length ||
284
+ message._openaiReasoningItems.length > 16
285
+ ) {
286
+ throw new TypeError(
287
+ "OpenAI reasoning replay requires bounded assistant items",
288
+ );
289
+ }
290
+ message._openaiReasoningItems.forEach((item, itemIndex) => {
291
+ if (
292
+ !(allowOpaqueTransportBlocks && isOpaqueBlock(item)) &&
293
+ !openAIReasoningItem(item)
294
+ ) {
295
+ throw new TypeError(
296
+ `OpenAI reasoning item at messages.${index}._openaiReasoningItems.${itemIndex} is unsupported`,
297
+ );
298
+ }
299
+ });
300
+ }
301
+ if (
302
+ Object.hasOwn(message, "_openaiReasoningSummary") &&
303
+ (message.role !== "assistant" ||
304
+ typeof message._openaiReasoningSummary !== "string" ||
305
+ message._openaiReasoningSummary.length > 8192)
306
+ ) {
307
+ throw new TypeError("OpenAI reasoning summary is unsupported");
308
+ }
217
309
  }
218
310
 
219
311
  // Capture before the first await. Accessors, proxies and exotic objects cannot
@@ -326,6 +418,10 @@ function textPath(path, allowStructuredArgumentText = true) {
326
418
  /^messages\.\d+\._thinkingBlocks\.\d+\.(?:thinking|signature|data)$/u.test(
327
419
  path,
328
420
  ) ||
421
+ /^messages\.\d+\._openaiReasoningItems\.\d+\.(?:encrypted_content|summary\.\d+\.text)$/u.test(
422
+ path,
423
+ ) ||
424
+ /^messages\.\d+\._openaiReasoningSummary$/u.test(path) ||
329
425
  (allowStructuredArgumentText
330
426
  ? /^messages\.\d+\.tool_calls\.\d+\.function\.arguments(?:\.|$)/u.test(
331
427
  path,