chainlesschain 0.162.167 → 0.162.169
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/assets/{AIOps-BZJrchIA.js → AIOps-DCeNRK8z.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Bhlrylt7.js → ActionButton-ZfD0HgVe.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-pHtXVQYs.js → Analytics-Ccn40f9E.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-ORpuri4R.js → AppLayout-DyXs4nSt.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-eC77yr1_.js → Artifacts-CYjMh5KR.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B2dZIiqz.js → Audit-DZIhvx88.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-COZiTiwP.js → BackgroundAgents-C1XJsa2d.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-vY_Srl5d.js → Backup-CMXC0oUN.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Dili5BdM.js → BaseInput-CRVmIH1t.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-EzKBf0XL.js → Chat-acBud5Yj.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D1CtRAyy.js → ChatBubbleRenderer-CTjqFhdD.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Beh6BmuW.js → Checkbox-CZem825o.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-C3fA6kBU.js → Codegen-B9UjZsww.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CefMqONH.js → Col-Dtu6Frtj.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CBAxFJtB.js → Community-9bV55Huv.js} +1 -1
- package/src/assets/web-panel/assets/{Compact--flHc-sM.js → Compact-g-kQ4c84.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CPeNLvA6.js → Compliance-CQjHzBO1.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bv5yv4BU.js → Cowork-D1Qm_Xhi.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-C22yMEas.js → Cron-992qo8zX.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dsb2bcpu.js → Crosschain-4TiqEwuc.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DAxei4w0.js → DID-BbsXzXCb.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DEUwuVZ8.js → Dashboard-Dx5aO9d3.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BVp4si2j.js → Dropdown-BhzW6i6i.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CyFkybOG.js → EmailListRenderer-qEib4yiq.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BWmmsbVx.js → FamilyGuardDashboard-BZ3N-u3h.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Cxw27A5d.js → Federation-CcOqwzHY.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Q9XthzL1.js → FormItemContext-dbi8mohd.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DS5DIdsW.js → GenericCardRenderer-57dqulUe.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BOliHfxP.js → Git-DtSV7C5g.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CD4oxa-W.js → Governance-CLnmH-RD.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CMlcivo8.js → Inference-wXiLeDnk.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BwhERcC4.js → KnowledgeGraph-NGdIX2Gx.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BjVcZR5P.js → Logs-Dz0HQn69.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CSRZ9da3.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DQLU3E2w.js → Marketplace-DpPDmY3W.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CeK0XkpB.js → McpTools-UMysoRQm.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DLFkgwaz.js → Memory-DsnBpQnY.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Bh6ymXyj.js → MobileBridge-DweooAfG.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-D950tUIe.js → MobileProjects-UdLfZOVA.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Bx5x9_2m.js → Mtc-oXWhJNgC.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-a1-Fexsq.js → MtcAudit-CXTD7qrm.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-eaw0X8X1.js → Multisig-BKt5mJ9O.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BaNsPV4k.js → NLProgramming-C-zcYzje.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C7pevN2X.js → Notes-CGaZ_jep.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-HDqeoP0r.js → NotificationSettings-BwX-tDbq.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DvzVl5T3.js → OrderTableRenderer-Cc9Se8H-.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D_xHDlGW.js → Organization-8BXdC7Im.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-B5sRnueL.js → Overflow-zCisFuGU.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-C-IRjOPW.js → P2P-BehHH9Ro.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DVuXYKAR.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-Bm_T1uWw.js → Permissions-BVDATm3p.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-DujDllye.js → PersonalDataHub-C43nnYoi.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DyNPOLIG.js → Pipeline-D9E7aSVD.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CYKTW3iK.js → Privacy-CRbIchdL.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CGf03uZ0.js → ProjectInit-CTsy8lhL.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DIec4bTI.js → ProjectSettings-CPEKWWJ5.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BY43-bmi.js → Projects-CNnW0v5N.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-RrnUmgPk.js → Providers-BeZnDL9Y.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BBWfqd4y.js → QrScannerModal-CaydwuIU.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BsICSrFp.js → QuickAsk-qYWbu7kw.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-B8y0b4ys.js → Recommend-RV_ogHrM.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-0QgdB1Oe.js → RemoteSession-Mah1i41_.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DBJGM0YO.js → Reputation-xZQhGktc.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DtWQ5otv.js → Row-B6cVbPbJ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-2zBxHd5H.js → RssFeed-C6hKjDPz.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BofliSkZ.js → Search-0jti_-Pe.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ockRBBEL.js → Security-Cy48feGz.js} +3 -3
- package/src/assets/web-panel/assets/{Services-QyvG7Vd0.js → Services-BW3ObFxH.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DwbOndX3.js → Skeleton-CfrZRvAM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-cHWa63sZ.js → Skills-yoccdk3t.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BHnTEydQ.js → Sla-AKBBdri6.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DE2hrrLb.js → SpeechSettings-DH87GbkH.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CZ9vnbJH.js → SyncSettings-DUuO-ZSw.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-ZTUfOzMZ.js +1 -0
- package/src/assets/web-panel/assets/{Templates-DiR3ad4X.js → Templates-shPrQ4NE.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-NqcW3frV.js → Tenant-C_inPunR.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-iYeqRQZ0.js → Terminal-CvVtx6ie.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C5GOoxFz.js → TimelineRenderer-Bzp_T3Xc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-82dz0XdU.js → Tokens-kUFRLdtp.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B3JCNrOi.js → Trigger-BsTU2blQ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BehFYsN_.js → Trust-DEKkuAsi.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BfOxJjVf.js → UkeySign-D1KEEgbK.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DdITCCPz.js → VideoEditing-C2yYkm9W.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-B0EhkCmD.js → Wallet-BKKod4qb.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DJ4i1f3-.js → WebAuthn-XXUgED6d.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-Dr9XTqIT.js → WorkflowEditor-DnlEyYTi.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dc2nFyOj.js → chat-BaVjI6nu.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Drw9djBR.js → colors-DQ0yx43H.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BdLXbU52.js → compact-item-DEyWDp0v.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BpQMZiWY.js → createContext-SuPOfylZ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-C_RK48j-.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CbYwawHf.js → hasIn-CQz1JNtC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO7LD_1t.js → index-3xcB2i6I.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bo_KwJTF.js → index-57GdL9ro.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJQiSQw7.js → index-BHJhyrFr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTeqWdAS.js → index-BIgWgye3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSmZjrFy.js → index-BJEIjYhV.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7Ipfs4F.js → index-BffmUosH.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9_u4Qhe.js → index-ByGF9ev7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyU21xVi.js → index-C-IKjQD3.js} +1 -1
- package/src/assets/web-panel/assets/{index-GG_MXjSL.js → index-C2k8eHyq.js} +3 -3
- package/src/assets/web-panel/assets/{index-Blv7c80V.js → index-C3Vlo45C.js} +1 -1
- package/src/assets/web-panel/assets/index-CDqhisfz.js +1 -0
- package/src/assets/web-panel/assets/{index-C1eo1Qkd.js → index-CEfLMvKf.js} +1 -1
- package/src/assets/web-panel/assets/{index-COoIIMbO.js → index-CGu-b0RE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu8Vy-mj.js → index-CI5jlfyn.js} +1 -1
- package/src/assets/web-panel/assets/index-CKUoX6Yi.js +1 -0
- package/src/assets/web-panel/assets/{index-BmQlot_u.js → index-COsmMpAO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWUN8c01.js → index-CZrARoXd.js} +1 -1
- package/src/assets/web-panel/assets/{index-IG3__pGj.js → index-C_fcNCoV.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1ANzVc6.js → index-CfVW-cd_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAq-4KqY.js → index-CgvnudM_.js} +1 -1
- package/src/assets/web-panel/assets/{index-aHrUfrv1.js → index-CnhJU5To.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_lkTnZ0.js → index-CpR6M7eQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWUoc9-s.js → index-D-gXgEsU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZxzdAI0.js → index-D5SY6Lwu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiGDrEt4.js → index-DB8AJ6T-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHMeEu-P.js → index-DNYVGZzG.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3Alz2QD.js → index-DWIuZ9bI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKQlF7Pw.js → index-DXczrVij.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKmz3Is-.js → index-Dfh6OJKz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIcEW07n.js → index-DhBeUGCp.js} +1 -1
- package/src/assets/web-panel/assets/{index-UX_Mfyfv.js → index-DjZ6szGM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBwQwtsE.js → index-DpPv8zeU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpmlTfpv.js → index-XjQfQBXH.js} +1 -1
- package/src/assets/web-panel/assets/{index-_vVucYqC.js → index-ZKOZ-YFJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-XYe6kBmi.js → index-ZMgCYtI7.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5KboakZ.js → index-fGgx2f1y.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3uRI8_y.js → index-fcA6tfBA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBueKSTR.js → index-v8PYYw05.js} +1 -1
- package/src/assets/web-panel/assets/{index-VIyNlXPX.js → index-wBsuJZcz.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DybC85E4.js → initDefaultProps-KetDXPXx.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BNNuyDg7.js → motion-BfAtwo2m.js} +1 -1
- package/src/assets/web-panel/assets/{move-Bm8gSjEN.js → move-BnJvzHgx.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CuHQvzzr.js → mtc-parser-DZxDclhM.js} +1 -1
- package/src/assets/web-panel/assets/{omit-lv4NO7Ng.js → omit-CmqfX2P_.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BoSMfjHq.js → pickAttrs-B2B2ahzC.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BOMDSvgz.js → placementArrow-C1SIgWRj.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C064Ubmu.js → responsiveObserve-Dy_adDTl.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CeqhbKoG.js → slide-hDO9sBPk.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CunFoYww.js → statusUtils-DlpTjRpg.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cxz3wPL7.js → styleChecker-DAv9eo6h.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DJsIaU2S.js → useFlexGapSupport-vfoXaeH8.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DnAygceJ.js → useFs-Dzji-S7v.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CrEUY7ta.js → usePersonalDataHub-jKcLN_Gj.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cq3rN2eT.js → vnode-DAWM5GgY.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-TMzcOx__.js → zoom-q3XgSOUd.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/plugin.js +49 -5
- package/src/data/changelog.json +18 -4
- package/src/harness/worktree-isolator.js +10 -2
- package/src/lib/agent-core.js +1 -0
- package/src/lib/background-agent-phase.js +22 -0
- package/src/lib/background-phase-reporter.js +153 -0
- package/src/lib/hook-runner.cjs +248 -36
- package/src/lib/install-command-policy.js +40 -1
- package/src/lib/lsp/code-intelligence.js +5 -1
- package/src/lib/lsp/workspace-roots.js +115 -0
- package/src/lib/session-lifecycle.js +3 -0
- package/src/lib/settings-hook-events.cjs +16 -3
- package/src/lib/sub-agent-context.js +13 -0
- package/src/runtime/agent-core.js +442 -89
- package/src/runtime/headless-runner.js +75 -8
- package/src/runtime/headless-stream.js +175 -2
- package/src/workers/background-agent-worker.js +22 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BfRhXdyG.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BqgUPlcU.js +0 -7
- package/src/assets/web-panel/assets/Tasks-DWgoAHvM.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CnfpDzMr.js +0 -1
- package/src/assets/web-panel/assets/index-CYTEB0tb.js +0 -1
- package/src/assets/web-panel/assets/index-CgsEp5bm.js +0 -1
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.169",
|
|
7
7
|
"cliVersions": [
|
|
8
8
|
"0.4.46",
|
|
9
9
|
"0.4.51",
|
|
@@ -25,13 +25,23 @@
|
|
|
25
25
|
"0.162.164",
|
|
26
26
|
"0.162.165",
|
|
27
27
|
"0.162.166",
|
|
28
|
-
"0.162.167"
|
|
28
|
+
"0.162.167",
|
|
29
|
+
"0.162.168",
|
|
30
|
+
"0.162.169"
|
|
29
31
|
],
|
|
30
32
|
"date": null,
|
|
31
33
|
"title": "",
|
|
32
34
|
"sections": [
|
|
33
35
|
{
|
|
34
|
-
"heading": "Added — cc CLI 0.162.
|
|
36
|
+
"heading": "Added — cc CLI 0.162.169:增量 gap-analysis 收口批——后台 Agent `needs_input`/`uncertain_side_effect` 真实生产者 + IDE stream 路径副作用台账 + post-edit 诊断多根 + plugin 安装入统一 install 审计(CLI-only npm 发版)",
|
|
37
|
+
"body": "> `chainlesschain` 0.162.168 → **0.162.169** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量(4 个 feat/fix commit + 测试 + gap-analysis 文档状态);未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。**无新增顶层命令,命令数 175 不变**。默认路径全部字节不变——唯一行为变化限**后台** agent 子进程(`ask_user_question` 从 `user_not_reachable` 变为 park 成 `needs_input`,前台/headless 不受影响)。\n\n- **P0 后台 Agent:`needs_input` + `uncertain_side_effect` 真实生产者(状态机相位收口)**:最后两个无生产者相位补齐。`uncertain_side_effect`——后台子进程 `--resume` 时 side-effect ledger reconcile 出 **UNKNOWN 结局**的不可逆操作(inspect 桶),即把 `phase:\"uncertain_side_effect\"` + 计数写进共享 state,Dashboard 归入 \"Needs input\"(unknown 必须人工确认);worker 在下一 turn/idle 边界清注解。`needs_input`(**提问**态,区别于审批)——后台 turn 子进程的 `ask_user_question` 现在有人接:把 `phase:\"needs_input\"` + `pendingQuestion:{question,options}` 写进 state、指示模型结束回合,用户经 attach 的回复作为下一 turn 到达;新纯核 `idlePhaseFor` 保证**未答问题在 idle 边界不降级为 Idle**。session-lifecycle/phase 词表/Dashboard 分组同步扩齐;前台运行不供 interaction → 既有 `user_not_reachable` 路径逐字节不变。\n- **P0-2 IDE stream 路径副作用台账(崩溃恢复补全第三路)**:crash-safe side-effect ledger(prepare→start→commit|fail 记账 + resume 时 verify-before-replay reconcile)此前只在单-prompt runner 与 WS bridge——IDE 双面板真正驱动的 **headless-stream**(`--input-format stream-json --resume`)没有:面板 worker 在 git push/publish/opaque shell 中途被杀,resume 后无恢复通知、可能盲目重放。现 stream 孪生路径同样记账(副作用 settle 前持久化快照),resume 时 reconcile 并把 Recovery notice 以 system 消息 + `raw/side_effect_recovery` 行双路发出(已发的 VS 0.37.16 / JB 0.4.60 面板已渲染该行)。匿名/`--ephemeral` 运行字节不变。\n- **P2 LSP:post-edit 诊断多根**:`_postEditDiagnostics` 的根选择不再恒 cwd——三个编辑工具(write_file/edit_file/edit_file_hashed)按**包含被编辑文件的根**(`pickRootForFile`,镜像 code_intelligence)做 server 探测与共享池 key,编辑 `--add-dir` 根内文件时诊断走它自己项目的语言服务器而非静默降级为无诊断。单根会话字节不变。\n- **P0 沙箱:plugin 安装入统一 install 审计(「下载并运行第三方代码」三入口收口)**:`cc plugin add`/`upgrade` 拉来的插件带可执行组件(bin/hooks/LSP/MCP 以进程运行),本质是 plugin-runtime 版的 `npm install -g`——现与 run_shell 安装、run_code 自动安装共用同一 opt-in 审计 trail(`CC_INSTALL_AUDIT`/settings `installPolicy` → `install-commands.jsonl`):新纯核 `classifyPluginInstall`(manager `cc-plugin`、`name@version`、**仅 user scope 判 global**、source URL + 已声明能力 token 随行),add 成功后与 upgrade **真落盘**新版本后记 `source:\"plugin_install\"`(up-to-date no-op 不记)。默认(策略关)零写;审计 best-effort 绝不破坏安装。"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"heading": "Added — cc CLI 0.162.168:增量 gap-analysis 第二批接线——后台 Agent「等待审批」真实状态 + hook 事件溯源(trace/parent)+ LSP 多根与重启退避默认开 + 严格 hook 合并真并行 + 大仓 subagent worktree/子树指令 + run_code install 审计(CLI-only npm 发版)",
|
|
41
|
+
"body": "> `chainlesschain` 0.162.167 → **0.162.168** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量(10 个 feat commit + 测试 + gap-analysis 文档状态);未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。**无新增顶层命令,命令数 175 不变**。绝大多数改动 opt-in / 默认路径字节不变;**两处默认行为变化**(均可 env 关):LSP 重启退避默认开(`CC_LSP_RESTART_BACKOFF_MS=0` 恢复旧行为)与子树指令懒注入默认开(`CC_SUBTREE_INSTRUCTIONS=0` 关)。\n\n- **P0 后台 Agent:`waiting_permission` 真实生产者**:后台 agent 卡在人工审批(`--permission-prompt-tool` / `--remote-control`)时不再永远显示 \"Working\"——agent 子进程(经 worker 注入的 `CC_BACKGROUND_AGENT_ID`)在审批 pending 期间把 `phase:\"waiting_permission\"` + 实时 `pendingApprovals` 计数写进共享 state,settle 即恢复;Dashboard \"Needs input\" 分组从此有真数据。前台运行返回同一 confirmer 函数对象、零 IO 字节不变;worker 在每回合开始与 idle 重置计数,被 SIGKILL 于审批中途的子进程不会把会话永久钉在 \"Needs input\"。\n- **P0 沙箱:统一 install 审计扩到 `run_code`**:分类器新识别模块调用 `python`/`python3`/`py` `-m pip install …`(含 `sudo` 包裹;`-m http.server`/`-m venv`/`setup.py install` 不误报);`run_code` 的 pip 自动安装 installed/failed 尝试在同一 opt-in 策略(`CC_INSTALL_AUDIT` / settings `installPolicy`)下落统一 `install-commands.jsonl`(`source:\"run_code_auto_install\"` + pip 分类 + global 判定)——一份审计覆盖所有「下载并运行第三方代码」入口。\n- **P2 Hooks:strictest-merge 决策合并(opt-in `CC_HOOK_STRICT_MERGE=1`)+ PreToolUse 真并行**:修掉真实安全缺口——原按序短路下**较早**的一个 `ask` 会掩盖**较晚**一个 hook 的 `block`(blocker 根本没跑)。开启后跑完全部匹配 hook 取最严(block>ask>allow>continue);PreToolUse 路径经异步 spawn **真并行**(wall-clock=最慢单 hook 而非求和,硬超时 SIGKILL 挂死 hook)。默认关=逐字节原短路行为。\n- **P2 Hooks:trace_id/parent_id 事件溯源**:PreToolUse / PostToolUse / PermissionRequest / SubagentStop 四个 payload 构造点现带 `event_id` + `trace_id`(本 run)+ `parent_id`(spawn 方 run);`spawn_sub_agent` 与隔离 `run_skill` 把父 trace 线程进子 loop,子 agent 的 hook 事件跨深度关联回父 trace。未线程时字段整个省略——legacy payload 字节不变;`CC_HOOK_EVENT_LOG` 开启时这些决策事件顺带可被 `cc hook replay` 寻址。\n- **P2 LSP:重启退避默认开 + 多根 workspace**:池化语言服务器重启退避默认 1s→2s→4s→8s 封顶(启动即崩的 server 不再毫秒级连爆 `maxRestarts` 次;`CC_LSP_RESTART_BACKOFF_MS` 覆盖、`=0` 恢复立即重生)。`code_intelligence` 现按**包含该文件的根**(containment 最深根胜)key 共享 server 池——`--add-dir` 根内的文件拿到它自己项目的语言服务器而非 cwd 的;`workspace_symbols` 跨全部根扇出合并、逐 symbol 标注 `root`。单根会话字节不变。\n- **P1 大仓:子树指令懒注入(tool-time)**:工具**首次访问**某子树(read_file / list_dir / write_file / edit_file / edit_file_hashed)时把该子树自带的 `cc.md`/`CLAUDE.md`/`AGENTS.md` 附到工具结果的 `subtreeInstructions` 字段(每子树每进程恰一次,honor `instructionExcludes`,fail-open)——monorepo 里 per-package 规则不再要求启动时全量注入。子树无指令文件(常态)零成本;`CC_SUBTREE_INSTRUCTIONS=0` 整体关闭。同批:post-edit 诊断从未排序裸 cap 20 改为 **severity 优先 + token 预算**封顶(error 先于 warning,`CC_EDIT_DIAGNOSTICS_TOKENS` 默认 2000)。\n- **P1 subagent/大仓三项收尾**:①subagent worktree spawn 透传 `sparsePaths`/`symlinkDirectories`(spawn-arg 胜 agent-file;隔离 worktree 只 checkout 任务需要的包 + junction 复用依赖目录);②agent-file frontmatter `background: true` 现真生效(此前只认调用方显式传参);③headless `--add-dir` 启动根 seed——`cc agent -p --add-dir` 现把完整根列表告知已连 MCP 服务器(`roots/list_changed`),此前它们的 `roots/list` 永远只见 cwd。"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"heading": "Added — cc CLI 0.162.167:增量 gap-analysis 收尾——P0 沙箱远程脚本执行检测 + 4 个生命周期事件钩子(CwdChanged/Worktree/InstructionsLoaded)+ doctor 孤儿子进程 + 4 项杂项接线(CLI-only npm 发版)",
|
|
35
45
|
"body": "> `chainlesschain` 0.162.166 → **0.162.167** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量(+ 测试 + gap-analysis 文档状态更新);未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。**无新增顶层命令,命令数 175 不变**;所有改动 opt-in / 默认路径字节不变。本版把 `docs/CLAUDE_CODE_CLI_INCREMENTAL_GAP_ANALYSIS_2026-07-12.md` 的多个可 Windows 落地「仍欠」项整批接线。\n\n- **P0 沙箱:run_shell 远程脚本执行检测**:新增统一「代码获取」分类器——把 20+ 包管理器安装命令(npm/pip/cargo/gem/go/apt/…)与 `curl … | sh` / `wget -O- | bash` 一类**下载即执行**的远程脚本归为一类,在 shell 审批时抬高风险地板并落审计(记录带 `remoteExec` 标记);`cat script.sh | sh`(本地文件)与 `curl -O file`(仅下载不执行)不误报。默认路径字节不变。\n- **P2 生命周期事件钩子——4 个命令层生产者**:为新的 settings.json 生命周期事件类型接上真实触发点(此前它们只在事件总线注册、无生产者、loader 不认、`cc doctor` 还会当 unknown-event 告警用户配的钩子):`CwdChanged`(REPL `/cd` 改工作目录后)、`WorktreeCreate`/`WorktreeRemove`(`cc agent --worktree` 会话 create/finish 一对,payload 含 branch/base_sha,remove 带 `removed`/`reason` 区分自动删与保留)、`InstructionsLoaded`(会话启动组装完项目指令块后,携本会话权威指令文件清单 `{path,scope,truncated}`,**绝不含文件内容**)。全部 observe-only、无注册 hook 时字节不变;`InstructionsLoaded` 经 `composeSystemPrompt` 可选回调拿**真正注入**的那份文件集(零漂移,非另行 re-discover)。三处会话入口(headless / stream / REPL)与 SessionStart 同点触发。\n- **P2 Doctor:孤儿 agent 子进程检测**:`cc doctor` 现从持久化的后台 agent 记录探活,标出「worker 已死但子进程仍在」或「会话已消失」的泄漏进程为 error 并给对应 `taskkill`/`kill` 修复命令(进程起始时间锚定,防 PID 复用误判;仅喂持久记录不做启发式全机扫描 → 零误报)。\n- **4 项杂项 gap 接线**:①async-hook 持久重唤队列 + 崩溃恢复(失败的 async-hook 重唤按会话落盘,`--resume` 时作「Recovery notice」系统消息恢复);②monorepo 附加根变更时向连接的 MCP 服务器广播 roots/list_changed(`/add-dir` + 启动 `--add-dir`);③`cc doctor` LSP 就绪安装缺口检查(源文件在但对应语言服务器未装 → 代码智能静默降级为文本搜索时告警);④Session Mirror at-rest 加密/删除/保留/密钥轮换(scrypt+AES-256-GCM,`cc session index --mirror-delete` / `--mirror-prune` / `--mirror-rotate`)。"
|
|
36
46
|
},
|
|
37
47
|
{
|
|
@@ -44,7 +54,11 @@
|
|
|
44
54
|
},
|
|
45
55
|
{
|
|
46
56
|
"heading": "Added — cc CLI 0.162.164:IDE 增量 gap-analysis (2026-07-13) 全批接线落地——凭据脱敏三导出面 / /rewind 从这里分支 / cc doctor 执行位置 / cc session pr-status / 复杂 Diff 行评论锚定 / 终端上下文策略 / worktree 清理安全闸 / 崩溃恢复台账 / 无人值守动作门 / 跨设备操作指纹(CLI-only npm 发版)",
|
|
47
|
-
"body": "> `chainlesschain` 0.162.163 → **0.162.164** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令面只加 **session 子命令 `cc session pr-status`** 与 REPL `/rewind <n> --branch`、`cc doctor` 新增「Execution context」诊断段 + 工具 flag,**顶层命令数 175 不变**。本版把 `docs/CLAUDE_CODE_IDE_INCREMENTAL_GAP_ANALYSIS_2026-07-13.md` 的可 Windows 落地项整批接线(纯核已建、本版补真实运行时/命令面接线,默认路径保持字节不变)。\n\n- **8.1 凭据脱敏三导出面全闸**:一份导出物离机必须朝「不泄漏」失败——`cc session export` 导出前对渲染 transcript 跑召回优先 secret-scan(命中替 `[REDACTED]`,脱敏计数写 stderr,`--no-redact` 保原值);OTLP `toOtlp()` 对 span/event 字符串属性(含 exception message)默认脱敏(`cc agent/team --otlp`、`cc eval`);诊断包 `cc doctor --export-bundle` 强制脱敏(P1-9)。三面共用同一 recall-first 扫描器。\n- **P0-2 崩溃恢复副作用台账**:两阶段记账 `prepare→start→commit|fail|unknown` 接进 headless 与 IDE/Bridge/Extension-Host resume——`--resume` reconcile 台账,started-未落定-非幂等 op 注入去标识「Recovery notice」而非盲目重跑;Diff-Apply 内容哈希幂等(old 已改+new 已在→幂等 no-op 不重写);外部操作 Idempotency Key + 0-重复副作用度量。\n- **P0-3「从这里分支」进 `/rewind`**:`/rewind <n> --branch [--write]`(`--fork` 别名)从选中 turn 派生独立会话,保留分支点之前历史并从此分叉,**父会话绝不被截断**;确定性分支 id + `session_branch` 血统事件 + 幂等重放 + traversal fail-closed。\n- **P1-1 复杂 Diff 行评论锚定**:review finding 锚到它所指的**代码**(file+baseHash+锚定行原文+上下文)而非裸坐标;agent 改文件后可 `reanchorComment` 重定位/标 outdated,绝不复用旧行号(接进 `review-pipeline` finding 输出 + `cc review` 尽力填 fileContents)。\n- **P1-2 终端上下文策略 + 后台任务脱敏**:`selectTerminalContextForModel` fail-closed(非显式 opt-in 绝不把终端 scrollback 塞进模型上下文)+ ANSI-strip→secret-redact→scrollback-cap;`check_shell {list}` / `/tasks` 后台任务快照对命令串脱敏并暴露 PID(stoppable 仅在握真 PID 时)。\n- **P1-4 PR/CI 监控 + 受控合并**:新子命令 `cc session pr-status [id] [--pr N] [--checks-file <json>] [--enable] [--json]`——从 PR-link ledger 取会话关联 PR,`gh pr view` 或 `--checks-file` 采信号,渲染状态条 + **默认关**的 auto-merge 合格性判定(穷举列未满足项:分支保护/Review/待审批/失败或 pending check/缺席必需 check)。\n- **P1-5 worktree 清理安全闸**:后台 agent worktree reaper 清理前过 fail-closed 安全闸——未提交/未追踪/未 push/关联 PR 任一命中即**保留**(旧「全清」逃生门 `force:true` 保留);`git` 读不出→保留(绝不销毁无法核实的工作)。\n- **P1-6 会话级 agent 工具准入 + 归因**:extension 层工具(run_skill/spawn_sub_agent/browser/schedule/publish_artifact/MCP)需 Capability+Policy+权限+预算+UI 五闸全过;每次调用记只带来源的安全归因(可落 transcript)。\n- **P1-7 执行位置一等属性**:`cc doctor` 新增「Execution context」诊断段——检测 ambient location(Codespaces/SSH/Container/WSL/Local),remote/unknown fail-closed 到只读地板并列 policy 违规;凭据只显示来源/作用域不显示值。\n- **P1-8 无人值守动作门**:`cc agenda` 定时/事件任务默认拦截 notify/publish_artifact 等高危外呼(`unattendedAllowlist` 显式放回);action-class 分级 fail-closed。\n- **P1-9 脱敏诊断包**:`cc doctor --export-bundle` 一键导出去标识诊断包(版本/平台/Capability/连接/脱敏事件/进程·端口·锁文件·worktree 摘要;默认不含源码/Key/Cookie/完整环境变量;导出前强制 secret-scan)。\n- **8.2 跨设备操作指纹**:远程审批 `remote-approval-bridge` 升级到全元组 `OperationApprovalRegistry`(工具名/规范化参数/目标环境/workspace/session/策略版本/有效期);`permission.request` 发完整指纹 + 短标识 + 无秘密摘要,`approval.resolve` 失败关闭(mismatch/superseded/duplicate/过窗)。\n- **Monorepo / P2 硬化**:worktree `sparsePaths` 稀疏检出 + `symlinkDirectories` 逃逸守卫接进 team runner;`cc doctor` 新增沙箱真能力/静默降级、重复 skill 影子、settings.json hook 配置静态校验、async-hook 可靠性健康检查;LSP 服务器可选指数退避重启;每 span 归一 OTel session/agent id + `permission.decision_id
|
|
57
|
+
"body": "> `chainlesschain` 0.162.163 → **0.162.164** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令面只加 **session 子命令 `cc session pr-status`** 与 REPL `/rewind <n> --branch`、`cc doctor` 新增「Execution context」诊断段 + 工具 flag,**顶层命令数 175 不变**。本版把 `docs/CLAUDE_CODE_IDE_INCREMENTAL_GAP_ANALYSIS_2026-07-13.md` 的可 Windows 落地项整批接线(纯核已建、本版补真实运行时/命令面接线,默认路径保持字节不变)。\n\n- **8.1 凭据脱敏三导出面全闸**:一份导出物离机必须朝「不泄漏」失败——`cc session export` 导出前对渲染 transcript 跑召回优先 secret-scan(命中替 `[REDACTED]`,脱敏计数写 stderr,`--no-redact` 保原值);OTLP `toOtlp()` 对 span/event 字符串属性(含 exception message)默认脱敏(`cc agent/team --otlp`、`cc eval`);诊断包 `cc doctor --export-bundle` 强制脱敏(P1-9)。三面共用同一 recall-first 扫描器。\n- **P0-2 崩溃恢复副作用台账**:两阶段记账 `prepare→start→commit|fail|unknown` 接进 headless 与 IDE/Bridge/Extension-Host resume——`--resume` reconcile 台账,started-未落定-非幂等 op 注入去标识「Recovery notice」而非盲目重跑;Diff-Apply 内容哈希幂等(old 已改+new 已在→幂等 no-op 不重写);外部操作 Idempotency Key + 0-重复副作用度量。\n- **P0-3「从这里分支」进 `/rewind`**:`/rewind <n> --branch [--write]`(`--fork` 别名)从选中 turn 派生独立会话,保留分支点之前历史并从此分叉,**父会话绝不被截断**;确定性分支 id + `session_branch` 血统事件 + 幂等重放 + traversal fail-closed。\n- **P1-1 复杂 Diff 行评论锚定**:review finding 锚到它所指的**代码**(file+baseHash+锚定行原文+上下文)而非裸坐标;agent 改文件后可 `reanchorComment` 重定位/标 outdated,绝不复用旧行号(接进 `review-pipeline` finding 输出 + `cc review` 尽力填 fileContents)。\n- **P1-2 终端上下文策略 + 后台任务脱敏**:`selectTerminalContextForModel` fail-closed(非显式 opt-in 绝不把终端 scrollback 塞进模型上下文)+ ANSI-strip→secret-redact→scrollback-cap;`check_shell {list}` / `/tasks` 后台任务快照对命令串脱敏并暴露 PID(stoppable 仅在握真 PID 时)。\n- **P1-4 PR/CI 监控 + 受控合并**:新子命令 `cc session pr-status [id] [--pr N] [--checks-file <json>] [--enable] [--json]`——从 PR-link ledger 取会话关联 PR,`gh pr view` 或 `--checks-file` 采信号,渲染状态条 + **默认关**的 auto-merge 合格性判定(穷举列未满足项:分支保护/Review/待审批/失败或 pending check/缺席必需 check)。\n- **P1-5 worktree 清理安全闸**:后台 agent worktree reaper 清理前过 fail-closed 安全闸——未提交/未追踪/未 push/关联 PR 任一命中即**保留**(旧「全清」逃生门 `force:true` 保留);`git` 读不出→保留(绝不销毁无法核实的工作)。\n- **P1-6 会话级 agent 工具准入 + 归因**:extension 层工具(run_skill/spawn_sub_agent/browser/schedule/publish_artifact/MCP)需 Capability+Policy+权限+预算+UI 五闸全过;每次调用记只带来源的安全归因(可落 transcript)。\n- **P1-7 执行位置一等属性**:`cc doctor` 新增「Execution context」诊断段——检测 ambient location(Codespaces/SSH/Container/WSL/Local),remote/unknown fail-closed 到只读地板并列 policy 违规;凭据只显示来源/作用域不显示值。\n- **P1-8 无人值守动作门**:`cc agenda` 定时/事件任务默认拦截 notify/publish_artifact 等高危外呼(`unattendedAllowlist` 显式放回);action-class 分级 fail-closed。\n- **P1-9 脱敏诊断包**:`cc doctor --export-bundle` 一键导出去标识诊断包(版本/平台/Capability/连接/脱敏事件/进程·端口·锁文件·worktree 摘要;默认不含源码/Key/Cookie/完整环境变量;导出前强制 secret-scan)。\n- **8.2 跨设备操作指纹**:远程审批 `remote-approval-bridge` 升级到全元组 `OperationApprovalRegistry`(工具名/规范化参数/目标环境/workspace/session/策略版本/有效期);`permission.request` 发完整指纹 + 短标识 + 无秘密摘要,`approval.resolve` 失败关闭(mismatch/superseded/duplicate/过窗)。\n- **Monorepo / P2 硬化**:worktree `sparsePaths` 稀疏检出 + `symlinkDirectories` 逃逸守卫接进 team runner;`cc doctor` 新增沙箱真能力/静默降级、重复 skill 影子、settings.json hook 配置静态校验、async-hook 可靠性健康检查;LSP 服务器可选指数退避重启;每 span 归一 OTel session/agent id + `permission.decision_id`。"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"heading": "Added — cc CLI 0.162.163:增量 gap-analysis last-mile 运行时接线——Subagent 契约全轴强制 / 跨 Agent 授权边界 / 完成条件引擎 / Turn↔Checkpoint 持久化 / hook 事件日志+replay / plugin consent 生命周期 / /goal 循环 / --json-schema / OTel(CLI-only npm 发版)",
|
|
61
|
+
"body": "> `chainlesschain` 0.162.162 → **0.162.163** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令面只加子命令(`cc agenda prune`、`cc plugin consent`、`cc hook replay`/`events-log`、`cc context --sources`)与 REPL slash(`/goal`)+ 工具参数/flag,**顶层命令数 175 不变**。本版把 0.162.162 announce 的多数纯核落成真实**运行时接线**,并补齐 `docs/CLAUDE_CODE_CLI_INCREMENTAL_GAP_ANALYSIS_2026-07-12.md` 各节的 last-mile「仍欠」。全套本地三层全绿(unit+integration 25,008 + e2e 628,0 真失败)。\n\n- **Subagent 契约全轴强制(P1)**:`_executeSpawnSubAgent` 真正消费 `resolveSubagentContract`(spawnArgs > agent-file > 父级天花板),tighten-only 强制 skills/mcp/hooks/memory capability INTERSECT、permissionMode(plan→只读工具集)、budget/effort/context、worktree fail-closed、递归深度/宽度上限;非 plan confirmer 线程化 + headless 与交互 REPL 均以运行模式播种子级天花板;子级专属无 confirmer ApprovalGate 强制 run_shell/run_code/browser_act 会话策略。\n- **跨 Agent 授权边界接线(P0)**:本地 headless 审批链路携带并校验 `tool_call_id + normalized_arguments + policy_digest` 绑定(重放/参数替换/错投的批准判 `binding-mismatch` 拒绝);入站 channel 事件显式打 steer authority(其载荷里的 \"approved\" 只是文本,不能代表用户批准)。\n- **会话完成条件引擎接线(P1)**:`--goal-condition <spec>`(exit-zero/file-exists/contains/regex/model)驱动 headless 外层回合,跨进程 `--resume` 续跑(持久 `goal_snapshot`),REPL `/goal <condition>` 交互入口;`goal_started/evaluated/completed/exhausted` 事件。\n- **Turn↔Checkpoint 绑定持久化 + coverage-aware /rewind(P1)**:绑定作为链式会话事件持久化;`/rewind` 打印诚实的 coverage/警告(副作用 / 缺 checkpoint / 对话-文件漂移),永不过度承诺可恢复范围。\n- **副作用台账崩溃恢复(P0 纯核)**:`side-effect-ledger.js` 两阶段记账 `prepare→start→commit|fail|unknown` + `reconcileSideEffects` 分桶 redo/inspect/skip(file-write/git-push/package-install 中途强杀不重复副作用)。\n- **持久 Scheduler/Monitor 扩展(P1)**:`cc agenda prune`(回收终态条目)+ 过期退休(`expiresAt`/`retireExpired`)+ Monitor 文件/HTTP/mtime-change 源(替每 tick spawn shell)+ agent `schedule` 工具透传 `expires`/`jitter` + 每任务 permission-mode/worktree/turn 预算。\n- **Plugin 能力 consent 生命周期(P1)**:consent 存储 + load-path chokepoint enforcement(opt-in)+ `cc plugin consent` + `add`/`upgrade` 渲染能力清单+diff+re-consent 提示 + doctor 未同意/坏 manifest 告警。\n- **Monorepo 上下文(P1)**:`instructionExcludes` 从分层 settings 接进 `composeSystemPrompt`(排除 legacy/vendor/generated 子树,含 @import)+ `cc context --sources`(逐来源 token 归因)+ 懒加载子树指令纯核。\n- **Hooks 持久事件日志 + Replay(P2)**:哈希链 JSONL 事件日志(opt-in `CC_HOOK_EVENT_LOG`)+ `cc hook replay`(决策类事件必显式 `--sandbox`,绝不 re-gate 真流程)/`cc hook events-log`(列出/校验链)。\n- **JSON Schema(P2)**:`--json-schema` 接受 inline JSON + 与 `stream-json` 兼容(终局 `structured_result` NDJSON 行)+ format/if-then-else 断言 + 约束式重试改用富校验器(带 RFC 6901 JSON Pointer 提示)。\n- **多 Agent Review(P2)**:`cc review --multi`(correctness/security/performance/tests 分维 finder 扇出)+ `--verify`(skeptic 复现剔除 refuted)+ high effort 自动双开。\n- **OTel(P2)**:`--otlp-content` opt-in 输出 prompt/response/tool_arguments(默认脱敏 `[redacted]`)+ 每 span 归一化 session/agent id。"
|
|
48
62
|
},
|
|
49
63
|
{
|
|
50
64
|
"heading": "Added — cc CLI 0.162.162:增量 gap-analysis 收尾(P1 Subagent 契约/Turn-Checkpoint 绑定/Plugin 能力 Schema + P2 Hooks 事件总线/JSON Schema/多 Agent Review + LSP 诊断/Doctor+文档+OTel)+ IDE gap P0(远程审批指纹/会话生命周期)(CLI-only npm 发版)",
|
|
@@ -163,9 +163,17 @@ export function pruneWorktrees(repoDir) {
|
|
|
163
163
|
return before - after;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
export async function isolateTask(repoDir, taskId, fn) {
|
|
166
|
+
export async function isolateTask(repoDir, taskId, fn, options = {}) {
|
|
167
167
|
const branchName = `agent/${taskId}`;
|
|
168
|
-
|
|
168
|
+
// options (large-monorepo): { sparsePaths, symlinkDirectories } forwarded to
|
|
169
|
+
// createWorktree so an isolated task only materializes the packages it needs
|
|
170
|
+
// and reuses approved dep dirs. Empty/absent → full checkout (byte-identical).
|
|
171
|
+
const { path: worktreePath } = createWorktree(
|
|
172
|
+
repoDir,
|
|
173
|
+
branchName,
|
|
174
|
+
undefined,
|
|
175
|
+
options || {},
|
|
176
|
+
);
|
|
169
177
|
|
|
170
178
|
try {
|
|
171
179
|
const result = await fn(worktreePath);
|
package/src/lib/agent-core.js
CHANGED
|
@@ -34,6 +34,11 @@ export const BACKGROUND_AGENT_PHASES = Object.freeze({
|
|
|
34
34
|
IDLE: "idle",
|
|
35
35
|
NEEDS_INPUT: "needs_input",
|
|
36
36
|
WAITING_PERMISSION: "waiting_permission",
|
|
37
|
+
// A resumed turn found irreversible side-effect operations whose outcome is
|
|
38
|
+
// UNKNOWN (the side-effect ledger's "inspect" bucket): the previous run died
|
|
39
|
+
// mid-flight, so a human/model must confirm before any replay. Grouped with
|
|
40
|
+
// the blocking phases — this is genuinely "look at me before continuing".
|
|
41
|
+
UNCERTAIN_SIDE_EFFECT: "uncertain_side_effect",
|
|
37
42
|
});
|
|
38
43
|
|
|
39
44
|
/**
|
|
@@ -56,6 +61,8 @@ const PHASE_ALIASES = new Map([
|
|
|
56
61
|
["waiting-permission", BACKGROUND_AGENT_PHASES.WAITING_PERMISSION],
|
|
57
62
|
["waiting_approval", BACKGROUND_AGENT_PHASES.WAITING_PERMISSION],
|
|
58
63
|
["awaiting_approval", BACKGROUND_AGENT_PHASES.WAITING_PERMISSION],
|
|
64
|
+
["uncertain_side_effect", BACKGROUND_AGENT_PHASES.UNCERTAIN_SIDE_EFFECT],
|
|
65
|
+
["uncertain-side-effect", BACKGROUND_AGENT_PHASES.UNCERTAIN_SIDE_EFFECT],
|
|
59
66
|
]);
|
|
60
67
|
|
|
61
68
|
/**
|
|
@@ -71,6 +78,7 @@ export function normalizeBackgroundAgentPhase(value) {
|
|
|
71
78
|
const BLOCKING_PHASES = new Set([
|
|
72
79
|
BACKGROUND_AGENT_PHASES.NEEDS_INPUT,
|
|
73
80
|
BACKGROUND_AGENT_PHASES.WAITING_PERMISSION,
|
|
81
|
+
BACKGROUND_AGENT_PHASES.UNCERTAIN_SIDE_EFFECT,
|
|
74
82
|
]);
|
|
75
83
|
|
|
76
84
|
/**
|
|
@@ -85,6 +93,20 @@ const BLOCKING_PHASES = new Set([
|
|
|
85
93
|
* `pendingApprovals` wins over `phase` because an approval that is genuinely
|
|
86
94
|
* pending blocks progress regardless of the phase label the worker last wrote.
|
|
87
95
|
*/
|
|
96
|
+
/**
|
|
97
|
+
* Phase the worker should persist when a turn ends and the session parks
|
|
98
|
+
* between turns. Normally that is `idle` — but when the turn's child parked an
|
|
99
|
+
* unanswered `ask_user_question` in the state file (`pendingQuestion`), the
|
|
100
|
+
* session is genuinely blocked on the user's reply and must keep advertising
|
|
101
|
+
* `needs_input` instead of demoting itself to Idle. Pure so the worker and
|
|
102
|
+
* tests share one rule.
|
|
103
|
+
*/
|
|
104
|
+
export function idlePhaseFor(state) {
|
|
105
|
+
return state && state.pendingQuestion
|
|
106
|
+
? BACKGROUND_AGENT_PHASES.NEEDS_INPUT
|
|
107
|
+
: BACKGROUND_AGENT_PHASES.IDLE;
|
|
108
|
+
}
|
|
109
|
+
|
|
88
110
|
export function phaseGroupKey(session) {
|
|
89
111
|
const status = session?.status;
|
|
90
112
|
if (status === "running") {
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* background-phase-reporter — the missing PRODUCER for the background-agent
|
|
3
|
+
* `waiting_permission` phase (P0 state-machine slice,
|
|
4
|
+
* CLAUDE_CODE_CLI_INCREMENTAL_GAP_ANALYSIS_2026-07-12 §"后台 Agent 状态机").
|
|
5
|
+
*
|
|
6
|
+
* The consuming contract has existed for a while: `background-agent-phase.js`
|
|
7
|
+
* normalizes `waiting_permission` and `pendingApprovals > 0` into the
|
|
8
|
+
* dashboard's "Needs input" group, and `session-lifecycle.js` folds them into
|
|
9
|
+
* `waitingApproval`. But nothing ever WROTE those fields — the worker only
|
|
10
|
+
* emits `turn`/`idle`, so a background agent blocked on a human approval
|
|
11
|
+
* (`--permission-prompt-tool`, `--remote-control`) showed as "Working"
|
|
12
|
+
* indefinitely while a decision was actually pending.
|
|
13
|
+
*
|
|
14
|
+
* The production seam is the agent CHILD process, not the worker: the worker
|
|
15
|
+
* spawns each turn with `CC_BACKGROUND_AGENT_ID` in the environment, and the
|
|
16
|
+
* only places a plain headless run genuinely blocks on a human are the
|
|
17
|
+
* confirmer overrides installed on the ApprovalGate. This module wraps those
|
|
18
|
+
* confirmers: while one is awaiting a decision it patches the shared state
|
|
19
|
+
* file with `phase: "waiting_permission"` + a live `pendingApprovals` count,
|
|
20
|
+
* and restores `phase: "turn"` when every pending approval has settled.
|
|
21
|
+
*
|
|
22
|
+
* Safety properties:
|
|
23
|
+
* - Disabled (no `CC_BACKGROUND_AGENT_ID`) → `wrapConfirmer` returns the
|
|
24
|
+
* SAME function object; zero reads, zero writes, byte-identical behavior
|
|
25
|
+
* for every non-background run.
|
|
26
|
+
* - Never resurrects a terminal session: writes are skipped when the current
|
|
27
|
+
* on-disk status is anything other than absent/"running" (mirrors the
|
|
28
|
+
* worker's own writeHeartbeat guard).
|
|
29
|
+
* - Best-effort throughout: a state-file hiccup must never break an approval.
|
|
30
|
+
* - IO is injectable so tests never touch the real user data dir.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import {
|
|
34
|
+
readBackgroundAgentState,
|
|
35
|
+
writeBackgroundAgentState,
|
|
36
|
+
} from "./background-agent-supervisor.js";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a phase reporter for the current process.
|
|
40
|
+
*
|
|
41
|
+
* @param {object} [opts]
|
|
42
|
+
* @param {string|null} [opts.agentId] background session id; defaults to
|
|
43
|
+
* `process.env.CC_BACKGROUND_AGENT_ID`. Falsy → disabled no-op reporter.
|
|
44
|
+
* @param {(id:string)=>object|null} [opts.readState] injectable state reader
|
|
45
|
+
* @param {(state:object)=>void} [opts.writeState] injectable state writer
|
|
46
|
+
*/
|
|
47
|
+
export function createBackgroundPhaseReporter(opts = {}) {
|
|
48
|
+
const agentId =
|
|
49
|
+
opts.agentId !== undefined
|
|
50
|
+
? opts.agentId
|
|
51
|
+
: process.env.CC_BACKGROUND_AGENT_ID;
|
|
52
|
+
const readState = opts.readState || readBackgroundAgentState;
|
|
53
|
+
const writeState = opts.writeState || writeBackgroundAgentState;
|
|
54
|
+
const enabled = typeof agentId === "string" && agentId.trim() !== "";
|
|
55
|
+
let pending = 0;
|
|
56
|
+
|
|
57
|
+
function patch(fields) {
|
|
58
|
+
if (!enabled) return false;
|
|
59
|
+
try {
|
|
60
|
+
const current = readState(agentId) || { id: agentId };
|
|
61
|
+
// Terminal states are owned by the worker/stopper — never write a
|
|
62
|
+
// "waiting" phase over a completed/failed/stopped record.
|
|
63
|
+
if (current.status && current.status !== "running") return false;
|
|
64
|
+
writeState({ ...current, id: agentId, ...fields });
|
|
65
|
+
return true;
|
|
66
|
+
} catch {
|
|
67
|
+
return false; // state persistence must never break the approval itself
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
enabled,
|
|
73
|
+
/** Current in-process pending-approval count (for tests/introspection). */
|
|
74
|
+
pendingCount() {
|
|
75
|
+
return pending;
|
|
76
|
+
},
|
|
77
|
+
/** A human approval just started blocking progress. */
|
|
78
|
+
beginApproval() {
|
|
79
|
+
if (!enabled) return;
|
|
80
|
+
pending++;
|
|
81
|
+
patch({
|
|
82
|
+
phase: "waiting_permission",
|
|
83
|
+
pendingApprovals: pending,
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
/** A previously reported approval settled (approved, denied, or failed). */
|
|
87
|
+
endApproval() {
|
|
88
|
+
if (!enabled) return;
|
|
89
|
+
pending = Math.max(0, pending - 1);
|
|
90
|
+
if (pending === 0) {
|
|
91
|
+
// Back to a live turn — the worker owns the turn/idle transition, we
|
|
92
|
+
// only hand the phase back to its steady in-turn value.
|
|
93
|
+
patch({ phase: "turn", pendingApprovals: 0 });
|
|
94
|
+
} else {
|
|
95
|
+
patch({ pendingApprovals: pending });
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* A resumed run found side-effect ops whose outcome is UNKNOWN (the
|
|
100
|
+
* ledger reconcile "inspect" bucket): surface `uncertain_side_effect` so
|
|
101
|
+
* the dashboard demands a look before anything is replayed. The worker
|
|
102
|
+
* clears the count at the next turn/idle boundary (the verify turn has
|
|
103
|
+
* then run its course), so this is a within-window annotation, not a
|
|
104
|
+
* sticky flag. Best-effort; returns whether the state was patched.
|
|
105
|
+
*/
|
|
106
|
+
reportUncertainSideEffects(count) {
|
|
107
|
+
if (!enabled) return false;
|
|
108
|
+
const n = Number(count);
|
|
109
|
+
if (!Number.isFinite(n) || n <= 0) return false;
|
|
110
|
+
return patch({
|
|
111
|
+
phase: "uncertain_side_effect",
|
|
112
|
+
uncertainSideEffects: Math.floor(n),
|
|
113
|
+
});
|
|
114
|
+
},
|
|
115
|
+
/**
|
|
116
|
+
* The model asked the user a question in a background turn
|
|
117
|
+
* (`ask_user_question`): there is no live channel to a human mid-turn, so
|
|
118
|
+
* the question is PARKED — recorded in the shared state as
|
|
119
|
+
* `pendingQuestion` with `phase: "needs_input"` (distinct from
|
|
120
|
+
* waiting_permission: this is a question, not an approval). The worker
|
|
121
|
+
* keeps `needs_input` through the idle boundary while the question is
|
|
122
|
+
* unanswered and clears it when the user's reply starts the next turn.
|
|
123
|
+
*/
|
|
124
|
+
reportQuestion(question) {
|
|
125
|
+
if (!enabled) return false;
|
|
126
|
+
const q = question && typeof question === "object" ? question : null;
|
|
127
|
+
return patch({
|
|
128
|
+
phase: "needs_input",
|
|
129
|
+
pendingQuestion: {
|
|
130
|
+
question: typeof q?.question === "string" ? q.question : "",
|
|
131
|
+
options: Array.isArray(q?.options) ? q.options : null,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Wrap a (potentially human-blocking) confirmer so the pending window is
|
|
137
|
+
* visible in the background state. Disabled → returns `confirmer`
|
|
138
|
+
* unchanged (same object identity, zero overhead).
|
|
139
|
+
*/
|
|
140
|
+
wrapConfirmer(confirmer) {
|
|
141
|
+
if (!enabled || typeof confirmer !== "function") return confirmer;
|
|
142
|
+
const self = this;
|
|
143
|
+
return async function phaseReportingConfirmer(...args) {
|
|
144
|
+
self.beginApproval();
|
|
145
|
+
try {
|
|
146
|
+
return await confirmer(...args);
|
|
147
|
+
} finally {
|
|
148
|
+
self.endApproval();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|