chainlesschain 0.162.197 → 0.162.200

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 (233) hide show
  1. package/bin/chainlesschain.js +14 -6
  2. package/package.json +4 -1
  3. package/scripts/command-lifecycle-report.mjs +94 -0
  4. package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
  40. package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
  54. package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
  56. package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
  61. package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
  62. package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
  112. package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
  123. package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +4 -4
  153. package/src/commands/agent.js +3 -3
  154. package/src/commands/background-session.js +145 -0
  155. package/src/commands/mcp.js +244 -7
  156. package/src/commands/serve.js +1 -1
  157. package/src/commands/session-show.js +129 -0
  158. package/src/commands/session.js +97 -145
  159. package/src/commands/skill.js +87 -50
  160. package/src/data/changelog.json +40 -1
  161. package/src/gateways/ws/session-protocol.js +14 -4
  162. package/src/gateways/ws/ws-agent-handler.js +39 -1
  163. package/src/harness/jsonl-session-store.js +1547 -127
  164. package/src/harness/mcp-client.js +2690 -409
  165. package/src/harness/session-index.js +80 -80
  166. package/src/harness/session-list-index.js +210 -7
  167. package/src/lazy-dispatch.js +76 -8
  168. package/src/lib/abort-utils.js +68 -0
  169. package/src/lib/agent-core.js +1 -59
  170. package/src/lib/background-interaction-journal.js +2 -2
  171. package/src/lib/chat-core.js +24 -6
  172. package/src/lib/command-lifecycle-report.js +516 -0
  173. package/src/lib/cowork-mcp-tools.js +47 -2
  174. package/src/lib/cowork-task-runner.js +11 -3
  175. package/src/lib/doctor-checkup.js +9 -7
  176. package/src/lib/learning/skill-improver.js +21 -2
  177. package/src/lib/mcp-call-ledger-store.js +116 -3
  178. package/src/lib/mcp-call-ledger.js +59 -14
  179. package/src/lib/mcp-client.js +1 -0
  180. package/src/lib/mcp-stdio-environment.js +48 -0
  181. package/src/lib/mcp-stdio-executable-identity.js +1133 -0
  182. package/src/lib/mcp-stdio-execution-authority.js +363 -0
  183. package/src/lib/mcp-stdio-package-materialization.js +1424 -0
  184. package/src/lib/mcp-tool-metadata.js +436 -0
  185. package/src/lib/mcp-tool-result.js +367 -0
  186. package/src/lib/observability/index.js +71 -0
  187. package/src/lib/packer/native-update-state.js +979 -1
  188. package/src/lib/packer/pack-update-applier.js +1050 -125
  189. package/src/lib/packer/pkg-config-generator.js +1 -0
  190. package/src/lib/paths.js +53 -0
  191. package/src/lib/pr-link-ledger.js +8 -27
  192. package/src/lib/pr-link-store.js +26 -0
  193. package/src/lib/process-execution-broker/index.js +192 -35
  194. package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
  195. package/src/lib/process-tree-termination.js +253 -0
  196. package/src/lib/recent-session.js +17 -17
  197. package/src/lib/secure-file-identity.js +47 -0
  198. package/src/lib/secure-fs.js +21 -2
  199. package/src/lib/session-anti-rollback-anchor.js +766 -0
  200. package/src/lib/session-host-lease.js +492 -0
  201. package/src/lib/session-host-snapshot.js +9 -5
  202. package/src/lib/session-persistence-failure.js +109 -0
  203. package/src/lib/session-picker.js +26 -3
  204. package/src/lib/session-projection.js +5 -1
  205. package/src/lib/session-search.js +25 -11
  206. package/src/lib/session-tail.js +31 -1
  207. package/src/lib/side-effect-ledger-store.js +2 -2
  208. package/src/lib/skill-budget.js +222 -0
  209. package/src/lib/skill-execution-authority.js +385 -0
  210. package/src/lib/skill-execution-identity.js +39 -2
  211. package/src/lib/skill-loader.js +322 -86
  212. package/src/lib/skill-mcp.js +43 -1
  213. package/src/lib/turn-binding-store.js +2 -2
  214. package/src/repl/agent-repl.js +483 -77
  215. package/src/repl/bg-dashboard.js +81 -28
  216. package/src/repl/chat-repl.js +77 -12
  217. package/src/runtime/agent-core.js +428 -113
  218. package/src/runtime/agent-runtime.js +26 -3
  219. package/src/runtime/cleanup-deadline.js +143 -0
  220. package/src/runtime/headless-runner.js +494 -149
  221. package/src/runtime/headless-stream.js +504 -75
  222. package/src/runtime/mcp-config.js +157 -10
  223. package/src/runtime/mcp-tool-search.js +0 -0
  224. package/src/runtime/output-backpressure.js +419 -0
  225. package/src/runtime/pipe-safety.js +56 -21
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
  227. package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
  228. package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
  229. package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
  231. package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
  232. package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
  233. package/src/lib/skill-process-broker.js +0 -85
@@ -20,6 +20,8 @@
20
20
 
21
21
  import chalk from "chalk";
22
22
  import { phaseGroupKey } from "../lib/background-agent-phase.js";
23
+ import { installPipeSafety } from "../runtime/pipe-safety.js";
24
+ import { installOutputBackpressure } from "../runtime/output-backpressure.js";
23
25
 
24
26
  export const GROUP_ORDER = [
25
27
  "needs-input",
@@ -171,31 +173,52 @@ const ALT_EXIT = `${ESC}[?25h${ESC}[?1049l`;
171
173
  const CLEAR = `${ESC}[2J${ESC}[H`;
172
174
 
173
175
  /** Default terminal IO — swapped for a fake in tests. */
174
- export function defaultDashboardIo() {
176
+ export function defaultDashboardIo({
177
+ input = process.stdin,
178
+ stdout = process.stdout,
179
+ stderr = process.stderr,
180
+ } = {}) {
181
+ let failure = null;
182
+ const recordFailure = (error) => {
183
+ failure ||= error;
184
+ process.exitCode = error?.code === "EPIPE" ? 0 : 1;
185
+ };
186
+ const outputFlow = installOutputBackpressure({
187
+ stdout,
188
+ stderr,
189
+ onFailure: recordFailure,
190
+ });
191
+ const disposePipeSafety = installPipeSafety([stdout, stderr], () =>
192
+ recordFailure(
193
+ Object.assign(new Error("dashboard output pipe closed"), {
194
+ code: "EPIPE",
195
+ }),
196
+ ),
197
+ );
175
198
  return {
176
- isTTY: Boolean(process.stdout.isTTY && process.stdin.isTTY),
177
- write: (s) => process.stdout.write(s),
178
- enterAlt: () => process.stdout.write(ALT_ENTER),
179
- exitAlt: () => process.stdout.write(ALT_EXIT),
180
- clear: () => process.stdout.write(CLEAR),
199
+ isTTY: Boolean(stdout.isTTY && input.isTTY),
200
+ write: (s) => stdout.write(s),
201
+ enterAlt: () => stdout.write(ALT_ENTER),
202
+ exitAlt: () => stdout.write(ALT_EXIT),
203
+ clear: () => stdout.write(CLEAR),
181
204
  setRaw: (on) => {
182
- if (process.stdin.isTTY && process.stdin.setRawMode) {
183
- process.stdin.setRawMode(on);
205
+ if (input.isTTY && input.setRawMode) {
206
+ input.setRawMode(on);
184
207
  }
185
208
  },
186
209
  async listenKeys(onKey) {
187
210
  const readline = await import("node:readline");
188
- readline.emitKeypressEvents(process.stdin);
189
- process.stdin.resume();
211
+ readline.emitKeypressEvents(input);
212
+ input.resume();
190
213
  const handler = (str, key) => onKey(str, key || {});
191
- process.stdin.on("keypress", handler);
192
- return () => process.stdin.off("keypress", handler);
214
+ input.on("keypress", handler);
215
+ return () => input.off("keypress", handler);
193
216
  },
194
217
  async promptLine(question) {
195
218
  const readline = await import("node:readline");
196
219
  const rl = readline.createInterface({
197
- input: process.stdin,
198
- output: process.stdout,
220
+ input,
221
+ output: stdout,
199
222
  });
200
223
  try {
201
224
  return await new Promise((resolve) => rl.question(question, resolve));
@@ -203,6 +226,15 @@ export function defaultDashboardIo() {
203
226
  rl.close();
204
227
  }
205
228
  },
229
+ async wait() {
230
+ if (failure) throw failure;
231
+ await outputFlow.wait();
232
+ if (failure) throw failure;
233
+ },
234
+ dispose() {
235
+ disposePipeSafety();
236
+ outputFlow.restore();
237
+ },
206
238
  };
207
239
  }
208
240
 
@@ -224,23 +256,36 @@ export async function runBgDashboard(deps = {}) {
224
256
  let filterIndex = 0;
225
257
  let peek = null;
226
258
  let message = "";
259
+ let outputFailed = false;
260
+ let finishDashboard = () => {};
261
+ let renderChain = Promise.resolve();
227
262
  let model = buildDashboardModel(listAgents(), {
228
263
  filter: FILTERS[filterIndex],
229
264
  now: now(),
230
265
  });
231
266
 
232
267
  const render = () => {
233
- model = buildDashboardModel(listAgents(), {
234
- filter: FILTERS[filterIndex],
235
- now: now(),
236
- });
237
- if (selected >= model.flat.length)
238
- selected = Math.max(0, model.flat.length - 1);
239
- if (peek && !model.flat.some((s) => s.id === peek.id)) peek = null;
240
- io.clear();
241
- io.write(
242
- renderDashboard(model, { selectedIndex: selected, peek, message }) + "\n",
243
- );
268
+ renderChain = renderChain
269
+ .then(async () => {
270
+ model = buildDashboardModel(listAgents(), {
271
+ filter: FILTERS[filterIndex],
272
+ now: now(),
273
+ });
274
+ if (selected >= model.flat.length)
275
+ selected = Math.max(0, model.flat.length - 1);
276
+ if (peek && !model.flat.some((s) => s.id === peek.id)) peek = null;
277
+ io.clear();
278
+ io.write(
279
+ renderDashboard(model, { selectedIndex: selected, peek, message }) +
280
+ "\n",
281
+ );
282
+ await io.wait?.();
283
+ })
284
+ .catch(() => {
285
+ outputFailed = true;
286
+ finishDashboard();
287
+ });
288
+ return renderChain;
244
289
  };
245
290
 
246
291
  const selectedSession = () => model.flat[selected] || null;
@@ -259,13 +304,15 @@ export async function runBgDashboard(deps = {}) {
259
304
 
260
305
  io.enterAlt();
261
306
  io.setRaw(true);
262
- const timer = setInterval(render, refreshMs);
307
+ const timer = setInterval(() => void render(), refreshMs);
263
308
  timer.unref?.();
264
- render();
309
+ await render();
265
310
 
266
311
  let stopListening = () => {};
267
312
  await new Promise((resolve) => {
268
313
  const finish = () => resolve();
314
+ finishDashboard = finish;
315
+ if (outputFailed) finish();
269
316
  const onKey = async (str, key) => {
270
317
  const name = key?.name || str;
271
318
  const ctrlC = key?.ctrl && key.name === "c";
@@ -342,7 +389,7 @@ export async function runBgDashboard(deps = {}) {
342
389
  } catch (err) {
343
390
  message = `error: ${err.message}`;
344
391
  }
345
- render();
392
+ await render();
346
393
  };
347
394
  io.listenKeys(onKey).then((stop) => {
348
395
  stopListening = stop || (() => {});
@@ -353,4 +400,10 @@ export async function runBgDashboard(deps = {}) {
353
400
  stopListening();
354
401
  io.setRaw(false);
355
402
  io.exitAlt();
403
+ try {
404
+ await io.wait?.();
405
+ } catch {
406
+ // The output owner already classified the exit code.
407
+ }
408
+ io.dispose?.();
356
409
  }
@@ -52,6 +52,8 @@ import {
52
52
  appendTokenUsage,
53
53
  appendEvent,
54
54
  } from "../harness/jsonl-session-store.js";
55
+ import { installPipeSafety } from "../runtime/pipe-safety.js";
56
+ import { installOutputBackpressure } from "../runtime/output-backpressure.js";
55
57
 
56
58
  const SLASH_COMMANDS = {
57
59
  "/exit": "Exit the chat",
@@ -96,6 +98,8 @@ export async function startChatRepl(options = {}) {
96
98
  const apiKey = options.apiKey || null;
97
99
 
98
100
  const messages = [];
101
+ const stdout = options.stdout || process.stdout;
102
+ const stderr = options.stderr || process.stderr;
99
103
 
100
104
  // Phase J — attach chat REPL to a JSONL session so token_usage is recorded
101
105
  // and `cc session usage` / `usage.*` WS routes show real numbers.
@@ -112,12 +116,42 @@ export async function startChatRepl(options = {}) {
112
116
  }
113
117
  }
114
118
 
115
- const rl = readline.createInterface({
116
- input: process.stdin,
117
- output: process.stdout,
118
- prompt: chalk.green("you> "),
119
- terminal: true,
119
+ let rl = null;
120
+ let closing = false;
121
+ let cleanupStarted = false;
122
+ let outputFailure = null;
123
+ const requestOutputClose = (error) => {
124
+ if (error && !outputFailure) outputFailure = error;
125
+ if (error) process.exitCode = error.code === "EPIPE" ? 0 : 1;
126
+ if (closing) return;
127
+ closing = true;
128
+ rl?.close?.();
129
+ };
130
+ const outputFlow = installOutputBackpressure({
131
+ stdout,
132
+ stderr,
133
+ maxQueuedBytes: options.outputBackpressureMaxBytes,
134
+ onFailure: requestOutputClose,
120
135
  });
136
+ const disposePipeSafety = installPipeSafety([stdout, stderr], () =>
137
+ requestOutputClose(
138
+ Object.assign(new Error("chat REPL output pipe closed"), {
139
+ code: "EPIPE",
140
+ }),
141
+ ),
142
+ );
143
+ try {
144
+ rl = readline.createInterface({
145
+ input: options.input || process.stdin,
146
+ output: stdout,
147
+ prompt: chalk.green("you> "),
148
+ terminal: true,
149
+ });
150
+ } catch (error) {
151
+ disposePipeSafety();
152
+ outputFlow.restore();
153
+ throw error;
154
+ }
121
155
 
122
156
  logger.log(chalk.bold("\nChainlessChain AI Chat"));
123
157
  logger.log(chalk.gray(`Model: ${model} Provider: ${provider}`));
@@ -127,6 +161,11 @@ export async function startChatRepl(options = {}) {
127
161
  rl.prompt();
128
162
 
129
163
  rl.on("line", async (input) => {
164
+ try {
165
+ await outputFlow.wait();
166
+ } catch {
167
+ return;
168
+ }
130
169
  const trimmed = input.trim();
131
170
 
132
171
  if (!trimmed) {
@@ -225,11 +264,14 @@ export async function startChatRepl(options = {}) {
225
264
  messages.push({ role: "user", content: userContent });
226
265
 
227
266
  // Stream the response
228
- process.stdout.write(chalk.blue("ai> "));
267
+ stdout.write(chalk.blue("ai> "));
229
268
 
230
269
  try {
231
270
  let response;
232
- const onToken = (token) => process.stdout.write(token);
271
+ const onToken = (token) => {
272
+ const accepted = stdout.write(token);
273
+ return accepted === false ? outputFlow.wait() : undefined;
274
+ };
233
275
  let capturedUsage = null;
234
276
  const onUsage = (u) => {
235
277
  capturedUsage = u;
@@ -246,7 +288,7 @@ export async function startChatRepl(options = {}) {
246
288
  const timeoutIn =
247
289
  timeoutMs > ms ? Math.round((timeoutMs - ms) / 1000) : 0;
248
290
  const suffix = timeoutIn > 0 ? ` · will time out in ${timeoutIn}s` : "";
249
- process.stderr.write(
291
+ stderr.write(
250
292
  `\x1b[2m ⏳ waiting for API response (silent ${silent}s)${suffix}…\x1b[0m\n`,
251
293
  );
252
294
  };
@@ -310,7 +352,7 @@ export async function startChatRepl(options = {}) {
310
352
  );
311
353
  }
312
354
 
313
- process.stdout.write("\n\n");
355
+ stdout.write("\n\n");
314
356
  messages.push({ role: "assistant", content: response });
315
357
 
316
358
  if (sessionId) {
@@ -331,14 +373,37 @@ export async function startChatRepl(options = {}) {
331
373
  }
332
374
  }
333
375
  } catch (err) {
334
- process.stdout.write("\n");
376
+ if (err?.isOutputBackpressureFailure === true) return;
377
+ stdout.write("\n");
335
378
  logger.error(`Error: ${err.message}`);
336
379
  }
337
380
 
381
+ try {
382
+ await outputFlow.wait();
383
+ } catch {
384
+ return;
385
+ }
338
386
  rl.prompt();
339
387
  });
340
388
 
341
- rl.on("close", () => {
342
- process.exit(0);
389
+ rl.on("close", async () => {
390
+ if (cleanupStarted) return;
391
+ cleanupStarted = true;
392
+ closing = true;
393
+ if (!outputFailure) {
394
+ try {
395
+ await outputFlow.wait();
396
+ } catch (error) {
397
+ outputFailure ||= error;
398
+ }
399
+ }
400
+ const exitCode = outputFailure
401
+ ? outputFailure.code === "EPIPE"
402
+ ? 0
403
+ : 1
404
+ : 0;
405
+ disposePipeSafety();
406
+ outputFlow.restore();
407
+ process.exit(exitCode);
343
408
  });
344
409
  }