chainlesschain 0.166.46 → 0.166.48

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 +4 -2
  3. package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-BLGEffkh.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-Cz1z2VGD.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C3j9cf6q.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-BR9ERuCA.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-CozJCm4y.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-DC5g9Ra2.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-B1zrQ0dW.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-ChVnfjpm.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-8_vLQsLf.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-Dct9bm6L.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-BvoSsCKh.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DZQIsCIC.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-CdzHxmnq.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-DdAN8LeW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-CNgjT9MA.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-BtQiX6G-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-OGX5ma3j.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-CgugQnGM.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-Bpg7cPFD.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-D1hsuswf.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-miDRsMBw.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-CGcl8htP.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BFaxTdVE.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-BQdGLZIO.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-BqpG3XHV.js → EvolutionSettings-bMvgBk6r.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-c1WVC_--.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-DyAcFrQY.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-CfwpfD2B.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DkJcbBpS.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-DgYIrPJh.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BF1tYPJ6.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-BFkwRIrU.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-DpCoqhBa.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-DU2qAJmD.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-QWv7UJLq.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Dz9NUrfo.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-B67I3d5v.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-crkElJSy.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-BO20VbdX.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-Ba-3gZZd.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-BAHZM084.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-CL3DzajL.js} +4 -4
  45. package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-BSWWzvWH.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-fnxqXM_3.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-6F8EarNN.js → Notes-qUZPIQXT.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-x9Xrixqu.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-gVgXQWdc.js → OrderTableRenderer-BtMtQUt7.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-C946Hzna.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BYf8KIts.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-Cbqf5dnv.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-rmxp0cuF.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CZBw45EW.js} +3 -3
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub-BKwUAt43.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DmFD2QW4.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-KpuwWvt5.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-Bt8UheX6.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-2ZeAn9CP.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-zBuet8Zs.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-DcEAnw6L.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-qF7liYG9.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-qiESlVBJ.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-Bk-cQyi9.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-CwrekErS.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-Bmw_UQtW.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-CPdqZIUX.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-D_W-xxvS.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-Hu0oDFj_.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DeRxUwmq.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CsNmHFkf.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-gv_Vz0tN.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-Dgg-_rCB.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-Bpu-bsEJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-CrhleHuF.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-JHjUN6I9.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-DKRWKkl9.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-leiWntLq.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant--1bYulvn.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-C0y6FvSS.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-CQK4PVv4.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-DbIvF-DV.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-CkXJ2vuq.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-B02WXJPw.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-VPMkfzmw.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-C5ezUnah.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-CYfvYRrY.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-DtKl-kpr.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-DACITF-u.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-qnygfnLi.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-D4mISLBD.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-BBPfxYGL.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Byx4ndHp.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-DBy6gsuI.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-CGjLkkn3.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index-B8UpadHC.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BD0w-888.js → index-B9jH-h4X.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BN7_TSgU.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-BNe2lCk6.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-B_fHPZ8E.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BfEDXk_E.js +1 -0
  102. package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-BklGH3YI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-BmKYaaGP.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BxQF1wCU.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-ByA1NyFP.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-0200QxC4.js → index-BzeBBAl5.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-C3abGsSW.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-C9tcHs46.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-CD5Btq6p.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-CFMWjuav.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-CMj8qmpX.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-CVUJjQAT.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-CWhI8G14.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CZjNamSU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-CmHE-lY_.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-CoA8WsVr.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-Cpg3AWRy.js} +1 -1
  118. package/src/assets/web-panel/assets/index-CrxUwNM8.js +1 -0
  119. package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-CsVuQsY1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-CydHMjwc.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CPYshcic.js → index-DH6iC5b2.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-DZXhKAk9.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-D_g9mA1N.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-DboTeuPF.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-DfgpKd64.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-Dmfe0L2Z.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-Dzni_5Qw.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-J5JkStvY.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-Ne8UGllV.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-O09jXbir.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-Y7el_3WS.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-c_tBkIlU.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-lKJWAmd4.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-xzRKTy0R.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-XuhfEIhB.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-Cbxh6AxO.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-C7IEnFly.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-lLADx4LL.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-mIbic_k-.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-_xIYEqu3.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-ClB-E0ny.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D36Bg2ut.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-CUuO08Bl.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-BKahwLbv.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-2pT-T8vy.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-DyH5g7Rg.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-CTOauB3X.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-B02JYIMe.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-Do22wQrc.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BfnL7rit.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 +161 -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 +48 -1
  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-list-index.js +222 -0
  175. package/src/lib/background-agent-supervisor.js +232 -47
  176. package/src/lib/codex-app-server-adapter.js +82 -27
  177. package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
  178. package/src/lib/context-memory-kernel/provider-context.js +118 -19
  179. package/src/lib/deferred-question-context.js +278 -0
  180. package/src/lib/eval/evidence.js +202 -64
  181. package/src/lib/eval/plugin-suite.js +1181 -0
  182. package/src/lib/eval/runner.js +10 -3
  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 +87 -3
  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/session-host-snapshot.js +16 -0
  217. package/src/lib/skill-loader.js +12 -0
  218. package/src/lib/with-file-lock.js +3 -1
  219. package/src/repl/agent-repl.js +5 -1
  220. package/src/runtime/agent-core.js +348 -23
  221. package/src/runtime/agent-runtime.js +7 -0
  222. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  223. package/src/runtime/headless-runner.js +4 -1
  224. package/src/runtime/headless-stream.js +283 -45
  225. package/src/runtime/runtime-factory.js +26 -2
  226. package/src/workers/background-agent-keeper.js +23 -13
  227. package/src/workers/background-agent-worker.js +27 -13
  228. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
  229. package/src/assets/web-panel/assets/PdhVaultBrowser-fYmQzmTA.js +0 -7
  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
@@ -6,6 +6,7 @@ export const CODEX_APP_SERVER_COMPATIBILITY_MATRIX = Object.freeze([
6
6
  Object.freeze({ version: "0.149.0" }),
7
7
  Object.freeze({ version: "0.150.0" }),
8
8
  Object.freeze({ version: "0.150.1" }),
9
+ Object.freeze({ version: "0.154.0" }),
9
10
  ]);
10
11
 
11
12
  function adapterError(code, message, details = {}) {
@@ -66,18 +67,40 @@ function projectNotification(notification) {
66
67
  };
67
68
  }
68
69
  if (method === "turn/completed" || method === "turn/failed") {
69
- const failed = method === "turn/failed";
70
+ const turn = params.turn || {};
71
+ const reportedStatus =
72
+ method === "turn/failed" ? "failed" : String(turn.status || "");
73
+ const terminalStatus = ["completed", "failed", "interrupted"].includes(
74
+ reportedStatus,
75
+ )
76
+ ? reportedStatus
77
+ : "failed";
78
+ const protocolError =
79
+ terminalStatus === "failed" && reportedStatus !== "failed"
80
+ ? {
81
+ code: "CC_CODEX_APP_SERVER_INVALID_TERMINAL_STATUS",
82
+ message:
83
+ "Codex App Server emitted turn/completed without a supported terminal status",
84
+ }
85
+ : null;
86
+ const terminalError =
87
+ terminalStatus === "failed"
88
+ ? turn.error ||
89
+ params.error ||
90
+ protocolError ||
91
+ "Codex App Server turn failed"
92
+ : turn.error || params.error || null;
70
93
  return {
71
94
  method: "turn/completed",
72
95
  params: {
73
96
  turn: {
74
- ...params.turn,
75
- status: failed ? "failed" : "completed",
97
+ ...turn,
98
+ status: terminalStatus,
76
99
  },
77
100
  },
78
- terminal: failed ? "failed" : "completed",
79
- error: failed ? params.error || "Codex App Server turn failed" : null,
80
- usage: params.usage || null,
101
+ terminal: terminalStatus,
102
+ error: terminalError,
103
+ usage: params.usage || turn.usage || null,
81
104
  };
82
105
  }
83
106
  return { unknownMethod: String(method || "<missing>") };
@@ -138,6 +161,10 @@ export class CodexAppServerAdapter extends EventEmitter {
138
161
  const notifications = [];
139
162
  const unknownMethods = new Set();
140
163
  let output = "";
164
+ let activeThreadId = threadId;
165
+ let submissionStarted = false;
166
+ let admissionObserved = false;
167
+ let observedTerminal = null;
141
168
  let terminalResolve;
142
169
  let terminalReject;
143
170
  const terminal = new Promise((resolve, reject) => {
@@ -162,16 +189,38 @@ export class CodexAppServerAdapter extends EventEmitter {
162
189
  notifications.push(projected);
163
190
  this.emit("notification", projected);
164
191
  }
192
+ if (
193
+ submissionStarted &&
194
+ (projected.method === "turn/started" ||
195
+ projected.method?.startsWith("item/") ||
196
+ Boolean(projected.terminal))
197
+ ) {
198
+ admissionObserved = true;
199
+ }
165
200
  if (projected.output) output = projected.output;
166
- if (projected.terminal) terminalResolve(projected);
201
+ if (projected.terminal) {
202
+ observedTerminal = projected;
203
+ terminalResolve(projected);
204
+ }
167
205
  };
168
206
  this.client.on?.("notification", onNotification);
169
- let admitted = false;
207
+ const buildResult = (terminalEvent) =>
208
+ Object.freeze({
209
+ protocol: CODEX_APP_SERVER_PROTOCOL,
210
+ threadId: activeThreadId,
211
+ terminal: terminalEvent.terminal,
212
+ output,
213
+ error: terminalEvent.error || null,
214
+ usage: terminalEvent.usage || null,
215
+ notifications: Object.freeze(notifications),
216
+ unknownMethods: Object.freeze([...unknownMethods].sort()),
217
+ fallback: false,
218
+ authoritative: false,
219
+ });
170
220
  try {
171
221
  if (!this.client.running && typeof this.client.start === "function") {
172
222
  await this.client.start();
173
223
  }
174
- let activeThreadId = threadId;
175
224
  if (!activeThreadId) {
176
225
  const started = await this.client.request("thread/start", {
177
226
  ephemeral: false,
@@ -185,31 +234,37 @@ export class CodexAppServerAdapter extends EventEmitter {
185
234
  "Codex App Server did not return a thread identity",
186
235
  );
187
236
  }
237
+ // Once turn/start begins, a rejected client promise cannot prove that
238
+ // the server did not accept the input. Never launch a second execution
239
+ // path from that ambiguous state.
240
+ submissionStarted = true;
188
241
  const started = await this.client.request("turn/start", {
189
242
  threadId: activeThreadId,
190
243
  input: [{ type: "text", text: String(prompt || "") }],
191
244
  });
192
- admitted = true;
193
- const terminalEvent =
194
- started?.turn?.status === "completed"
195
- ? { terminal: "completed", usage: started.turn.usage || null }
196
- : await terminal;
197
- return Object.freeze({
198
- protocol: CODEX_APP_SERVER_PROTOCOL,
199
- threadId: activeThreadId,
200
- terminal: terminalEvent.terminal,
201
- output,
202
- error: terminalEvent.error || null,
203
- usage: terminalEvent.usage || null,
204
- notifications: Object.freeze(notifications),
205
- unknownMethods: Object.freeze([...unknownMethods].sort()),
206
- fallback: false,
207
- authoritative: false,
208
- });
245
+ admissionObserved = true;
246
+ const initialStatus = String(started?.turn?.status || "");
247
+ const terminalEvent = ["completed", "failed", "interrupted"].includes(
248
+ initialStatus,
249
+ )
250
+ ? projectNotification({
251
+ method: "turn/completed",
252
+ params: { turn: started.turn, usage: started.turn.usage || null },
253
+ })
254
+ : await terminal;
255
+ return buildResult(terminalEvent);
209
256
  } catch (error) {
210
- if (!admitted) {
257
+ if (!submissionStarted) {
211
258
  return this._fallback(prompt, options, error?.code || "startup_failed");
212
259
  }
260
+ if (observedTerminal) return buildResult(observedTerminal);
261
+ if (!admissionObserved) {
262
+ throw adapterError(
263
+ "CC_CODEX_APP_SERVER_SUBMISSION_UNKNOWN",
264
+ "Codex App Server turn submission outcome is unknown; fallback was suppressed to prevent duplicate effects",
265
+ { cause: error },
266
+ );
267
+ }
213
268
  throw adapterError(
214
269
  "CC_CODEX_APP_SERVER_FAILED_AFTER_ADMISSION",
215
270
  "Codex App Server failed after the turn was admitted; fallback was suppressed to prevent duplicate effects",
@@ -170,11 +170,14 @@ export class DurableJsonMemoryPort {
170
170
  filePath = join(getHomeDir(), "context-memory", "kernel-v1.json"),
171
171
  maxStoreBytes = DEFAULT_MAX_STORE_BYTES,
172
172
  maxEvents = DEFAULT_MAX_EVENTS,
173
+ lockObserver = null,
173
174
  } = {}) {
174
175
  this.name = "cli-context-memory-authority";
175
176
  this.filePath = filePath;
176
177
  this.maxStoreBytes = maxStoreBytes;
177
178
  this.maxEvents = maxEvents;
179
+ this.lockObserver =
180
+ typeof lockObserver === "function" ? lockObserver : null;
178
181
  }
179
182
 
180
183
  _readUnlocked() {
@@ -182,7 +185,10 @@ export class DurableJsonMemoryPort {
182
185
  if (!existsSync(this.filePath)) return initializeState();
183
186
  const bytes = readFileSync(this.filePath);
184
187
  if (bytes.length > this.maxStoreBytes) {
185
- throw corruptStore(this.filePath, "store exceeds its configured byte limit");
188
+ throw corruptStore(
189
+ this.filePath,
190
+ "store exceeds its configured byte limit",
191
+ );
186
192
  }
187
193
  try {
188
194
  return normalizeState(JSON.parse(bytes.toString("utf8")), this.filePath);
@@ -194,13 +200,30 @@ export class DurableJsonMemoryPort {
194
200
 
195
201
  _locked(operation) {
196
202
  mkdirSync(dirname(this.filePath), { recursive: true, mode: 0o700 });
197
- return withFileLock(this.filePath, operation, {
198
- failIfUnavailable: true,
199
- timeoutMs: 30_000,
200
- retryMs: 2,
201
- maxRetryMs: 32,
202
- retryJitterMs: 8,
203
- });
203
+ return withFileLock(
204
+ this.filePath,
205
+ (context) => {
206
+ if (this.lockObserver) {
207
+ try {
208
+ this.lockObserver({
209
+ locked: context.locked,
210
+ waitMs: context.waitMs,
211
+ attempts: context.attempts,
212
+ });
213
+ } catch {
214
+ // Diagnostics must not alter the authority operation.
215
+ }
216
+ }
217
+ return operation(context);
218
+ },
219
+ {
220
+ failIfUnavailable: true,
221
+ timeoutMs: 30_000,
222
+ retryMs: 2,
223
+ maxRetryMs: 32,
224
+ retryJitterMs: 8,
225
+ },
226
+ );
204
227
  }
205
228
 
206
229
  async read(memoryId) {
@@ -4,7 +4,7 @@ import {
4
4
  isProtected,
5
5
  normalizeContextItem,
6
6
  } from "@chainlesschain/context-memory-kernel";
7
- import { getContextWindow } from "../model-context-window.js";
7
+ import { resolveModelCapabilityProfile } from "../model-capabilities.js";
8
8
  import { createCliContextMemoryRuntime } from "./runtime.js";
9
9
  import {
10
10
  contextItemsToMessages,
@@ -12,6 +12,9 @@ import {
12
12
  messagesToContextItems,
13
13
  } from "./message-adapter.js";
14
14
 
15
+ export const SEMANTIC_CANDIDATE_REQUEST_SCHEMA =
16
+ "chainlesschain.context-memory-semantic-candidate-request/v1";
17
+
15
18
  function defaultAdmissions(sessionId, options) {
16
19
  const candidates = [
17
20
  { scope: "session", scopeId: sessionId },
@@ -19,9 +22,10 @@ function defaultAdmissions(sessionId, options) {
19
22
  { scope: "user", scopeId: options.userId || "local-user" },
20
23
  ];
21
24
  const configured = options.contextMemoryScopeAdmissions;
22
- const admissions = Array.isArray(configured) && configured.length > 0
23
- ? configured
24
- : candidates;
25
+ const admissions =
26
+ Array.isArray(configured) && configured.length > 0
27
+ ? configured
28
+ : candidates;
25
29
  const seen = new Set();
26
30
  return admissions.filter((entry) => {
27
31
  const key = `${entry.scope}\0${entry.scopeId || ""}`;
@@ -31,6 +35,57 @@ function defaultAdmissions(sessionId, options) {
31
35
  });
32
36
  }
33
37
 
38
+ function semanticCandidateProvider(options) {
39
+ const provider = options.contextMemorySemanticCandidateProvider;
40
+ if (provider == null) return null;
41
+ if (typeof provider !== "function") {
42
+ throw new TypeError(
43
+ "contextMemorySemanticCandidateProvider must be a function",
44
+ );
45
+ }
46
+ return provider;
47
+ }
48
+
49
+ /**
50
+ * Ask a host-owned semantic index for opaque record identifiers. The host sees
51
+ * the query and admission boundary but never receives canonical record content;
52
+ * the kernel later validates every returned revision/digest and applies its
53
+ * lifecycle, scope, expiry, and sink filters before ranking.
54
+ */
55
+ async function resolveSemanticCandidates({
56
+ provider,
57
+ sessionId,
58
+ query,
59
+ sink,
60
+ scopeAdmissions,
61
+ limit,
62
+ }) {
63
+ if (!provider) return undefined;
64
+ const candidates = await provider(
65
+ Object.freeze({
66
+ schema: SEMANTIC_CANDIDATE_REQUEST_SCHEMA,
67
+ sessionId,
68
+ query,
69
+ sink,
70
+ scopeAdmissions: Object.freeze(
71
+ scopeAdmissions.map((entry) => Object.freeze({ ...entry })),
72
+ ),
73
+ limit,
74
+ maxCandidates: 1000,
75
+ }),
76
+ );
77
+ if (!Array.isArray(candidates)) {
78
+ throw new TypeError(
79
+ "contextMemorySemanticCandidateProvider must resolve to an array",
80
+ );
81
+ }
82
+ return candidates.map((candidate) =>
83
+ candidate && typeof candidate === "object" && !Array.isArray(candidate)
84
+ ? Object.freeze({ ...candidate })
85
+ : candidate,
86
+ );
87
+ }
88
+
34
89
  function toolDefinitionsToContextItems(definitionsInput, { sessionId, sink }) {
35
90
  const definitions = Array.isArray(definitionsInput) ? definitionsInput : [];
36
91
  return definitions.map((definition, index) => {
@@ -83,6 +138,34 @@ export async function prepareCanonicalProviderContext(
83
138
  ) {
84
139
  const messages = Array.isArray(messagesInput) ? messagesInput : [];
85
140
  const sessionId = String(options.sessionId || "ephemeral-cli-session");
141
+ const planningRequested = options.contextMemorySkipPlanning !== true;
142
+ const provider = String(options.provider || "local");
143
+ const modelCapabilities = planningRequested
144
+ ? resolveModelCapabilityProfile({
145
+ provider,
146
+ model: options.model,
147
+ baseUrl: options.baseUrl,
148
+ contextMemoryModelWindowTokens: options.contextMemoryModelWindowTokens,
149
+ maxOutputTokens: options.maxOutputTokens,
150
+ })
151
+ : null;
152
+
153
+ // A request cap at or above the complete model window leaves no valid input
154
+ // allocation. Reject it before creating the memory runtime so an impossible
155
+ // request cannot write state or reach the provider.
156
+ if (
157
+ modelCapabilities !== null &&
158
+ modelCapabilities.requestMaxOutputTokens !== null &&
159
+ modelCapabilities.requestMaxOutputTokens >=
160
+ modelCapabilities.contextWindowTokens
161
+ ) {
162
+ const error = new RangeError(
163
+ "The configured output-token cap must be smaller than the model context window",
164
+ );
165
+ error.code = "CC_MODEL_OUTPUT_BUDGET_EXCEEDS_WINDOW";
166
+ throw error;
167
+ }
168
+
86
169
  const runtime = createCliContextMemoryRuntime({
87
170
  env: options.contextMemoryEnv || process.env,
88
171
  sessionId,
@@ -91,11 +174,17 @@ export async function prepareCanonicalProviderContext(
91
174
  ? { memoryFilePath: options.contextMemoryFilePath }
92
175
  : {}),
93
176
  });
94
- if (!runtime.decision.canonical || options.contextMemorySkipPlanning === true) {
95
- return { messages, plan: null, recall: null, decision: runtime.decision };
177
+ if (!runtime.decision.canonical || !planningRequested) {
178
+ return {
179
+ messages,
180
+ plan: null,
181
+ recall: null,
182
+ decision: runtime.decision,
183
+ modelCapabilities: null,
184
+ };
96
185
  }
97
186
 
98
- const provider = String(options.provider || "local");
187
+ const candidateProvider = semanticCandidateProvider(options);
99
188
  const sink = String(options.contextMemorySink || `provider.${provider}`);
100
189
  const scopeAdmissions = defaultAdmissions(sessionId, options);
101
190
  const lastUser = [...messages]
@@ -105,15 +194,28 @@ export async function prepareCanonicalProviderContext(
105
194
  typeof lastUser?.content === "string" && lastUser.content.trim()
106
195
  ? lastUser.content.trim().slice(0, 32 * 1024)
107
196
  : "*";
197
+ const recallLimit = Math.max(
198
+ 1,
199
+ Math.min(32, Number(options.contextMemoryRecallLimit) || 12),
200
+ );
201
+ const semanticCandidates = await resolveSemanticCandidates({
202
+ provider: candidateProvider,
203
+ sessionId,
204
+ query,
205
+ sink,
206
+ scopeAdmissions,
207
+ limit: recallLimit,
208
+ });
108
209
  const recall = await runtime.kernel.recallMemory({
109
210
  query,
110
211
  sink,
111
212
  scopeAdmissions,
112
- limit: Math.max(1, Math.min(32, Number(options.contextMemoryRecallLimit) || 12)),
213
+ limit: recallLimit,
113
214
  tokenBudget: Math.max(
114
215
  1,
115
216
  Math.min(32_768, Number(options.contextMemoryRecallTokens) || 4096),
116
217
  ),
218
+ ...(semanticCandidates === undefined ? {} : { semanticCandidates }),
117
219
  });
118
220
  const messageItems = messagesToContextItems(messages, {
119
221
  sessionId,
@@ -130,15 +232,10 @@ export async function prepareCanonicalProviderContext(
130
232
  { sessionId, sink },
131
233
  );
132
234
  const items = [...messageItems, ...memoryItems, ...toolItems];
133
- const modelWindowTokens = Math.max(
134
- 1024,
135
- Number(options.contextMemoryModelWindowTokens) ||
136
- getContextWindow(options.model, provider) ||
137
- 128 * 1024,
138
- );
235
+ const modelWindowTokens = modelCapabilities.contextWindowTokens;
139
236
  const reservedOutputTokens = Math.min(
140
237
  modelWindowTokens - 1,
141
- Math.max(256, Number(options.maxOutputTokens) || 4096),
238
+ Math.max(256, modelCapabilities.plannedOutputReserveTokens),
142
239
  );
143
240
  const safetyMarginTokens = Math.min(
144
241
  modelWindowTokens - reservedOutputTokens - 1,
@@ -185,10 +282,11 @@ export async function prepareCanonicalProviderContext(
185
282
  policyVersion: String(
186
283
  options.contextMemoryPolicyVersion || "cli-provider-v1",
187
284
  ),
188
- modelProfile: `${provider}:${String(options.model || "default")}`.slice(
189
- 0,
190
- 256,
191
- ),
285
+ modelProfile:
286
+ `${modelCapabilities.profileId}:${modelCapabilities.digest}`.slice(
287
+ 0,
288
+ 256,
289
+ ),
192
290
  sessionHead,
193
291
  memoryRevision: recall.memoryRevision,
194
292
  });
@@ -202,6 +300,7 @@ export async function prepareCanonicalProviderContext(
202
300
  plan,
203
301
  recall,
204
302
  decision: runtime.decision,
303
+ modelCapabilities,
205
304
  };
206
305
  }
207
306