chainlesschain 0.166.25 → 0.166.28

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 (177) hide show
  1. package/README.md +16 -10
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-RaxL_QQD.js → AIOps-TeJoc3XQ.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DD3ieFO-.js → ActionButton-SZ9klC71.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CATDJukS.js → Analytics-BvxMGhXs.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BHGsnRDS.js → AppLayout-5zUWvYnk.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-BL6NunjN.js → Artifacts-0BfSQj3N.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-D0nEWfbA.js → Audit-cScBdt3p.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-BAP1MUol.js → BackgroundAgents-022mS_uG.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-R4y2OeSi.js → Backup-CWnqpCpj.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-ByQZ2z6S.js → BaseInput-BCp80_Kc.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-32uV--xF.js → Chat-B2rj5NdZ.js} +3 -3
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-t1enanwz.js → ChatBubbleRenderer-2Lw_8bkr.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-D1CB-7bq.js → Checkbox-BTHrb0x7.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-BPx3dQ2q.js → Codegen-Y17WGsCF.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DkPTQ2Gl.js → Col-BBBucqHI.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-ZriaxRlr.js → Community-B2qcNGY4.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-C_qJ0P7F.js → Compact-BhDyZd93.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-Bgoy-saS.js → Compliance-BUEgTVrI.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-B5i9y6XK.js → Cowork-_wey4IKY.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-D7vBJ5-J.js → Cron-BSO7RSdx.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-D4kvoGI_.js → Crosschain-DawYCk-u.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BLOeBd-r.js → DID-DvtgImFY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-mecJaonC.js → Dashboard-DYAyw4yL.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-GPKwaFer.js → Dropdown-CIaenBpM.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BML9m7Dd.js → EmailListRenderer-jKv7wz64.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DN5bAtJC.js → FamilyGuardDashboard-BxQggJuN.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-DmD6Gecd.js → Federation-CDi_BOHj.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-6wwplN_K.js → FormItemContext-C-7XWf-w.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-DUhpLkDL.js → GenericCardRenderer-D8PAhWue.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-eJfyXkwf.js → Git-yhajzO5I.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-swAUW59x.js → Governance-DjM6hZK3.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CbdwJPDJ.js → Inference-C-gVn1ci.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-UuYpg1nm.js → KnowledgeGraph-CyG5TgH-.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CS0G057y.js → Logs-CnIbZJc3.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BDfOgqr1.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-CZRjuvvI.js → Marketplace-BQry6ziq.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BOJ9A_Rf.js → McpTools-7MBu8YsX.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-BnkrR-Ok.js → Memory-BlaZL_vM.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-Do4mPi13.js → MobileBridge-iUYdZA22.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-2JxWa6-p.js → MobileProjects-CUO-OpoO.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-CS_mnpGd.js → Mtc-6sD7414H.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-DZ4J_351.js → MtcAudit-BW8hjlD8.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-Jh74zKXu.js → Multisig-BA7_DWLu.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-_4n2BfnS.js → NLProgramming-7P7H52-B.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-CtENcKHv.js → Notes-D2O2aG0R.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-dgDCvpK9.js → NotificationSettings-SD4fdxcr.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-D5VxCrmG.js → OrderTableRenderer-BbXM4Ueq.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-CpIF8Xkd.js → Organization-DNabgtKX.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-aHnBZaez.js → Overflow-B7Bqrhq0.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-8ppzog2V.js → P2P-Dh0Df0zq.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-D3p1BXkp.js → PdhVaultBrowser-DHfJarF9.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-D7vflD5q.js → Permissions-Bz3ddnZ9.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-D2hY-Ek2.js → PersonalDataHub-Dfe0X6p8.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-qK2VqhJC.js → Pipeline-kCnDqnwc.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DHJr4uu0.js → Privacy-CPveUX9G.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-DMBS6trm.js → ProjectInit-ddXd7WTL.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-D3Ng74BT.js → ProjectSettings-DnXcEjyu.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-BfJFZiIW.js → Projects-O2yaPDuU.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-DlNA95G0.js → Providers-hJpcyGxR.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CMOIYxIm.js → QrScannerModal-CkbMoodn.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-D6MyGp5I.js → QuickAsk-CyFailNZ.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-W6WcShtf.js → Recommend-jpIDoqHs.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Dm_MjlV_.js → RemoteSession-CieiVXM-.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-Ctvij6eX.js → Reputation-DHtgC0AY.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DivbeDE-.js → Row-CSUyTUkR.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-D4famoAw.js → RssFeed-CkHylSMs.js} +2 -2
  68. package/src/assets/web-panel/assets/{Search-6gOAh3zG.js → Search-ykyn3OaJ.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-DApb9kK8.js → Security-DjM95Eyb.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-B8OomyE2.js → Services-Cf4UMvka.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-BTJ2g2E3.js → Skeleton-BnR-ZNiM.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-NIRr4DD1.js → Skills-oC5jYJgK.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-BQHP_6px.js → Sla-CTc_YFxW.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BVQTDSVS.js → SpeechSettings-31rddoaP.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-BOD4Mar6.js → SyncSettings-C-h00U59.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-Ciu7H2-y.js → Tasks-CGn_IiAO.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CtlwavRU.js → Templates-B9Hz_RuF.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-QLWYJdL6.js → Tenant-CJnIeKrI.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-B3q10mjm.js → Terminal-DfGtwDMA.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-CqltBA_8.js → TimelineRenderer-CISmCIFj.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-CJOKrj4y.js → Tokens-DNr-VU6W.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-CPMGgfdM.js → Trigger-CCYolBXm.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DiJms7Bl.js → Trust-DD75_Hjo.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-rakR8eel.js → UkeySign-BXulgGCu.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-DAWZUM5o.js → VideoEditing-B0DgHQiZ.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-DqUPnl7K.js → Wallet-BV3CEPVS.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-BnVUwvMm.js → WebAuthn-CI9bXloP.js} +2 -2
  88. package/src/assets/web-panel/assets/{WorkflowEditor-B1CAwxgs.js → WorkflowEditor-B4z18zZp.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-k2-0Jzfy.js → chat-BsQ4S4Nh.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-BAu8xBmW.js → colors-C0Jsl3u8.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DMlqcdfI.js → compact-item-CMZ_5Gdj.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-BU9kfiSw.js → createContext-VeTZ9pjJ.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-ChXQhXs6.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-2vacgdcl.js → hasIn-R2ip_4t-.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Bpe2CJd-.js → index-02inSVeg.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BUX4W-2v.js → index-0LEUdXks.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CSvSf9px.js → index-4i3UILe7.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BxctzdYQ.js → index-6vvyh4N2.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-JsyGqKmD.js → index-B53MC1iz.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BMq0frKK.js → index-BDl3jun-.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Bn8tARil.js → index-BGFKUUsv.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-TtrpHmYx.js → index-BGKhfuHU.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-C9WsM29I.js → index-BJvl_XUa.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DWLTSIka.js → index-BPTTGRU9.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Chybe7Ge.js → index-BX_8_UFn.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C5C4kSi8.js → index-BdwYZI-H.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-oElehY4F.js → index-Bhz0a_oU.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DCusBOqR.js → index-BjW7Qlh-.js} +1 -1
  109. package/src/assets/web-panel/assets/index-BpqhSIKB.js +1 -0
  110. package/src/assets/web-panel/assets/{index-DHg3LMNP.js → index-BtV-unhh.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DH01oIaj.js → index-ByPe74vs.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CXmpR6N3.js → index-Bz4O8exa.js} +3 -3
  113. package/src/assets/web-panel/assets/{index-DmZNnZz7.js → index-C3oYV_lA.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CyXmP3PW.js → index-CIanQUmB.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Ygh0wmKz.js → index-CNMfIBsh.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CONPVaxw.js → index-CsoYgCfM.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C6ICn9Y6.js → index-CuIo38St.js} +1 -1
  118. package/src/assets/web-panel/assets/index-Cv9p7aNY.js +1 -0
  119. package/src/assets/web-panel/assets/{index-B7wDjYUd.js → index-D4DUCUMd.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BZz2eB33.js → index-DF8AVnyq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BblNQlaA.js → index-DUfRaQ2R.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BdfKoqsK.js → index-DdXJoar7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-hDHHJYno.js → index-DjkLws9g.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DfWvcu4p.js → index-Dqf95oif.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DaUGdvtU.js → index-Du20UePt.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DcA-tEQd.js → index-DvYF07ij.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C8ldqZi6.js → index-DwfM7rYW.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CPyYXKFB.js → index-WJ_YxlwK.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Bf8YofPE.js → index-Zlt4hVX9.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-z4_YwZDW.js → index-iHgBGK8l.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-dIYqw3f0.js → index-nM2lMEZ4.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-B-C-Ruft.js → index-q_5BV7Pj.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-C24NoPpy.js → index-yIN1stc7.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-B9OXWu2e.js → initDefaultProps-D1uCn3z4.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-IQ47MCDQ.js → motion-5TP3EY0Q.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CLCU4kjV.js → move-C_bi-KUq.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CXnVlSPq.js → mtc-parser-CmdzT6ro.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BJjLXB0f.js → omit-Ce0_wQke.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BHdtvdy6.js → pickAttrs-DG8auaWM.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-oq8X_Bwc.js → placementArrow-CaWVLdLv.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-DTD02LAO.js → responsiveObserve-Bot4LFBx.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DbEeq8to.js → slide-HCFYDpKc.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-Do2fy1CJ.js → statusUtils-CWNqwWxQ.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-CFWD63T-.js → styleChecker-BUyR4PCy.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-BeozAWOo.js → useFlexGapSupport-C4XRVB5s.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-0-rIgnBL.js → useFs-D2VOJbk-.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-CeiNoI31.js → usePersonalDataHub-dN8G1tq6.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-Dj0ReRNg.js → vnode-DSQKKZnw.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-DD7MC4Dy.js → zoom-Dl0bVMqQ.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/ask.js +84 -5
  152. package/src/commands/chat.js +67 -1
  153. package/src/commands/compact.js +81 -2
  154. package/src/commands/complete.js +64 -5
  155. package/src/commands/cowork.js +133 -0
  156. package/src/commands/orchestrate.js +18 -7
  157. package/src/data/changelog.json +26 -0
  158. package/src/gateways/ws/action-protocol.js +2 -0
  159. package/src/lib/agent-router.js +116 -36
  160. package/src/lib/cowork-task-runner.js +107 -4
  161. package/src/lib/evolution/agent-evolution-ingress.js +231 -40
  162. package/src/lib/evolution/agent-evolution-runtime-composition.js +85 -5
  163. package/src/lib/evolution/evolution-deployment-loader.js +17 -1
  164. package/src/lib/evolution/evolution-evidence-projector.js +25 -6
  165. package/src/lib/model-failure-policy.js +10 -0
  166. package/src/lib/orchestrator.js +97 -27
  167. package/src/lib/read-file-loop-guard.js +205 -76
  168. package/src/lib/read-file-page.js +55 -2
  169. package/src/lib/sub-agent-context.js +34 -2
  170. package/src/repl/chat-repl.js +60 -10
  171. package/src/runtime/agent-core.js +243 -64
  172. package/src/runtime/agent-runtime.js +20 -1
  173. package/src/runtime/runtime-factory.js +1 -1
  174. package/src/assets/web-panel/assets/MarkdownRenderer-BxIIB4k3.js +0 -1
  175. package/src/assets/web-panel/assets/devWarning-DuGrUMAS.js +0 -1
  176. package/src/assets/web-panel/assets/index-DvFfMAux.js +0 -1
  177. package/src/assets/web-panel/assets/index-n6p-1A77.js +0 -1
@@ -12,6 +12,8 @@ import crypto from "crypto";
12
12
  import { CLIContextEngineering } from "./cli-context-engineering.js";
13
13
  import { agentLoop, buildSystemPrompt, AGENT_TOOLS } from "./agent-core.js";
14
14
  import { feature } from "./feature-flags.js";
15
+ import { isEvolutionIngressFailure } from "./model-failure-policy.js";
16
+ import { captureAgentEvolutionIngress } from "./evolution/agent-evolution-ingress.js";
15
17
  import {
16
18
  createWorktree,
17
19
  removeWorktree,
@@ -589,7 +591,13 @@ export class SubAgentContext {
589
591
  }
590
592
  return result;
591
593
  } catch (err) {
592
- if (err?.runtimeLedgerPersistence === true || this._workflowEffectId) {
594
+ if (
595
+ isEvolutionIngressFailure(err) ||
596
+ err?.runtimeLedgerPersistence === true ||
597
+ this._workflowEffectId
598
+ ) {
599
+ this.status = "failed";
600
+ this.completedAt = new Date().toISOString();
593
601
  throw err;
594
602
  }
595
603
  // If worktree creation fails (e.g. not a git repo), fall back to direct
@@ -875,12 +883,21 @@ export class SubAgentContext {
875
883
  options.approvalGate = this._approvalGate;
876
884
  }
877
885
 
886
+ const evolutionIngress =
887
+ options.evolutionIngress == null
888
+ ? null
889
+ : captureAgentEvolutionIngress(options.evolutionIngress);
890
+ if (evolutionIngress !== null) options.evolutionIngress = evolutionIngress;
891
+
878
892
  try {
879
893
  // Use a separate messages array for the agent loop
880
894
  // The agentLoop will append to this.messages directly
881
895
  const gen = agentLoop(this.messages, options);
882
896
 
883
897
  for await (const event of gen) {
898
+ if (evolutionIngress !== null) {
899
+ await evolutionIngress.ingestAgentEvent(event);
900
+ }
884
901
  this._iterationCount++;
885
902
 
886
903
  if (event.type === "run-started" && event.runId) {
@@ -1099,6 +1116,13 @@ export class SubAgentContext {
1099
1116
  this._tokenCount += Math.ceil((lastContent.length || 0) / 4);
1100
1117
  }
1101
1118
 
1119
+ if (event.type === "run-ended" && event.reason !== "complete") {
1120
+ this.forceComplete(event.reason || "unknown-terminal-reason", {
1121
+ partialContent: lastContent,
1122
+ artifacts,
1123
+ });
1124
+ }
1125
+
1102
1126
  // Emit progress to consumer if callback provided
1103
1127
  if (this._onProgress) {
1104
1128
  try {
@@ -1161,7 +1185,13 @@ export class SubAgentContext {
1161
1185
  throw error;
1162
1186
  }
1163
1187
  } catch (err) {
1164
- if (err?.runtimeLedgerPersistence === true || this._workflowEffectId) {
1188
+ if (
1189
+ isEvolutionIngressFailure(err) ||
1190
+ err?.runtimeLedgerPersistence === true ||
1191
+ this._workflowEffectId
1192
+ ) {
1193
+ this.status = "failed";
1194
+ this.completedAt = new Date().toISOString();
1165
1195
  throw err;
1166
1196
  }
1167
1197
  if (this.isAborted()) {
@@ -1295,6 +1325,8 @@ export class SubAgentContext {
1295
1325
  : "";
1296
1326
  this.result = {
1297
1327
  summary: `(Sub-agent force-completed: ${reason})${partialText}`,
1328
+ incomplete: true,
1329
+ completionReason: reason,
1298
1330
  artifacts: Array.isArray(partial.artifacts) ? partial.artifacts : [],
1299
1331
  tokenCount: this._tokenCount,
1300
1332
  toolsUsed: [...new Set(this._toolsUsed)],
@@ -56,6 +56,8 @@ import { installPipeSafety } from "../runtime/pipe-safety.js";
56
56
  import { installOutputBackpressure } from "../runtime/output-backpressure.js";
57
57
  import { assertChatSessionUsageAdmission } from "../lib/chat-session-admission.js";
58
58
  import { captureAmbientExecutionLocation } from "../lib/execution-location-runtime.js";
59
+ import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
60
+ import { createAgentEvolutionSessionLifecycle } from "../lib/evolution/agent-evolution-session-lifecycle.js";
59
61
 
60
62
  const SLASH_COMMANDS = {
61
63
  "/exit": "Exit the chat",
@@ -94,9 +96,17 @@ const SLASH_COMMANDS = {
94
96
  * @param {object} options
95
97
  */
96
98
  export async function startChatRepl(options = {}) {
99
+ const evolutionIngress =
100
+ options.evolutionIngress == null
101
+ ? null
102
+ : captureAgentEvolutionIngress(options.evolutionIngress);
97
103
  const admittedSessionId = options.sessionId
98
104
  ? assertChatSessionUsageAdmission(options.sessionId)
99
105
  : null;
106
+ const evolutionSession =
107
+ evolutionIngress === null
108
+ ? null
109
+ : createAgentEvolutionSessionLifecycle(evolutionIngress);
100
110
  let model = options.model || "qwen2:7b";
101
111
  let provider = options.provider || "ollama";
102
112
  const baseUrl = options.baseUrl || "http://localhost:11434";
@@ -147,7 +157,9 @@ export async function startChatRepl(options = {}) {
147
157
  ),
148
158
  );
149
159
  try {
150
- rl = readline.createInterface({
160
+ const createInterface =
161
+ options.createInterface || readline.createInterface.bind(readline);
162
+ rl = createInterface({
151
163
  input: options.input || process.stdin,
152
164
  output: stdout,
153
165
  prompt: chalk.green("you> "),
@@ -266,13 +278,20 @@ export async function startChatRepl(options = {}) {
266
278
  logger.verbose?.(`[@ref] expansion skipped: ${err.message}`);
267
279
  }
268
280
 
269
- // Add user message
270
- messages.push({ role: "user", content: userContent });
281
+ try {
282
+ if (evolutionIngress !== null) {
283
+ await evolutionIngress.ingestUserPrompt({
284
+ content: userContent,
285
+ sessionId,
286
+ });
287
+ }
271
288
 
272
- // Stream the response
273
- stdout.write(chalk.blue("ai> "));
289
+ // Add user message
290
+ messages.push({ role: "user", content: userContent });
291
+
292
+ // Stream the response
293
+ stdout.write(chalk.blue("ai> "));
274
294
 
275
- try {
276
295
  let response;
277
296
  const onToken = (token) => {
278
297
  const accepted = stdout.write(token);
@@ -302,9 +321,19 @@ export async function startChatRepl(options = {}) {
302
321
  if (sessionId)
303
322
  appendEvent(sessionId, "user_message", { content: trimmed });
304
323
 
324
+ const providerMessages =
325
+ evolutionIngress === null
326
+ ? messages
327
+ : (
328
+ await evolutionIngress.prepareModelRequest({
329
+ messages,
330
+ tools: [],
331
+ })
332
+ ).messages;
333
+
305
334
  if (provider === "ollama") {
306
335
  response = await streamOllama(
307
- messages,
336
+ providerMessages,
308
337
  model,
309
338
  baseUrl,
310
339
  onToken,
@@ -325,7 +354,7 @@ export async function startChatRepl(options = {}) {
325
354
  `API key required for anthropic (set ${providerDef?.apiKeyEnv || "ANTHROPIC_API_KEY"})`,
326
355
  );
327
356
  response = await streamAnthropic(
328
- messages,
357
+ providerMessages,
329
358
  model,
330
359
  url,
331
360
  key,
@@ -348,7 +377,7 @@ export async function startChatRepl(options = {}) {
348
377
  `API key required for ${provider} (set ${providerDef?.apiKeyEnv || "API key"})`,
349
378
  );
350
379
  response = await streamOpenAI(
351
- messages,
380
+ providerMessages,
352
381
  model,
353
382
  url,
354
383
  key,
@@ -358,6 +387,14 @@ export async function startChatRepl(options = {}) {
358
387
  );
359
388
  }
360
389
 
390
+ if (evolutionIngress !== null) {
391
+ await evolutionIngress.ingestAgentEvent({
392
+ type: "response-complete",
393
+ content: response,
394
+ sessionId,
395
+ });
396
+ }
397
+
361
398
  stdout.write("\n\n");
362
399
  messages.push({ role: "assistant", content: response });
363
400
 
@@ -410,6 +447,19 @@ export async function startChatRepl(options = {}) {
410
447
  : 0;
411
448
  disposePipeSafety();
412
449
  outputFlow.restore();
413
- process.exit(exitCode);
450
+ if (evolutionSession !== null) {
451
+ try {
452
+ await evolutionSession.close(outputFailure);
453
+ } catch (error) {
454
+ outputFailure ||= error;
455
+ }
456
+ }
457
+ const finalExitCode = outputFailure
458
+ ? outputFailure.code === "EPIPE"
459
+ ? 0
460
+ : 1
461
+ : exitCode;
462
+ process.exit(finalExitCode);
414
463
  });
464
+ return evolutionSession?.handle;
415
465
  }