chainlesschain 0.162.94 → 0.162.96

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 (224) hide show
  1. package/README.md +1 -1
  2. package/bin/chainlesschain.js +8 -18
  3. package/package.json +1 -1
  4. package/src/assets/web-panel/.build-hash +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-CiEoV_Hg.js → AIOps-Bo9Ux24z.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DrrjQMuK.js → ActionButton-CExgXSQT.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-ChlhPe9a.js → Analytics-BNnZhRTZ.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-CIkI7d5o.js → AppLayout-D9xfqFCT.js} +4 -4
  9. package/src/assets/web-panel/assets/{Audit-_sY9bNSN.js → Audit-Cpgu8uCw.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DvzaThN8.js → Backup-CHdEJnNE.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DDZW_DU8.js → BaseInput-Cbw-PxBq.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DqErkog2.js → Chat-ChHTZK_6.js} +5 -5
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BcnNHS-r.js → ChatBubbleRenderer-Dl6z6ZH7.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-NWDuyRK6.js → Checkbox-Cj8d9bru.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B_jnSC8a.js → Codegen-C2YobW4j.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-B-uyUy0z.js → Col-CxfV5FGT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Dmf1MpG7.js → Community-CiwOASMj.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-fGI68M5y.js → Compact-CTg_2iKW.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-PV9qT-iV.js → Compliance-HMbsTmtw.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BM6BvCgv.js → Cowork-DyNDqGR2.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-BsSWwFFo.js → Cron-9-x5M7qy.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-DUdPVYvS.js → Crosschain-4msgDaYJ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-PPLLhrJs.js → DID--2Beb5Po.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Cn_Xjj80.js → Dashboard-T6nq0Lzs.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DkTXjy5D.js → Dropdown-D_Q6T10v.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BnA27cjB.js → EmailListRenderer-TnN21bJx.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-jqrv5VCp.js → FamilyGuardDashboard-kky_uIij.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-DESwXwtR.js → Federation-C1GkNY4B.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-C9gbyY1r.js → FormItemContext-5-_Fc5YV.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-CkZB9crH.js → GenericCardRenderer-CmHiB7sr.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-B6niu0W9.js → Git-Cuci_BPI.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BrF28dEi.js → Governance-BU0cO2LD.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CZDnV8SN.js → Inference-BDFNgEcx.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-eqZ0hP0l.js → KnowledgeGraph-DITXUzHz.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-BlHS7DoS.js → Logs-Ea-07CRd.js} +2 -2
  36. package/src/assets/web-panel/assets/{Marketplace-NOp9G83e.js → Marketplace-D6OBbRVG.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-B6wMx173.js → McpTools-eiKpIJMi.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-BKVeTAeT.js → Memory-M-X-T8UF.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-Da2y6iYW.js → MobileBridge-xcZb9Ekv.js} +2 -2
  40. package/src/assets/web-panel/assets/MobileProjects-DCfoTPRC.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-B7Hy5rAT.js → Mtc-BWfGDzD8.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-BgBoX0XI.js → MtcAudit-imBuld-U.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-Db7bwi5J.js → Multisig-C2kcsq7I.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-f9ca2vst.js → NLProgramming-DObvXSXP.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-meVqoOMz.js → Notes-C-6OGJMe.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BfEhBXNo.js → NotificationSettings-ub7Ozxci.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-e25Q6ALJ.js → OrderTableRenderer-CR2W89Vk.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-BpgOG9lj.js → Organization-DNA_Wty7.js} +2 -2
  49. package/src/assets/web-panel/assets/{Overflow-fI3L05Rq.js → Overflow-rT4Wb4rQ.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-wD0wpJJY.js → P2P-CK-hARKv.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-BWV9J4VZ.js → PdhVaultBrowser-C2pbtNbT.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-BJH7W2iv.js → Permissions-B8EIEqGJ.js} +3 -3
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CqQ3XpMz.js → PersonalDataHub-BxNVNU3s.js} +2 -2
  54. package/src/assets/web-panel/assets/{Pipeline-CHyXCU1i.js → Pipeline-CT9pbkyY.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CJtfNlc7.js → Privacy-DhCNd2CS.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CKOaHFGR.js → ProjectInit-Qngnx-vQ.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-QD8wp_EM.js → ProjectSettings-Dfn-nQc1.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-BKdiSaPR.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-BPESqCEg.js → Providers-4o9B_n-X.js} +1 -1
  60. package/src/assets/web-panel/assets/{QuickAsk-C5AzvvRo.js → QuickAsk-bs1qvF30.js} +1 -1
  61. package/src/assets/web-panel/assets/{Recommend-cGpF3tsA.js → Recommend-CuEnKA2K.js} +1 -1
  62. package/src/assets/web-panel/assets/{Reputation-Duaxvbt9.js → Reputation-DbfvmRb2.js} +1 -1
  63. package/src/assets/web-panel/assets/{Row-xsUwB5Ay.js → Row-DvMJGAI3.js} +1 -1
  64. package/src/assets/web-panel/assets/{RssFeed-DmUUsqaF.js → RssFeed-oJ0BZvmA.js} +3 -3
  65. package/src/assets/web-panel/assets/{Search-Do9YuDbX.js → Search-DnIVrY9O.js} +1 -1
  66. package/src/assets/web-panel/assets/{Security-06BgEn-d.js → Security-CIWhI_Tc.js} +3 -3
  67. package/src/assets/web-panel/assets/{Services-DyaCes7r.js → Services-DLrnpjwm.js} +2 -2
  68. package/src/assets/web-panel/assets/{Skeleton-Cj_VbkFG.js → Skeleton-CYmqgtVb.js} +1 -1
  69. package/src/assets/web-panel/assets/{Skills-DCOWMJOR.js → Skills-BUzCkoeu.js} +1 -1
  70. package/src/assets/web-panel/assets/{Sla-C44_86bu.js → Sla-DYRE4bnS.js} +1 -1
  71. package/src/assets/web-panel/assets/{SpeechSettings-BXhBJSMB.js → SpeechSettings-_6MurdOg.js} +1 -1
  72. package/src/assets/web-panel/assets/{SyncSettings-BpHsaNWg.js → SyncSettings-UIdnF5Li.js} +2 -2
  73. package/src/assets/web-panel/assets/Tasks-COx2CjT8.js +1 -0
  74. package/src/assets/web-panel/assets/{Templates-aEWbCOdo.js → Templates-BcHAmkZo.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tenant-DkOLw1Yz.js → Tenant-CjYQS8yZ.js} +1 -1
  76. package/src/assets/web-panel/assets/{Terminal-5Z4paIoh.js → Terminal-BmfOPcWt.js} +2 -2
  77. package/src/assets/web-panel/assets/{TimelineRenderer-CYhublOm.js → TimelineRenderer-D5HuarNQ.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tokens-h57dBT4T.js → Tokens-C_fbProA.js} +1 -1
  79. package/src/assets/web-panel/assets/{Trigger-abE21FpD.js → Trigger-JPulpRx8.js} +1 -1
  80. package/src/assets/web-panel/assets/{Trust-urB3VZip.js → Trust-CnO-062O.js} +1 -1
  81. package/src/assets/web-panel/assets/{UkeySign-D6uXV9pp.js → UkeySign-HpNovvau.js} +1 -1
  82. package/src/assets/web-panel/assets/{VideoEditing-C9MxXAzw.js → VideoEditing-yMncxH7y.js} +1 -1
  83. package/src/assets/web-panel/assets/{Wallet-DTn5rW4u.js → Wallet-Cug-t7Np.js} +3 -3
  84. package/src/assets/web-panel/assets/{WebAuthn-BNYEqeqr.js → WebAuthn--U1-NR-3.js} +2 -2
  85. package/src/assets/web-panel/assets/{WorkflowEditor-CsRoOJPT.js → WorkflowEditor-R-XvSJ3S.js} +1 -1
  86. package/src/assets/web-panel/assets/{chat-B5GoUHDS.js → chat-CCI1i6Rp.js} +1 -1
  87. package/src/assets/web-panel/assets/{colors-BF_Rqaab.js → colors-C-mqoaLt.js} +1 -1
  88. package/src/assets/web-panel/assets/{compact-item-BNPfqT4P.js → compact-item-De_N2iRR.js} +1 -1
  89. package/src/assets/web-panel/assets/{createContext-C3qLKXX-.js → createContext-DbTM6sjZ.js} +1 -1
  90. package/src/assets/web-panel/assets/devWarning-OcLPHSl5.js +1 -0
  91. package/src/assets/web-panel/assets/{hasIn-BLpAeFXB.js → hasIn-D0Adylyc.js} +1 -1
  92. package/src/assets/web-panel/assets/index-7E_mHkDU.js +1 -0
  93. package/src/assets/web-panel/assets/{index-BOoTjHGU.js → index-AY937BxS.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-Cv1WRH-j.js → index-B6hgy5VC.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C2wJowV1.js → index-B7XnpLHk.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Dj6rUk3f.js → index-B7gw-tDm.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Dz7o1Zt6.js → index-BBgDgkwW.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CMRdeB2r.js → index-BMmeiw88.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-2-7AD4Fq.js → index-BU6XtnSx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-7Tt41tHa.js → index-Bi7VUG0R.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CaROOJ5Z.js → index-BtE3cw9m.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DmrPbYXh.js → index-C9ej-MF0.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-CgIrRLBP.js → index-CIEiQl1j.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DudglWTC.js → index-CKgaW9E5.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C8B3rHnr.js → index-CY0KKR5f.js} +1 -1
  106. package/src/assets/web-panel/assets/index-CbV3-WlB.js +1 -0
  107. package/src/assets/web-panel/assets/{index-ixN0R0We.js → index-Co1UkcFX.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cqb8TXEp.js → index-CzP5d5LW.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DH95hKUN.js → index-D0NJ5lRi.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C6yRwT6e.js → index-D0gBsqTX.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-o1doEeT3.js → index-D5F6shtn.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BxWEK9FS.js → index-DVtamtlm.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Cxd2RsZR.js → index-DWT18hDG.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-vXHPZOmO.js → index-DaXb4B9P.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BJsVUj80.js → index-DjQA0Vez.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CIjPwa7h.js → index-Ds8NJVEL.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DMKiwMJa.js → index-DuP-8HWu.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BIpGZeh2.js → index-DwLTiJ31.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Dn95Blhx.js → index-T3VhH8cO.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BqjU6Jp9.js → index-TDY1o0w3.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CBFekqcY.js → index-TRy2Gc3V.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D-PNuV4r.js → index-W1OMxCmI.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BlEDjdTc.js → index-ftFRZbuc.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DMKbLaTg.js → index-iGPGaORA.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DYWExa2Z.js → index-jhy5KQvg.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BryugSCS.js → index-qUSZJcgw.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-81hgV6U6.js → index-w3f6lqkD.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CmBMP52w.js → index-xdMc71Kh.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-KUdyAwqr.js → index-xhX5eg2Z.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DGVf-eOG.js → index-zkTiW6d6.js} +1 -1
  131. package/src/assets/web-panel/assets/{initDefaultProps-Dhfx-jOJ.js → initDefaultProps-CIHqouWk.js} +1 -1
  132. package/src/assets/web-panel/assets/{motion-DzZPc4Mq.js → motion-D1iUKftk.js} +1 -1
  133. package/src/assets/web-panel/assets/{move-D6R8EIjz.js → move-YOpWjmjL.js} +1 -1
  134. package/src/assets/web-panel/assets/{omit-CPniUUR1.js → omit-C_1357UY.js} +1 -1
  135. package/src/assets/web-panel/assets/{pickAttrs-DbzxHNNa.js → pickAttrs-CDb4dq6o.js} +1 -1
  136. package/src/assets/web-panel/assets/{placementArrow-B_MxmwXz.js → placementArrow-D-OGYyhd.js} +1 -1
  137. package/src/assets/web-panel/assets/{responsiveObserve-Em-jKJ7U.js → responsiveObserve-hS-j69A0.js} +1 -1
  138. package/src/assets/web-panel/assets/{slide-B2RV1mQl.js → slide-tnjuvphU.js} +1 -1
  139. package/src/assets/web-panel/assets/{statusUtils-C9Ps6HQe.js → statusUtils-BERfMMcU.js} +1 -1
  140. package/src/assets/web-panel/assets/{styleChecker-DCoehh1S.js → styleChecker-DKpl2K9E.js} +1 -1
  141. package/src/assets/web-panel/assets/{useFlexGapSupport-DZOaLVto.js → useFlexGapSupport-C_sX4D3N.js} +1 -1
  142. package/src/assets/web-panel/assets/{useFs-Dk_JA91R.js → useFs-DBcxC1vK.js} +1 -1
  143. package/src/assets/web-panel/assets/{usePersonalDataHub-CJR6Dqtz.js → usePersonalDataHub-CeoDf2XI.js} +1 -1
  144. package/src/assets/web-panel/assets/{vnode-BaFNaDQL.js → vnode-DC9Pmj_u.js} +1 -1
  145. package/src/assets/web-panel/assets/{zoom-CxA9IYpM.js → zoom-CZA58J7M.js} +1 -1
  146. package/src/assets/web-panel/index.html +1 -1
  147. package/src/commands/activitypub.js +19 -3
  148. package/src/commands/agent.js +25 -0
  149. package/src/commands/ask.js +13 -0
  150. package/src/commands/config.js +17 -1
  151. package/src/commands/cost.js +6 -1
  152. package/src/commands/dao.js +16 -3
  153. package/src/commands/dlp.js +7 -1
  154. package/src/commands/hub.js +13 -0
  155. package/src/commands/mtc.js +37 -1
  156. package/src/commands/pdh.js +162 -0
  157. package/src/gateways/discord/discord-formatter.js +18 -1
  158. package/src/gateways/telegram/telegram-formatter.js +6 -3
  159. package/src/gateways/ws/ws-server.js +19 -1
  160. package/src/harness/mcp-client.js +19 -2
  161. package/src/harness/plugin-manager.js +20 -0
  162. package/src/harness/worktree-isolator.js +17 -1
  163. package/src/index.js +2 -0
  164. package/src/lib/__tests__/model-deprecation.test.js +194 -0
  165. package/src/lib/a2a-protocol.js +23 -9
  166. package/src/lib/agent-core.js +2 -5
  167. package/src/lib/audit-mtc.js +40 -2
  168. package/src/lib/chat-core.js +141 -18
  169. package/src/lib/claude-code-bridge.js +14 -2
  170. package/src/lib/cli-anything-bridge.js +5 -0
  171. package/src/lib/cli-numeric.js +38 -0
  172. package/src/lib/config-manager.js +37 -6
  173. package/src/lib/cowork/ab-comparator-cli.js +6 -2
  174. package/src/lib/cowork-cron.js +45 -34
  175. package/src/lib/cowork-learning.js +31 -1
  176. package/src/lib/cowork-share.js +39 -3
  177. package/src/lib/cowork-template-marketplace.js +54 -2
  178. package/src/lib/cowork-workflow.js +33 -6
  179. package/src/lib/cross-chain-mtc.js +41 -12
  180. package/src/lib/crypto-manager.js +12 -2
  181. package/src/lib/dbevo.js +19 -8
  182. package/src/lib/downloader.js +24 -9
  183. package/src/lib/evomap-governance.js +4 -4
  184. package/src/lib/evomap-manager.js +54 -7
  185. package/src/lib/fatal-handler.js +48 -0
  186. package/src/lib/file-checkpoint.js +56 -4
  187. package/src/lib/git-integration.js +28 -0
  188. package/src/lib/goal-store.js +36 -10
  189. package/src/lib/hierarchical-memory.js +6 -0
  190. package/src/lib/llm-pricing.js +52 -2
  191. package/src/lib/mcp-oauth.js +37 -7
  192. package/src/lib/memory-manager.js +23 -2
  193. package/src/lib/model-deprecation.js +249 -0
  194. package/src/lib/pdh-feedback-ledger.js +131 -0
  195. package/src/lib/permanent-memory.js +30 -2
  196. package/src/lib/permission-rules.cjs +11 -3
  197. package/src/lib/personal-data-hub-aichat-wizard.js +33 -3
  198. package/src/lib/personal-data-hub-wiring.js +36 -13
  199. package/src/lib/project-instructions.js +10 -4
  200. package/src/lib/runnable-provider.js +62 -31
  201. package/src/lib/session-tail.js +6 -1
  202. package/src/lib/session-usage.js +34 -1
  203. package/src/lib/skill-loader.js +4 -1
  204. package/src/lib/skill-packs/generator.js +25 -2
  205. package/src/lib/stream-retry.js +56 -0
  206. package/src/lib/sync-credentials.js +53 -17
  207. package/src/lib/token-tracker.js +12 -2
  208. package/src/lib/with-file-lock.js +87 -0
  209. package/src/repl/agent-repl.js +52 -13
  210. package/src/repl/chat-repl.js +10 -0
  211. package/src/repl/session-cost.js +31 -3
  212. package/src/runtime/agent-core.js +474 -53
  213. package/src/runtime/coding-agent-contract-shared.cjs +58 -1
  214. package/src/runtime/coding-agent-policy.cjs +10 -0
  215. package/src/runtime/file-ref-expander.js +29 -1
  216. package/src/runtime/headless-runner.js +51 -6
  217. package/src/runtime/headless-stream.js +219 -2
  218. package/src/skills/video-editing/tools/commit.js +15 -1
  219. package/src/assets/web-panel/assets/MobileProjects-CTFPhn4A.js +0 -1
  220. package/src/assets/web-panel/assets/Projects-Dj33CO-H.js +0 -1
  221. package/src/assets/web-panel/assets/Tasks-C83eyBn8.js +0 -1
  222. package/src/assets/web-panel/assets/devWarning-D5Rwbl_Y.js +0 -1
  223. package/src/assets/web-panel/assets/index-7ls1Z3dH.js +0 -1
  224. package/src/assets/web-panel/assets/index-DoldiBPq.js +0 -1
@@ -286,9 +286,19 @@ export async function startAgentRepl(options = {}) {
286
286
  // an auto-detected image path so the REPL switches to a vision-capable model
287
287
  // for that turn only (resolveVisionLlm falls back to the default when unset).
288
288
  let _visionModel;
289
+ // Hard stream inactivity timeout override (config.llm.streamStallTimeoutMs,
290
+ // ms): a stream silent that long is aborted + retried instead of hanging.
291
+ // Unset → agent-core's 180s default (matches cc chat/ask). Set to 0 to
292
+ // disable. Left undefined here means "use the default".
293
+ let _streamStallTimeoutMs;
289
294
  try {
290
295
  const { loadConfig } = await import("../lib/config-manager.js");
291
- _visionModel = loadConfig()?.llm?.visionModel || undefined;
296
+ const _cfg = loadConfig();
297
+ _visionModel = _cfg?.llm?.visionModel || undefined;
298
+ const raw = _cfg?.llm?.streamStallTimeoutMs;
299
+ const t = Number(raw);
300
+ // Accept 0 (explicit disable) — only ignore absent/invalid values.
301
+ if (raw != null && Number.isFinite(t) && t >= 0) _streamStallTimeoutMs = t;
292
302
  } catch {
293
303
  /* optional — resolveVisionLlm falls back to DEFAULT_VISION_MODEL */
294
304
  }
@@ -721,6 +731,7 @@ export async function startAgentRepl(options = {}) {
721
731
  // an IDE integrated terminal. --ide forces it, --no-ide disables it
722
732
  // (parity with headless; auto-detect already works via process.env).
723
733
  ide: options.ide,
734
+ pdh: options.pdh,
724
735
  cwd: process.cwd(),
725
736
  // advertise the session id to spawned stdio MCP servers
726
737
  sessionId,
@@ -1946,6 +1957,11 @@ export async function startAgentRepl(options = {}) {
1946
1957
  messages.length = 1; // keep system prompt
1947
1958
  messages.push(...rebuilt.filter((m) => m.role !== "system"));
1948
1959
  sessionId = resumeId;
1960
+ // The prior session's checkpoint marks (turn-index → checkpoint id)
1961
+ // no longer map to this swapped-in history; keeping them would make
1962
+ // a later /rewind restore files from the WRONG session's snapshot.
1963
+ // Same reset /clear does on a context swap.
1964
+ _checkpointMarks.length = 0;
1949
1965
  logger.info(
1950
1966
  `Resumed JSONL session ${sessionId} (${rebuilt.length} messages)`,
1951
1967
  );
@@ -1959,6 +1975,8 @@ export async function startAgentRepl(options = {}) {
1959
1975
  messages.length = 1; // keep system prompt
1960
1976
  messages.push(...parsed.filter((m) => m.role !== "system"));
1961
1977
  sessionId = existing.id;
1978
+ // Drop the prior session's checkpoint marks (see JSONL branch).
1979
+ _checkpointMarks.length = 0;
1962
1980
  logger.info(
1963
1981
  `Resumed session ${sessionId} (${parsed.length} messages)`,
1964
1982
  );
@@ -2456,12 +2474,19 @@ export async function startAgentRepl(options = {}) {
2456
2474
  process.stdout.write(chalk.gray(` [step] ${evt.step}\n`));
2457
2475
  };
2458
2476
 
2459
- autonomousAgent.on("goal:completed", goalListener);
2460
- autonomousAgent.on("goal:failed", goalListener);
2461
- autonomousAgent.on("step:started", stepListener);
2462
- autonomousAgent.on("step:completed", (evt) => {
2463
- process.stdout.write(chalk.green(` [done] ${evt.step}\n`));
2464
- });
2477
+ // Attach the live-output listeners ONCE per REPL session — the agent is
2478
+ // a session-scoped singleton (created once above), so re-attaching on
2479
+ // every `/auto` would accumulate listeners (duplicate output + leak +
2480
+ // MaxListenersExceededWarning). The handlers are stateless.
2481
+ if (!autonomousAgent._replListenersAttached) {
2482
+ autonomousAgent._replListenersAttached = true;
2483
+ autonomousAgent.on("goal:completed", goalListener);
2484
+ autonomousAgent.on("goal:failed", goalListener);
2485
+ autonomousAgent.on("step:started", stepListener);
2486
+ autonomousAgent.on("step:completed", (evt) => {
2487
+ process.stdout.write(chalk.green(` [done] ${evt.step}\n`));
2488
+ });
2489
+ }
2465
2490
 
2466
2491
  logger.info(`Submitting goal: ${chalk.cyan(autoArg)}`);
2467
2492
  try {
@@ -2660,7 +2685,7 @@ export async function startAgentRepl(options = {}) {
2660
2685
 
2661
2686
  // `/sessions` — list recent RESUMABLE conversations (read-only; the ids
2662
2687
  // work with `cc agent --resume <id>`). `/session` shows the current one.
2663
- if (trimmed === "/sessions" || trimmed === "/sessions ") {
2688
+ if (trimmed === "/sessions" || trimmed.startsWith("/sessions ")) {
2664
2689
  try {
2665
2690
  const { listRecentSessions } = await import("../lib/recent-session.js");
2666
2691
  const { renderRecentSessions } = await import("./recent-sessions.js");
@@ -2676,7 +2701,7 @@ export async function startAgentRepl(options = {}) {
2676
2701
  // `/memory` — project-memory files auto-loaded into the system prompt
2677
2702
  // (cc.md hierarchy + imports + path-scoped rules). Distinct from `#` (add
2678
2703
  // a note) and `cc memory recall` (scoped store).
2679
- if (trimmed === "/memory" || trimmed === "/memory ") {
2704
+ if (trimmed === "/memory" || trimmed.startsWith("/memory ")) {
2680
2705
  try {
2681
2706
  const { loadProjectInstructions } =
2682
2707
  await import("../lib/project-instructions.js");
@@ -2695,7 +2720,7 @@ export async function startAgentRepl(options = {}) {
2695
2720
  }
2696
2721
 
2697
2722
  // `/mcp` — overview of connected MCP servers' resources + prompts.
2698
- if (trimmed === "/mcp" || trimmed === "/mcp ") {
2723
+ if (trimmed === "/mcp" || trimmed.startsWith("/mcp ")) {
2699
2724
  const mcpClient = _adhocMcp?.mcpClient || _bundleMcpClient;
2700
2725
  logger.log(renderMcpSurface(mcpClient));
2701
2726
  prompt();
@@ -2753,7 +2778,7 @@ export async function startAgentRepl(options = {}) {
2753
2778
 
2754
2779
  // `/doctor` — consolidated session-health readout (Claude-Code parity):
2755
2780
  // provider/key/IDE/MCP/permissions/hooks in one pass-or-warn view.
2756
- if (trimmed === "/doctor" || trimmed === "/doctor ") {
2781
+ if (trimmed === "/doctor" || trimmed.startsWith("/doctor ")) {
2757
2782
  let config = {};
2758
2783
  try {
2759
2784
  config = (await import("../lib/config-manager.js")).loadConfig() || {};
@@ -2860,7 +2885,7 @@ export async function startAgentRepl(options = {}) {
2860
2885
 
2861
2886
  // `/cost` — running token spend + estimated $ for this session (Claude-Code
2862
2887
  // parity). In-memory accumulation, so it works without session persistence.
2863
- if (trimmed === "/cost" || trimmed === "/cost ") {
2888
+ if (trimmed === "/cost" || trimmed.startsWith("/cost ")) {
2864
2889
  let overrides;
2865
2890
  let visionModel;
2866
2891
  try {
@@ -2937,7 +2962,7 @@ export async function startAgentRepl(options = {}) {
2937
2962
 
2938
2963
  // `/ide` — IDE bridge connection status (Claude-Code parity): which editor
2939
2964
  // is connected, its tools, or why discovery came up empty.
2940
- if (trimmed === "/ide" || trimmed === "/ide ") {
2965
+ if (trimmed === "/ide" || trimmed.startsWith("/ide ")) {
2941
2966
  let diag = null;
2942
2967
  try {
2943
2968
  const { diagnoseIde } = await import("../lib/ide-bridge.js");
@@ -3242,6 +3267,20 @@ export async function startAgentRepl(options = {}) {
3242
3267
  ` ⟳ connection dropped — retrying (attempt ${attempt})…\n`,
3243
3268
  ),
3244
3269
  ),
3270
+ // Stream-stall hint (Claude-Code 2.1.185): the connection is alive but
3271
+ // the API has gone silent mid-response — tell the user we're still
3272
+ // waiting instead of leaving a frozen spinner. stderr so it never
3273
+ // corrupts the streamed answer on stdout.
3274
+ onStall: (ms) =>
3275
+ process.stderr.write(
3276
+ chalk.dim(
3277
+ ` ⏳ waiting for API response (silent ${Math.round(ms / 1000)}s)…\n`,
3278
+ ),
3279
+ ),
3280
+ // Hard inactivity timeout: abort + retry a dead-but-open stream instead
3281
+ // of hanging forever. undefined → agent-core's 180s default (matches cc
3282
+ // chat/ask); config.llm.streamStallTimeoutMs tunes or disables (0).
3283
+ streamStallTimeoutMs: _streamStallTimeoutMs,
3245
3284
  signal: _turnAbort.signal,
3246
3285
  // On an auto-detected image turn, switch to the vision LLM for this
3247
3286
  // turn only (provider/baseUrl/apiKey unchanged, model → vision model).
@@ -183,6 +183,13 @@ export async function startChatRepl(options = {}) {
183
183
  const onUsage = (u) => {
184
184
  capturedUsage = u;
185
185
  };
186
+ // Stall hint (cc agent parity): the connection is alive but the API has
187
+ // gone silent — reassure instead of a frozen cursor. stderr so it never
188
+ // corrupts the streamed answer on stdout.
189
+ const onStall = (ms) =>
190
+ process.stderr.write(
191
+ `\x1b[2m ⏳ waiting for API response (silent ${Math.round(ms / 1000)}s)…\x1b[0m\n`,
192
+ );
186
193
 
187
194
  if (sessionId)
188
195
  appendEvent(sessionId, "user_message", { content: trimmed });
@@ -194,6 +201,7 @@ export async function startChatRepl(options = {}) {
194
201
  baseUrl,
195
202
  onToken,
196
203
  onUsage,
204
+ onStall,
197
205
  );
198
206
  } else if (provider === "anthropic") {
199
207
  const providerDef = BUILT_IN_PROVIDERS.anthropic;
@@ -215,6 +223,7 @@ export async function startChatRepl(options = {}) {
215
223
  key,
216
224
  onToken,
217
225
  onUsage,
226
+ onStall,
218
227
  );
219
228
  } else {
220
229
  // OpenAI-compatible providers (openai, volcengine, deepseek, dashscope, mistral, gemini, anthropic-proxy)
@@ -237,6 +246,7 @@ export async function startChatRepl(options = {}) {
237
246
  key,
238
247
  onToken,
239
248
  onUsage,
249
+ onStall,
240
250
  );
241
251
  }
242
252
 
@@ -24,7 +24,14 @@ function fmtUsd(n) {
24
24
  /** A fresh accumulator: running totals + per provider/model rows. */
25
25
  export function newCostStore() {
26
26
  return {
27
- total: { inputTokens: 0, outputTokens: 0, totalTokens: 0, calls: 0 },
27
+ total: {
28
+ inputTokens: 0,
29
+ outputTokens: 0,
30
+ totalTokens: 0,
31
+ cacheReadTokens: 0,
32
+ cacheCreationTokens: 0,
33
+ calls: 0,
34
+ },
28
35
  byKey: new Map(),
29
36
  };
30
37
  }
@@ -43,10 +50,16 @@ export function addUsage(store, events) {
43
50
  const inT = num(u.input_tokens ?? u.prompt_tokens ?? u.inputTokens);
44
51
  const outT = num(u.output_tokens ?? u.completion_tokens ?? u.outputTokens);
45
52
  const totT = num(u.total_tokens ?? u.totalTokens ?? inT + outT);
46
- if (inT === 0 && outT === 0 && totT === 0) continue;
53
+ // Prompt-cache token counts (Anthropic caching) so /cost prices cached
54
+ // reads/writes correctly; absent on non-caching providers → 0.
55
+ const cR = num(u.cache_read_input_tokens ?? u.cacheReadTokens);
56
+ const cC = num(u.cache_creation_input_tokens ?? u.cacheCreationTokens);
57
+ if (inT === 0 && outT === 0 && totT === 0 && cR === 0 && cC === 0) continue;
47
58
  s.total.inputTokens += inT;
48
59
  s.total.outputTokens += outT;
49
60
  s.total.totalTokens += totT;
61
+ s.total.cacheReadTokens += cR;
62
+ s.total.cacheCreationTokens += cC;
50
63
  s.total.calls += 1;
51
64
  const key = `${ev.provider || "?"}/${ev.model || "?"}`;
52
65
  let row = s.byKey.get(key);
@@ -57,6 +70,8 @@ export function addUsage(store, events) {
57
70
  inputTokens: 0,
58
71
  outputTokens: 0,
59
72
  totalTokens: 0,
73
+ cacheReadTokens: 0,
74
+ cacheCreationTokens: 0,
60
75
  calls: 0,
61
76
  };
62
77
  s.byKey.set(key, row);
@@ -64,6 +79,8 @@ export function addUsage(store, events) {
64
79
  row.inputTokens += inT;
65
80
  row.outputTokens += outT;
66
81
  row.totalTokens += totT;
82
+ row.cacheReadTokens += cR;
83
+ row.cacheCreationTokens += cC;
67
84
  row.calls += 1;
68
85
  }
69
86
  return s;
@@ -172,10 +189,21 @@ export function renderSessionCost(store, { pricingOverrides, roles } = {}) {
172
189
  ` total: ${fmtUsd(result.cost.totalCost)} USD ` +
173
190
  `(${result.total.totalTokens.toLocaleString()} tokens, ${result.total.calls} calls)`,
174
191
  );
192
+ // Cache line only when caching actually happened this session.
193
+ const cacheRead = num(result.total.cacheReadTokens);
194
+ const cacheWrite = num(result.total.cacheCreationTokens);
195
+ if (cacheRead || cacheWrite) {
196
+ lines.push(
197
+ ` cache: ${cacheRead.toLocaleString()} read + ${cacheWrite.toLocaleString()} write tokens`,
198
+ );
199
+ }
175
200
  for (const row of result.byModel) {
176
201
  const provider = (row.provider || "?").padEnd(10);
177
202
  const model = (row.model || "?").padEnd(24);
178
- const tokens = `in=${row.inputTokens} out=${row.outputTokens}`;
203
+ const cacheSuffix = num(row.cacheReadTokens)
204
+ ? ` cache_read=${row.cacheReadTokens}`
205
+ : "";
206
+ const tokens = `in=${row.inputTokens} out=${row.outputTokens}${cacheSuffix}`;
179
207
  const price = row.free
180
208
  ? "free (local)"
181
209
  : row.matched