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.
- package/README.md +1 -1
- package/bin/chainlesschain.js +8 -18
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CiEoV_Hg.js → AIOps-Bo9Ux24z.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DrrjQMuK.js → ActionButton-CExgXSQT.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-ChlhPe9a.js → Analytics-BNnZhRTZ.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-CIkI7d5o.js → AppLayout-D9xfqFCT.js} +4 -4
- package/src/assets/web-panel/assets/{Audit-_sY9bNSN.js → Audit-Cpgu8uCw.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DvzaThN8.js → Backup-CHdEJnNE.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DDZW_DU8.js → BaseInput-Cbw-PxBq.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DqErkog2.js → Chat-ChHTZK_6.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BcnNHS-r.js → ChatBubbleRenderer-Dl6z6ZH7.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-NWDuyRK6.js → Checkbox-Cj8d9bru.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B_jnSC8a.js → Codegen-C2YobW4j.js} +1 -1
- package/src/assets/web-panel/assets/{Col-B-uyUy0z.js → Col-CxfV5FGT.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Dmf1MpG7.js → Community-CiwOASMj.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-fGI68M5y.js → Compact-CTg_2iKW.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-PV9qT-iV.js → Compliance-HMbsTmtw.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BM6BvCgv.js → Cowork-DyNDqGR2.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BsSWwFFo.js → Cron-9-x5M7qy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DUdPVYvS.js → Crosschain-4msgDaYJ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-PPLLhrJs.js → DID--2Beb5Po.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Cn_Xjj80.js → Dashboard-T6nq0Lzs.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DkTXjy5D.js → Dropdown-D_Q6T10v.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BnA27cjB.js → EmailListRenderer-TnN21bJx.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-jqrv5VCp.js → FamilyGuardDashboard-kky_uIij.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DESwXwtR.js → Federation-C1GkNY4B.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C9gbyY1r.js → FormItemContext-5-_Fc5YV.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CkZB9crH.js → GenericCardRenderer-CmHiB7sr.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B6niu0W9.js → Git-Cuci_BPI.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BrF28dEi.js → Governance-BU0cO2LD.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CZDnV8SN.js → Inference-BDFNgEcx.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-eqZ0hP0l.js → KnowledgeGraph-DITXUzHz.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BlHS7DoS.js → Logs-Ea-07CRd.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-NOp9G83e.js → Marketplace-D6OBbRVG.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-B6wMx173.js → McpTools-eiKpIJMi.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BKVeTAeT.js → Memory-M-X-T8UF.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Da2y6iYW.js → MobileBridge-xcZb9Ekv.js} +2 -2
- package/src/assets/web-panel/assets/MobileProjects-DCfoTPRC.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B7Hy5rAT.js → Mtc-BWfGDzD8.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BgBoX0XI.js → MtcAudit-imBuld-U.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Db7bwi5J.js → Multisig-C2kcsq7I.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-f9ca2vst.js → NLProgramming-DObvXSXP.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-meVqoOMz.js → Notes-C-6OGJMe.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BfEhBXNo.js → NotificationSettings-ub7Ozxci.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-e25Q6ALJ.js → OrderTableRenderer-CR2W89Vk.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BpgOG9lj.js → Organization-DNA_Wty7.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-fI3L05Rq.js → Overflow-rT4Wb4rQ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-wD0wpJJY.js → P2P-CK-hARKv.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BWV9J4VZ.js → PdhVaultBrowser-C2pbtNbT.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BJH7W2iv.js → Permissions-B8EIEqGJ.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CqQ3XpMz.js → PersonalDataHub-BxNVNU3s.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-CHyXCU1i.js → Pipeline-CT9pbkyY.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CJtfNlc7.js → Privacy-DhCNd2CS.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CKOaHFGR.js → ProjectInit-Qngnx-vQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-QD8wp_EM.js → ProjectSettings-Dfn-nQc1.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BKdiSaPR.js +1 -0
- package/src/assets/web-panel/assets/{Providers-BPESqCEg.js → Providers-4o9B_n-X.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-C5AzvvRo.js → QuickAsk-bs1qvF30.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-cGpF3tsA.js → Recommend-CuEnKA2K.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-Duaxvbt9.js → Reputation-DbfvmRb2.js} +1 -1
- package/src/assets/web-panel/assets/{Row-xsUwB5Ay.js → Row-DvMJGAI3.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DmUUsqaF.js → RssFeed-oJ0BZvmA.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Do9YuDbX.js → Search-DnIVrY9O.js} +1 -1
- package/src/assets/web-panel/assets/{Security-06BgEn-d.js → Security-CIWhI_Tc.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DyaCes7r.js → Services-DLrnpjwm.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Cj_VbkFG.js → Skeleton-CYmqgtVb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DCOWMJOR.js → Skills-BUzCkoeu.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-C44_86bu.js → Sla-DYRE4bnS.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BXhBJSMB.js → SpeechSettings-_6MurdOg.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BpHsaNWg.js → SyncSettings-UIdnF5Li.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-COx2CjT8.js +1 -0
- package/src/assets/web-panel/assets/{Templates-aEWbCOdo.js → Templates-BcHAmkZo.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DkOLw1Yz.js → Tenant-CjYQS8yZ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-5Z4paIoh.js → Terminal-BmfOPcWt.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CYhublOm.js → TimelineRenderer-D5HuarNQ.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-h57dBT4T.js → Tokens-C_fbProA.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-abE21FpD.js → Trigger-JPulpRx8.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-urB3VZip.js → Trust-CnO-062O.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D6uXV9pp.js → UkeySign-HpNovvau.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C9MxXAzw.js → VideoEditing-yMncxH7y.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DTn5rW4u.js → Wallet-Cug-t7Np.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-BNYEqeqr.js → WebAuthn--U1-NR-3.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-CsRoOJPT.js → WorkflowEditor-R-XvSJ3S.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B5GoUHDS.js → chat-CCI1i6Rp.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BF_Rqaab.js → colors-C-mqoaLt.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BNPfqT4P.js → compact-item-De_N2iRR.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C3qLKXX-.js → createContext-DbTM6sjZ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-OcLPHSl5.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BLpAeFXB.js → hasIn-D0Adylyc.js} +1 -1
- package/src/assets/web-panel/assets/index-7E_mHkDU.js +1 -0
- package/src/assets/web-panel/assets/{index-BOoTjHGU.js → index-AY937BxS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cv1WRH-j.js → index-B6hgy5VC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2wJowV1.js → index-B7XnpLHk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dj6rUk3f.js → index-B7gw-tDm.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dz7o1Zt6.js → index-BBgDgkwW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMRdeB2r.js → index-BMmeiw88.js} +1 -1
- package/src/assets/web-panel/assets/{index-2-7AD4Fq.js → index-BU6XtnSx.js} +1 -1
- package/src/assets/web-panel/assets/{index-7Tt41tHa.js → index-Bi7VUG0R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaROOJ5Z.js → index-BtE3cw9m.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmrPbYXh.js → index-C9ej-MF0.js} +3 -3
- package/src/assets/web-panel/assets/{index-CgIrRLBP.js → index-CIEiQl1j.js} +1 -1
- package/src/assets/web-panel/assets/{index-DudglWTC.js → index-CKgaW9E5.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8B3rHnr.js → index-CY0KKR5f.js} +1 -1
- package/src/assets/web-panel/assets/index-CbV3-WlB.js +1 -0
- package/src/assets/web-panel/assets/{index-ixN0R0We.js → index-Co1UkcFX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cqb8TXEp.js → index-CzP5d5LW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DH95hKUN.js → index-D0NJ5lRi.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6yRwT6e.js → index-D0gBsqTX.js} +1 -1
- package/src/assets/web-panel/assets/{index-o1doEeT3.js → index-D5F6shtn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxWEK9FS.js → index-DVtamtlm.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cxd2RsZR.js → index-DWT18hDG.js} +1 -1
- package/src/assets/web-panel/assets/{index-vXHPZOmO.js → index-DaXb4B9P.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJsVUj80.js → index-DjQA0Vez.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIjPwa7h.js → index-Ds8NJVEL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMKiwMJa.js → index-DuP-8HWu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIpGZeh2.js → index-DwLTiJ31.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dn95Blhx.js → index-T3VhH8cO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqjU6Jp9.js → index-TDY1o0w3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBFekqcY.js → index-TRy2Gc3V.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-PNuV4r.js → index-W1OMxCmI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlEDjdTc.js → index-ftFRZbuc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMKbLaTg.js → index-iGPGaORA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYWExa2Z.js → index-jhy5KQvg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BryugSCS.js → index-qUSZJcgw.js} +1 -1
- package/src/assets/web-panel/assets/{index-81hgV6U6.js → index-w3f6lqkD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmBMP52w.js → index-xdMc71Kh.js} +1 -1
- package/src/assets/web-panel/assets/{index-KUdyAwqr.js → index-xhX5eg2Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGVf-eOG.js → index-zkTiW6d6.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Dhfx-jOJ.js → initDefaultProps-CIHqouWk.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DzZPc4Mq.js → motion-D1iUKftk.js} +1 -1
- package/src/assets/web-panel/assets/{move-D6R8EIjz.js → move-YOpWjmjL.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CPniUUR1.js → omit-C_1357UY.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DbzxHNNa.js → pickAttrs-CDb4dq6o.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B_MxmwXz.js → placementArrow-D-OGYyhd.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Em-jKJ7U.js → responsiveObserve-hS-j69A0.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B2RV1mQl.js → slide-tnjuvphU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C9Ps6HQe.js → statusUtils-BERfMMcU.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DCoehh1S.js → styleChecker-DKpl2K9E.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DZOaLVto.js → useFlexGapSupport-C_sX4D3N.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Dk_JA91R.js → useFs-DBcxC1vK.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CJR6Dqtz.js → usePersonalDataHub-CeoDf2XI.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BaFNaDQL.js → vnode-DC9Pmj_u.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CxA9IYpM.js → zoom-CZA58J7M.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/activitypub.js +19 -3
- package/src/commands/agent.js +25 -0
- package/src/commands/ask.js +13 -0
- package/src/commands/config.js +17 -1
- package/src/commands/cost.js +6 -1
- package/src/commands/dao.js +16 -3
- package/src/commands/dlp.js +7 -1
- package/src/commands/hub.js +13 -0
- package/src/commands/mtc.js +37 -1
- package/src/commands/pdh.js +162 -0
- package/src/gateways/discord/discord-formatter.js +18 -1
- package/src/gateways/telegram/telegram-formatter.js +6 -3
- package/src/gateways/ws/ws-server.js +19 -1
- package/src/harness/mcp-client.js +19 -2
- package/src/harness/plugin-manager.js +20 -0
- package/src/harness/worktree-isolator.js +17 -1
- package/src/index.js +2 -0
- package/src/lib/__tests__/model-deprecation.test.js +194 -0
- package/src/lib/a2a-protocol.js +23 -9
- package/src/lib/agent-core.js +2 -5
- package/src/lib/audit-mtc.js +40 -2
- package/src/lib/chat-core.js +141 -18
- package/src/lib/claude-code-bridge.js +14 -2
- package/src/lib/cli-anything-bridge.js +5 -0
- package/src/lib/cli-numeric.js +38 -0
- package/src/lib/config-manager.js +37 -6
- package/src/lib/cowork/ab-comparator-cli.js +6 -2
- package/src/lib/cowork-cron.js +45 -34
- package/src/lib/cowork-learning.js +31 -1
- package/src/lib/cowork-share.js +39 -3
- package/src/lib/cowork-template-marketplace.js +54 -2
- package/src/lib/cowork-workflow.js +33 -6
- package/src/lib/cross-chain-mtc.js +41 -12
- package/src/lib/crypto-manager.js +12 -2
- package/src/lib/dbevo.js +19 -8
- package/src/lib/downloader.js +24 -9
- package/src/lib/evomap-governance.js +4 -4
- package/src/lib/evomap-manager.js +54 -7
- package/src/lib/fatal-handler.js +48 -0
- package/src/lib/file-checkpoint.js +56 -4
- package/src/lib/git-integration.js +28 -0
- package/src/lib/goal-store.js +36 -10
- package/src/lib/hierarchical-memory.js +6 -0
- package/src/lib/llm-pricing.js +52 -2
- package/src/lib/mcp-oauth.js +37 -7
- package/src/lib/memory-manager.js +23 -2
- package/src/lib/model-deprecation.js +249 -0
- package/src/lib/pdh-feedback-ledger.js +131 -0
- package/src/lib/permanent-memory.js +30 -2
- package/src/lib/permission-rules.cjs +11 -3
- package/src/lib/personal-data-hub-aichat-wizard.js +33 -3
- package/src/lib/personal-data-hub-wiring.js +36 -13
- package/src/lib/project-instructions.js +10 -4
- package/src/lib/runnable-provider.js +62 -31
- package/src/lib/session-tail.js +6 -1
- package/src/lib/session-usage.js +34 -1
- package/src/lib/skill-loader.js +4 -1
- package/src/lib/skill-packs/generator.js +25 -2
- package/src/lib/stream-retry.js +56 -0
- package/src/lib/sync-credentials.js +53 -17
- package/src/lib/token-tracker.js +12 -2
- package/src/lib/with-file-lock.js +87 -0
- package/src/repl/agent-repl.js +52 -13
- package/src/repl/chat-repl.js +10 -0
- package/src/repl/session-cost.js +31 -3
- package/src/runtime/agent-core.js +474 -53
- package/src/runtime/coding-agent-contract-shared.cjs +58 -1
- package/src/runtime/coding-agent-policy.cjs +10 -0
- package/src/runtime/file-ref-expander.js +29 -1
- package/src/runtime/headless-runner.js +51 -6
- package/src/runtime/headless-stream.js +219 -2
- package/src/skills/video-editing/tools/commit.js +15 -1
- package/src/assets/web-panel/assets/MobileProjects-CTFPhn4A.js +0 -1
- package/src/assets/web-panel/assets/Projects-Dj33CO-H.js +0 -1
- package/src/assets/web-panel/assets/Tasks-C83eyBn8.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D5Rwbl_Y.js +0 -1
- package/src/assets/web-panel/assets/index-7ls1Z3dH.js +0 -1
- package/src/assets/web-panel/assets/index-DoldiBPq.js +0 -1
package/src/repl/agent-repl.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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).
|
package/src/repl/chat-repl.js
CHANGED
|
@@ -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
|
|
package/src/repl/session-cost.js
CHANGED
|
@@ -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: {
|
|
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
|
-
|
|
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
|
|
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
|