chainlesschain 0.162.124 → 0.162.126
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/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-BrTOcqIJ.js +1 -0
- package/src/assets/web-panel/assets/{ActionButton-COjZZKWG.js → ActionButton-na9cocmf.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-4ZDZE7lc.js → Analytics-BtDygkpt.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CYH5k2Rp.js → AppLayout-D_t5CS18.js} +5 -5
- package/src/assets/web-panel/assets/Audit-BYMZccCy.js +1 -0
- package/src/assets/web-panel/assets/{Backup-CiX61Qc2.js → Backup-D2qDfAdL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CDxIQokd.js → BaseInput-kj456Ju9.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CaKgdRab.js → Chat-BY0A0ZLE.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D1VvrOPQ.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CjiWfu4s.js → Checkbox-DiBhtXsh.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-B1ER0L0j.js +1 -0
- package/src/assets/web-panel/assets/{Col-ZKWREyNs.js → Col-CjLmza7D.js} +1 -1
- package/src/assets/web-panel/assets/Community-BNId05U7.js +1 -0
- package/src/assets/web-panel/assets/{Compact-DqknM98n.js → Compact-BuuMj7K1.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-DUuDycaJ.js +1 -0
- package/src/assets/web-panel/assets/{Cowork-Dp29kHsC.js → Cowork-BKHiF6uL.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-zmEJAetz.js → Cron-C7p-lHnC.js} +2 -2
- package/src/assets/web-panel/assets/Crosschain-BvSOx8a6.js +1 -0
- package/src/assets/web-panel/assets/{DID-D_UFNzJ5.js → DID-D1k9jgHv.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-B9mCCnqY.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-CH7l3KCs.js → Dropdown-ge9UHSXF.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bud2M3XX.js → EmailListRenderer-TZO7ppXi.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bd2_8uME.js → FamilyGuardDashboard-DkhLJmzx.js} +1 -1
- package/src/assets/web-panel/assets/Federation-JLuA_8zp.js +1 -0
- package/src/assets/web-panel/assets/{FormItemContext-CpSH464Y.js → FormItemContext-C4w-rzNg.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CANo8O-y.js → GenericCardRenderer-Btns4sV9.js} +1 -1
- package/src/assets/web-panel/assets/{Git-hvuZVoD3.js → Git-BheXMjzC.js} +2 -2
- package/src/assets/web-panel/assets/Governance-D9rLlatH.js +1 -0
- package/src/assets/web-panel/assets/Inference-DiklIMcd.js +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-C70EWL03.js +1 -0
- package/src/assets/web-panel/assets/{Logs-DDkTnedu.js → Logs-Zt_MLI10.js} +2 -2
- package/src/assets/web-panel/assets/Marketplace-suQxES99.js +1 -0
- package/src/assets/web-panel/assets/{McpTools-Qx78XyOT.js → McpTools-CclpCDpY.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CXYDO1oT.js → Memory-B2lHOUwF.js} +2 -2
- package/src/assets/web-panel/assets/MobileBridge-BMXKoDAD.js +1 -0
- package/src/assets/web-panel/assets/{MobileProjects-DEDbWNIk.js → MobileProjects-a6mWVdBV.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Dwa_vlR8.js → Mtc-BFpM4Fkj.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DAVkxhJv.js → MtcAudit-DDQkxkbS.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-C3upmgPN.js → Multisig-Crkd_zKQ.js} +3 -3
- package/src/assets/web-panel/assets/NLProgramming-Dpk5An7B.js +1 -0
- package/src/assets/web-panel/assets/{Notes-B1Oy3FbC.js → Notes-BrFnOMNz.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Bs4-Fc6b.js → NotificationSettings-CM0iApFM.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CEy1pIeq.js → OrderTableRenderer-XXjeqkdz.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D4cJ1UNo.js → Organization-CHFW_38T.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-fdzvlF7x.js → Overflow-C-vl3EjV.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Y13PwXBA.js → P2P-BT7Slavq.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Ck1zCLe6.js → PdhVaultBrowser-DRUaULap.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CvEXP6LC.js → Permissions-DkhOAvMz.js} +2 -2
- package/src/assets/web-panel/assets/{PersonalDataHub-JeP7IWMW.js → PersonalDataHub-Dl7dSOvV.js} +3 -3
- package/src/assets/web-panel/assets/Pipeline-B3nVI4p6.js +1 -0
- package/src/assets/web-panel/assets/Privacy-Dv1SXx1Q.js +1 -0
- package/src/assets/web-panel/assets/{ProjectInit-DeWd9UcS.js → ProjectInit-DrAhVi5p.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DUpVuU9F.js → ProjectSettings-h-ggCYN_.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CM91hYdr.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DECW00ek.js → Providers-rfkZel3N.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Dl-pK9Io.js → QuickAsk-XepZB7h_.js} +1 -1
- package/src/assets/web-panel/assets/Recommend-DzQWsh1a.js +1 -0
- package/src/assets/web-panel/assets/Reputation-CDeaal0j.js +1 -0
- package/src/assets/web-panel/assets/Row-BN4aKhFH.js +1 -0
- package/src/assets/web-panel/assets/{RssFeed-iyQT5q9l.js → RssFeed-INP6VYAA.js} +3 -3
- package/src/assets/web-panel/assets/Search-ChPbwatu.js +1 -0
- package/src/assets/web-panel/assets/{Security-c4Jxf5Ih.js → Security-C97ZCY8N.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CRuisolj.js → Services-Cbtl2Ajs.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CCnzJkb-.js → Skeleton-B13sFxBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CZURCwZg.js → Skills-vI9zSIKX.js} +1 -1
- package/src/assets/web-panel/assets/Sla-Cr3oBH39.js +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-BwemqPPV.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CJWVtd87.js → SyncSettings-CLA78P-Z.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-61lrQ_lS.js → Tasks-DBjQ_DOM.js} +1 -1
- package/src/assets/web-panel/assets/Templates-BkSLDkBs.js +1 -0
- package/src/assets/web-panel/assets/Tenant-Dn0nSlib.js +1 -0
- package/src/assets/web-panel/assets/{Terminal-CP15hcNS.js → Terminal-C8f4boru.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Sl5uXrkN.js → TimelineRenderer-DW_rMtJR.js} +1 -1
- package/src/assets/web-panel/assets/Tokens-BdffrKYV.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-BLCQEOF2.js → Trigger-CX4CUg-Q.js} +1 -1
- package/src/assets/web-panel/assets/Trust-Cq9Bl7Od.js +1 -0
- package/src/assets/web-panel/assets/{UkeySign-Dwp0zXQ6.js → UkeySign-BQy18_VY.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CIHA55Sx.js → VideoEditing-h5hzK7Vw.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Hjajvnto.js → Wallet-BLotT3gw.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DqSURUvI.js → WebAuthn-8cCANYLE.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B5bHRwUG.js → WorkflowEditor-Db6NwtAv.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DsheLKkG.js → chat-BPk1LbpL.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CST2UkgL.js → colors-BnNal71p.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-yqEoy1L7.js → compact-item-W2VC0tcy.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Jwp78HFY.js → createContext-DceVsgnZ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning--rwFDBhx.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CVS5mFEP.js → hasIn-BEq6EDcp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLTUVd0V.js → index-5gIBUFBn.js} +2 -2
- package/src/assets/web-panel/assets/index-APCHxOkM.js +3 -0
- package/src/assets/web-panel/assets/index-B2dMhwZi.js +1 -0
- package/src/assets/web-panel/assets/{index-C0FZScMe.js → index-B8cPjrEH.js} +4 -4
- package/src/assets/web-panel/assets/{index-CjfN2CpJ.js → index-BDC5HsxZ.js} +1 -1
- package/src/assets/web-panel/assets/index-BPFuPGKi.js +1 -0
- package/src/assets/web-panel/assets/{index-SjxCCf5h.js → index-BUkDcIwJ.js} +2 -2
- package/src/assets/web-panel/assets/{index-Cjig5i3a.js → index-BWcCyH6-.js} +28 -26
- package/src/assets/web-panel/assets/{index-AnW25bEq.js → index-BgZikQoh.js} +1 -1
- package/src/assets/web-panel/assets/index-Bwjus13Y.js +1 -0
- package/src/assets/web-panel/assets/index-BzSzRWsw.js +55 -0
- package/src/assets/web-panel/assets/index-C1K9CsGr.js +1 -0
- package/src/assets/web-panel/assets/{index-DDAigsel.js → index-CBZVISK6.js} +2 -2
- package/src/assets/web-panel/assets/index-CEJN-R2L.js +1 -0
- package/src/assets/web-panel/assets/index-CG5dGC9E.js +1 -0
- package/src/assets/web-panel/assets/{index-DxaU_lza.js → index-CMGLpstm.js} +1 -1
- package/src/assets/web-panel/assets/index-CWrGCndd.js +1 -0
- package/src/assets/web-panel/assets/index-CbcvfpCV.js +1 -0
- package/src/assets/web-panel/assets/{index-De600Jjm.js → index-Ceqv4lI2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy0dNzkp.js → index-CsT6frT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDAPnZUs.js → index-D8PQKsDT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk4KWLW.js → index-DGncdA-j.js} +1 -1
- package/src/assets/web-panel/assets/{index-R-VGFpi6.js → index-DHanQHO0.js} +3 -3
- package/src/assets/web-panel/assets/index-DaUBk28E.js +12 -0
- package/src/assets/web-panel/assets/{index-BzetOasL.js → index-Di2J4b4V.js} +1 -1
- package/src/assets/web-panel/assets/index-DtuLvWZN.js +21 -0
- package/src/assets/web-panel/assets/{index-Dgyn8-wN.js → index-DvS1J8xc.js} +2 -2
- package/src/assets/web-panel/assets/{index-CtyEOGuj.js → index-DxePJdwP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzsKK0tQ.js → index-Et4XvL49.js} +2 -2
- package/src/assets/web-panel/assets/{index-BuI27WSx.js → index-GlFxgcj4.js} +2 -2
- package/src/assets/web-panel/assets/index-HV119Oui.js +1 -0
- package/src/assets/web-panel/assets/index-InGW87pj.js +13 -0
- package/src/assets/web-panel/assets/{index-Dxljh9Fu.js → index-P1-s8JR7.js} +2 -2
- package/src/assets/web-panel/assets/{index-CSBPc-sI.js → index-SdABCNoi.js} +2 -2
- package/src/assets/web-panel/assets/{index-BCHAUdel.js → index-WTAZbN-c.js} +1 -1
- package/src/assets/web-panel/assets/index-_2I-KzOj.js +1 -0
- package/src/assets/web-panel/assets/index-m1sVaWVU.js +1 -0
- package/src/assets/web-panel/assets/index-s37wwyeN.js +1 -0
- package/src/assets/web-panel/assets/{index-CRBbVS43.js → index-tyWABqp9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-ClAjrsQ-.js → initDefaultProps-DzrCDb3j.js} +1 -1
- package/src/assets/web-panel/assets/motion-BQERVnE3.js +11 -0
- package/src/assets/web-panel/assets/{move-DMelzIW-.js → move-I9ACA5XJ.js} +1 -1
- package/src/assets/web-panel/assets/mtc-parser-Dd2Pw-tr.js +1 -0
- package/src/assets/web-panel/assets/{omit-oxecfU3b.js → omit-DwzYRzWV.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DJ5F5M6x.js → pickAttrs-BSGULyIL.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DdbKsant.js → placementArrow-tSYYjAts.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BUuM5cmS.js → responsiveObserve-Dy2lqikT.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DSV0ccvR.js → slide-RaB4Uq0c.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B-6oLAXf.js → statusUtils-CBpC_wZg.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DdCAHtsZ.js → styleChecker-BEKwPWt5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-ZORkcoZd.js → useFlexGapSupport-C4CnYJH1.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BFp46LoP.js → useFs-n24jutw5.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-H7rxgbdW.js → usePersonalDataHub-DMgS8F6G.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-eIq4Tk0J.js → vnode-BSp2KYcj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CTNrv8-H.js → zoom-7UfQtTPh.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +51 -2
- package/src/commands/compliance.js +3 -1
- package/src/commands/ide.js +60 -5
- package/src/commands/incentive.js +22 -22
- package/src/commands/mtc.js +5 -1
- package/src/commands/review.js +47 -17
- package/src/commands/session.js +11 -2
- package/src/gateways/ws/message-dispatcher.js +149 -166
- package/src/gateways/ws/ws-session-gateway.js +95 -9
- package/src/harness/background-task-manager.js +5 -1
- package/src/harness/jsonl-session-store.js +90 -12
- package/src/harness/mcp-client.js +62 -21
- package/src/harness/prompt-compressor.js +24 -5
- package/src/harness/worktree-isolator.js +10 -1
- package/src/lib/agent-core.js +2 -0
- package/src/lib/audit-logger.js +3 -1
- package/src/lib/autonomous-agent.js +29 -0
- package/src/lib/chat-core.js +5 -2
- package/src/lib/chat-intent-service.js +82 -23
- package/src/lib/checkpoint-store.js +31 -4
- package/src/lib/claude-code-bridge.js +48 -3
- package/src/lib/config-manager.js +25 -1
- package/src/lib/cost-budget.js +13 -2
- package/src/lib/credential-guard.js +81 -1
- package/src/lib/git-integration.js +16 -2
- package/src/lib/goal-store.js +11 -0
- package/src/lib/hook-manager.js +4 -0
- package/src/lib/interaction-adapter.js +32 -11
- package/src/lib/jetbrains-bridge.js +147 -0
- package/src/lib/jsonl-session-store.js +2 -0
- package/src/lib/llm-config-defaults.js +37 -0
- package/src/lib/llm-pricing.js +11 -4
- package/src/lib/llm-providers.js +11 -1
- package/src/lib/mcp-oauth.js +88 -10
- package/src/lib/mcp-serve.js +29 -0
- package/src/lib/orchestrator.js +38 -2
- package/src/lib/permission-engine.js +4 -1
- package/src/lib/pipeline-orchestrator.js +20 -2
- package/src/lib/project-instructions.js +13 -0
- package/src/lib/repl-bang-memorize.js +9 -1
- package/src/lib/repl-denials.js +137 -0
- package/src/lib/runnable-provider.js +7 -1
- package/src/lib/safe-json.js +22 -0
- package/src/lib/sandbox-v2.js +7 -6
- package/src/lib/search-command.js +65 -0
- package/src/lib/session-insights.js +13 -6
- package/src/lib/session-usage.js +21 -3
- package/src/lib/settings-hooks.cjs +133 -0
- package/src/lib/settings-loader.cjs +16 -7
- package/src/lib/social-graph.js +3 -1
- package/src/lib/status-line.cjs +4 -1
- package/src/lib/stream-retry.js +27 -0
- package/src/lib/sub-agent-context.js +9 -0
- package/src/lib/turn-context.js +15 -5
- package/src/repl/agent-repl.js +110 -8
- package/src/runtime/__tests__/message-roles.test.js +36 -3
- package/src/runtime/agent-core.js +179 -52
- package/src/runtime/coding-agent-contract-shared.cjs +9 -2
- package/src/runtime/coding-agent-shell-policy.cjs +23 -2
- package/src/runtime/file-ref-expander.js +51 -7
- package/src/runtime/headless-runner.js +96 -2
- package/src/runtime/headless-stream.js +78 -3
- package/src/runtime/mcp-config.js +114 -4
- package/src/runtime/message-roles.js +14 -1
- package/src/runtime/pipe-safety.js +51 -0
- package/src/runtime/policies/agent-policy.js +3 -0
- package/src/assets/web-panel/assets/AIOps-BsDJlD_l.js +0 -1
- package/src/assets/web-panel/assets/Audit-BKlFbLdl.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DgvpwU5o.js +0 -1
- package/src/assets/web-panel/assets/Codegen-tKWGzajw.js +0 -1
- package/src/assets/web-panel/assets/Community-CmLuPBUU.js +0 -1
- package/src/assets/web-panel/assets/Compliance-PZw0aBLI.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-Sb-uM7Ty.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-Btag698v.js +0 -3
- package/src/assets/web-panel/assets/Federation-1jhstF5P.js +0 -1
- package/src/assets/web-panel/assets/Governance-BQrWksKt.js +0 -1
- package/src/assets/web-panel/assets/Inference-jEBTp12v.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-tDiV2taf.js +0 -1
- package/src/assets/web-panel/assets/Marketplace-9Yi32avt.js +0 -1
- package/src/assets/web-panel/assets/MobileBridge-MfUfkHA0.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-DO3CZ0_z.js +0 -1
- package/src/assets/web-panel/assets/Pipeline-BZ7wRzG1.js +0 -1
- package/src/assets/web-panel/assets/Privacy-BJ6qj9Hv.js +0 -1
- package/src/assets/web-panel/assets/Projects-y1WbI337.js +0 -1
- package/src/assets/web-panel/assets/Recommend-Bju04wTd.js +0 -1
- package/src/assets/web-panel/assets/Reputation-BUPa3nEk.js +0 -1
- package/src/assets/web-panel/assets/Row-WYqqaq_5.js +0 -1
- package/src/assets/web-panel/assets/Search-CrfwJF0R.js +0 -1
- package/src/assets/web-panel/assets/Sla-CrMzaEi2.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-jTDOM5eY.js +0 -1
- package/src/assets/web-panel/assets/Templates-Cg-iF2g1.js +0 -1
- package/src/assets/web-panel/assets/Tenant-DrDv1FFc.js +0 -1
- package/src/assets/web-panel/assets/Tokens-yRIZTVsR.js +0 -1
- package/src/assets/web-panel/assets/Trust-D5xq8z6s.js +0 -1
- package/src/assets/web-panel/assets/community-parser-Cuyslaku.js +0 -3
- package/src/assets/web-panel/assets/devWarning-C8to6gQk.js +0 -1
- package/src/assets/web-panel/assets/index-BeblNJDH.js +0 -1
- package/src/assets/web-panel/assets/index-C130LLPq.js +0 -1
- package/src/assets/web-panel/assets/index-C8rq85gu.js +0 -1
- package/src/assets/web-panel/assets/index-CIE2n8k_.js +0 -1
- package/src/assets/web-panel/assets/index-CTd3lDxp.js +0 -13
- package/src/assets/web-panel/assets/index-CUWj5L2s.js +0 -1
- package/src/assets/web-panel/assets/index-ChRL6rgA.js +0 -3
- package/src/assets/web-panel/assets/index-CrlRa054.js +0 -1
- package/src/assets/web-panel/assets/index-Cu6Ql64n.js +0 -1
- package/src/assets/web-panel/assets/index-Cx_t5rWw.js +0 -12
- package/src/assets/web-panel/assets/index-DZfnYE6e.js +0 -1
- package/src/assets/web-panel/assets/index-D_1b7uh6.js +0 -55
- package/src/assets/web-panel/assets/index-D_e9gwfn.js +0 -1
- package/src/assets/web-panel/assets/index-DbxAlpPC.js +0 -21
- package/src/assets/web-panel/assets/index-DiK4vSZa.js +0 -1
- package/src/assets/web-panel/assets/index-DpYn5v2k.js +0 -1
- package/src/assets/web-panel/assets/index-diWkx2Wq.js +0 -1
- package/src/assets/web-panel/assets/motion-BalXv_60.js +0 -11
- package/src/assets/web-panel/assets/mtc-parser-CEQffxds.js +0 -1
package/src/repl/agent-repl.js
CHANGED
|
@@ -29,6 +29,11 @@ import {
|
|
|
29
29
|
analyzeContinuation,
|
|
30
30
|
joinContinuation,
|
|
31
31
|
} from "../lib/repl-multiline.js";
|
|
32
|
+
import {
|
|
33
|
+
classifyDenial,
|
|
34
|
+
recordDenial,
|
|
35
|
+
formatDenials,
|
|
36
|
+
} from "../lib/repl-denials.js";
|
|
32
37
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
33
38
|
import {
|
|
34
39
|
createSession,
|
|
@@ -84,6 +89,7 @@ import { formatBackgroundTasks } from "./tasks-status.js";
|
|
|
84
89
|
import { expandFileRefsAsync } from "../runtime/file-ref-expander.js";
|
|
85
90
|
import { prepareVisionTurn } from "../lib/image-input.js";
|
|
86
91
|
import { composeSystemPrompt } from "../runtime/system-prompt.js";
|
|
92
|
+
import { installPipeSafety } from "../runtime/pipe-safety.js";
|
|
87
93
|
import {
|
|
88
94
|
makeFallbackChatFn,
|
|
89
95
|
normalizeFallbackModels,
|
|
@@ -117,6 +123,14 @@ let _settingsHooks = null;
|
|
|
117
123
|
// `!command` auto-triggers an assistant response to its output. undefined =
|
|
118
124
|
// unset → defaults OFF (opt-in) in shouldRespondToBashCommands.
|
|
119
125
|
let _respondToBash;
|
|
126
|
+
// .claude/settings.json `autoMode.classifyAllShell` (Claude-Code 2.1.193): route
|
|
127
|
+
// the built-in verification allowlist through the shell-policy classifier (→
|
|
128
|
+
// ApprovalGate confirm) instead of fast-pathing it. false = unset → off.
|
|
129
|
+
let _classifyAllShell = false;
|
|
130
|
+
// Bounded log of tool calls the agent was BLOCKED from running this session
|
|
131
|
+
// (shell-policy / ApprovalGate / settings rule / hook). Surfaced by
|
|
132
|
+
// `/permissions denials` (Claude-Code 2.1.193 "recent denials"). In-memory only.
|
|
133
|
+
const _recentDenials = [];
|
|
120
134
|
|
|
121
135
|
/**
|
|
122
136
|
* Fire settings.json Notification hooks (observe-only) — the agent needs the
|
|
@@ -179,13 +193,17 @@ async function executeTool(name, args) {
|
|
|
179
193
|
permissionRules: _permissionRules,
|
|
180
194
|
permissionConfirm: _permissionConfirm,
|
|
181
195
|
settingsHooks: _settingsHooks,
|
|
196
|
+
classifyAllShell: _classifyAllShell,
|
|
182
197
|
});
|
|
183
198
|
}
|
|
184
199
|
|
|
185
200
|
/**
|
|
186
201
|
* Agentic loop — wraps agent-core's async generator with REPL display output.
|
|
202
|
+
* Exported so its event-translation contract (checkpoint-mark accuracy for
|
|
203
|
+
* `/rewind`, content/usage extraction, forced-off in-loop compaction) is
|
|
204
|
+
* unit-testable via the `options._coreLoop` injection seam.
|
|
187
205
|
*/
|
|
188
|
-
async function agentLoop(messages, options) {
|
|
206
|
+
export async function agentLoop(messages, options) {
|
|
189
207
|
// Resume-degenerate role merge (Claude Code 2.1.187 parity), gated by the
|
|
190
208
|
// one-shot `mergeRoles` flag so it fires only on the first model call after
|
|
191
209
|
// resuming a session whose prior run produced no assistant response. Collapse
|
|
@@ -211,12 +229,19 @@ async function agentLoop(messages, options) {
|
|
|
211
229
|
`\n ⚠️ ${info.message || `已从 "${info.from}" 切换到 "${info.to}"`}\n`,
|
|
212
230
|
),
|
|
213
231
|
));
|
|
214
|
-
//
|
|
215
|
-
//
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
232
|
+
// `_coreLoop` is an injectable seam (defaults to agent-core's loop) so the
|
|
233
|
+
// wrapper's event translation can be unit-tested without a live model.
|
|
234
|
+
const runCoreLoop = options._coreLoop || coreAgentLoop;
|
|
235
|
+
// The tool-result event carries no args; remember the last tool-executing
|
|
236
|
+
// pair so a recorded denial can show what was attempted (/permissions denials).
|
|
237
|
+
let _lastExec = null;
|
|
238
|
+
for await (const event of runCoreLoop(messages, {
|
|
219
239
|
...options,
|
|
240
|
+
// FORCE in-loop compaction off — the REPL runs its OWN post-turn compaction
|
|
241
|
+
// (with metrics + persisted compact events), so letting agent-core compact
|
|
242
|
+
// too would trim the same history twice. Placed AFTER the spread so a
|
|
243
|
+
// caller's options.autoCompact can never silently re-enable the double pass.
|
|
244
|
+
autoCompact: false,
|
|
220
245
|
onProviderFallback,
|
|
221
246
|
})) {
|
|
222
247
|
if (event.type === "checkpoint") {
|
|
@@ -235,6 +260,7 @@ async function agentLoop(messages, options) {
|
|
|
235
260
|
chalk.gray(` ⎌ checkpoint ${event.id} (before ${event.tool})\n`),
|
|
236
261
|
);
|
|
237
262
|
} else if (event.type === "tool-executing") {
|
|
263
|
+
_lastExec = { tool: event.tool, args: event.args };
|
|
238
264
|
process.stdout.write(
|
|
239
265
|
chalk.gray(
|
|
240
266
|
` [${event.tool}] ${formatToolArgs(event.tool, event.args)}\n`,
|
|
@@ -245,6 +271,24 @@ async function agentLoop(messages, options) {
|
|
|
245
271
|
process.stdout.write(
|
|
246
272
|
chalk.red(` Error: ${event.error || event.result?.error}\n`),
|
|
247
273
|
);
|
|
274
|
+
// Record policy denials (not plain tool failures) into the caller's
|
|
275
|
+
// denial log for review via `/permissions denials` (Claude-Code 2.1.193
|
|
276
|
+
// recent denials). Caller passes the session log (mirrors checkpointMarks)
|
|
277
|
+
// so the wrapper stays unit-testable.
|
|
278
|
+
if (Array.isArray(options.denialLog)) {
|
|
279
|
+
const denial = classifyDenial({
|
|
280
|
+
tool: event.tool,
|
|
281
|
+
result: event.result,
|
|
282
|
+
error: event.error,
|
|
283
|
+
argsSummary:
|
|
284
|
+
_lastExec && _lastExec.tool === event.tool
|
|
285
|
+
? formatToolArgs(event.tool, _lastExec.args)
|
|
286
|
+
: "",
|
|
287
|
+
});
|
|
288
|
+
if (denial) {
|
|
289
|
+
recordDenial(options.denialLog, { ...denial, at: Date.now() });
|
|
290
|
+
}
|
|
291
|
+
}
|
|
248
292
|
// Parity with Desktop AIChatPage's `Switch to Trusted` button:
|
|
249
293
|
// when the deny came from ApprovalGate (not shell-policy), surface
|
|
250
294
|
// the exact CLI command the user can run to relax the per-session
|
|
@@ -297,6 +341,27 @@ async function agentLoop(messages, options) {
|
|
|
297
341
|
* Start the agentic REPL
|
|
298
342
|
*/
|
|
299
343
|
export async function startAgentRepl(options = {}) {
|
|
344
|
+
// EPIPE guard: if the REPL's stdout is piped and the consumer closes (e.g.
|
|
345
|
+
// `cc agent | head`), the async stream `error` would otherwise crash the
|
|
346
|
+
// process. Route a broken pipe into the REPL's own graceful shutdown (the
|
|
347
|
+
// rl "close" handler — MCP disconnect, kill background tasks) when the
|
|
348
|
+
// interface exists, else exit cleanly. `_replClosing` makes it fire once so a
|
|
349
|
+
// cleanup write that also EPIPEs can't loop. `_replRl` is set when rl is built.
|
|
350
|
+
let _replRl = null;
|
|
351
|
+
let _replClosing = false;
|
|
352
|
+
installPipeSafety(undefined, () => {
|
|
353
|
+
if (_replClosing) return;
|
|
354
|
+
_replClosing = true;
|
|
355
|
+
if (_replRl) {
|
|
356
|
+
try {
|
|
357
|
+
_replRl.close(); // triggers the graceful "close" cleanup → process.exit
|
|
358
|
+
return;
|
|
359
|
+
} catch {
|
|
360
|
+
/* fall through to a bare exit */
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
process.exit(0);
|
|
364
|
+
});
|
|
300
365
|
let model = options.model || "qwen2.5:7b";
|
|
301
366
|
let provider = options.provider || "ollama";
|
|
302
367
|
// Extended thinking (Anthropic; opt-in via --think/--ultrathink). Carried from
|
|
@@ -481,6 +546,11 @@ export async function startAgentRepl(options = {}) {
|
|
|
481
546
|
_respondToBash = readBooleanSetting("respondToBashCommands", {
|
|
482
547
|
cwd: process.cwd(),
|
|
483
548
|
});
|
|
549
|
+
// Claude-Code 2.1.193 autoMode.classifyAllShell (default OFF when unset).
|
|
550
|
+
_classifyAllShell =
|
|
551
|
+
readBooleanSetting("autoMode.classifyAllShell", {
|
|
552
|
+
cwd: process.cwd(),
|
|
553
|
+
}) === true;
|
|
484
554
|
const total =
|
|
485
555
|
loaded.rules.allow.length +
|
|
486
556
|
loaded.rules.ask.length +
|
|
@@ -516,12 +586,21 @@ export async function startAgentRepl(options = {}) {
|
|
|
516
586
|
// PostToolUse). The interactive _permissionConfirm above doubles as the
|
|
517
587
|
// confirmer for a hook `ask` decision.
|
|
518
588
|
try {
|
|
519
|
-
const { loadHooks } =
|
|
589
|
+
const { loadHooks, projectHookTrustNotice } =
|
|
590
|
+
await import("../lib/settings-hooks.cjs");
|
|
520
591
|
const loaded = loadHooks({ cwd: process.cwd() });
|
|
521
592
|
_settingsHooks =
|
|
522
593
|
loaded.hooks && Object.keys(loaded.hooks).length > 0
|
|
523
594
|
? loaded.hooks
|
|
524
595
|
: null;
|
|
596
|
+
// First-run trust notice for an untrusted/cloned repo's shell-running
|
|
597
|
+
// hooks (Claude-Code 2.1.195 parity). Best-effort, stderr-only.
|
|
598
|
+
try {
|
|
599
|
+
const notice = projectHookTrustNotice({ cwd: process.cwd() });
|
|
600
|
+
if (notice) process.stderr.write(notice + "\n");
|
|
601
|
+
} catch {
|
|
602
|
+
/* trust notice is best-effort */
|
|
603
|
+
}
|
|
525
604
|
} catch (_err) {
|
|
526
605
|
_settingsHooks = null;
|
|
527
606
|
}
|
|
@@ -779,6 +858,10 @@ export async function startAgentRepl(options = {}) {
|
|
|
779
858
|
// (parity with headless; auto-detect already works via process.env).
|
|
780
859
|
ide: options.ide,
|
|
781
860
|
pdh: options.pdh,
|
|
861
|
+
// IDEA built-in MCP (server `idea`): auto-connect when the JetBrains
|
|
862
|
+
// plugin injected CHAINLESSCHAIN_JETBRAINS_MCP_URL. --jetbrains forces,
|
|
863
|
+
// --no-jetbrains disables.
|
|
864
|
+
jetbrains: options.jetbrains,
|
|
782
865
|
cwd: process.cwd(),
|
|
783
866
|
// advertise the session id to spawned stdio MCP servers
|
|
784
867
|
sessionId,
|
|
@@ -1030,6 +1113,9 @@ export async function startAgentRepl(options = {}) {
|
|
|
1030
1113
|
terminal: true,
|
|
1031
1114
|
completer: atCompleter,
|
|
1032
1115
|
});
|
|
1116
|
+
// Let the EPIPE guard route a broken pipe through this interface's graceful
|
|
1117
|
+
// "close" cleanup instead of a bare exit.
|
|
1118
|
+
_replRl = rl;
|
|
1033
1119
|
|
|
1034
1120
|
// Vim-mode plumbing: capture readline's OWN keypress listeners now so we can
|
|
1035
1121
|
// suspend them while in NORMAL mode (the engine drives editing then) and
|
|
@@ -1453,7 +1539,7 @@ export async function startAgentRepl(options = {}) {
|
|
|
1453
1539
|
` ${chalk.cyan("/cost")} Session token spend + estimated $ (per model & category)`,
|
|
1454
1540
|
);
|
|
1455
1541
|
logger.log(
|
|
1456
|
-
` ${chalk.cyan("/permissions")} Allow/ask/deny rules; set/cycle tier (/permissions <tier> · Shift+Tab
|
|
1542
|
+
` ${chalk.cyan("/permissions")} Allow/ask/deny rules; set/cycle tier (/permissions <tier> · Shift+Tab); /permissions denials to review blocked calls`,
|
|
1457
1543
|
);
|
|
1458
1544
|
logger.log(
|
|
1459
1545
|
` ${chalk.cyan("/export")} Save this conversation to a Markdown file (/export [path])`,
|
|
@@ -3005,6 +3091,13 @@ export async function startAgentRepl(options = {}) {
|
|
|
3005
3091
|
// parity): what the agent runs unprompted, asks about, or is blocked from.
|
|
3006
3092
|
if (trimmed === "/permissions" || trimmed.startsWith("/permissions ")) {
|
|
3007
3093
|
const arg = trimmed.slice("/permissions".length).trim();
|
|
3094
|
+
if (arg === "denials" || arg === "denied") {
|
|
3095
|
+
// Review what the agent was BLOCKED from running this session
|
|
3096
|
+
// (Claude-Code 2.1.193 "recent denials").
|
|
3097
|
+
logger.log(formatDenials(_recentDenials));
|
|
3098
|
+
prompt();
|
|
3099
|
+
return;
|
|
3100
|
+
}
|
|
3008
3101
|
if (arg) {
|
|
3009
3102
|
// Set this session's approval tier mid-session (Claude-Code
|
|
3010
3103
|
// permission-mode / Shift+Tab parity; mirrors `cc session policy --set`).
|
|
@@ -3050,6 +3143,13 @@ export async function startAgentRepl(options = {}) {
|
|
|
3050
3143
|
" Set tier mid-session: /permissions <strict|trusted|autopilot>",
|
|
3051
3144
|
),
|
|
3052
3145
|
);
|
|
3146
|
+
if (_recentDenials.length) {
|
|
3147
|
+
logger.log(
|
|
3148
|
+
chalk.gray(
|
|
3149
|
+
` ${_recentDenials.length} tool call(s) denied this session — /permissions denials to review`,
|
|
3150
|
+
),
|
|
3151
|
+
);
|
|
3152
|
+
}
|
|
3053
3153
|
prompt();
|
|
3054
3154
|
return;
|
|
3055
3155
|
}
|
|
@@ -3482,11 +3582,13 @@ export async function startAgentRepl(options = {}) {
|
|
|
3482
3582
|
autoCheckpoint,
|
|
3483
3583
|
checkpointSession: sessionId,
|
|
3484
3584
|
checkpointMarks: _checkpointMarks,
|
|
3585
|
+
denialLog: _recentDenials,
|
|
3485
3586
|
prepareCall,
|
|
3486
3587
|
approvalGate: _approvalGate,
|
|
3487
3588
|
permissionRules: _permissionRules,
|
|
3488
3589
|
permissionConfirm: _permissionConfirm,
|
|
3489
3590
|
settingsHooks: _settingsHooks,
|
|
3591
|
+
classifyAllShell: _classifyAllShell,
|
|
3490
3592
|
// Interactive session: gate run_code through the ApprovalGate (like
|
|
3491
3593
|
// run_shell) so a strict tier prompts before arbitrary code runs.
|
|
3492
3594
|
interactiveApproval: true,
|
|
@@ -51,13 +51,38 @@ describe("mergeConsecutiveMessages", () => {
|
|
|
51
51
|
// A multi-tool turn produces back-to-back `tool` results — folding them
|
|
52
52
|
// would drop tool_call_ids and corrupt the tool-call pairing.
|
|
53
53
|
const msgs = [
|
|
54
|
-
{
|
|
54
|
+
{
|
|
55
|
+
role: "assistant",
|
|
56
|
+
content: "",
|
|
57
|
+
tool_calls: [{ id: "a" }, { id: "b" }],
|
|
58
|
+
},
|
|
55
59
|
{ role: "tool", content: "r1", tool_call_id: "a" },
|
|
56
60
|
{ role: "tool", content: "r2", tool_call_id: "b" },
|
|
57
61
|
];
|
|
58
62
|
expect(mergeConsecutiveMessages(msgs)).toEqual(msgs);
|
|
59
63
|
});
|
|
60
64
|
|
|
65
|
+
it("never merges a structured assistant tool-call turn (tool_calls preserved)", () => {
|
|
66
|
+
// Two consecutive assistants where the SECOND carries tool_calls — folding
|
|
67
|
+
// would drop them (orphaning the result) and the strict API would 400.
|
|
68
|
+
const msgs = [
|
|
69
|
+
{ role: "assistant", content: "let me check" },
|
|
70
|
+
{ role: "assistant", content: "", tool_calls: [{ id: "c1" }] },
|
|
71
|
+
{ role: "tool", content: "result", tool_call_id: "c1" },
|
|
72
|
+
];
|
|
73
|
+
expect(mergeConsecutiveMessages(msgs)).toEqual(msgs);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("never folds two consecutive assistants when the FIRST has tool_calls", () => {
|
|
77
|
+
// e.g. after a compaction dropped the tool results — merging would mutate
|
|
78
|
+
// the structured turn's content and keep its now-unanswered tool_calls.
|
|
79
|
+
const msgs = [
|
|
80
|
+
{ role: "assistant", content: "", tool_calls: [{ id: "a" }] },
|
|
81
|
+
{ role: "assistant", content: "fallback text" },
|
|
82
|
+
];
|
|
83
|
+
expect(mergeConsecutiveMessages(msgs)).toEqual(msgs);
|
|
84
|
+
});
|
|
85
|
+
|
|
61
86
|
it("never merges system messages (leading base + context pair kept distinct)", () => {
|
|
62
87
|
const msgs = [
|
|
63
88
|
{ role: "system", content: "base" },
|
|
@@ -202,14 +227,22 @@ describe("collapseConsecutiveMessagesInPlace", () => {
|
|
|
202
227
|
const messages = [
|
|
203
228
|
{ role: "user", content: "u1" },
|
|
204
229
|
{ role: "user", content: "u2" },
|
|
205
|
-
{
|
|
230
|
+
{
|
|
231
|
+
role: "assistant",
|
|
232
|
+
content: "",
|
|
233
|
+
tool_calls: [{ id: "a" }, { id: "b" }],
|
|
234
|
+
},
|
|
206
235
|
{ role: "tool", content: "r1", tool_call_id: "a" },
|
|
207
236
|
{ role: "tool", content: "r2", tool_call_id: "b" },
|
|
208
237
|
];
|
|
209
238
|
expect(collapseConsecutiveMessagesInPlace(messages)).toBe(true);
|
|
210
239
|
expect(messages).toEqual([
|
|
211
240
|
{ role: "user", content: "u1\n\nu2" },
|
|
212
|
-
{
|
|
241
|
+
{
|
|
242
|
+
role: "assistant",
|
|
243
|
+
content: "",
|
|
244
|
+
tool_calls: [{ id: "a" }, { id: "b" }],
|
|
245
|
+
},
|
|
213
246
|
{ role: "tool", content: "r1", tool_call_id: "a" },
|
|
214
247
|
{ role: "tool", content: "r2", tool_call_id: "b" },
|
|
215
248
|
]);
|