chainlesschain 0.162.176 → 0.162.178
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 +10 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BDLu5Elz.js → AIOps-DRftcSue.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-BFvUaMKR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-C0-Rru4P.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-bx-BCljj.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DAJ8B3Un.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-hOk4L1lr.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-3pbDpM9z.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-BtziGDn9.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-kmshphJ3.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-d7tGSosA.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CGHYrugQ.js → ChatBubbleRenderer-p-_PBpX_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-C4Eh4Tz5.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-r7gmhZyA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-U7mDaGlL.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-Bpu8aH1T.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CHb2XBJe.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-Cn_r4dey.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-CdMWfDcz.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BtnREHWy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BKI9TSzr.js} +1 -1
- package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-pkNubzzJ.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-1rrz1snN.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-DLyFVxDc.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-CtUWfYVq.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-B8eX2Qe4.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D8lsDGus.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-CRYt_aIw.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-ClKzY8_N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-BXj5Dney.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-Cm-I8RMz.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-CPvbhvgt.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-sYNDZaoi.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-BZY_3CRZ.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-up0BW6pv.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-C5MEJ2Qe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-ihdrn43I.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-Br8bPMlh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-BNntgrYW.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BdV915mw.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-A3wDmlqL.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CF-mBLWM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-Iy2k_MSo.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-kk0W7HUb.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-B5u5t_4S.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-BN0POf6_.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CHkSUrXB.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DwWQESuN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-DG6klrcC.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-BwJcKkgZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-BwOHG0in.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-CGMXe4TX.js} +4 -4
- package/src/assets/web-panel/assets/PersonalDataHub-ziYqg7-A.js +8 -0
- package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-BzJfeoGt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-DLh3Bblx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-USVWW36c.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-CiiOn62h.js} +2 -2
- package/src/assets/web-panel/assets/Projects-6V-PNmcA.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-CBPWWzpu.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-QVwoRUq3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-CXnR-2Vn.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-ClaNzjmF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C3rGw8vJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-Ci-OWAoP.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-DRhAwXOS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-BQLJQ2_y.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-QQUpkfFd.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-DdXKzuKT.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-x2Zh62Qd.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-GdY4KwRz.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BDHh17P0.js → Skills-Bv4tY1Fd.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-C3QnM-11.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-Bl3ytvmI.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-Wp9IwTsP.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DYQ_6lxj.js → Tasks-CF3rIrDe.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-CGfvVVM9.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-CVXmwQ3U.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-bvwrt03E.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-D0g74KhH.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-BH4IwzlT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-DJOpM533.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-B43EPRLr.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-BmBFG-em.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-n9oJwB8k.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-D5QeivHp.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-DcNy7igO.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BVjc7-5-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-Dy5Tfj3m.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C4c2CNZU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-DPa3O5vN.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-TLcfNA6_.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BAwdDA_5.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-D41LVFkp.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-0oevYjfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-388pLGJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-B8nLBZbv.js} +3 -3
- package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-BPTGAjee.js} +1 -1
- package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BPtrOBmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-BQiIxHBy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BSM1cHVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-BYPr9fkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-BsQ7Ev6i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-Btk9qLL2.js} +1 -1
- package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-BvmziZSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BvopLC_T.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-C7xhTVyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-CNk_ZooP.js} +1 -1
- package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CQrEHoOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CSxex23J.js} +1 -1
- package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-CVjgm992.js} +1 -1
- package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CWK4zOPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-CX0VsoP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-CXl0YPNG.js} +1 -1
- package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-Cip7LWml.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-Cq_hlWNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-CzZ49YZL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-D2Nkivlm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-DBUgRs4D.js} +1 -1
- package/src/assets/web-panel/assets/index-DEjVkdzq.js +1 -0
- package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-DNsBj2Ob.js} +1 -1
- package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Di4X8cfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-DljFsVGI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-Korc3QIe.js} +1 -1
- package/src/assets/web-panel/assets/index-LMOc5xrS.js +1 -0
- package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-MKZDje0H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-OHAfRu_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-WEJr8PL5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-WinCp6du.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-Yjr6cqSK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-iQ6gtFih.js} +1 -1
- package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-pt3s7yvV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-tQ3igERQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-BFZu87WZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-DJIo7qvt.js} +1 -1
- package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-Cfr5qknL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-Bgc-OadH.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-X3WI-TNp.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-pJhU9IxK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-BNg_Vj3T.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-TeSEGQ5-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-D_t_P0bv.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-DrrIMwAT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-BjZCuFRm.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-rTFdlqdQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BidCpfLX.js} +1 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-C5mHttA9.js +1 -0
- package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-BrbcRiHZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-PISX7AkR.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/__tests__/hub-wechat.test.js +45 -0
- package/src/commands/agenda.js +22 -6
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +16 -6
- package/src/commands/batch.js +79 -27
- package/src/commands/changelog.js +15 -4
- package/src/commands/context.js +33 -1
- package/src/commands/eval.js +21 -6
- package/src/commands/hook.js +2 -2
- package/src/commands/hub.js +473 -39
- package/src/commands/init.js +212 -110
- package/src/commands/llm.js +22 -6
- package/src/commands/loop.js +9 -2
- package/src/commands/skill.js +13 -1
- package/src/commands/statusline.js +3 -3
- package/src/data/changelog.json +53 -5
- package/src/gateways/ws/personal-data-hub-protocol.js +22 -2
- package/src/harness/background-task-manager.js +18 -6
- package/src/harness/background-task-worker.js +11 -18
- package/src/harness/golden-transcript.js +3 -0
- package/src/harness/mcp-client.js +9 -15
- package/src/harness/worktree-isolator.js +18 -21
- package/src/index.js +18 -7
- package/src/lib/agent-core.js +5 -0
- package/src/lib/agent-ipc-bus.js +12 -3
- package/src/lib/agent-team/team-worktree.js +28 -6
- package/src/lib/agent-worktree.js +20 -19
- package/src/lib/approval-authority-store.js +891 -0
- package/src/lib/async-hook-supervisor.cjs +134 -24
- package/src/lib/async-hook-supervisor.js +47 -0
- package/src/lib/background-agent-supervisor.js +35 -12
- package/src/lib/background-interaction-resolver.js +399 -54
- package/src/lib/background-session-transport.js +3 -1
- package/src/lib/background-task-manager.js +5 -1
- package/src/lib/changelog.js +57 -0
- package/src/lib/chrome-connector.js +6 -2
- package/src/lib/claude-code-bridge.js +24 -8
- package/src/lib/cli-anything-bridge.js +82 -25
- package/src/lib/context-breakdown.js +82 -3
- package/src/lib/doctor-checkup.js +18 -6
- package/src/lib/eval/tasks.js +25 -31
- package/src/lib/event-runtime-host.js +225 -0
- package/src/lib/event-runtime-store.js +102 -21
- package/src/lib/event-runtime-worker.js +70 -2
- package/src/lib/hook-runner.cjs +71 -36
- package/src/lib/hook-runner.js +55 -0
- package/src/lib/hooks-v2-producers.js +33 -8
- package/src/lib/hooks-v2-runtime.js +360 -40
- package/src/lib/host-adb-bridge.js +18 -3
- package/src/lib/interaction-adapter.js +66 -0
- package/src/lib/lsp/__tests__/benchmark.test.js +61 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +6 -1
- package/src/lib/lsp/benchmark.js +20 -4
- package/src/lib/lsp/lsp-client.js +6 -4
- package/src/lib/lsp/lsp-server-registry.js +0 -2
- package/src/lib/operation-fingerprint.js +107 -2
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/packer/pack-update-applier.js +14 -2
- package/src/lib/packer/smoke-runner.js +18 -5
- package/src/lib/paths.js +1 -1
- package/src/lib/pdh-dedicated-batch-collectors.js +124 -0
- package/src/lib/personal-data-hub-wiring.js +327 -52
- package/src/lib/plugin-monitor-supervisor.js +20 -13
- package/src/lib/plugin-runtime/install.js +10 -3
- package/src/lib/process-execution-broker/credential-agent.js +954 -111
- package/src/lib/process-execution-broker/index.js +369 -85
- package/src/lib/process-execution-broker/platform-sandbox.js +320 -140
- package/src/lib/provider-http-error.js +94 -0
- package/src/lib/remote-approval-bridge.js +222 -26
- package/src/lib/repl-bang-memorize.js +10 -2
- package/src/lib/repl-goal.js +19 -2
- package/src/lib/settings-hook-events.cjs +13 -8
- package/src/lib/settings-hook-events.js +20 -0
- package/src/lib/side-effect-ledger-store.js +65 -14
- package/src/lib/skill-loader.js +215 -12
- package/src/lib/skill-packs/generator.js +18 -9
- package/src/lib/skill-process-broker.js +85 -0
- package/src/lib/slash-commands.js +10 -2
- package/src/lib/status-line.cjs +28 -7
- package/src/lib/status-line.js +33 -0
- package/src/lib/sub-agent-context.js +42 -0
- package/src/lib/turn-binding-store.js +64 -15
- package/src/lib/turn-binding.js +85 -16
- package/src/repl/agent-repl.js +88 -49
- package/src/repl/remote-approval.js +13 -13
- package/src/repl/repl-turn-binding.js +46 -16
- package/src/runtime/agent-core.js +419 -84
- package/src/runtime/coding-agent-contract-shared.cjs +16 -0
- package/src/runtime/headless-runner.js +172 -44
- package/src/runtime/headless-stream.js +221 -11
- package/src/runtime/session-slash-commands.js +506 -0
- package/src/skills/video-editing/extractors/audio-extractor.js +13 -5
- package/src/skills/video-editing/extractors/video-extractor.js +13 -3
- package/src/skills/video-editing/media-process.js +20 -0
- package/src/skills/video-editing/render/audio-mix.js +13 -3
- package/src/skills/video-editing/render/ffmpeg-concat.js +7 -2
- package/src/skills/video-editing/render/ffmpeg-extract.js +7 -2
- package/src/workers/background-agent-worker.js +76 -40
- package/src/assets/web-panel/assets/AppLayout-Duu8xR14.js +0 -9
- package/src/assets/web-panel/assets/Dashboard-CXrd5gAw.js +0 -3
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-C48mu09U.js +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-AX3ypUDV.js +0 -9
- package/src/assets/web-panel/assets/Projects-Cc7FC9-e.js +0 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +0 -3
- package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +0 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +0 -1
- package/src/assets/web-panel/assets/index-ycwAfC-i.js +0 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-B4NkcLaP.js +0 -1
|
@@ -876,6 +876,22 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
876
876
|
type: "number",
|
|
877
877
|
description: "Max wait for user reply in ms (default: 60000)",
|
|
878
878
|
},
|
|
879
|
+
defaultValue: {
|
|
880
|
+
description:
|
|
881
|
+
"Fallback answer used only when onTimeout/onReject is useDefault",
|
|
882
|
+
},
|
|
883
|
+
onTimeout: {
|
|
884
|
+
type: "string",
|
|
885
|
+
enum: ["error", "useDefault", "skip"],
|
|
886
|
+
description:
|
|
887
|
+
"Timeout policy: error (default), useDefault, or skip with a null answer",
|
|
888
|
+
},
|
|
889
|
+
onReject: {
|
|
890
|
+
type: "string",
|
|
891
|
+
enum: ["error", "useDefault", "skip"],
|
|
892
|
+
description:
|
|
893
|
+
"User-rejection policy: error (default), useDefault, or skip with a null answer",
|
|
894
|
+
},
|
|
879
895
|
},
|
|
880
896
|
required: ["question"],
|
|
881
897
|
},
|
|
@@ -61,6 +61,7 @@ import { SIDE_EFFECT_LEDGER_EVENT } from "../lib/side-effect-ledger-store.js";
|
|
|
61
61
|
import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
|
|
62
62
|
import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
|
|
63
63
|
import { operationIdempotencyKey } from "../lib/idempotency.js";
|
|
64
|
+
import { CLISkillLoader } from "../lib/skill-loader.js";
|
|
64
65
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
65
66
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
66
67
|
import { buildUserContent } from "../lib/image-input.js";
|
|
@@ -79,6 +80,7 @@ import {
|
|
|
79
80
|
} from "../lib/exit-codes.cjs";
|
|
80
81
|
import { isolationLevel } from "../lib/agent-sandbox.js";
|
|
81
82
|
import { createBackgroundPhaseReporter } from "../lib/background-phase-reporter.js";
|
|
83
|
+
import { createBackgroundInteractionClient } from "../lib/background-interaction-resolver.js";
|
|
82
84
|
import { withQuietStdout } from "./quiet-stdout.js";
|
|
83
85
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
84
86
|
import { estimateTokens } from "../harness/prompt-compressor.js";
|
|
@@ -87,6 +89,23 @@ import {
|
|
|
87
89
|
recordDenial,
|
|
88
90
|
formatDenials,
|
|
89
91
|
} from "../lib/repl-denials.js";
|
|
92
|
+
import executionBroker from "../lib/process-execution-broker/index.js";
|
|
93
|
+
|
|
94
|
+
const goalBrokerRunner = executionBroker.spawnSync.bind(executionBroker);
|
|
95
|
+
|
|
96
|
+
export const _goalProcessDeps = {
|
|
97
|
+
run: goalBrokerRunner,
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
function runHeadlessGoalCommand(command, options = {}) {
|
|
101
|
+
return _goalProcessDeps.run(command, [], {
|
|
102
|
+
...options,
|
|
103
|
+
timeout: options.timeout ?? 30000,
|
|
104
|
+
origin: "headless-goal:exit-zero",
|
|
105
|
+
policy: "allow",
|
|
106
|
+
scope: "headless-goal",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
90
109
|
|
|
91
110
|
/** Tools that cannot mutate the filesystem or run commands. */
|
|
92
111
|
export const READ_ONLY_TOOLS = Object.freeze([
|
|
@@ -717,21 +736,51 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
717
736
|
deps.backgroundPhaseReporter || createBackgroundPhaseReporter();
|
|
718
737
|
|
|
719
738
|
const sideEffectRunNonce = String(deps.now ? deps.now() : Date.now());
|
|
739
|
+
const _backgroundPolicyDigest = _bgPhase.enabled
|
|
740
|
+
? computePolicyDigest({
|
|
741
|
+
permissionMode: options.permissionMode,
|
|
742
|
+
allowedTools: options.allowedTools,
|
|
743
|
+
disallowedTools: options.disallowedTools,
|
|
744
|
+
permissionRules,
|
|
745
|
+
})
|
|
746
|
+
: null;
|
|
747
|
+
const _backgroundInteraction = _bgPhase.enabled
|
|
748
|
+
? deps.backgroundInteractionClient ||
|
|
749
|
+
createBackgroundInteractionClient({
|
|
750
|
+
backgroundAgentId: process.env.CC_BACKGROUND_AGENT_ID,
|
|
751
|
+
sessionId,
|
|
752
|
+
// One headless invocation is one user turn even when its model/tool
|
|
753
|
+
// loop contains several internal iterations.
|
|
754
|
+
turnId: options.turnId || sideEffectRunNonce,
|
|
755
|
+
})
|
|
756
|
+
: null;
|
|
720
757
|
let sideEffectLedger = new SideEffectLedger({ clock: deps.now || null });
|
|
758
|
+
let sideEffectLedgerLoadError = null;
|
|
721
759
|
let sideEffectSeq = 0;
|
|
722
760
|
let currentSideEffectOpId = null;
|
|
723
761
|
let resumeSideEffectContext = null;
|
|
724
762
|
let resumeAsyncHookContext = null;
|
|
725
763
|
const persistSideEffectLedger = () => {
|
|
726
764
|
if (!persist) return;
|
|
765
|
+
if (sideEffectLedgerLoadError) throw sideEffectLedgerLoadError;
|
|
727
766
|
try {
|
|
728
|
-
store.appendEvent(
|
|
767
|
+
const persisted = store.appendEvent(
|
|
729
768
|
sessionId,
|
|
730
769
|
SIDE_EFFECT_LEDGER_EVENT,
|
|
731
770
|
sideEffectLedger.toJSON(),
|
|
732
771
|
);
|
|
733
|
-
|
|
734
|
-
|
|
772
|
+
if (persisted === false) {
|
|
773
|
+
throw new Error("session store rejected the ledger snapshot");
|
|
774
|
+
}
|
|
775
|
+
} catch (cause) {
|
|
776
|
+
const error = new Error(
|
|
777
|
+
`Side-effect ledger persistence failed for ${sessionId}: ${
|
|
778
|
+
cause?.message || String(cause)
|
|
779
|
+
}`,
|
|
780
|
+
{ cause },
|
|
781
|
+
);
|
|
782
|
+
error.code = "SIDE_EFFECT_LEDGER_PERSIST_FAILED";
|
|
783
|
+
throw error;
|
|
735
784
|
}
|
|
736
785
|
};
|
|
737
786
|
// P1 explicit turn→checkpoint binding: feed the TurnBindingLog in real time
|
|
@@ -744,6 +793,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
744
793
|
// context. Only writes when a turn actually recorded something, and only for
|
|
745
794
|
// persisted runs — a tool-free Q&A or ephemeral run stays byte-identical.
|
|
746
795
|
let turnBindingLog = new TurnBindingLog();
|
|
796
|
+
let turnBindingLoadError = null;
|
|
747
797
|
if (persist) {
|
|
748
798
|
try {
|
|
749
799
|
const events = store.readEvents(sessionId) || [];
|
|
@@ -759,8 +809,15 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
759
809
|
break;
|
|
760
810
|
}
|
|
761
811
|
}
|
|
762
|
-
} catch {
|
|
763
|
-
|
|
812
|
+
} catch (cause) {
|
|
813
|
+
const error = new Error(
|
|
814
|
+
`Turn binding read failed for ${sessionId}: ${
|
|
815
|
+
cause?.message || String(cause)
|
|
816
|
+
}`,
|
|
817
|
+
{ cause },
|
|
818
|
+
);
|
|
819
|
+
error.code = "TURN_BINDING_READ_FAILED";
|
|
820
|
+
turnBindingLoadError = error;
|
|
764
821
|
}
|
|
765
822
|
}
|
|
766
823
|
// Event→table folding + id synthesis live in the SHARED feeder core
|
|
@@ -771,11 +828,26 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
771
828
|
: null;
|
|
772
829
|
const persistTurnBindingLog = () => {
|
|
773
830
|
if (!turnBindingFeed || !turnBindingFeed.isDirty()) return;
|
|
831
|
+
if (turnBindingLoadError) throw turnBindingLoadError;
|
|
774
832
|
try {
|
|
775
|
-
store.appendEvent(
|
|
833
|
+
const persisted = store.appendEvent(
|
|
834
|
+
sessionId,
|
|
835
|
+
TURN_BINDING_EVENT,
|
|
836
|
+
turnBindingLog.toJSON(),
|
|
837
|
+
);
|
|
838
|
+
if (persisted === false) {
|
|
839
|
+
throw new Error("session store rejected the binding snapshot");
|
|
840
|
+
}
|
|
776
841
|
turnBindingFeed.clearDirty();
|
|
777
|
-
} catch {
|
|
778
|
-
|
|
842
|
+
} catch (cause) {
|
|
843
|
+
const error = new Error(
|
|
844
|
+
`Turn binding persistence failed for ${sessionId}: ${
|
|
845
|
+
cause?.message || String(cause)
|
|
846
|
+
}`,
|
|
847
|
+
{ cause },
|
|
848
|
+
);
|
|
849
|
+
error.code = "TURN_BINDING_PERSIST_FAILED";
|
|
850
|
+
throw error;
|
|
779
851
|
}
|
|
780
852
|
};
|
|
781
853
|
if (persist) {
|
|
@@ -795,8 +867,17 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
795
867
|
break;
|
|
796
868
|
}
|
|
797
869
|
}
|
|
798
|
-
} catch {
|
|
799
|
-
|
|
870
|
+
} catch (cause) {
|
|
871
|
+
const error = new Error(
|
|
872
|
+
`Side-effect ledger read failed for ${sessionId}: ${
|
|
873
|
+
cause?.message || String(cause)
|
|
874
|
+
}`,
|
|
875
|
+
{ cause },
|
|
876
|
+
);
|
|
877
|
+
error.code = "SIDE_EFFECT_LEDGER_READ_FAILED";
|
|
878
|
+
// Keep read-only turns available; classified side effects call the
|
|
879
|
+
// persistence gate above before the generator can execute the tool.
|
|
880
|
+
sideEffectLedgerLoadError = error;
|
|
800
881
|
}
|
|
801
882
|
// On resume, surface any operation that was in flight when the prior run
|
|
802
883
|
// died: its outcome is UNKNOWN, so the model is told to VERIFY before any
|
|
@@ -951,10 +1032,19 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
951
1032
|
const _leanNoProjectMemory = options.projectMemory === false;
|
|
952
1033
|
let _loadedInstructions = null;
|
|
953
1034
|
let _loadedPersonaSkills = [];
|
|
1035
|
+
let _skillCacheLedger = null;
|
|
1036
|
+
const _runtimeSkillLoader =
|
|
1037
|
+
options.skillLoader || new CLISkillLoader();
|
|
954
1038
|
const systemContent = composeSystemPrompt(
|
|
955
1039
|
buildSystemPrompt(cwd, {
|
|
956
1040
|
additionalDirectories,
|
|
957
1041
|
projectMemory: options.projectMemory,
|
|
1042
|
+
sessionId,
|
|
1043
|
+
skillLoader: _runtimeSkillLoader,
|
|
1044
|
+
onSkillsLoaded: (skills, cacheLedger) => {
|
|
1045
|
+
_loadedPersonaSkills = Array.isArray(skills) ? skills : [];
|
|
1046
|
+
_skillCacheLedger = cacheLedger || null;
|
|
1047
|
+
},
|
|
958
1048
|
}),
|
|
959
1049
|
{
|
|
960
1050
|
systemPrompt: options.systemPrompt,
|
|
@@ -965,9 +1055,6 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
965
1055
|
onInstructionsLoaded: (loaded) => {
|
|
966
1056
|
_loadedInstructions = loaded;
|
|
967
1057
|
},
|
|
968
|
-
onSkillsLoaded: (skills) => {
|
|
969
|
-
_loadedPersonaSkills = Array.isArray(skills) ? skills : [];
|
|
970
|
-
},
|
|
971
1058
|
},
|
|
972
1059
|
);
|
|
973
1060
|
|
|
@@ -975,7 +1062,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
975
1062
|
if (settingsHooks) {
|
|
976
1063
|
try {
|
|
977
1064
|
const { runUserPromptSubmitHooks } =
|
|
978
|
-
await import("../lib/settings-hook-events.
|
|
1065
|
+
await import("../lib/settings-hook-events.js");
|
|
979
1066
|
const ups = runUserPromptSubmitHooks(settingsHooks, {
|
|
980
1067
|
prompt: userContent,
|
|
981
1068
|
cwd,
|
|
@@ -1006,7 +1093,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1006
1093
|
if (settingsHooks && _loadedInstructions) {
|
|
1007
1094
|
try {
|
|
1008
1095
|
const { runInstructionsLoadedHooks } =
|
|
1009
|
-
await import("../lib/settings-hook-events.
|
|
1096
|
+
await import("../lib/settings-hook-events.js");
|
|
1010
1097
|
instructionsLoadedContext = runInstructionsLoadedHooks(settingsHooks, {
|
|
1011
1098
|
files: _loadedInstructions.files,
|
|
1012
1099
|
cwd,
|
|
@@ -1022,7 +1109,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1022
1109
|
if (settingsHooks) {
|
|
1023
1110
|
try {
|
|
1024
1111
|
const { runSessionStartHooks } =
|
|
1025
|
-
await import("../lib/settings-hook-events.
|
|
1112
|
+
await import("../lib/settings-hook-events.js");
|
|
1026
1113
|
sessionStartContext = runSessionStartHooks(settingsHooks, {
|
|
1027
1114
|
source: resumeId ? "resume" : "startup",
|
|
1028
1115
|
cwd,
|
|
@@ -1041,7 +1128,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1041
1128
|
if (settingsHooks && resumeId && history.length > 0) {
|
|
1042
1129
|
try {
|
|
1043
1130
|
const { runObserveHooks } =
|
|
1044
|
-
await import("../lib/settings-hook-events.
|
|
1131
|
+
await import("../lib/settings-hook-events.js");
|
|
1045
1132
|
runObserveHooks(
|
|
1046
1133
|
settingsHooks,
|
|
1047
1134
|
"SessionResume",
|
|
@@ -1313,7 +1400,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1313
1400
|
if (settingsHooks) {
|
|
1314
1401
|
try {
|
|
1315
1402
|
const { AsyncHookSupervisor } =
|
|
1316
|
-
await import("../lib/async-hook-supervisor.
|
|
1403
|
+
await import("../lib/async-hook-supervisor.js");
|
|
1317
1404
|
_hookSupervisor = new AsyncHookSupervisor({
|
|
1318
1405
|
persistStats: true,
|
|
1319
1406
|
// Durably park failed-rewake signals keyed by session so a crash before
|
|
@@ -1350,10 +1437,17 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1350
1437
|
// Persist the admitted runtime schema surface so `cc context --sources` can
|
|
1351
1438
|
// attribute MCP cost to the actual server/tool definitions used by this run,
|
|
1352
1439
|
// rather than guessing from the current environment on a later invocation.
|
|
1353
|
-
|
|
1354
|
-
persist
|
|
1355
|
-
|
|
1356
|
-
|
|
1440
|
+
const persistContextSources = () => {
|
|
1441
|
+
if (!persist) return false;
|
|
1442
|
+
_skillCacheLedger =
|
|
1443
|
+
_runtimeSkillLoader.getCacheLedger?.() || _skillCacheLedger;
|
|
1444
|
+
if (
|
|
1445
|
+
!mcp?.extraToolDefinitions?.length &&
|
|
1446
|
+
!_loadedPersonaSkills.length &&
|
|
1447
|
+
!_skillCacheLedger?.descriptors?.resident
|
|
1448
|
+
) {
|
|
1449
|
+
return false;
|
|
1450
|
+
}
|
|
1357
1451
|
try {
|
|
1358
1452
|
store.appendEvent(sessionId, "context_sources", {
|
|
1359
1453
|
mcp: (mcp?.extraToolDefinitions || []).map((definition) => ({
|
|
@@ -1367,13 +1461,22 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1367
1461
|
id: skill?.id || skill?.displayName || "skill",
|
|
1368
1462
|
displayName: skill?.displayName || skill?.id || "skill",
|
|
1369
1463
|
source: skill?.source || "skill",
|
|
1370
|
-
|
|
1464
|
+
tokens: estimateTokens(
|
|
1465
|
+
`## Persona: ${skill?.displayName || skill?.id || "skill"}\n${
|
|
1466
|
+
typeof skill?.body === "string" ? skill.body : ""
|
|
1467
|
+
}`,
|
|
1468
|
+
),
|
|
1469
|
+
bodyLoaded: skill?.bodyLoaded === true,
|
|
1371
1470
|
})),
|
|
1471
|
+
skillCache: _skillCacheLedger,
|
|
1372
1472
|
});
|
|
1473
|
+
return true;
|
|
1373
1474
|
} catch {
|
|
1374
1475
|
// Source attribution is observability-only; never fail the agent run.
|
|
1476
|
+
return false;
|
|
1375
1477
|
}
|
|
1376
|
-
}
|
|
1478
|
+
};
|
|
1479
|
+
persistContextSources();
|
|
1377
1480
|
|
|
1378
1481
|
const loopOptions = {
|
|
1379
1482
|
model,
|
|
@@ -1392,6 +1495,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1392
1495
|
baseUrl,
|
|
1393
1496
|
apiKey,
|
|
1394
1497
|
cwd,
|
|
1498
|
+
skillLoader: _runtimeSkillLoader,
|
|
1395
1499
|
additionalDirectories,
|
|
1396
1500
|
sandbox: options.sandbox || null,
|
|
1397
1501
|
sessionId,
|
|
@@ -1418,27 +1522,39 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1418
1522
|
disabledTools,
|
|
1419
1523
|
iterationBudget: budget,
|
|
1420
1524
|
toolAdmission: options.toolAdmission || null,
|
|
1421
|
-
// `ask_user_question` in a BACKGROUND turn child
|
|
1422
|
-
//
|
|
1423
|
-
//
|
|
1424
|
-
//
|
|
1425
|
-
// file (dashboard "Needs input" gets real data; the user's reply arrives
|
|
1426
|
-
// as the next attach prompt) and tell the model to end the turn. A
|
|
1427
|
-
// non-background run supplies no interaction → the handler's existing
|
|
1428
|
-
// `user_not_reachable` path stays byte-identical.
|
|
1525
|
+
// `ask_user_question` in a BACKGROUND turn child: send a bound request to
|
|
1526
|
+
// the worker over Node IPC and await the answer here. `executeTool` remains
|
|
1527
|
+
// suspended, so the model continues the SAME turn/tool call after the user
|
|
1528
|
+
// answers instead of receiving the answer as a follow-up turn.
|
|
1429
1529
|
...(_bgPhase.enabled
|
|
1430
1530
|
? {
|
|
1431
1531
|
interaction: {
|
|
1432
|
-
askUser: async ({
|
|
1532
|
+
askUser: async ({
|
|
1533
|
+
question,
|
|
1534
|
+
options: qOptions,
|
|
1535
|
+
multiSelect,
|
|
1536
|
+
timeoutMs,
|
|
1537
|
+
defaultValue,
|
|
1538
|
+
toolUseId,
|
|
1539
|
+
turnId,
|
|
1540
|
+
policyDigest,
|
|
1541
|
+
} = {}) => {
|
|
1433
1542
|
_bgPhase.reportQuestion({
|
|
1434
1543
|
question: typeof question === "string" ? question : "",
|
|
1435
1544
|
options: Array.isArray(qOptions) ? qOptions : null,
|
|
1436
1545
|
});
|
|
1437
|
-
|
|
1438
|
-
"question
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1546
|
+
return _backgroundInteraction.request({
|
|
1547
|
+
kind: "question",
|
|
1548
|
+
question,
|
|
1549
|
+
options: qOptions,
|
|
1550
|
+
multiSelect,
|
|
1551
|
+
timeoutMs,
|
|
1552
|
+
defaultValue,
|
|
1553
|
+
toolUseId,
|
|
1554
|
+
turnId,
|
|
1555
|
+
policyDigest: policyDigest || _backgroundPolicyDigest,
|
|
1556
|
+
sessionId,
|
|
1557
|
+
});
|
|
1442
1558
|
},
|
|
1443
1559
|
},
|
|
1444
1560
|
}
|
|
@@ -1603,7 +1719,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1603
1719
|
const _settleAsyncStop = async () => {
|
|
1604
1720
|
if (!settingsHooks || !_hookSupervisor) return { rewakes: [], results: [] };
|
|
1605
1721
|
const { dispatchAsyncHooks } =
|
|
1606
|
-
await import("../lib/settings-hook-events.
|
|
1722
|
+
await import("../lib/settings-hook-events.js");
|
|
1607
1723
|
dispatchAsyncHooks(
|
|
1608
1724
|
settingsHooks,
|
|
1609
1725
|
"Stop",
|
|
@@ -1783,7 +1899,6 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1783
1899
|
process.once("SIGTERM", _onHardSignal);
|
|
1784
1900
|
|
|
1785
1901
|
try {
|
|
1786
|
-
// eslint-disable-next-line no-constant-condition
|
|
1787
1902
|
while (true) {
|
|
1788
1903
|
// P1 turn→checkpoint binding: one drain of the loop = one turn. Anchor
|
|
1789
1904
|
// the conversation offset before the model sees the new user turn. A
|
|
@@ -1808,10 +1923,15 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1808
1923
|
if (isText) writeErr(line + "\n");
|
|
1809
1924
|
emitStream({
|
|
1810
1925
|
type: "tool_use",
|
|
1926
|
+
...(event.tool_use_id ? { id: event.tool_use_id } : {}),
|
|
1927
|
+
tool: event.tool,
|
|
1928
|
+
args: event.args,
|
|
1929
|
+
});
|
|
1930
|
+
toolCalls.push({
|
|
1931
|
+
...(event.tool_use_id ? { id: event.tool_use_id } : {}),
|
|
1811
1932
|
tool: event.tool,
|
|
1812
1933
|
args: event.args,
|
|
1813
1934
|
});
|
|
1814
|
-
toolCalls.push({ tool: event.tool, args: event.args });
|
|
1815
1935
|
// P0-2: record an irreversible effect as STARTED (persisted before
|
|
1816
1936
|
// it settles) so a crash before the matching tool-result leaves a
|
|
1817
1937
|
// reconcilable "in flight" marker instead of a silent replay.
|
|
@@ -1866,6 +1986,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1866
1986
|
if (isText && err) writeErr(` Error: ${err}\n`);
|
|
1867
1987
|
emitStream({
|
|
1868
1988
|
type: "tool_result",
|
|
1989
|
+
...(event.tool_use_id ? { id: event.tool_use_id } : {}),
|
|
1869
1990
|
tool: event.tool,
|
|
1870
1991
|
is_error: Boolean(err),
|
|
1871
1992
|
error: err,
|
|
@@ -2085,8 +2206,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
2085
2206
|
try {
|
|
2086
2207
|
if (_goalHelpers.isDeterministicCondition(cond)) {
|
|
2087
2208
|
const gc = deps.goalCheck || {};
|
|
2088
|
-
const spawnSync =
|
|
2089
|
-
gc.spawnSync || (await import("node:child_process")).spawnSync;
|
|
2209
|
+
const spawnSync = gc.spawnSync || runHeadlessGoalCommand;
|
|
2090
2210
|
const existsSync =
|
|
2091
2211
|
gc.existsSync || (await import("node:fs")).existsSync;
|
|
2092
2212
|
evaluation = _goalHelpers.runDeterministicCheck(cond, {
|
|
@@ -2183,6 +2303,14 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
2183
2303
|
// "the model call failed" from "the run itself errored" (1).
|
|
2184
2304
|
return { exitCode: classifyLoopError(err), result: message, isError: true };
|
|
2185
2305
|
} finally {
|
|
2306
|
+
// Capture body-cache hits/misses caused by list_skills/run_skill during the
|
|
2307
|
+
// turn. `cc context --sources` reads the newest snapshot.
|
|
2308
|
+
persistContextSources();
|
|
2309
|
+
try {
|
|
2310
|
+
_backgroundInteraction?.close?.();
|
|
2311
|
+
} catch {
|
|
2312
|
+
// Best-effort listener cleanup; never mask the run result.
|
|
2313
|
+
}
|
|
2186
2314
|
// Drop the signal handlers first — a normal return must not leave a
|
|
2187
2315
|
// process-wide SIGINT/SIGTERM listener behind (a later Ctrl-C would wrongly
|
|
2188
2316
|
// exit with 130, and repeated in-process runs would leak listeners).
|
|
@@ -2221,7 +2349,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
2221
2349
|
if (settingsHooks) {
|
|
2222
2350
|
try {
|
|
2223
2351
|
const { runObserveHooks, dispatchAsyncHooks } =
|
|
2224
|
-
await import("../lib/settings-hook-events.
|
|
2352
|
+
await import("../lib/settings-hook-events.js");
|
|
2225
2353
|
const stopPayload = { reason: endReason, cwd, session_id: sessionId };
|
|
2226
2354
|
runObserveHooks(settingsHooks, "Stop", stopPayload, { cwd });
|
|
2227
2355
|
// Skip the async Stop dispatch/settle here if the auto-rewake re-drive
|