chainlesschain 0.166.125 → 0.166.127

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 (190) hide show
  1. package/README.md +33 -5
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-BP7bvhgw.js → AIOps-DkSOwKNn.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-CRSlqvUW.js → ActionButton-CaYSnkeR.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-Uh-IHXPq.js → Analytics-D8kEgXLP.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-BV2iUfEI.js → AppLayout-D43FaO4a.js} +4 -4
  10. package/src/assets/web-panel/assets/Artifacts-DfxY2Gqs.js +1 -0
  11. package/src/assets/web-panel/assets/{Audit-CYX8n3_m.js → Audit-0ogv1Zu5.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-BqmXROox.js → BackgroundAgents-BhLnn-Gw.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-BnVDRZIg.js → Backup-D4591rlk.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-Bb6UmdRt.js → BaseInput-gK1PjPDZ.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-hz3OIIbK.js → Chat-CCDmOYwg.js} +5 -5
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DGNJTSsQ.js → ChatBubbleRenderer-CnpWe3dp.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-CQikB2We.js → Checkbox-DG4PRH9M.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-B2nJ-skp.js → Codegen-DtJxGiSg.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-klIv1AGo.js → Col-4wGBC25p.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-Di-kPX__.js → Community-dOCSc8t-.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BxqPTGPL.js → Compact-Du4kXsyN.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-BGMFZVuF.js → Compliance-BbI5XMcz.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-mqWGIwSR.js → Cowork-CbQRpyiK.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-DR5O38TG.js → Cron-CtWy2bMC.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-D6hPm17z.js → Crosschain-CzdM5hF6.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-DoWPTVwK.js → DID-CcBboBJN.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-BPL8xNW_.js → Dashboard-I7m0oCeC.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-CiSVSWe5.js → Dropdown-CKIy2Ikn.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-xx2j4JdY.js → EmailListRenderer-BNuxCq89.js} +1 -1
  30. package/src/assets/web-panel/assets/EvolutionSettings-BeBovLZs.js +1 -0
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DyXIXJ_A.js → FamilyGuardDashboard-QThmET-n.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-Byr6DvRk.js → Federation-Bqf7YYlV.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-CQGnmQJv.js → FormItemContext-DZAM28ve.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-hQguQVZ3.js → GenericCardRenderer-DunXFYML.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-BecJOnx6.js → Git-BgwOjaMf.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-BJddTPXq.js → Governance-B1za4wCP.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-D24icM6B.js → Inference-DMPqX1oN.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-Do22sAeu.js → KnowledgeGraph-ChDn3okr.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-hUuWosrZ.js → Logs-BQoPB6-O.js} +2 -2
  40. package/src/assets/web-panel/assets/MarkdownRenderer-uS1yHX12.js +1 -0
  41. package/src/assets/web-panel/assets/{Marketplace-Dp5LwB9H.js → Marketplace-DZXEaPpe.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-BiVU1FMc.js → McpTools-CZbVOFaG.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-CIxR4kQp.js → Memory-Cl3T8asu.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-BfuDQmNF.js → MobileBridge-DK_ayU9I.js} +1 -1
  45. package/src/assets/web-panel/assets/MobileProjects-DEWAA2gT.js +1 -0
  46. package/src/assets/web-panel/assets/{Mtc-CTvkHtBz.js → Mtc-z-XAWzMh.js} +5 -5
  47. package/src/assets/web-panel/assets/{MtcAudit-DkF8di0r.js → MtcAudit-CX7qJvQS.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-BsI3rR_s.js → Multisig-DiQlKgxx.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-DUE2RUBH.js → NLProgramming-Ciuxcu00.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-CZH-8mLz.js → Notes-BAvqNw_6.js} +4 -4
  51. package/src/assets/web-panel/assets/{NotificationSettings-BWrE5Fdu.js → NotificationSettings-DkHDTslA.js} +1 -1
  52. package/src/assets/web-panel/assets/OrderTableRenderer--WZdD2oV.js +1 -0
  53. package/src/assets/web-panel/assets/{Organization-GfJxDuZd.js → Organization-Bv6bMLCe.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-DVpJGkTd.js → Overflow-Bwoz_oq1.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-DLWmK0no.js → P2P-De7T0ZeB.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-CgJZVTlX.js → PdhVaultBrowser-Dblr2x25.js} +5 -5
  57. package/src/assets/web-panel/assets/{Permissions-CutFqMXH.js → Permissions-C-jAt-cg.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-CfqM7ZpK.js → PersonalDataHub-yXeXDMgf.js} +3 -3
  59. package/src/assets/web-panel/assets/{Pipeline-ie5hQZ0r.js → Pipeline-C8CYoLOa.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-B1KdLF7O.js → Privacy-B-gwnOGT.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-CRPPcQzY.js → ProjectInit-CbNjHiBV.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-Do6fMBWF.js → ProjectSettings-BMUY0GCP.js} +2 -2
  63. package/src/assets/web-panel/assets/Projects-DpCaWXv6.js +1 -0
  64. package/src/assets/web-panel/assets/{Providers-CgZd2eBh.js → Providers-K_tlWkON.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-DrPG8IxK.js → QrScannerModal-2RSZDzJI.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-D_uU-5Ph.js → QuickAsk-mhbcQRMI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-DDId0K_9.js → Recommend-BXm0uG0q.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-BnJcoKDQ.js → RemoteSession-xhOpmNZG.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-BnnmzZb0.js → Reputation-CwbCWB-3.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-ChHU3TqH.js → Row-BdAjmDBO.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-DeiKl8k2.js → RssFeed-Cq4LZ9WU.js} +3 -3
  72. package/src/assets/web-panel/assets/{Search-Cd0Byr5Y.js → Search-C_I6B-4l.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-CHqAAtUE.js → Security-CdH6mzL-.js} +4 -4
  74. package/src/assets/web-panel/assets/{Services-CaC6ZaY3.js → Services-CWu1wqtS.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-Do4HAN0a.js → Skeleton-daw9DiVM.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-CoElvXB8.js → Skills-CmurIxkM.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-jJiTPvtG.js → Sla-cETA5aPO.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-OXfemdVC.js → SpeechSettings-B1llZgu3.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-JPkmyUwi.js → SyncSettings-DufZ-B2q.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-BGG7ffmW.js → Tasks-PfRLKTFY.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-DeK9-2LY.js → Templates-DGtz-vT8.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-BTQSUiAe.js → Tenant-JeKYLN0b.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-nSeD_GjQ.js → Terminal-BiMsF2Y0.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-DWj9DOd9.js → TimelineRenderer-DhcBAGPg.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-CNi7fvHT.js → Tokens-DpIg-0ju.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-qXYBuAUZ.js → Trigger-DreKHxyb.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-UMIDxWBQ.js → Trust-D7ByQvBQ.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-VWmZ_L_a.js → UkeySign-OudyQByy.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-Dwlrr7Ju.js → VideoEditing-BhU6nzCF.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-DY25E1_s.js → Wallet-BCEpB6E0.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-Cg4ZH9YH.js → WebAuthn-DwjAM5Mr.js} +2 -2
  92. package/src/assets/web-panel/assets/{WorkflowEditor-LB5NqSGq.js → WorkflowEditor-ChQqlAmY.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-CaCuVsD2.js → chat-CzUKWqTy.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-BG2JI5F8.js → colors-D3Y_Pvu4.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-CdTkLvXf.js → compact-item-ByyPRfkA.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-Wv41oeUq.js → createContext-Dt5PF6VI.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-BgSxkkQ3.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-B7Uw6Y5_.js → hasIn-BuIaEKuC.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BfpOUAjn.js → index-1YgdY0Vq.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BLLVYN1S.js → index-B600riYP.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-XVz1pdi4.js → index-BFQGN97S.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-tyw6dj9r.js → index-BO29sPX8.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-oICFzKT6.js → index-BSWTyRhI.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-xZOajA5D.js → index-BcqZAAr5.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-98U0Akgy.js → index-BdvZNMNm.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CDuOf0Sk.js → index-BmVY2f7I.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Cnkd1twb.js → index-BwlY7Yap.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B68Kr1A0.js → index-BztqxXMP.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-zEDHN35C.js → index-CAfX0VyL.js} +1 -1
  110. package/src/assets/web-panel/assets/{index--q3_jHhu.js → index-CByWkXdO.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CZCE6USm.js → index-CCBm8_o4.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-a811Rdaf.js → index-CDTS4qJm.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Cd9QfEPf.js → index-CFXZ9lbO.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-FYb9E4P0.js → index-COsjgjvP.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BN8FIy9Z.js → index-CZX4_hGp.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BONqMz21.js → index-Cb7MzML-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-ByGwOQL-.js → index-CgPKUSe4.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DTWvW7Q9.js → index-CmrfHS36.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BWuKDmL6.js → index-D51wU4q-.js} +1 -1
  120. package/src/assets/web-panel/assets/index-D5v6roiB.js +1 -0
  121. package/src/assets/web-panel/assets/{index-ChJPZoiz.js → index-D7QSTEjb.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Hcx0wbx7.js → index-DHzVIQLX.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CeBODQXm.js → index-DSXjiZAV.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C58rpLKM.js → index-DSgroT-P.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-0DcGfrpr.js → index-DWW5svXU.js} +1 -1
  126. package/src/assets/web-panel/assets/index-DgXZCvH5.js +1 -0
  127. package/src/assets/web-panel/assets/{index-DyBgFbOX.js → index-Di78LDr8.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-m9IlVQwa.js → index-Dlec7Sr4.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BzQ1hohb.js → index-DpAqy6Co.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CAG1C05A.js → index-DxVLI-Iu.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CCVpB1HT.js → index-EtrWRKu2.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D6wz6Lj3.js → index-F-T8AHeo.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-6TrZH59x.js → index-GyTOYTFg.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CDA9_4jw.js → index-NFqKQquS.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-X3kmZCFh.js → index-_oJnnOnZ.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-27hwVsUl.js → index-gg5zO3aD.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-DyddYZY6.js → index-huWw0XBb.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-rhNcfOEv.js → initDefaultProps-Bny6G13G.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-C3Ot7PRG.js → motion-DRhRj_uM.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-BSbZkByI.js → move-D0wKnhYr.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-BHcarv2m.js → mtc-parser-BXXSTJBk.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-CH8lRpcG.js → omit-d8t9Yze4.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-DiLvg1NK.js → pickAttrs-nyB6BMe6.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-DXqb9Lm6.js → placementArrow-CSFyBNA2.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-qhZCsCCH.js → responsiveObserve-DYmiKhJa.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-amPl47DO.js → slide-D4KZSRmt.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-BIM6xD4_.js → statusUtils-BcrcPeFm.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-BQM4w1nF.js → styleChecker-BFgOb1vz.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-CQLRdXAd.js → useFlexGapSupport-DQ5qSQlN.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-CjgDjsYN.js → useFs-Cafq069l.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-BNs5KK4A.js → usePersonalDataHub-DTma9Ary.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-CEORzacS.js → vnode-HvC2-bE9.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-CJco15He.js → zoom-AZxADWXu.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/commands/ask.js +23 -23
  156. package/src/commands/chat.js +1 -5
  157. package/src/commands/session.js +92 -61
  158. package/src/commands/ui.js +18 -5
  159. package/src/constants.js +3 -0
  160. package/src/data/changelog.json +26 -0
  161. package/src/gateways/ws/action-protocol.js +22 -14
  162. package/src/gateways/ws/chat-intent-protocol.js +7 -3
  163. package/src/gateways/ws/llm-chat-protocol.js +9 -2
  164. package/src/gateways/ws/ws-server.js +24 -12
  165. package/src/lib/chat-intent-service.js +28 -4
  166. package/src/lib/config-manager.js +49 -16
  167. package/src/lib/config-schema.js +5 -0
  168. package/src/lib/context-memory-kernel/task-worklog-port.js +24 -8
  169. package/src/lib/evolution/evolution-deployment-config.js +48 -5
  170. package/src/lib/evolution/evolution-deployment-loader.js +26 -11
  171. package/src/lib/evolution/evolution-enabled.js +27 -0
  172. package/src/lib/evolution/governed-model-turn.js +4 -1
  173. package/src/lib/evolution/optional-ui-model-turn.js +26 -0
  174. package/src/lib/paths.js +2 -2
  175. package/src/lib/read-file-loop-guard.js +4 -3
  176. package/src/lib/remote-read-loop-guard.js +2 -1
  177. package/src/lib/retained-context-preview.js +95 -0
  178. package/src/lib/task-progress-tracker.js +2 -1
  179. package/src/repl/chat-repl.js +15 -9
  180. package/src/runtime/agent-runtime.js +18 -6
  181. package/src/runtime/headless-stream.js +4 -2
  182. package/src/assets/web-panel/assets/Artifacts-INNQe4tS.js +0 -1
  183. package/src/assets/web-panel/assets/EvolutionSettings-C8hEbz_k.js +0 -1
  184. package/src/assets/web-panel/assets/MarkdownRenderer-Bjl9v5wW.js +0 -1
  185. package/src/assets/web-panel/assets/MobileProjects-DjmNE-wQ.js +0 -1
  186. package/src/assets/web-panel/assets/OrderTableRenderer-DBkeHV6o.js +0 -1
  187. package/src/assets/web-panel/assets/Projects-BOB6rWxT.js +0 -1
  188. package/src/assets/web-panel/assets/devWarning-CgQHHMHl.js +0 -1
  189. package/src/assets/web-panel/assets/index-B5iepofq.js +0 -1
  190. package/src/assets/web-panel/assets/index-C_pAjUXd.js +0 -1
@@ -106,8 +106,9 @@ function _sessionEpoch(ts) {
106
106
  * @returns {{statusBar:string, autoMerge:{allow:boolean,reason:string,unmet:string[]}, lines:string[]}}
107
107
  */
108
108
  export async function renderPrStatus(signals = {}, opts = {}) {
109
- const { strictAutoMergeDecision, describePrStatusBar } =
110
- await import("../lib/pr-automation-policy.js");
109
+ const { strictAutoMergeDecision, describePrStatusBar } = await import(
110
+ "../lib/pr-automation-policy.js"
111
+ );
111
112
  const autoMerge = strictAutoMergeDecision({
112
113
  enabled: opts.enabled === true,
113
114
  hasOpenPr: signals.hasOpenPr,
@@ -356,22 +357,25 @@ export function registerSessionCommand(program, dependencies = {}) {
356
357
  sourceErrors.local = error?.message || String(error);
357
358
  }
358
359
  try {
359
- const { listBackgroundAgents } =
360
- await import("../lib/background-agent-supervisor.js");
360
+ const { listBackgroundAgents } = await import(
361
+ "../lib/background-agent-supervisor.js"
362
+ );
361
363
  background = listBackgroundAgents({ all: true });
362
364
  } catch (error) {
363
365
  sourceErrors.background = error?.message || String(error);
364
366
  }
365
367
  try {
366
- const { readRemoteControlStates } =
367
- await import("../lib/remote-control.js");
368
+ const { readRemoteControlStates } = await import(
369
+ "../lib/remote-control.js"
370
+ );
368
371
  remote = readRemoteControlStates();
369
372
  } catch (error) {
370
373
  sourceErrors.remote = error?.message || String(error);
371
374
  }
372
375
  try {
373
- const { listCollaborationRuns } =
374
- await import("../lib/collaboration-run-store.js");
376
+ const { listCollaborationRuns } = await import(
377
+ "../lib/collaboration-run-store.js"
378
+ );
375
379
  team = listCollaborationRuns({ limit }).filter(
376
380
  (run) => run?.kind === "team",
377
381
  );
@@ -392,8 +396,9 @@ export function registerSessionCommand(program, dependencies = {}) {
392
396
  sourceErrors.workflow = error?.message || String(error);
393
397
  }
394
398
  try {
395
- const { listDynamicWorkflowWorkbenchStates } =
396
- await import("../lib/dynamic-workflow-runtime.js");
399
+ const { listDynamicWorkflowWorkbenchStates } = await import(
400
+ "../lib/dynamic-workflow-runtime.js"
401
+ );
397
402
  const discovered = listDynamicWorkflowWorkbenchStates(projectRoot, {
398
403
  limit,
399
404
  });
@@ -412,8 +417,9 @@ export function registerSessionCommand(program, dependencies = {}) {
412
417
  // engine proves that the exact worktree is supported. Copy-mode
413
418
  // checkpoints need explicit paths and therefore cannot truthfully be
414
419
  // offered as a one-click session action.
415
- const { isCheckpointAvailable } =
416
- await import("../lib/checkpoint-store.js");
420
+ const { isCheckpointAvailable } = await import(
421
+ "../lib/checkpoint-store.js"
422
+ );
417
423
  const capability = new Map();
418
424
  const decorate = (items, pathFor, sessionFor) =>
419
425
  items.map((item) => {
@@ -456,8 +462,9 @@ export function registerSessionCommand(program, dependencies = {}) {
456
462
  // checkpoint action unavailable with its explicit reason.
457
463
  }
458
464
  try {
459
- const { ArtifactStore, publicArtifactMetadata } =
460
- await import("../lib/artifact-store.js");
465
+ const { ArtifactStore, publicArtifactMetadata } = await import(
466
+ "../lib/artifact-store.js"
467
+ );
461
468
  artifacts = new ArtifactStore().list().map(publicArtifactMetadata);
462
469
  } catch {
463
470
  // Summaries are optional; absence never removes a session.
@@ -469,22 +476,25 @@ export function registerSessionCommand(program, dependencies = {}) {
469
476
  // Summaries are optional; absence never removes a session.
470
477
  }
471
478
  try {
472
- const { SessionMessageFabric } =
473
- await import("../lib/session-message-fabric.js");
479
+ const { SessionMessageFabric } = await import(
480
+ "../lib/session-message-fabric.js"
481
+ );
474
482
  sessionMessageFabric = new SessionMessageFabric().projection();
475
483
  } catch (error) {
476
484
  sourceErrors.sessionMessageFabric = error?.message || String(error);
477
485
  }
478
486
  try {
479
- const { SessionWorkbenchStore } =
480
- await import("../lib/session-workbench-store.js");
487
+ const { SessionWorkbenchStore } = await import(
488
+ "../lib/session-workbench-store.js"
489
+ );
481
490
  sessionWorkbench = new SessionWorkbenchStore().projection();
482
491
  } catch (error) {
483
492
  sourceErrors.sessionWorkbench = error?.message || String(error);
484
493
  }
485
494
 
486
- const { buildSessionProjection } =
487
- await import("../lib/session-projection.js");
495
+ const { buildSessionProjection } = await import(
496
+ "../lib/session-projection.js"
497
+ );
488
498
  const projection = buildSessionProjection({
489
499
  local,
490
500
  background,
@@ -511,8 +521,9 @@ export function registerSessionCommand(program, dependencies = {}) {
511
521
  }
512
522
  }
513
523
  } catch (error) {
514
- const { disconnectedSessionProjection } =
515
- await import("../lib/session-projection.js");
524
+ const { disconnectedSessionProjection } = await import(
525
+ "../lib/session-projection.js"
526
+ );
516
527
  if (options.json) {
517
528
  jsonPayload = JSON.stringify(
518
529
  disconnectedSessionProjection(error?.message || String(error)),
@@ -562,8 +573,9 @@ export function registerSessionCommand(program, dependencies = {}) {
562
573
  } else {
563
574
  // Live path: resolve the session's linked PR and fetch via gh.
564
575
  const { getPrLinks } = await import("../lib/pr-link-ledger.js");
565
- const { getLastSessionId } =
566
- await import("../harness/jsonl-session-store.js");
576
+ const { getLastSessionId } = await import(
577
+ "../harness/jsonl-session-store.js"
578
+ );
567
579
  const sid = !id || id === "last" ? getLastSessionId() : id;
568
580
  const links = sid ? getPrLinks(sid) : [];
569
581
  if (links.length === 0) {
@@ -641,8 +653,9 @@ export function registerSessionCommand(program, dependencies = {}) {
641
653
  // (single / non-TTY / Ctrl-C). Same helper as `cc agent --resume`.
642
654
  if (!id) {
643
655
  ctx = await bootstrap({ verbose: program.opts().verbose });
644
- const { pickRecentSession } =
645
- await import("../lib/session-picker.js");
656
+ const { pickRecentSession } = await import(
657
+ "../lib/session-picker.js"
658
+ );
646
659
  const picked = await pickRecentSession(ctx);
647
660
  if (!picked.id) {
648
661
  logger.error(
@@ -672,8 +685,9 @@ export function registerSessionCommand(program, dependencies = {}) {
672
685
  if (jsonlId) {
673
686
  // Tamper gate: a broken hash chain means the transcript was edited
674
687
  // outside the store — never silently rebuild it as trusted context.
675
- const { verifySession } =
676
- await import("../harness/jsonl-session-store.js");
688
+ const { verifySession } = await import(
689
+ "../harness/jsonl-session-store.js"
690
+ );
677
691
  const trust = verifySession(jsonlId);
678
692
  if (["missing", "conflict"].includes(trust.status)) {
679
693
  logger.error(
@@ -741,12 +755,15 @@ export function registerSessionCommand(program, dependencies = {}) {
741
755
  resolveChatCommandEvolutionComposition,
742
756
  assertChatSessionUsageAdmission,
743
757
  } = await import("./chat.js");
744
- const { readEvolutionCompositionFactory } =
745
- await import("../lib/evolution/governed-model-turn.js");
746
- const { loadEvolutionDeploymentCommandDependencies } =
747
- await import("../lib/evolution/evolution-deployment-loader.js");
748
- const { waitForAgentEvolutionSession } =
749
- await import("../lib/evolution/agent-evolution-session-lifecycle.js");
758
+ const { readEvolutionCompositionFactory } = await import(
759
+ "../lib/evolution/governed-model-turn.js"
760
+ );
761
+ const { loadEvolutionDeploymentCommandDependencies } = await import(
762
+ "../lib/evolution/evolution-deployment-loader.js"
763
+ );
764
+ const { waitForAgentEvolutionSession } = await import(
765
+ "../lib/evolution/agent-evolution-session-lifecycle.js"
766
+ );
750
767
  assertChatSessionUsageAdmission(sess.id);
751
768
  // Resume is a chat entrypoint. Use the target's authenticated chat
752
769
  // deployment, loaded only here so read-only session commands need none.
@@ -757,8 +774,8 @@ export function registerSessionCommand(program, dependencies = {}) {
757
774
  );
758
775
  const composition =
759
776
  await resolveChatCommandEvolutionComposition(factory);
760
- const ingress = composition.evolutionIngress;
761
- await ingress.start();
777
+ const ingress = composition?.evolutionIngress ?? null;
778
+ if (ingress !== null) await ingress.start();
762
779
  const lifecycle = await startChatRepl({
763
780
  model: options.model || sess.model,
764
781
  provider: options.provider || sess.provider || "ollama",
@@ -767,7 +784,9 @@ export function registerSessionCommand(program, dependencies = {}) {
767
784
  sessionId: sess.id,
768
785
  evolutionIngress: ingress,
769
786
  });
770
- await waitForAgentEvolutionSession(lifecycle, ingress);
787
+ if (ingress !== null)
788
+ await waitForAgentEvolutionSession(lifecycle, ingress);
789
+ else await lifecycle.finished;
771
790
  } catch (err) {
772
791
  logger.error(`Failed: ${err.message}`);
773
792
  process.exitCode = 1;
@@ -810,8 +829,9 @@ export function registerSessionCommand(program, dependencies = {}) {
810
829
  );
811
830
  }
812
831
  if (sid) {
813
- const { renderAgentSessionMarkdown } =
814
- await import("../lib/agent-session-export.js");
832
+ const { renderAgentSessionMarkdown } = await import(
833
+ "../lib/agent-session-export.js"
834
+ );
815
835
  markdown = renderAgentSessionMarkdown(sid, store.readEvents(sid), {
816
836
  exportedAt: new Date().toISOString(),
817
837
  });
@@ -1064,8 +1084,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1064
1084
  }
1065
1085
  let result;
1066
1086
  if (jsonlId) {
1067
- const { renameSession } =
1068
- await import("../harness/jsonl-session-store.js");
1087
+ const { renameSession } = await import(
1088
+ "../harness/jsonl-session-store.js"
1089
+ );
1069
1090
  result = renameSession(jsonlId, normalized);
1070
1091
  } else {
1071
1092
  ctx = await bootstrap({ verbose: program.opts().verbose });
@@ -1104,8 +1125,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1104
1125
  .option("--json", "Output as JSON")
1105
1126
  .action(async (options) => {
1106
1127
  try {
1107
- const { pruneJsonlSessions } =
1108
- await import("../harness/jsonl-session-store.js");
1128
+ const { pruneJsonlSessions } = await import(
1129
+ "../harness/jsonl-session-store.js"
1130
+ );
1109
1131
  const result = pruneJsonlSessions({
1110
1132
  olderThanDays: Number(options.olderThan),
1111
1133
  keep: options.keep != null ? Number(options.keep) : undefined,
@@ -1483,8 +1505,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1483
1505
  .option("--json", "Output as JSON")
1484
1506
  .action(async (id, options) => {
1485
1507
  try {
1486
- const { getApprovalGate } =
1487
- await import("../lib/session-core-singletons.js");
1508
+ const { getApprovalGate } = await import(
1509
+ "../lib/session-core-singletons.js"
1510
+ );
1488
1511
  const gate = await getApprovalGate();
1489
1512
  if (options.set) {
1490
1513
  await gate.setSessionPolicy(id, options.set);
@@ -1519,8 +1542,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1519
1542
  .option("--json", "Output as JSON")
1520
1543
  .action(async (options) => {
1521
1544
  try {
1522
- const { getSessionManager } =
1523
- await import("../lib/session-core-singletons.js");
1545
+ const { getSessionManager } = await import(
1546
+ "../lib/session-core-singletons.js"
1547
+ );
1524
1548
  const mgr = getSessionManager();
1525
1549
  const live = mgr.list({
1526
1550
  agentId: options.agent,
@@ -1564,8 +1588,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1564
1588
  .argument("<id>", "Session ID")
1565
1589
  .action(async (id) => {
1566
1590
  try {
1567
- const { getSessionManager } =
1568
- await import("../lib/session-core-singletons.js");
1591
+ const { getSessionManager } = await import(
1592
+ "../lib/session-core-singletons.js"
1593
+ );
1569
1594
  const mgr = getSessionManager();
1570
1595
  if (!mgr.has(id)) {
1571
1596
  logger.error(`Session ${id} is not active in this process`);
@@ -1590,8 +1615,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1590
1615
  .argument("<id>", "Session ID")
1591
1616
  .action(async (id) => {
1592
1617
  try {
1593
- const { getSessionManager } =
1594
- await import("../lib/session-core-singletons.js");
1618
+ const { getSessionManager } = await import(
1619
+ "../lib/session-core-singletons.js"
1620
+ );
1595
1621
  const mgr = getSessionManager();
1596
1622
  const ok = await mgr.resume(id);
1597
1623
  if (!ok) {
@@ -1620,12 +1646,14 @@ export function registerSessionCommand(program, dependencies = {}) {
1620
1646
  .option("--agent-id <id>", "Agent id for scope=agent")
1621
1647
  .action(async (id, options) => {
1622
1648
  try {
1623
- const { getSessionManager } =
1624
- await import("../lib/session-core-singletons.js");
1649
+ const { getSessionManager } = await import(
1650
+ "../lib/session-core-singletons.js"
1651
+ );
1625
1652
  if (options.consolidate) {
1626
1653
  try {
1627
- const { consolidateJsonlSession } =
1628
- await import("../lib/session-consolidator.js");
1654
+ const { consolidateJsonlSession } = await import(
1655
+ "../lib/session-consolidator.js"
1656
+ );
1629
1657
  const res = await consolidateJsonlSession(id, {
1630
1658
  scope: options.scope,
1631
1659
  scopeId: options.scopeId || null,
@@ -1844,8 +1872,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1844
1872
  );
1845
1873
  process.exit(1);
1846
1874
  }
1847
- const { sessionUsage, allSessionsUsage } =
1848
- await import("../lib/session-usage.js");
1875
+ const { sessionUsage, allSessionsUsage } = await import(
1876
+ "../lib/session-usage.js"
1877
+ );
1849
1878
  const result = id
1850
1879
  ? sessionUsage(id)
1851
1880
  : allSessionsUsage({ limit: parseInt(options.limit, 10) || 1000 });
@@ -1918,8 +1947,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1918
1947
  .option("--json", "Machine-readable JSON output")
1919
1948
  .action(async (id) => {
1920
1949
  try {
1921
- const { getVerifiedSessionObservabilityAuthority } =
1922
- await import("../harness/jsonl-session-store.js");
1950
+ const { getVerifiedSessionObservabilityAuthority } = await import(
1951
+ "../harness/jsonl-session-store.js"
1952
+ );
1923
1953
  const authority = getVerifiedSessionObservabilityAuthority(id);
1924
1954
  console.log(
1925
1955
  JSON.stringify(
@@ -2357,8 +2387,9 @@ async function mirrorPruneSessions() {
2357
2387
  * (`session.mirror.encryption`). Requires both to be configured.
2358
2388
  */
2359
2389
  async function mirrorRotateKey() {
2360
- const { createMirror, createMirrorCipher, rotateMirrorKey } =
2361
- await import("../harness/session-mirror.js");
2390
+ const { createMirror, createMirrorCipher, rotateMirrorKey } = await import(
2391
+ "../harness/session-mirror.js"
2392
+ );
2362
2393
  const { cfg } = await loadConfiguredMirror();
2363
2394
  if (!cfg || !cfg.kind || cfg.kind === "none") {
2364
2395
  return { target: null };
@@ -1,6 +1,10 @@
1
1
  import { logger } from "../lib/logger.js";
2
2
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
3
3
  import { readEvolutionCompositionFactory } from "../lib/evolution/governed-model-turn.js";
4
+ import {
5
+ prepareConfiguredUiModelTurn,
6
+ loadConfiguredUiEvolutionFactory,
7
+ } from "../lib/evolution/optional-ui-model-turn.js";
4
8
  import { loadEvolutionDeploymentCommandDependencies } from "../lib/evolution/evolution-deployment-loader.js";
5
9
  import { getEvolutionDeploymentStatus } from "../lib/evolution/evolution-deployment-config.js";
6
10
 
@@ -36,7 +40,7 @@ export function registerUiCommand(program, dependencies = {}) {
36
40
  try {
37
41
  deploymentDependencies =
38
42
  await loadEvolutionDeploymentCommandDependencies("ui", {
39
- initializeDefaultLocalUi: true,
43
+ initializeDefaultLocalUi: false,
40
44
  });
41
45
  } catch (error) {
42
46
  localTrustSetupError = error;
@@ -44,7 +48,10 @@ export function registerUiCommand(program, dependencies = {}) {
44
48
  activeEvolutionCompositionFactory = readEvolutionCompositionFactory(
45
49
  deploymentDependencies || {},
46
50
  );
47
- if (activeEvolutionCompositionFactory === null) {
51
+ if (
52
+ activeEvolutionCompositionFactory === null &&
53
+ localTrustSetupError
54
+ ) {
48
55
  const status = await getEvolutionDeploymentStatus();
49
56
  const readiness = status.readiness.ui;
50
57
  logger.warn(
@@ -71,13 +78,19 @@ export function registerUiCommand(program, dependencies = {}) {
71
78
  10,
72
79
  );
73
80
  const runtime = createAgentRuntimeFactory({
74
- deps:
75
- activeEvolutionCompositionFactory === null
81
+ deps: {
82
+ ...(activeEvolutionCompositionFactory === null
76
83
  ? {}
77
84
  : {
78
85
  evolutionCompositionFactory:
79
86
  activeEvolutionCompositionFactory,
80
- },
87
+ }),
88
+ // Re-read the shared setting at each new Quick Ask request so the
89
+ // GUI and config-file switches also work in an already running UI.
90
+ prepareUiModelTurn: prepareConfiguredUiModelTurn,
91
+ resolveEvolutionCompositionFactory:
92
+ loadConfiguredUiEvolutionFactory,
93
+ },
81
94
  }).createUiRuntime({
82
95
  port,
83
96
  wsPort: parseInt(opts.wsPort, 10),
package/src/constants.js CHANGED
@@ -136,6 +136,9 @@ export const DEFAULT_CONFIG = {
136
136
  completedAt: null,
137
137
  edition: "personal",
138
138
  features: {},
139
+ evolution: {
140
+ enabled: false,
141
+ },
139
142
  paths: {
140
143
  projectRoot: null,
141
144
  database: null,
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.127",
7
+ "cliVersions": ["0.166.127"],
8
+ "date": "2026-10-27",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.127: optional self-evolution controls (2026-10-27)",
13
+ "body": "- Default fresh installations and older automatically generated local deployments to self-evolution off. Share the boolean `evolution.enabled` setting across CLI, cc ui, VS Code and JetBrains; explicit false overrides inherited deployment environment variables, while absent settings preserve manually selected deployments.\n- Enable and disable through configuration or deployment commands, initialize the local signed runtime on explicit enable, and retain deployment and trust history when disabled. Require a restart for running Agent sessions and reread the setting for new UI model requests.\n- Keep ordinary Agent, ask, chat, session resume and UI intent confirmation available while off. Retain strict signature and evidence checks for enabled deployments and prevent unrelated configuration writes from changing an absent Evolution choice.\n- Add shared configuration documentation and regression coverage. Pair IDE candidates VS Code 0.37.164 and JetBrains 0.4.180 with CLI 0.166.127; publish them only after verified public CLI availability. Child dependency pins are unchanged.\n- Require exact-source Linux, Windows and macOS CLI CI and Strict Sandbox before GitHub Actions OIDC publication and public package readback. Automatic candidate promotion remains HOLD; this switch does not start a full RRSI campaign or claim new live model-task acceptance."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.126",
20
+ "cliVersions": ["0.166.126"],
21
+ "date": "2026-10-26",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed - cc CLI 0.166.126: retained recovery context JSON boundaries (2026-10-26)",
26
+ "body": "- Prevent host-created file excerpts, task checkpoints, remote-read summaries and worklog context from injecting truncated JSON into the next model request. Reduce complete JSON structurally and explicitly omit excerpts that cannot be safely represented within the existing decoding budgets.\n- Project legacy checkpoints and regenerated WORKLOG.md views without rewriting canonical session history. Omitted file excerpts retain their location and version but do not count as visible source for subsequent reads.\n- Preserve strict validation of original tool evidence, credential/PII redaction and historical projection rules. Add continuation, restart, handoff, Unicode, budget and real projection verification regressions.\n- Keep all child dependency pins and the public Open VSX 0.37.162 / JetBrains 0.4.179 pairing unchanged. Require exact-source Linux, Windows and macOS CLI CI and CLI Strict Sandbox, publish through GitHub Actions OIDC, verify public archive bytes and provenance, then merge the release PR."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.166.125",
@@ -1,3 +1,5 @@
1
+ import { resolveServerEvolutionFactory } from "../../lib/evolution/optional-ui-model-turn.js";
2
+
1
3
  // Track running cowork tasks for cancellation
2
4
  const _runningTasks = new Map();
3
5
 
@@ -54,7 +56,7 @@ export async function handleCoworkTask(server, id, ws, message) {
54
56
  files,
55
57
  cwd: server.projectRoot || process.cwd(),
56
58
  llmOptions: {},
57
- evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
59
+ evolutionCompositionFactory: await resolveServerEvolutionFactory(server),
58
60
  signal: ac.signal,
59
61
  ...(message.mcpSessionId ? { mcpSessionId: message.mcpSessionId } : {}),
60
62
  ...(useParallel
@@ -205,8 +207,9 @@ export async function handleCoworkHistory(server, id, ws, message) {
205
207
 
206
208
  export async function handleCoworkTemplates(server, id, ws) {
207
209
  try {
208
- const { getTemplatesForUI } =
209
- await import("../../lib/cowork-task-templates.js");
210
+ const { getTemplatesForUI } = await import(
211
+ "../../lib/cowork-task-templates.js"
212
+ );
210
213
  const templates = getTemplatesForUI();
211
214
  server._send(ws, { id, type: "cowork:templates", templates });
212
215
  } catch (err) {
@@ -240,15 +243,16 @@ export async function handleOrchestrate(server, id, ws, message) {
240
243
  }
241
244
 
242
245
  try {
243
- const { Orchestrator, TASK_SOURCE } =
244
- await import("../../lib/orchestrator.js");
246
+ const { Orchestrator, TASK_SOURCE } = await import(
247
+ "../../lib/orchestrator.js"
248
+ );
245
249
 
246
250
  const orch = new Orchestrator({
247
251
  cwd: cwd || server.projectRoot || process.cwd(),
248
252
  maxParallel: Math.min(parseInt(agents, 10) || 3, 10),
249
253
  ciCommand: ci,
250
254
  agents: strategy ? { strategy } : undefined,
251
- evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
255
+ evolutionCompositionFactory: await resolveServerEvolutionFactory(server),
252
256
  verbose: false,
253
257
  });
254
258
 
@@ -389,8 +393,9 @@ async function _resolveWorkflowExecutionAuthority(server, sessionId) {
389
393
  }
390
394
  provider = descriptor.value;
391
395
  } else {
392
- ({ getVerifiedSessionExecutionLocationAuthority: provider } =
393
- await import("../../harness/jsonl-session-store.js"));
396
+ ({ getVerifiedSessionExecutionLocationAuthority: provider } = await import(
397
+ "../../harness/jsonl-session-store.js"
398
+ ));
394
399
  }
395
400
  if (typeof provider !== "function") {
396
401
  const error = new Error(
@@ -507,8 +512,9 @@ export async function handleWorkflowSave(server, id, ws, message) {
507
512
  );
508
513
  }
509
514
  try {
510
- const { getWorkflowRecord, validateWorkflow, saveWorkflow } =
511
- await import("../../lib/cowork-workflow.js");
515
+ const { getWorkflowRecord, validateWorkflow, saveWorkflow } = await import(
516
+ "../../lib/cowork-workflow.js"
517
+ );
512
518
  const result = validateWorkflow(workflow);
513
519
  if (!result.valid) {
514
520
  return _sendError(
@@ -595,8 +601,9 @@ export async function handleWorkflowRun(server, id, ws, message) {
595
601
  try {
596
602
  const { getWorkflowRecord, getWorkflowVersion, executeWorkflow } =
597
603
  await import("../../lib/cowork-workflow.js");
598
- const { executeDynamicWorkflowWithAdmission } =
599
- await import("../../lib/dynamic-workflow-facade.js");
604
+ const { executeDynamicWorkflowWithAdmission } = await import(
605
+ "../../lib/dynamic-workflow-facade.js"
606
+ );
600
607
  let workflowRunTask;
601
608
  if (Object.hasOwn(server, "workflowRunTask")) {
602
609
  const descriptor = Object.getOwnPropertyDescriptor(
@@ -608,8 +615,9 @@ export async function handleWorkflowRun(server, id, ws, message) {
608
615
  }
609
616
  workflowRunTask = descriptor.value;
610
617
  } else {
611
- ({ runCoworkTask: workflowRunTask } =
612
- await import("../../lib/cowork-task-runner.js"));
618
+ ({ runCoworkTask: workflowRunTask } = await import(
619
+ "../../lib/cowork-task-runner.js"
620
+ ));
613
621
  }
614
622
  if (typeof workflowRunTask !== "function") {
615
623
  throw new Error("Workflow task runner is unavailable");
@@ -17,6 +17,7 @@ import {
17
17
  classifyFollowupIntent,
18
18
  } from "../../lib/chat-intent-service.js";
19
19
  import { resolveLlmCreds } from "./llm-creds.js";
20
+ import { resolveServerEvolutionFactory } from "../../lib/evolution/optional-ui-model-turn.js";
20
21
 
21
22
  /**
22
23
  * Look up LLM creds for the intent flow.
@@ -60,7 +61,8 @@ export async function handleChatIntentUnderstand(server, id, ws, message) {
60
61
  contextMode: message.contextMode || "global",
61
62
  history,
62
63
  llmOptions,
63
- evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
64
+ evolutionCompositionFactory: await resolveServerEvolutionFactory(server),
65
+ prepareModelTurn: server.prepareUiModelTurn,
64
66
  });
65
67
  server._send(ws, {
66
68
  id,
@@ -118,7 +120,8 @@ export async function handleChatIntentUnderstandStream(
118
120
  contextMode: message.contextMode || "global",
119
121
  history,
120
122
  llmOptions,
121
- evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
123
+ evolutionCompositionFactory: await resolveServerEvolutionFactory(server),
124
+ prepareModelTurn: server.prepareUiModelTurn,
122
125
  })) {
123
126
  if (event.type === "token") {
124
127
  server._send(ws, {
@@ -171,7 +174,8 @@ export async function handleChatIntentClassifyFollowup(
171
174
  input,
172
175
  context: message.context || {},
173
176
  llmOptions,
174
- evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
177
+ evolutionCompositionFactory: await resolveServerEvolutionFactory(server),
178
+ prepareModelTurn: server.prepareUiModelTurn,
175
179
  });
176
180
  server._send(ws, {
177
181
  id,
@@ -180,7 +180,14 @@ export async function handleLlmChat(server, id, ws, message) {
180
180
  ws?.once?.("close", disconnect);
181
181
  try {
182
182
  const turn = await waitForChatPhase(
183
- prepareGovernedModelTurn(server.evolutionCompositionFactory ?? null, {
183
+ (
184
+ server.prepareUiModelTurn ||
185
+ ((context) =>
186
+ prepareGovernedModelTurn(
187
+ server.evolutionCompositionFactory ?? null,
188
+ context,
189
+ ))
190
+ )({
184
191
  mode: "ws-llm-chat",
185
192
  messages: message.messages,
186
193
  signal: controller.signal,
@@ -189,7 +196,7 @@ export async function handleLlmChat(server, id, ws, message) {
189
196
  "initialization",
190
197
  );
191
198
  const streamOptions = {
192
- requireCompletion: turn.governed,
199
+ requireCompletion: true,
193
200
  signal: controller.signal,
194
201
  };
195
202
  // Tell the browser the configured deadline even when waiting hints are
@@ -124,10 +124,7 @@ import {
124
124
  } from "./artifact-protocol.js";
125
125
  import { executionBroker } from "../../lib/process-execution-broker/index.js";
126
126
  import { collectWorkspacePluginBinSandboxPolicy } from "../../lib/plugin-runtime/bin.js";
127
- import {
128
- loadConfig,
129
- loadUserConfig,
130
- } from "../../lib/config-manager.js";
127
+ import { loadConfig, loadUserConfig } from "../../lib/config-manager.js";
131
128
 
132
129
  export const _deps = {
133
130
  spawn: (...args) => executionBroker.spawn(...args),
@@ -200,11 +197,9 @@ function boundedInteger(value, fallback, maximum = Number.MAX_SAFE_INTEGER) {
200
197
  }
201
198
 
202
199
  function loadCurrentLlmConfig() {
203
- const savedLlm =
204
- loadUserConfig({ failIfUnavailable: true }).llm || {};
200
+ const savedLlm = loadUserConfig({ failIfUnavailable: true }).llm || {};
205
201
  const resolvedLlm = loadConfig({ failIfUnavailable: true }).llm || {};
206
- const confirmedLlm =
207
- loadUserConfig({ failIfUnavailable: true }).llm || {};
202
+ const confirmedLlm = loadUserConfig({ failIfUnavailable: true }).llm || {};
208
203
  const provider =
209
204
  typeof savedLlm.provider === "string" && savedLlm.provider.trim()
210
205
  ? savedLlm.provider.trim()
@@ -378,6 +373,21 @@ export class ChainlessChainWSServer extends EventEmitter {
378
373
  }
379
374
  this.evolutionCompositionFactory =
380
375
  options.evolutionCompositionFactory || null;
376
+ if (
377
+ options.prepareUiModelTurn != null &&
378
+ typeof options.prepareUiModelTurn !== "function"
379
+ )
380
+ throw new TypeError("prepareUiModelTurn must be a function");
381
+ this.prepareUiModelTurn = options.prepareUiModelTurn || null;
382
+ if (
383
+ options.resolveEvolutionCompositionFactory != null &&
384
+ typeof options.resolveEvolutionCompositionFactory !== "function"
385
+ )
386
+ throw new TypeError(
387
+ "resolveEvolutionCompositionFactory must be a function",
388
+ );
389
+ this.resolveEvolutionCompositionFactory =
390
+ options.resolveEvolutionCompositionFactory || null;
381
391
  this.runtimeAdmissionDependencies =
382
392
  captureSkillRuntimeDependencies(options);
383
393
  this.skillOutcomeIndex =
@@ -827,8 +837,9 @@ export class ChainlessChainWSServer extends EventEmitter {
827
837
  /** Read the same static + scoped authority used by the Agent Core. */
828
838
  async _handlePermissionRulesGet(id, ws) {
829
839
  try {
830
- const { loadPermissionAuthority } =
831
- await import("../../lib/permission-authority.js");
840
+ const { loadPermissionAuthority } = await import(
841
+ "../../lib/permission-authority.js"
842
+ );
832
843
  const loaded = loadPermissionAuthority({ cwd: this.projectRoot });
833
844
  this._send(ws, {
834
845
  id,
@@ -1588,8 +1599,9 @@ export class ChainlessChainWSServer extends EventEmitter {
1588
1599
  /** @private — ping/pong heartbeat to detect dead connections */
1589
1600
  async _ensureTaskManager() {
1590
1601
  if (this._taskManager) return this._taskManager;
1591
- const { BackgroundTaskManager } =
1592
- await import("../../harness/background-task-manager.js");
1602
+ const { BackgroundTaskManager } = await import(
1603
+ "../../harness/background-task-manager.js"
1604
+ );
1593
1605
  this._taskManager = new BackgroundTaskManager({
1594
1606
  recoverOnStart: true,
1595
1607
  policyCwd: this.projectRoot,