chainlesschain 0.162.159 → 0.162.161
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-ByIiF5bT.js → AIOps-DMn528q-.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-NlgSFZq5.js → ActionButton-D9ZcDCJL.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D17cOUcb.js → Analytics-A_K-8PX0.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B4mEZcbl.js → AppLayout-D4pFW3X6.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CASsmyQw.js → Artifacts-Dz46COAd.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DYAia2e2.js → Audit-cbMjbyg0.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C1lvYUSu.js → BackgroundAgents-Dtf88GAj.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B6agK6bA.js → Backup-C5KRxn52.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DM43R2vy.js → BaseInput-Dd2UK3BN.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dtdp3eXp.js → Chat-lptKTFdG.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BL5c_OQ1.js → ChatBubbleRenderer-C2KLtwHz.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-D2xf7uZt.js → Checkbox-_yspG6rG.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D3j45jJL.js → Codegen-BGq_GAha.js} +1 -1
- package/src/assets/web-panel/assets/{Col-voPJ9fUZ.js → Col-CePor71g.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DEsyTESF.js → Community-CLOWhIT7.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-OHV_QXLD.js → Compact-CivJt2vT.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-eDTJWC-J.js → Compliance-Btmo1GGE.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBvy-6d1.js → Cowork-Ct35OlG4.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-Dw2eoJxu.js → Cron-CTc2GmhB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DQHms_Bh.js → Crosschain-ZtiBETk1.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Cyu7Id1c.js → DID-BNqMQQXw.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-sIDzkG92.js → Dashboard-BmzZd-9V.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DUW3T2ey.js → Dropdown-CMVgvP2M.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CECELXW8.js → EmailListRenderer-CcqQFAfT.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BIZR37ov.js → FamilyGuardDashboard-CTqB1_4V.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BEZIQX84.js → Federation-CiKOOzlb.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BcdUMznL.js → FormItemContext-Wk-OT0gr.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DsN_fr5H.js → GenericCardRenderer-DbEQT6ue.js} +1 -1
- package/src/assets/web-panel/assets/{Git-63LhjBx2.js → Git-0ZvCPSD9.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYtQtIcH.js → Governance-CmVuKkPb.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BwR6UUox.js → Inference-CTWE3Jwg.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D9lVNTUA.js → KnowledgeGraph-CBEIF00L.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C4q5h7Ut.js → Logs-DLhxDwVG.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DxywvhTU.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Plksliuw.js → Marketplace-BgsCBrnc.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DZUFfeuG.js → McpTools-ClBUGDS2.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-NoDYt29V.js → Memory-CnG_ZnYw.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CEXGTkdh.js → MobileBridge-BUOAbR1Z.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DnbJkbZo.js → MobileProjects-Dnt_9-WB.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DTAa0cwy.js → Mtc-CLjt4kCD.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-CVV7LnNS.js → MtcAudit-f24U9Aes.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BqqGrjt_.js → Multisig-GrmGQbSq.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C4WP8DRp.js → NLProgramming-DADaWn-n.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Zo4DJUVI.js → Notes-xtf5RX6C.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DBcjRaz2.js → NotificationSettings-Cd27Rgtx.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-fXRxlDjl.js +1 -0
- package/src/assets/web-panel/assets/{Organization-BT9WPBOX.js → Organization-joCFlNB0.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-D6b4bZ3q.js → Overflow-B1HoURq0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cw3OsYx-.js → P2P-DiwsKbT7.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C0nyiK2b.js → PdhVaultBrowser-Xe-BsW6S.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-zVBZEB_C.js → Permissions-C23qi8kl.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BOspsFew.js → PersonalDataHub-BS1syX2f.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-CQWfZ4XH.js → Pipeline-DRYwwDyh.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-C2oGJ_WL.js → Privacy-BQKaDHPH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BZMR4qY1.js → ProjectInit-BC6F9xiG.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DAujoP63.js → ProjectSettings-ClFPc1Nd.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Dn-f5aYe.js +1 -0
- package/src/assets/web-panel/assets/{Providers-D_RGHM-v.js → Providers-CLWuOUNt.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Mf6KfL2J.js → QrScannerModal-DiqULTxb.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-5D8URoI_.js → QuickAsk-9A03P-E_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Df4kC8Gy.js → Recommend-CJZAnbq_.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DGi3f3vO.js → RemoteSession-C9A1R77h.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-jmkGFNWb.js → Reputation-BIZc6Rky.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DP6Pcu3m.js → Row-DfIPNtuG.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-D60hSuPO.js → RssFeed-C5znFcQ1.js} +3 -3
- package/src/assets/web-panel/assets/{Search-0mf1BQUK.js → Search-DSs2z3OX.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CfZtLFYV.js → Security-CV6LcrLY.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D9zpZLWz.js → Services-cmhoX0Xj.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D1_44eMD.js → Skeleton-tCsg2po7.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-cVFa8zkz.js → Skills-BK1KUDiy.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Cinpzc3L.js → Sla-yRgyeA82.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-bqdiJE_P.js → SpeechSettings-c1mo1mlp.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dgl_SLgj.js → SyncSettings-koIAfuT3.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DawWAEhy.js → Tasks-DkkreAaB.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Ca0nY651.js → Templates-fy5Ctf9M.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CgaGEhLm.js → Tenant-Bw70Jf6S.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D-9EnpRx.js → Terminal-BKh6Rx-4.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CSOxDHZ6.js → TimelineRenderer-Dg54WP0c.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BpwLZpL3.js → Tokens-BvvD5SxJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DgowwBK5.js → Trigger-B7Ug9x4e.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BZutapjE.js → Trust-BjvuMORY.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-QZPt8_Sp.js → UkeySign-CZqhkx8p.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DlQx5UDJ.js → VideoEditing-ClR50lhX.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-ZfdTgtWA.js → Wallet-DlfppYjx.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CAp0y_Cr.js → WebAuthn-BirgVr8B.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BVITZEmr.js → WorkflowEditor-B8DP_bax.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CC2tPaNg.js → chat-DA8AUZzL.js} +1 -1
- package/src/assets/web-panel/assets/{colors-31brc9CA.js → colors-C38pLGp1.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DLMkC9C-.js → compact-item-81rtr98o.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BMtveI6F.js → createContext-D34ixq8t.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CHDIEOeN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DbD6WHW2.js → hasIn-D4bzqTrZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoO4WEJB.js → index-9qoVpPt6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJhREOlG.js → index-B0QArPQt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnFLzejT.js → index-B8mkLM4x.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bbc2JeQG.js → index-BIP62a6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXKbOek.js → index-BP-zkXK8.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-cGlCDW.js → index-BS3M5H9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-AaIKG60c.js → index-BXd2_LmH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEXa-4zd.js → index-BlxEphl7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZl-UXB6.js → index-BqIhLAbA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOM-VFlv.js → index-BtGxuQrO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcVszn2b.js → index-BvD7b2IK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C21pdBqs.js → index-BvL_3J_n.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJvxFyIz.js → index-COe_cOLJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-ALvoNTRF.js → index-CP5alL4t.js} +1 -1
- package/src/assets/web-panel/assets/index-CY1NURWZ.js +1 -0
- package/src/assets/web-panel/assets/{index-Dm0byjm1.js → index-CbhE3j5j.js} +1 -1
- package/src/assets/web-panel/assets/{index-WQUO2vvK.js → index-Cd3KuNK5.js} +1 -1
- package/src/assets/web-panel/assets/{index-bdaJwTXJ.js → index-CoVgZw_b.js} +1 -1
- package/src/assets/web-panel/assets/{index-COHHQ9cU.js → index-CuS-UPoj.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7LHNw_N.js → index-D0Ih7Hwn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cod97Urs.js → index-D3zCCZRS.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cwbqh0KZ.js → index-D6GfvEQG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKAB6-6V.js → index-DBFSo1NF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEwjBA9q.js → index-DFHa1HIg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DndNnYc0.js → index-DFyWKOBD.js} +1 -1
- package/src/assets/web-panel/assets/{index-3oBsXZmF.js → index-DMgnRwrK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_eUKGYP.js → index-DUQLXLQM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUmLMFsy.js → index-D_2VYPr1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPpS-lGb.js → index-DakfFZ-k.js} +1 -1
- package/src/assets/web-panel/assets/{index-ep6JchNG.js → index-Ddk0e_Pi.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7cV0tu0.js → index-DkHqMnn3.js} +1 -1
- package/src/assets/web-panel/assets/{index-jG6h22Qg.js → index-Dmo3dFHb.js} +1 -1
- package/src/assets/web-panel/assets/index-DokUYqpq.js +1 -0
- package/src/assets/web-panel/assets/{index-C1PfeI88.js → index-DvfCEJG-.js} +1 -1
- package/src/assets/web-panel/assets/{index-ntVQqSML.js → index-E1OJRXs4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWgfipcC.js → index-F76w1NiL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiRQUoyE.js → index-ZRJRItm0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFRLmCR3.js → index-fI5sXMLg.js} +1 -1
- package/src/assets/web-panel/assets/{index-D67kIagl.js → index-tKiC8T-4.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D5UoBRhN.js → initDefaultProps-ByyvflIR.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DltOw0CR.js → motion-B3FQm2By.js} +1 -1
- package/src/assets/web-panel/assets/{move-_oPkk5zj.js → move-BSfns6Ef.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-EES8ROCS.js → mtc-parser-CTG1Ieri.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B-_39x_M.js → omit-DObM_2j6.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-l6D0yJHz.js → pickAttrs-DOfelQ1t.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DIeUK31L.js → placementArrow-CHZILds_.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-dG4EzUQo.js → responsiveObserve-REbucKSx.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DWFzYGdH.js → slide-C6EZzD7o.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CECdTA5H.js → statusUtils-BxkWS-g3.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-D6kP-mMK.js → styleChecker-Chklyoq6.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BWfna_rd.js → useFlexGapSupport-CRVwKrrI.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Bb-j6rzo.js → useFs-DV24ik_J.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D5OIsYM4.js → usePersonalDataHub-C7vIo4Pg.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNpwzFTM.js → vnode-By-v5GlF.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-vNLpFQBW.js → zoom-B1w9Am3r.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agenda.js +15 -1
- package/src/commands/agent.js +72 -6
- package/src/commands/background-session.js +46 -2
- package/src/commands/mcp.js +46 -0
- package/src/commands/session.js +70 -0
- package/src/data/changelog.json +12 -2
- package/src/gateways/ws/background-agent-protocol.js +88 -14
- package/src/harness/jsonl-session-store.js +70 -1
- package/src/harness/mcp-client.js +50 -0
- package/src/lib/agent-authority.js +251 -0
- package/src/lib/agent-sandbox.js +68 -0
- package/src/lib/agents.js +12 -4
- package/src/lib/api-key-helper.js +62 -0
- package/src/lib/background-agent-phase.js +100 -0
- package/src/lib/background-agent-supervisor.js +320 -8
- package/src/lib/backpressure-policy.js +105 -0
- package/src/lib/capability-negotiation.js +212 -0
- package/src/lib/credential-guard.js +11 -0
- package/src/lib/credential-proxy.js +182 -0
- package/src/lib/dependency-install-policy.js +130 -0
- package/src/lib/event-seq-replay.js +167 -0
- package/src/lib/exit-codes.cjs +77 -0
- package/src/lib/goal-condition-engine.js +369 -0
- package/src/lib/headless-manifest.js +188 -0
- package/src/lib/hook-runner.cjs +70 -4
- package/src/lib/ide-context-redaction.js +130 -0
- package/src/lib/ide-context.js +128 -13
- package/src/lib/jsonl-session-store.js +2 -0
- package/src/lib/llm-config-defaults.js +24 -8
- package/src/lib/project-instructions.js +98 -1
- package/src/lib/project-mcp-trust.js +87 -0
- package/src/lib/remote-path-mapping.js +229 -0
- package/src/lib/schedule-planner.js +136 -0
- package/src/lib/sensitive-file-guard.js +51 -0
- package/src/lib/sub-agent-context.js +7 -3
- package/src/repl/bg-dashboard.js +13 -12
- package/src/runtime/agent-core.js +113 -10
- package/src/runtime/coding-agent-contract-shared.cjs +19 -2
- package/src/runtime/headless-runner.js +66 -7
- package/src/runtime/headless-stream.js +224 -12
- package/src/runtime/mcp-config.js +32 -1
- package/src/runtime/system-prompt.js +3 -0
- package/src/workers/background-agent-worker.js +37 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DexLlXfN.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BCQel9bD.js +0 -1
- package/src/assets/web-panel/assets/Projects-DvH_P2Uq.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CB8pPOtd.js +0 -1
- package/src/assets/web-panel/assets/index-BhXiaiev.js +0 -1
- package/src/assets/web-panel/assets/index-WpaYaE3D.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-D3zCCZRS.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as d}from"./index-
|
|
1
|
+
import{B as d}from"./index-D3zCCZRS.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
|
package/src/assets/web-panel/assets/{useFlexGapSupport-BWfna_rd.js → useFlexGapSupport-CRVwKrrI.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-
|
|
1
|
+
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-Chklyoq6.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-D3zCCZRS.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as f}from"./index-
|
|
1
|
+
import{u as f}from"./index-D3zCCZRS.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-D3zCCZRS.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-D3zCCZRS.js";import{i as f}from"./motion-B3FQm2By.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-D3zCCZRS.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
package/src/commands/agenda.js
CHANGED
|
@@ -20,6 +20,7 @@ import { fileURLToPath } from "node:url";
|
|
|
20
20
|
import chalk from "chalk";
|
|
21
21
|
import { AgentScheduleStore } from "../lib/agent-schedule-store.js";
|
|
22
22
|
import { sendAgentNotification } from "../lib/agent-notify.js";
|
|
23
|
+
import { nextWakeupAt } from "../lib/schedule-planner.js";
|
|
23
24
|
|
|
24
25
|
const BIN_PATH = fileURLToPath(
|
|
25
26
|
new URL("../../bin/chainlesschain.js", import.meta.url),
|
|
@@ -63,8 +64,13 @@ export function runAgendaList(options = {}, _deps = {}) {
|
|
|
63
64
|
const log = _deps.log || ((m) => console.log(m));
|
|
64
65
|
const store = _deps.store || new AgentScheduleStore();
|
|
65
66
|
const entries = store.list(options.kind || null);
|
|
67
|
+
// Adaptive next-wakeup (schedule-planner): the earliest future fire time
|
|
68
|
+
// across all schedulable, non-expired entries — what a daemon would sleep
|
|
69
|
+
// until. `now` is injectable for tests.
|
|
70
|
+
const now = _deps.now ? _deps.now() : Date.now();
|
|
71
|
+
const nextAt = nextWakeupAt(entries, { now });
|
|
66
72
|
if (options.json) {
|
|
67
|
-
log(JSON.stringify({ entries }, null, 2));
|
|
73
|
+
log(JSON.stringify({ entries, nextWakeupAt: nextAt }, null, 2));
|
|
68
74
|
return 0;
|
|
69
75
|
}
|
|
70
76
|
if (entries.length === 0) {
|
|
@@ -86,6 +92,14 @@ export function runAgendaList(options = {}, _deps = {}) {
|
|
|
86
92
|
);
|
|
87
93
|
log(` ${chalk.dim(when)}`);
|
|
88
94
|
}
|
|
95
|
+
if (nextAt != null) {
|
|
96
|
+
const rel = Math.max(0, Math.round((nextAt - now) / 1000));
|
|
97
|
+
log(
|
|
98
|
+
chalk.gray(
|
|
99
|
+
`\n next wakeup: ${new Date(nextAt).toISOString()} (in ${rel}s)`,
|
|
100
|
+
),
|
|
101
|
+
);
|
|
102
|
+
}
|
|
89
103
|
log("");
|
|
90
104
|
return 0;
|
|
91
105
|
}
|
package/src/commands/agent.js
CHANGED
|
@@ -16,7 +16,10 @@ import {
|
|
|
16
16
|
} from "../runtime/fallback-model.js";
|
|
17
17
|
import { resolveImages, resolveVisionLlm } from "../lib/image-input.js";
|
|
18
18
|
import { loadConfig } from "../lib/config-manager.js";
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
normalizeAgentSandbox,
|
|
21
|
+
assertSandboxAvailable,
|
|
22
|
+
} from "../lib/agent-sandbox.js";
|
|
20
23
|
|
|
21
24
|
/**
|
|
22
25
|
* Resolve + validate `--add-dir` values into absolute, existing, de-duped
|
|
@@ -172,6 +175,14 @@ export function registerAgentCommand(program) {
|
|
|
172
175
|
"--bare",
|
|
173
176
|
"Everything --safe-mode disables PLUS skills, plugins and MCP/IDE auto-connect — minimal fast surface for scripted calls (explicit --mcp-config still loads; permission rules STAY active)",
|
|
174
177
|
)
|
|
178
|
+
.option(
|
|
179
|
+
"--ephemeral",
|
|
180
|
+
"No session persistence: nothing is written to the session store (headless; a --resume id still replays history read-only)",
|
|
181
|
+
)
|
|
182
|
+
.option(
|
|
183
|
+
"--capabilities",
|
|
184
|
+
"Print a machine-readable capability manifest (JSON: protocol version, tools, permission modes, exit codes) and exit",
|
|
185
|
+
)
|
|
175
186
|
.option(
|
|
176
187
|
"--disable-slash-commands",
|
|
177
188
|
"Interactive REPL: don't dispatch '/' input as slash commands — it reaches the model verbatim (/exit and /quit stay live)",
|
|
@@ -279,6 +290,10 @@ export function registerAgentCommand(program) {
|
|
|
279
290
|
"Headless input: text | stream-json (NDJSON user events on stdin, multi-turn)",
|
|
280
291
|
"text",
|
|
281
292
|
)
|
|
293
|
+
.option(
|
|
294
|
+
"--trace-id <id>",
|
|
295
|
+
"Correlation id stamped as `trace_id` on every stream-json output line (also read from CC_TRACE_ID). Lets an IDE/bridge trace one run across its own logs, the CLI, transcripts and diagnostics. Auto-generated per run when omitted.",
|
|
296
|
+
)
|
|
282
297
|
.option(
|
|
283
298
|
"--fallback-model <model>",
|
|
284
299
|
"Backup model(s) to try in order when the primary fails (transient error or model-not-found). Repeatable or comma-separated; up to 3. A `provider:model` entry (e.g. openai:gpt-4o) falls back cross-provider, using that provider's API key from its env var (skipped if unset — never reuses the primary key). Defaults to config llm.fallbackModels.",
|
|
@@ -367,12 +382,31 @@ export function registerAgentCommand(program) {
|
|
|
367
382
|
false,
|
|
368
383
|
)
|
|
369
384
|
.action(async (task, options, command) => {
|
|
385
|
+
// --capabilities: print the machine-readable manifest and exit — no
|
|
386
|
+
// config, no bootstrap, no network (gap-analysis 2026-07-11 快速收益 #6).
|
|
387
|
+
if (options.capabilities) {
|
|
388
|
+
const { buildAgentCapabilities } =
|
|
389
|
+
await import("../lib/headless-manifest.js");
|
|
390
|
+
console.log(JSON.stringify(buildAgentCapabilities(), null, 2));
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
370
393
|
// CC_API_KEY env fallback for --api-key: lets callers (IDE plugins,
|
|
371
394
|
// scripts) pass the key via the environment instead of argv, where it
|
|
372
395
|
// is visible to every local process (/proc/<pid>/cmdline, Win32_Process).
|
|
373
396
|
// An explicit --api-key still wins.
|
|
374
397
|
if (!options.apiKey && process.env.CC_API_KEY) {
|
|
375
398
|
options.apiKey = process.env.CC_API_KEY;
|
|
399
|
+
} else if (
|
|
400
|
+
options.apiKey &&
|
|
401
|
+
process.argv.includes("--api-key") &&
|
|
402
|
+
!process.env.VITEST &&
|
|
403
|
+
!process.env.VITEST_WORKER_ID
|
|
404
|
+
) {
|
|
405
|
+
// gap-analysis 2026-07-11: argv keys leak into shell history, process
|
|
406
|
+
// lists and logs — steer callers to the env/helper paths.
|
|
407
|
+
process.stderr.write(
|
|
408
|
+
"⚠️ --api-key on the command line is visible to every local process (shell history, ps). Prefer CC_API_KEY env or config llm.apiKeyHelper.\n",
|
|
409
|
+
);
|
|
376
410
|
}
|
|
377
411
|
const bypassPermissions = !!(
|
|
378
412
|
options.allowDangerousBypass ||
|
|
@@ -798,6 +832,9 @@ export function registerAgentCommand(program) {
|
|
|
798
832
|
baseUrl: options.baseUrl,
|
|
799
833
|
apiKey: options.apiKey,
|
|
800
834
|
sessionId: options.session,
|
|
835
|
+
// Cross-event correlation id for this run (stamped as `trace_id` on
|
|
836
|
+
// every output line); falls back to CC_TRACE_ID / auto-generated.
|
|
837
|
+
traceId: options.traceId || null,
|
|
801
838
|
// Auto-checkpoint follows the same resolution as the headless/REPL
|
|
802
839
|
// paths (default ON in a git repo) so panel/stream sessions snapshot
|
|
803
840
|
// before mutating tools and can be rewound via `cc checkpoint`.
|
|
@@ -830,6 +867,7 @@ export function registerAgentCommand(program) {
|
|
|
830
867
|
outputStyle: options.outputStyle || null,
|
|
831
868
|
strictMcpConfig: options.strictMcpConfig === true,
|
|
832
869
|
replayUserMessages: options.replayUserMessages === true,
|
|
870
|
+
ephemeral: options.ephemeral === true,
|
|
833
871
|
maxCostUsd,
|
|
834
872
|
priceTable,
|
|
835
873
|
chatFn: fallbackChatFn,
|
|
@@ -937,6 +975,15 @@ export function registerAgentCommand(program) {
|
|
|
937
975
|
network: options.sandboxNetwork === true,
|
|
938
976
|
settings: settingsSandbox,
|
|
939
977
|
});
|
|
978
|
+
// Strict sandbox mode: failIfUnavailable refuses to START when the
|
|
979
|
+
// configured engine can't run — no silent per-command degradation.
|
|
980
|
+
try {
|
|
981
|
+
assertSandboxAvailable(agentSandbox);
|
|
982
|
+
} catch (err) {
|
|
983
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
984
|
+
await _finishWorktree();
|
|
985
|
+
process.exit(6); // config error (see lib/exit-codes.cjs)
|
|
986
|
+
}
|
|
940
987
|
// Resume requested onto a session with no headless (JSONL) transcript?
|
|
941
988
|
// Warn instead of silently starting empty 鈥?headless resume rebuilds
|
|
942
989
|
// from the JSONL store only (DB-only sessions are not replayable here).
|
|
@@ -1025,6 +1072,8 @@ export function registerAgentCommand(program) {
|
|
|
1025
1072
|
// --settings: extra .claude/settings.json permission rules
|
|
1026
1073
|
settingsFile: options.settings || null,
|
|
1027
1074
|
outputStyle: options.outputStyle || null,
|
|
1075
|
+
// --ephemeral: no session persistence (resume replay stays read-only)
|
|
1076
|
+
ephemeral: options.ephemeral === true,
|
|
1028
1077
|
// --max-budget-usd: hard spend cap (+ price table from config llm.pricing)
|
|
1029
1078
|
maxCostUsd,
|
|
1030
1079
|
priceTable,
|
|
@@ -1074,6 +1123,13 @@ export function registerAgentCommand(program) {
|
|
|
1074
1123
|
return;
|
|
1075
1124
|
}
|
|
1076
1125
|
|
|
1126
|
+
// --ephemeral is a headless contract (the interactive REPL owns its own
|
|
1127
|
+
// session lifecycle) — warn instead of silently dropping the flag.
|
|
1128
|
+
if (options.ephemeral) {
|
|
1129
|
+
process.stderr.write(
|
|
1130
|
+
"--ephemeral is only used in headless mode (-p / a task / piped stdin); ignoring for the interactive session.\n",
|
|
1131
|
+
);
|
|
1132
|
+
}
|
|
1077
1133
|
// Reached only for an interactive session, where --image has no turn to
|
|
1078
1134
|
// attach to 鈥?warn instead of silently dropping the attachment.
|
|
1079
1135
|
if (images.length) {
|
|
@@ -1082,6 +1138,20 @@ export function registerAgentCommand(program) {
|
|
|
1082
1138
|
);
|
|
1083
1139
|
}
|
|
1084
1140
|
|
|
1141
|
+
// Strict sandbox mode also guards the interactive session: refuse to
|
|
1142
|
+
// start when failIfUnavailable is set and the engine can't run.
|
|
1143
|
+
const interactiveSandbox = normalizeAgentSandbox(options.sandbox, {
|
|
1144
|
+
cwd: process.cwd(),
|
|
1145
|
+
network: options.sandboxNetwork === true,
|
|
1146
|
+
settings: settingsSandbox,
|
|
1147
|
+
});
|
|
1148
|
+
try {
|
|
1149
|
+
assertSandboxAvailable(interactiveSandbox);
|
|
1150
|
+
} catch (err) {
|
|
1151
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
1152
|
+
process.exit(6); // config error (see lib/exit-codes.cjs)
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1085
1155
|
const runtime = createAgentRuntimeFactory().createAgentRuntime({
|
|
1086
1156
|
model: options.model,
|
|
1087
1157
|
thinking,
|
|
@@ -1103,11 +1173,7 @@ export function registerAgentCommand(program) {
|
|
|
1103
1173
|
parkOnExit: options.parkOnExit, // false when --no-park-on-exit
|
|
1104
1174
|
bundlePath: options.bundle || null,
|
|
1105
1175
|
additionalDirectories,
|
|
1106
|
-
sandbox:
|
|
1107
|
-
cwd: process.cwd(),
|
|
1108
|
-
network: options.sandboxNetwork === true,
|
|
1109
|
-
settings: settingsSandbox,
|
|
1110
|
-
}),
|
|
1176
|
+
sandbox: interactiveSandbox,
|
|
1111
1177
|
autoCheckpoint,
|
|
1112
1178
|
// --vim: start the REPL in vim-mode editing (also CC_VIM=1 or /vim).
|
|
1113
1179
|
vimMode: options.vim === true,
|
|
@@ -103,10 +103,24 @@ async function loadSupervisor() {
|
|
|
103
103
|
return import("../lib/background-agent-supervisor.js");
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
export const LOG_TRUNCATION_NOTICE =
|
|
107
|
+
"--- log truncated/rotated, resuming from tail ---";
|
|
108
|
+
const TRUNCATION_RESUME_TAIL_BYTES = 4096;
|
|
109
|
+
|
|
110
|
+
export function readLogFromOffset(file, offset) {
|
|
107
111
|
if (!existsSync(file)) return { text: "", offset };
|
|
108
112
|
const text = readFileSync(file, "utf8");
|
|
109
|
-
if (offset > text.length)
|
|
113
|
+
if (offset > text.length) {
|
|
114
|
+
// Gap 3: the log shrank under us (rotation/truncation). Resetting the
|
|
115
|
+
// offset to 0 used to REPLAY the entire new file into the follow stream;
|
|
116
|
+
// resume from the current tail instead, with an explicit marker.
|
|
117
|
+
const from = Math.max(0, text.length - TRUNCATION_RESUME_TAIL_BYTES);
|
|
118
|
+
return {
|
|
119
|
+
text: `\n${LOG_TRUNCATION_NOTICE}\n${text.slice(from)}`,
|
|
120
|
+
offset: text.length,
|
|
121
|
+
truncated: true,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
110
124
|
return { text: text.slice(offset), offset: text.length };
|
|
111
125
|
}
|
|
112
126
|
|
|
@@ -597,6 +611,36 @@ export function registerBackgroundSessionCommands(program) {
|
|
|
597
611
|
}
|
|
598
612
|
});
|
|
599
613
|
|
|
614
|
+
// daemon rm — record cleanup (gap-analysis 2026-07-11 P0 后台 Supervisor).
|
|
615
|
+
daemon
|
|
616
|
+
.command("rm <id>")
|
|
617
|
+
.description(
|
|
618
|
+
"Remove a finished background agent's record + log (running agents need --force; the conversation session itself is untouched)",
|
|
619
|
+
)
|
|
620
|
+
.option("--force", "Stop a still-running agent first, then remove")
|
|
621
|
+
.option("--keep-log", "Keep the log file, remove only the state record")
|
|
622
|
+
.option("--json", "Output as JSON")
|
|
623
|
+
.action(async (id, options) => {
|
|
624
|
+
try {
|
|
625
|
+
const { removeBackgroundAgent } = await loadSupervisor();
|
|
626
|
+
const result = removeBackgroundAgent(id, {
|
|
627
|
+
force: options.force === true,
|
|
628
|
+
keepLog: options.keepLog === true,
|
|
629
|
+
});
|
|
630
|
+
if (options.json) {
|
|
631
|
+
console.log(JSON.stringify(result, null, 2));
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
logger.log(
|
|
635
|
+
chalk.green(`Removed background agent ${result.id}`) +
|
|
636
|
+
chalk.gray(` (was ${result.status})`),
|
|
637
|
+
);
|
|
638
|
+
} catch (error) {
|
|
639
|
+
logger.error(chalk.red(error.message));
|
|
640
|
+
process.exitCode = 1;
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
|
|
600
644
|
daemon
|
|
601
645
|
.command("stop [id]")
|
|
602
646
|
.description("Stop one background agent, or all running agents with --any")
|
package/src/commands/mcp.js
CHANGED
|
@@ -999,6 +999,52 @@ export function registerMcpCommand(program) {
|
|
|
999
999
|
});
|
|
1000
1000
|
|
|
1001
1001
|
// mcp scaffold — generate a boilerplate MCP server project
|
|
1002
|
+
mcp
|
|
1003
|
+
.command("trust-project")
|
|
1004
|
+
.description(
|
|
1005
|
+
"Re-trust the project .mcp.json after reviewing a content change (records its fingerprint for --project-mcp runs)",
|
|
1006
|
+
)
|
|
1007
|
+
.option("--json", "Output as JSON")
|
|
1008
|
+
.action(async (options) => {
|
|
1009
|
+
try {
|
|
1010
|
+
const fsMod = await import("node:fs");
|
|
1011
|
+
const { projectRootBase } = await import("../lib/project-root.cjs");
|
|
1012
|
+
const { recordProjectMcpTrust, projectMcpFingerprint } =
|
|
1013
|
+
await import("../lib/project-mcp-trust.js");
|
|
1014
|
+
const cwd = process.cwd();
|
|
1015
|
+
const candidates = [path.join(cwd, ".mcp.json")];
|
|
1016
|
+
const root = projectRootBase(cwd, { fs: fsMod.default, path });
|
|
1017
|
+
if (root) candidates.push(path.join(root, ".mcp.json"));
|
|
1018
|
+
const results = [];
|
|
1019
|
+
for (const file of [...new Set(candidates)]) {
|
|
1020
|
+
if (!fsMod.existsSync(file)) continue;
|
|
1021
|
+
const content = fsMod.readFileSync(file, "utf-8");
|
|
1022
|
+
const ok = recordProjectMcpTrust(file, content);
|
|
1023
|
+
results.push({
|
|
1024
|
+
file,
|
|
1025
|
+
trusted: ok,
|
|
1026
|
+
fingerprint: projectMcpFingerprint(content).slice(0, 16),
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
if (options.json) {
|
|
1030
|
+
console.log(JSON.stringify(results, null, 2));
|
|
1031
|
+
return;
|
|
1032
|
+
}
|
|
1033
|
+
if (results.length === 0) {
|
|
1034
|
+
console.log("No .mcp.json found in this project.");
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
for (const r of results) {
|
|
1038
|
+
console.log(
|
|
1039
|
+
`${r.trusted ? "Trusted" : "FAILED to record"} ${r.file} (${r.fingerprint})`,
|
|
1040
|
+
);
|
|
1041
|
+
}
|
|
1042
|
+
} catch (err) {
|
|
1043
|
+
console.error(`Failed: ${err.message}`);
|
|
1044
|
+
process.exitCode = 1;
|
|
1045
|
+
}
|
|
1046
|
+
});
|
|
1047
|
+
|
|
1002
1048
|
mcp
|
|
1003
1049
|
.command("scaffold <name>")
|
|
1004
1050
|
.description("Scaffold a new MCP server project (stdio or http+sse)")
|
package/src/commands/session.js
CHANGED
|
@@ -534,6 +534,76 @@ export function registerSessionCommand(program) {
|
|
|
534
534
|
}
|
|
535
535
|
});
|
|
536
536
|
|
|
537
|
+
// session rename — named sessions (gap-analysis 2026-07-11 快速收益 #5).
|
|
538
|
+
// Appends a session_rename event (hash chain stays intact); last one wins.
|
|
539
|
+
session
|
|
540
|
+
.command("rename")
|
|
541
|
+
.description("Rename a headless (JSONL) session — shows up in session list")
|
|
542
|
+
.argument("<id>", "Session ID")
|
|
543
|
+
.argument("<title...>", "New title")
|
|
544
|
+
.option("--json", "Output as JSON")
|
|
545
|
+
.action(async (id, title, options) => {
|
|
546
|
+
try {
|
|
547
|
+
const { renameSession } =
|
|
548
|
+
await import("../harness/jsonl-session-store.js");
|
|
549
|
+
const result = renameSession(
|
|
550
|
+
id,
|
|
551
|
+
Array.isArray(title) ? title.join(" ") : title,
|
|
552
|
+
);
|
|
553
|
+
if (options.json) {
|
|
554
|
+
console.log(JSON.stringify(result, null, 2));
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
logger.success(`Renamed session ${result.id}`);
|
|
558
|
+
logger.info(` ${result.title}`);
|
|
559
|
+
} catch (err) {
|
|
560
|
+
logger.error(`Failed: ${err.message}`);
|
|
561
|
+
process.exitCode = 1;
|
|
562
|
+
}
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
// session prune — retention sweep (gap-analysis 2026-07-11 P1 "保留期限").
|
|
566
|
+
session
|
|
567
|
+
.command("prune")
|
|
568
|
+
.description(
|
|
569
|
+
"Delete JSONL sessions whose last activity is older than a cutoff (newest N always kept)",
|
|
570
|
+
)
|
|
571
|
+
.requiredOption(
|
|
572
|
+
"--older-than <days>",
|
|
573
|
+
"Delete sessions idle for more than this many days",
|
|
574
|
+
)
|
|
575
|
+
.option("--keep <n>", "Always keep the newest N sessions (default 10)")
|
|
576
|
+
.option("--dry-run", "List what would be deleted without deleting")
|
|
577
|
+
.option("--json", "Output as JSON")
|
|
578
|
+
.action(async (options) => {
|
|
579
|
+
try {
|
|
580
|
+
const { pruneJsonlSessions } =
|
|
581
|
+
await import("../harness/jsonl-session-store.js");
|
|
582
|
+
const result = pruneJsonlSessions({
|
|
583
|
+
olderThanDays: Number(options.olderThan),
|
|
584
|
+
keep: options.keep != null ? Number(options.keep) : undefined,
|
|
585
|
+
dryRun: options.dryRun === true,
|
|
586
|
+
});
|
|
587
|
+
if (options.json) {
|
|
588
|
+
console.log(JSON.stringify(result, null, 2));
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
const verb = result.dryRun ? "Would delete" : "Deleted";
|
|
592
|
+
logger.info(
|
|
593
|
+
`${verb} ${result.deleted.length} of ${result.scanned} session(s).`,
|
|
594
|
+
);
|
|
595
|
+
for (const id of result.deleted.slice(0, 50)) {
|
|
596
|
+
logger.info(` - ${id}`);
|
|
597
|
+
}
|
|
598
|
+
if (result.deleted.length > 50) {
|
|
599
|
+
logger.info(` … and ${result.deleted.length - 50} more`);
|
|
600
|
+
}
|
|
601
|
+
} catch (err) {
|
|
602
|
+
logger.error(`Failed: ${err.message}`);
|
|
603
|
+
process.exitCode = 1;
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
|
|
537
607
|
session
|
|
538
608
|
.command("migrate")
|
|
539
609
|
.description("Migrate legacy JSON session files to JSONL")
|
package/src/data/changelog.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"releases": [
|
|
4
4
|
{
|
|
5
5
|
"productVersion": "Unreleased",
|
|
6
|
-
"cliVersion": "0.162.
|
|
6
|
+
"cliVersion": "0.162.161",
|
|
7
7
|
"cliVersions": [
|
|
8
8
|
"0.4.46",
|
|
9
9
|
"0.4.51",
|
|
@@ -17,11 +17,21 @@
|
|
|
17
17
|
"0.162.156",
|
|
18
18
|
"0.162.157",
|
|
19
19
|
"0.162.158",
|
|
20
|
-
"0.162.159"
|
|
20
|
+
"0.162.159",
|
|
21
|
+
"0.162.160",
|
|
22
|
+
"0.162.161"
|
|
21
23
|
],
|
|
22
24
|
"date": null,
|
|
23
25
|
"title": "",
|
|
24
26
|
"sections": [
|
|
27
|
+
{
|
|
28
|
+
"heading": "Added — cc CLI 0.162.161:增量 gap-analysis(P0 后台状态机/跨 Agent 授权/凭据代理 + P1 完成条件/Monorepo 排除/持久 Scheduler)+ bg-* WS relay 协议硬化(CLI-only npm 发版)",
|
|
29
|
+
"body": "> `chainlesschain` 0.162.160 → **0.162.161** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` + `packages/agent-sdk` 协议增量;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令面无新顶层命令(`cc agenda list` 增 `nextWakeupAt` 字段),**顶层命令数 175 不变**。对照 `docs/CLAUDE_CODE_CLI_INCREMENTAL_GAP_ANALYSIS_2026-07-12.md`(vs Claude Code v2.1.207)逐节落地 P0/P1 Windows-可做、自包含、全测试的最有价值切片,每节文档记录「已落地」与「仍欠」。\n>\n> 全部为纯核 + 时钟注入(无 timer/RNG,确定性可测)+ 最小真实接线的低风险增量;已落地增量的 9 个测试文件 148 测全绿。\n\n- **跨事件 `trace_id`(协议 §1.2.1)**:stream-json 每行标注 run-scoped `trace_id`(`--trace-id` / `CC_TRACE_ID` / 自动生成),`sanitizeTraceId` 限字符集 `[A-Za-z0-9._:-]`≤128,供跨进程/跨 Agent 事件关联。\n- **后台 Agent 状态机(P0)**:拆分 Idle 与 Needs-input——`background-agent-phase.js` 归一化 phase(starting/working/idle/needs_input/waiting_permission,legacy `turn`→working),`phaseGroupKey` 让 `cc` 后台仪表板把「空闲」与「待输入/待批准」分组显示,不再混为一谈。\n- **跨 Agent 授权边界(P0 安全)**:`agent-authority.js` 授权信封——`origin`(user/model/subagent/teammate/channel/hook/remote/system/permission_tool)→ `authority`(none/steer/approve/manage),仅 user=manage、permission_tool=approve、已认证且 approve-scoped 的 remote=approve 可批准;`approvalBindingDigest({toolCallId,args,policyDigest})` 常数时间校验、fail-closed,防止一个 Agent 冒用另一个的批准。`origin` 恒由可信 dispatch 赋值,绝不从消息内容读取。\n- **跨平台沙箱与凭据代理(P0)**:`credential-proxy.js`——子进程环境默认屏蔽长效凭据(`maskCredentialEnv` 把 secret 值换成哨兵 `cc-cred-redacted:<NAME>`,`mask`/`deny` 双模式),审计日志绝不记录还原后的明文(`redactEnvForAudit`),`resolveApprovedInjection` 按 approved-host fail-closed 注入;`CC_CREDENTIAL_PROXY` 开关,关闭时同对象引用零开销。接线到 agent-core 前后台两处 spawn。\n- **会话级完成条件引擎(P1)**:`goal-condition-engine.js`——确定性完成条件(`exit-zero:`/`file-exists:`/`contains:`/`regex:`/`model:`/裸),预算(maxOuterTurns 默认 10、硬顶 100)+ 纯 reducer `evaluateGoalStep`,`GoalConditionEngine` 支持 snapshot/fromSnapshot 恢复;确定性检查经注入 spawnSync/existsSync 可测。\n- **大型 Monorepo 上下文排除(P1)**:`instructionExcludes`——`project-instructions.js` 支持按 glob 排除 legacy/vendor/generated 子树(裸名=任意段匹配、带斜杠前缀=目录+后代、`*`/`**`/`?` 通配、祖先匹配语义),@import 目标落在排除子树内也跳过(避免把凭据文件拉进 prompt);`composeSystemPrompt` 透传 `instructionExcludes`。\n- **统一持久 Scheduler 规划器(P1)**:`schedule-planner.js`——确定性 jitter(FNV-1a 稳定 per-task 偏移,跨重启不漂移,避免共享 cron 分钟的惊群)、自适应唤醒(`nextWakeupAt`/`msUntilNextWakeup` 让 daemon 睡到最早 fire 而非轮询)、过期(`isEntryExpired`/`partitionSchedule` 先退休过期再触发);接线到 `cc agenda list`(JSON `nextWakeupAt` + \"next wakeup\" 行)。\n- **bg-* WS relay 协议硬化**:事件序号缺口检测 + replay(慢/断线消费者补投)、出站背压(slow-consumer 保护)、跨语言 fixture 契约 + `tool_use_id` + event seq,IDE 上报文件路径的 remote URI/path 映射,MCP tool-path 边界守卫 + Windows lockfile ACL,diff-apply 并发/二进制守卫 + 读取实时编辑器缓冲的 stale-rejection,后台 Agent supervisor 3 个 pinned gap 收口 + 有界 prompt 队列。"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"heading": "Added — cc CLI 0.162.160:运行时安全与确定性 8 批(沙箱严格模式 + 依赖/凭据安全 + 确定性 Headless + Subagent 契约 + MCP 生命周期 + Hooks 硬化)(CLI-only npm 发版)",
|
|
33
|
+
"body": "> `chainlesschain` 0.162.159 → **0.162.160** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令面**只加子命令**(`cc session rename/prune`、`cc daemon rm`、`cc mcp trust-project`),**顶层命令数 175 不变**(manifest 无需重生)。对照 `docs/CLAUDE_CODE_CLI_GAP_ANALYSIS.md`(docs 根)审计确认仍缺的 8 项全落地(commit 链 `c4533ad848..4c2e297754`)。\n>\n> ⚠️ **行为变更(升级前须知)**:① `run_code` 的 pip 依赖**默认不再自动安装**(改 opt-in,见下);② agent 脚本默认写 OS 临时目录、不再落项目根(`persist:true` 才进项目);③ headless/agent **退出码细化**——最大轮次→3、预算超限→4、模型错误→5、配置错误→6(成功仍 0、通用失败仍 1、hook block 仍 2、SIGINT/SIGTERM 仍 130/143)。依赖固定 exit≠0 判失败的脚本不受影响;依赖\"失败必为 1\"的脚本需放宽。\n\n- **确定性 Headless(A)**:新增 `--ephemeral`(resume 只读回放、零落盘);init 事件补 `protocol_version`/`session_persistence`/`loaded_sources`/`policy_digest`/`tools_hash`/`isolation_level`(消费者可判定回放确定性与工具/策略指纹);退出码分类(`lib/exit-codes.cjs`);`cc agent --capabilities` 打印机读能力清单(协议版本、agent 工具集、权限模式、退出码、特性开关)后退出。\n- **依赖安装安全(B)**:`run_code` 的 pip 自动安装**默认关闭**——经 settings `runCode.autoInstall` 或 `CC_RUN_CODE_AUTO_INSTALL` 显式开启,且受 `runCode.installAllowlist`(PEP 503 归一化包名)约束,每次安装写审计 JSONL(`~/.chainlesschain/audit/`,`CC_AUDIT_DIR` 可覆盖);agent 脚本默认写 OS 临时目录(`persist:true` 才进项目根)。系统提示词/工具契约文案已同步。\n- **凭据卫生(C)**:config `llm.apiKeyHelper`——从外部命令(→ OS 凭据库)解析 API Key,5 分钟缓存,helper 失败 **fail-closed 并告警一次**(返回 null,绝不静默替换成别的凭据);argv `--api-key` 明文传参现给出告警(进程表/shell 历史泄露面)。\n- **沙箱严格模式(D)**:`failIfUnavailable` 此前只是声明、从不执行——现在启动期探测沙箱引擎(docker `version` / bwrap `--version`),不可用即拒绝启动(退出码 6),headless 与交互双路均生效;`isolation_level`(os-sandbox / container / policy-only)透出到 init 事件与 `sandboxSummary`,不再静默降级为\"只有工具规则\"。\n- **Subagent 契约(E)**:`spawn_sub_agent` 与 `.claude/agents/*.md` frontmatter 双入口新增 `disallowedTools`(从 allowedTools 减去)、`maxTurns`、`isolation:worktree`。**顺手修出一个真 bug**:`SubAgentContext._runCore` 早已算出工具白名单却从未传给 agentLoop——子代理在 LLM 面一直看到全量工具,白名单形同虚设(修=`enabledToolNames` 透传)。\n- **会话运营(F)**:`cc session rename <id> <title>`(append `session_rename` 事件,哈希链不破)+ `cc session prune --older-than <days> [--keep N] [--dry-run]`(按最后活动保留期清理,默认保最新 10)+ `cc daemon rm <id> [--force] [--keep-log]`(终态直接移除、运行中需 `--force`)。\n- **MCP 生命周期(G)**:mcp-client 处理 `notifications/tools/list_changed` + `notifications/resources/list_changed`——合并式重拉服务器工具/资源清单(刻意**不动 in-flight LLM 工具数组**,保 tool-search 缓存稳定性,追加式更新);项目 `.mcp.json` 首用记 sha256 指纹,文件变更后 **fail-closed 拒绝加载**,需 `CC_PROJECT_MCP_TRUST=1` 或 `cc mcp trust-project` 显式重信任(防被换过的项目配置静默拉起新 MCP server)。\n- **Hooks 硬化(H)**:每个 hook 的 stdin payload 打 `schema_version`(=1,additive 变更保号、破坏性 reshape 才 bump);连续失败熔断——同一 hook 命令连续 3 次非阻塞失败(spawn error / 超时 / 非 2 非零退出)开闸,60s 冷却后半开试跑一次,成功或真 block/ask 决策关闸(`CC_HOOK_BREAKER_THRESHOLD=0` 关闭、`CC_HOOK_BREAKER_COOLDOWN_MS` 可调);坏 hook 不再每轮拖慢 agent。"
|
|
34
|
+
},
|
|
25
35
|
{
|
|
26
36
|
"heading": "Added — cc CLI 0.162.159:Claude-Code 平价 gap-analysis 14 项收口(cloud handoff + /tui + /voice + /fast + plugin 治理 + session SQLite 索引)(CLI-only npm 发版)",
|
|
27
37
|
"body": "> `chainlesschain` 0.162.158 → **0.162.159** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。顶层命令数 **173 → 175**(新增 `cc cloud` + `cc routine`;`cc session index` 是 `session` 子命令、`/tui` `/voice` `/fast` 为 REPL-only 均不计数)。对照 `docs/internal/cli-claude-code-gap-analysis-2026-07-11.md` 14 项全落地。\n\n- **`cc cloud`(P1#7)自托管 cloud handoff**:`cc cloud run/status/attach/list`——`git bundle`(base64)当前分支上传到配置的私有 runner(`cloud.baseUrl`/`cloud.token` 或 `CC_CLOUD_URL`/`CC_CLOUD_TOKEN`),runner 完成后 `cc cloud attach` 轮询到终态并 `git apply --3way` 回流 patch、落 plan/artifacts、显示 PR——无 Anthropic 云依赖。本地 job 台账 `~/.chainlesschain/cloud-jobs/`(穿越守卫),不落地的 patch 存旁不失败。\n- **`/tui`(P1#10)全屏无闪烁视图**:`/tui fullscreen` 进备用屏缓冲(`?1049h`,保滚动历史)+ 尾锚定视口窗口化 + diff 重绘(仅改动行光标寻址重写,无整屏清屏→无闪烁);`/tui default` 退回流式滚动;`CC_NO_FLICKER=1` 启动即全屏;屏幕阅读器模式强制 default。持久化 `cli.tuiMode`。\n- **`/voice`(P2#11)语音听写**:`/voice hold|tap|off`(hold=按住说话,tap=切换);严格 local-first STT 优先级(本地 Whisper > 系统 STT > 云,云需 `voice.allowCloud` 显式开);SSH/无 TTY/CI/`CC_NO_VOICE` 环境清晰降级不假装监听;真实采集是主机绑定 DI seam。\n- **`/fast`(P2#12)延迟档**:`/fast on|off|status`——下一轮最小化推理(thinking off)+ 除非用户 `/model` 钉过模型否则换到 provider 的低延迟模型(anthropic→haiku-4-5、openai→4o-mini、deepseek/dashscope/mistral/gemini),始终显示成本/质量权衡。持久化 `cli.fastMode`。\n- **插件治理(P2#13)三项**:manifest `dependencies`(插件名→semver 区间 + 保留 `host`/`cc` 约束 CLI 版本)经 `cc plugin validate` 校验缺失/越界依赖;LSP 注册表改**每 languageId 有序候选表**——一个插件 LSP server 二进制缺失不再遮蔽 builtin(回退到下一候选/内建,扩展名不再\"变黑\");`isPluginInUse` 把 LSP/MCP/hooks/monitors 被动组件视为 in-use,不再被\"未调用即弃用\"误判。\n- **`cc session index`(P2#14)外部 session 存储**:JSONL 仍是权威源,新增 SQLite 索引(`~/.chainlesschain/session-index.db`)——增量按 mtime+size 同步 + 内容/标题搜索(LIKE 转义通配符)+ stats + `--rebuild`,取代逐文件解析(1072 真 session 验过);可插拔 off-box mirror(`fs`/`http` 驱动,S3/WebDAV/Redis 同接口待配),`session.mirror.{kind,dir|baseUrl,token}` 配置,加密/访问控制由驱动独立负责。\n- **P0/P1 早前提交同随本版发出**:`cc bg view` 交互式 agent 面板(P0#1)+ background supervisor 稳定性加固(P0#2)+ `/doctor` 可修复 checkup + `/checkup` 别名(P0#3)+ transcript hash-chain 防篡改 `cc session verify`(P0#4)+ Inbound Channels(webhook/telegram allowlist,P0#5)+ computer-use MCP 显式开启(P1#6)+ Routines(cron/once/webhook/github,P1#8)+ PR/session linking(P1#9)。"
|