chainlesschain 0.165.5 → 0.165.8
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 +2 -1
- package/src/assets/web-panel/assets/{AIOps-CEeYTeDB.js → AIOps-B3gWmXjo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BeRUQ3V2.js → ActionButton-G9pdT-0e.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DrV718XF.js → Analytics-Ca30J7m2.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Cd2Frt7Q.js → AppLayout-BtVTm8PU.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CUJMlORU.js → Artifacts-BhViNa6u.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CXJcfT6p.js → Audit-DhKq-FnY.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOv6Z7H9.js → BackgroundAgents-BL0SVbnE.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BwdDyBI0.js → Backup-BWkblnFi.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BmLn4kYH.js → BaseInput-ClaRNrF8.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COg8pAW2.js → Chat-sZE2Z77o.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BAfKOnRe.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BCP4uoU8.js → Checkbox-Cvhay5WM.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-pRt6Y9JI.js → Codegen-BpejL-4N.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DLaprKhS.js → Col-g2Ki6g_1.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DyATsz5f.js → Community-D2xKbNo9.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BXAaupZK.js → Compact-DbL1Pds3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DpcJBELr.js → Compliance-DGtZCV4c.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DG4EFWyd.js → Cowork-4kQpoNsI.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-F6Oy5n2P.js → Cron-BxTYXXAN.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BOdgtalX.js → Crosschain-k0J0LT2N.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT1dSkjH.js → DID-BaqhoPgN.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-NBUIqWzC.js → Dashboard-T4RVPIM1.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CSpHeMYB.js → Dropdown-DszOToWq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CEG0xISr.js → EmailListRenderer-C9KJU7HF.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BTZ0BZna.js → FamilyGuardDashboard-Cmr0JnsA.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BuuCTn2V.js → Federation-BI-_2xZX.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-KAVceevk.js → FormItemContext-DsnDEPsl.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnHpcQvW.js → GenericCardRenderer-BLncAKKK.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_B_0HwB.js → Git-BPQhGXDn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DPSZuzuu.js → Governance-CyElbUQW.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BV-06V7q.js → Inference-CcSntBQD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-wpDuupn6.js → KnowledgeGraph-p6e7HZ2r.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Bseca1_I.js → Logs-CNEtr-wz.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Bj9xI0YH.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-d3kM4DDL.js → Marketplace-Dd2notAJ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DQ_xZ23i.js → McpTools-BBsN2CSW.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-CRIeYO4L.js → Memory-Dg2uTvwx.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BsllIa9l.js → MobileBridge-r1YMRiJV.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BUuQy30X.js → MobileProjects-C-89kSm4.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BOFDIzrC.js → Mtc-CrPZcVgf.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BQg-vyvG.js → MtcAudit-sxi7hqJb.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-Bo1jrPdN.js → Multisig-CAgOMfF1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Bmod8alw.js → NLProgramming-DafaPts3.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CGGFL8w-.js → Notes-CJM-xUW_.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZvCJxC.js → NotificationSettings-L0ZjfAh_.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C1-Quo_h.js → OrderTableRenderer-BB1CvCK0.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BjOeDYOi.js → Organization-DeLtgAD8.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DwVV3l5A.js → Overflow-CKC2b10z.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cu3DQT9W.js → P2P-eyf2rzY1.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Cg0gR7dH.js → PdhVaultBrowser-5upNIOW8.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CsAXxRN5.js → Permissions-B8p3W6JK.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C-nNmnYp.js → PersonalDataHub-BnRMxTq3.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-BOnW7nNc.js → Pipeline-DjCNI1li.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-ClLSyGKt.js → Privacy-u6gXLbWT.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DuLvjjq7.js → ProjectInit-BZAw4tkM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DQYYbDD9.js → ProjectSettings-B1Tr72q7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Drw8MBGK.js → Projects-DO7HFuBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-ckqHQe6K.js → Providers-BjCztyhj.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DW5BXk-G.js → QrScannerModal-ZWyCUbR1.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DDLnhNTp.js → QuickAsk-DhDjeW4G.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-PJQ2C91U.js → Recommend-R_CN2MuU.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-s6wmda34.js → RemoteSession-uxFcujeu.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DC2sb-I3.js → Reputation-DX8D7rks.js} +1 -1
- package/src/assets/web-panel/assets/{Row-hPGk1eGj.js → Row-BYahQILD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-RIvfZql0.js → RssFeed-CUSQ2tm-.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFg1G1eR.js → Search-CnN_S8Cs.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D6H5p8Dp.js → Security-DcZlh-O4.js} +4 -4
- package/src/assets/web-panel/assets/{Services-nxYiFV_w.js → Services-ZhBOjzIX.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BmgFNAdB.js → Skeleton-D5Qnq_lI.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CsaaD2av.js → Skills-BC9cZ3Be.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-yM5y9yvK.js → Sla-DauJ3E8_.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DbNeZ_fh.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CFVhEyyr.js → SyncSettings-DUvJbSct.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DdO02Inn.js → Tasks-BXa-5noQ.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Eo2d8Llu.js → Templates-JxaiUt_3.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ChESOXgy.js → Tenant-BW4ERQN8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BJ7oDxTI.js → Terminal-DltUbdtv.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-hWX0fUvz.js → TimelineRenderer-CMoZz0Tc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DVBZQnd-.js → Tokens-D_VEV60K.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-D89cQfVq.js → Trigger-CCXTCs0R.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BIVSb4-V.js → Trust-lkGRIPcG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B58gWopl.js → UkeySign-BfGeQ9HX.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DhHI7bmG.js → VideoEditing-BEC7pYvc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-C4FheWS_.js → Wallet-BZdG24o0.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DnPRq-Bx.js → WebAuthn-yoEddedp.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-BerRPjpJ.js → WorkflowEditor-BXZEprOW.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BzZ52iKr.js → chat-gg0bzZal.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BI_E4BAn.js → colors-DjRVRuin.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-d50mr3yk.js → compact-item-su-dieAc.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C6FsQ1IH.js → createContext-Ci3S8oKF.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CxbFX9uH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLZEMgLP.js → hasIn-D8F10heH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-aBumtY.js → index-11wtYQiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjuKZBqJ.js → index-1IgxgALJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-9H_M2jju.js → index-1agckWSq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE0V6cp-.js → index-5JqhujnR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Y2-q7QLm.js → index-6Tniqk1s.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoFtCVZ7.js → index-8Z-8BIlN.js} +1 -1
- package/src/assets/web-panel/assets/{index-KNGgO4Wm.js → index-BCI5v0yB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY4j5zkF.js → index-BDJntYmJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZjjdQ62.js → index-BGzixOGZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTpIOTfR.js → index-BMMOVoLD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BB9SqVSt.js → index-BTFpdBtt.js} +1 -1
- package/src/assets/web-panel/assets/{index-AHr7ryWf.js → index-Ba_HyPnE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Pvf30m8Q.js → index-BbF1IHof.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRN5TRTQ.js → index-BgT9su_e.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUaEHfQ0.js → index-BzPB6kGZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdKt9fOd.js → index-C6ygzplr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dec0Kf_Z.js → index-CC3ZDjzY.js} +1 -1
- package/src/assets/web-panel/assets/{index-IPkwSAW_.js → index-CEmXRhAE.js} +1 -1
- package/src/assets/web-panel/assets/index-CJGOlduY.js +1 -0
- package/src/assets/web-panel/assets/{index-C3k8kevG.js → index-CMPqd5Cv.js} +1 -1
- package/src/assets/web-panel/assets/{index-A5CDWP7y.js → index-COWd8uGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CO8DAF7U.js → index-CPIYSp4H.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVzuawCX.js → index-CR0h6seT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co7s9LsB.js → index-CUmDhC4j.js} +1 -1
- package/src/assets/web-panel/assets/index-CkBCN5yH.js +1 -0
- package/src/assets/web-panel/assets/{index-CLoTQr0W.js → index-CusgZPtc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B81mo1Et.js → index-DBAETXft.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcSUl9fA.js → index-DIJ2qFOC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q5Tn735s.js → index-Dbq4NMET.js} +1 -1
- package/src/assets/web-panel/assets/{index-GXE0D8Nx.js → index-DkMEF5VT.js} +1 -1
- package/src/assets/web-panel/assets/{index-TWG-_D1M.js → index-DkfQR3hM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAE3hwev.js → index-DnLucOn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgkoH3_g.js → index-DugB_aKa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRGx3w6T.js → index-DyLUarhZ.js} +3 -3
- package/src/assets/web-panel/assets/{index-BeM4hfht.js → index-T6_6ygJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsscwxPE.js → index-Tu8eWqh-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bmr_vxXD.js → index-W7XUgdVL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoNZlzhQ.js → index-dHZinfko.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqkbHHg8.js → index-jyNgp5FI.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D-4Hzgej.js → initDefaultProps-Cv4p8e4w.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D4Wl4xU7.js → motion-B8EwmMOw.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cd5eQvL0.js → move-B8R9F8TK.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B4ilslCW.js → mtc-parser-DoFYz5Bp.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Ckarx-tf.js → omit-CHWYLBjI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-QJ0bpCmc.js → pickAttrs-CXuPDO77.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CKHm-tq8.js → placementArrow-BaAtUUon.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CV6a_w_Y.js → responsiveObserve-DCc4zcDD.js} +1 -1
- package/src/assets/web-panel/assets/{slide-mHpeQFgk.js → slide-B_lx89oZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIaQNQWA.js → statusUtils-DE8DPmR0.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-PJpzavV8.js → styleChecker-1ktXOsL_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BH7zTw8S.js → useFlexGapSupport-xH89-wjh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BDNG3JDd.js → useFs-DscvfW5p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CY2VWdUg.js → usePersonalDataHub-RdMKQta7.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D0kw9jhz.js → vnode-Z3wTni2T.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B5g7TN7r.js → zoom-B0iChCsm.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +105 -62
- package/src/commands/background-session.js +100 -10
- package/src/commands/git.js +39 -0
- package/src/commands/mcp.js +5 -0
- package/src/commands/plugin.js +160 -29
- package/src/commands/remote-control.js +295 -110
- package/src/commands/session-group.js +131 -0
- package/src/commands/session-location.js +48 -0
- package/src/commands/session-message.js +171 -0
- package/src/commands/session.js +22 -0
- package/src/commands/sync-providers.js +4 -1
- package/src/commands/update.js +1 -0
- package/src/data/changelog.json +41 -2
- package/src/gateways/ws/ws-agent-handler.js +20 -12
- package/src/harness/jsonl-session-store.js +279 -37
- package/src/harness/mcp-client.js +832 -91
- package/src/harness/session-index.js +15 -4
- package/src/lib/agent-worktree.js +8 -1
- package/src/lib/auto-mode-safety-classifier.js +3 -17
- package/src/lib/background-agent-keeper-protocol.js +26 -6
- package/src/lib/background-agent-supervisor.js +17 -1
- package/src/lib/background-session-transport.js +153 -27
- package/src/lib/browser-evidence.js +1405 -0
- package/src/lib/chrome-connector.js +465 -79
- package/src/lib/claude-project-auto-memory.js +481 -0
- package/src/lib/claude-project-storage-layout.js +104 -0
- package/src/lib/cloud/cloud-client.js +40 -0
- package/src/lib/execution-location-local-supervisor.mjs +226 -0
- package/src/lib/execution-location-runner-lifecycle.js +991 -0
- package/src/lib/execution-location-target-preflight.js +333 -0
- package/src/lib/execution-location-target.js +783 -13
- package/src/lib/file-lines.js +6 -1
- package/src/lib/gateway-client-resilience.js +571 -0
- package/src/lib/gitlab-mr-worktree.js +176 -0
- package/src/lib/hooks-v2-producers.js +119 -15
- package/src/lib/hooks-v2-workspace-context.js +44 -1
- package/src/lib/host-resource-budget.js +295 -0
- package/src/lib/ide-context.js +15 -2
- package/src/lib/llm-config-defaults.js +43 -0
- package/src/lib/mcp-client.js +2 -0
- package/src/lib/mcp-headers-helper.js +47 -5
- package/src/lib/mcp-lifecycle-authority.js +887 -0
- package/src/lib/mcp-oauth.js +156 -26
- package/src/lib/mcp-tls.js +330 -0
- package/src/lib/output-styles.js +12 -0
- package/src/lib/paths.js +260 -32
- package/src/lib/permission-request.js +48 -0
- package/src/lib/plugin-runtime/bin.js +3 -1
- package/src/lib/plugin-runtime/hooks.js +3 -1
- package/src/lib/plugin-runtime/install.js +730 -71
- package/src/lib/plugin-runtime/lsp.js +4 -4
- package/src/lib/plugin-runtime/marketplace-archive-source.js +366 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +63 -6
- package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
- package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
- package/src/lib/plugin-runtime/marketplace-source-adapter.js +188 -0
- package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
- package/src/lib/plugin-runtime/mcp.js +3 -1
- package/src/lib/plugin-runtime/monitors.js +3 -1
- package/src/lib/plugin-runtime/remote-source.js +583 -58
- package/src/lib/plugin-runtime/settings.js +3 -1
- package/src/lib/plugin-runtime/trust.js +274 -13
- package/src/lib/plugin-security.js +393 -41
- package/src/lib/plugin-source-identity.js +850 -0
- package/src/lib/process-execution-broker/credential-agent.js +210 -41
- package/src/lib/process-execution-broker/index.js +15 -1
- package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
- package/src/lib/project-mcp-trust.js +165 -10
- package/src/lib/remote-approval-bridge.js +136 -46
- package/src/lib/remote-control.js +217 -31
- package/src/lib/resume-session.js +9 -6
- package/src/lib/session-core-singletons.js +26 -11
- package/src/lib/session-host-lease.js +52 -16
- package/src/lib/session-lifecycle-scope.js +153 -0
- package/src/lib/session-message-fabric.js +1252 -0
- package/src/lib/session-projection.js +286 -3
- package/src/lib/session-runtime-retention.js +155 -0
- package/src/lib/session-store-guard.js +3 -1
- package/src/lib/session-workbench-store.js +466 -0
- package/src/lib/settings-loader.cjs +29 -0
- package/src/lib/spellcheck.js +211 -0
- package/src/lib/sub-agent-context.js +9 -9
- package/src/lib/sync-cli-db.js +485 -129
- package/src/lib/sync-credentials.js +31 -20
- package/src/lib/web-fetch.js +112 -40
- package/src/lib/web-search.js +127 -61
- package/src/lib/workspace-trust.js +793 -0
- package/src/repl/agent-repl.js +175 -19
- package/src/repl/permission-prompt.js +29 -8
- package/src/repl/repl-keybindings.js +55 -0
- package/src/runtime/agent-core.js +362 -20
- package/src/runtime/bootstrap.js +37 -13
- package/src/runtime/coding-agent-contract-shared.cjs +11 -4
- package/src/runtime/headless-runner.js +281 -102
- package/src/runtime/headless-stream.js +199 -30
- package/src/runtime/mcp-config.js +298 -6
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/runtime/status-diagnostics-lite.js +9 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DPy1XMYh.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CagEcIex.js +0 -1
- package/src/assets/web-panel/assets/index-pzT9PpOU.js +0 -1
- package/src/assets/web-panel/assets/index-z1kFadaX.js +0 -1
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
sameInteractionBinding,
|
|
28
28
|
} from "../lib/interaction-binding.js";
|
|
29
29
|
import {
|
|
30
|
+
addHooksV2EventObserver,
|
|
30
31
|
emitHooksV2Event,
|
|
31
32
|
executeHooksV2Event,
|
|
32
33
|
resolvePromptExpansion,
|
|
@@ -42,6 +43,7 @@ import { composeSystemPrompt } from "./system-prompt.js";
|
|
|
42
43
|
import { collapseConsecutiveMessagesInPlace } from "./message-roles.js";
|
|
43
44
|
import { sanitizeToolPairs } from "../harness/prompt-compressor.js";
|
|
44
45
|
import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
|
|
46
|
+
import { HostResourceBudget } from "../lib/host-resource-budget.js";
|
|
45
47
|
import { projectCanonicalResumeMessages } from "../lib/session-message-provenance.js";
|
|
46
48
|
import { isAbortError } from "../lib/abort-utils.js";
|
|
47
49
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
@@ -65,6 +67,7 @@ import {
|
|
|
65
67
|
resolveAgentMcp,
|
|
66
68
|
resolvePermissionPromptTool,
|
|
67
69
|
makePermissionPromptConfirmer,
|
|
70
|
+
readHeadlessMcpConfigErrors,
|
|
68
71
|
} from "./mcp-config.js";
|
|
69
72
|
import { maybeApplyToolSearch } from "./mcp-tool-search.js";
|
|
70
73
|
import {
|
|
@@ -398,6 +401,9 @@ export function planSnapshot(pm) {
|
|
|
398
401
|
const MAX_PLAN_REVIEW_SNAPSHOT_CHARS = 24000;
|
|
399
402
|
const MAX_PLAN_REVIEW_COMMENTS = 64;
|
|
400
403
|
const MAX_PLAN_REVIEW_COMMENT_CHARS = 2000;
|
|
404
|
+
const HOST_EVENT_BACKLOG_CODE = "CC_HOST_EVENT_BACKLOG_EXHAUSTED";
|
|
405
|
+
const HOST_EVENT_BACKLOG_ERROR =
|
|
406
|
+
"CC_HOST_EVENT_BACKLOG_EXHAUSTED: event backlog limit reached";
|
|
401
407
|
|
|
402
408
|
function boundedReviewString(value, limit) {
|
|
403
409
|
return String(value == null ? "" : value).slice(0, limit);
|
|
@@ -1463,6 +1469,11 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1463
1469
|
deps[STREAM_SESSION_ID] ||
|
|
1464
1470
|
options.sessionId ||
|
|
1465
1471
|
`headless-stream-${Date.now()}-${process.pid}`;
|
|
1472
|
+
// The input stream may drive many turns. Allocate once at the stream-run
|
|
1473
|
+
// boundary so every turn (and its nested agents) shares cache/backlog limits.
|
|
1474
|
+
// SessionResourceBudget remains separately leased by executeTool.
|
|
1475
|
+
const hostResourceBudget =
|
|
1476
|
+
options.hostResourceBudget || new HostResourceBudget();
|
|
1466
1477
|
const persist =
|
|
1467
1478
|
(Boolean(options.sessionId) || options.observabilityScope != null) &&
|
|
1468
1479
|
options.ephemeral !== true;
|
|
@@ -1483,6 +1494,10 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1483
1494
|
fieldGate,
|
|
1484
1495
|
});
|
|
1485
1496
|
const emit = streamCoalescer.emit;
|
|
1497
|
+
const removeHookObserver =
|
|
1498
|
+
options.includeHookEvents === true
|
|
1499
|
+
? addHooksV2EventObserver(sessionId, (event) => emit(event))
|
|
1500
|
+
: null;
|
|
1486
1501
|
streamCleanup.setOutputCleanup(() => streamCoalescer.flush?.());
|
|
1487
1502
|
|
|
1488
1503
|
const hasInjectedSessionStore =
|
|
@@ -1694,9 +1709,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1694
1709
|
const { loadHooks, projectHookTrustNotice, attachAuthorityErrors } =
|
|
1695
1710
|
await import("../lib/settings-hooks.cjs");
|
|
1696
1711
|
const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
|
|
1697
|
-
const { mergePluginHooks } =
|
|
1698
|
-
"../lib/plugin-runtime/hooks.js"
|
|
1699
|
-
);
|
|
1712
|
+
const { mergePluginHooks } =
|
|
1713
|
+
await import("../lib/plugin-runtime/hooks.js");
|
|
1700
1714
|
const effectiveHooks = mergePluginHooks(
|
|
1701
1715
|
attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
|
|
1702
1716
|
{ cwd },
|
|
@@ -1777,9 +1791,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1777
1791
|
});
|
|
1778
1792
|
|
|
1779
1793
|
if (managedSettings) {
|
|
1780
|
-
const { assertManagedPermissionMode } =
|
|
1781
|
-
"../lib/settings-loader.cjs"
|
|
1782
|
-
);
|
|
1794
|
+
const { assertManagedPermissionMode } =
|
|
1795
|
+
await import("../lib/settings-loader.cjs");
|
|
1783
1796
|
assertManagedPermissionMode(options.permissionMode, managedSettings);
|
|
1784
1797
|
}
|
|
1785
1798
|
const perm = resolvePermissionMode(options.permissionMode);
|
|
@@ -2267,9 +2280,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2267
2280
|
: null;
|
|
2268
2281
|
if (!instructionExcludes) {
|
|
2269
2282
|
try {
|
|
2270
|
-
const { readStringArraySetting } =
|
|
2271
|
-
"../lib/settings-loader.cjs"
|
|
2272
|
-
);
|
|
2283
|
+
const { readStringArraySetting } =
|
|
2284
|
+
await import("../lib/settings-loader.cjs");
|
|
2273
2285
|
const fromSettings = readStringArraySetting("instructionExcludes", {
|
|
2274
2286
|
cwd,
|
|
2275
2287
|
settingsFile: options.settingsFile,
|
|
@@ -2334,9 +2346,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2334
2346
|
// Best-effort; no-op when project memory is off or no hook is registered.
|
|
2335
2347
|
if (settingsHooks && _loadedInstructions) {
|
|
2336
2348
|
try {
|
|
2337
|
-
const { runInstructionsLoadedHooks } =
|
|
2338
|
-
"../lib/settings-hook-events.js"
|
|
2339
|
-
);
|
|
2349
|
+
const { runInstructionsLoadedHooks } =
|
|
2350
|
+
await import("../lib/settings-hook-events.js");
|
|
2340
2351
|
const ctx = runInstructionsLoadedHooks(settingsHooks, {
|
|
2341
2352
|
files: _loadedInstructions.files,
|
|
2342
2353
|
cwd,
|
|
@@ -2376,9 +2387,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2376
2387
|
// settings.json SessionStart hooks → inject session context once (observe-only).
|
|
2377
2388
|
if (settingsHooks) {
|
|
2378
2389
|
try {
|
|
2379
|
-
const { runSessionStartHooks } =
|
|
2380
|
-
"../lib/settings-hook-events.js"
|
|
2381
|
-
);
|
|
2390
|
+
const { runSessionStartHooks } =
|
|
2391
|
+
await import("../lib/settings-hook-events.js");
|
|
2382
2392
|
const ctx = runSessionStartHooks(settingsHooks, {
|
|
2383
2393
|
source: "startup",
|
|
2384
2394
|
cwd,
|
|
@@ -2489,6 +2499,20 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2489
2499
|
let sanitizeRolesNextTurn =
|
|
2490
2500
|
resumedMessages > 0 && messages[messages.length - 1]?.role === "user";
|
|
2491
2501
|
|
|
2502
|
+
// `system:init` intentionally precedes MCP connection so stream consumers
|
|
2503
|
+
// receive their manifest promptly. Validation itself is local and side-effect
|
|
2504
|
+
// free, so preflight just its bounded, redacted projection here; the normal
|
|
2505
|
+
// resolver below remains authoritative for parsing and connection.
|
|
2506
|
+
let initialMcpServerErrors = [];
|
|
2507
|
+
if (options.mcpConfig) {
|
|
2508
|
+
try {
|
|
2509
|
+
initialMcpServerErrors = readHeadlessMcpConfigErrors(options.mcpConfig);
|
|
2510
|
+
} catch {
|
|
2511
|
+
// The normal resolver reports unreadable/malformed files as its existing
|
|
2512
|
+
// config error result. Never place filesystem/parser details in init.
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
|
|
2492
2516
|
emit({
|
|
2493
2517
|
type: "system",
|
|
2494
2518
|
subtype: "init",
|
|
@@ -2517,6 +2541,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2517
2541
|
mcp: Boolean(options.mcpConfig) || options.useRegisteredMcp !== false,
|
|
2518
2542
|
enabledToolNames,
|
|
2519
2543
|
}),
|
|
2544
|
+
...(initialMcpServerErrors.length > 0
|
|
2545
|
+
? { mcp_server_errors: initialMcpServerErrors }
|
|
2546
|
+
: {}),
|
|
2520
2547
|
slash_commands: [...SESSION_SLASH_COMMANDS],
|
|
2521
2548
|
input_format: "stream-json",
|
|
2522
2549
|
additional_directories: additionalDirectories,
|
|
@@ -2596,6 +2623,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2596
2623
|
},
|
|
2597
2624
|
{
|
|
2598
2625
|
writeErr,
|
|
2626
|
+
mcpConfigWarnings: false,
|
|
2599
2627
|
loadMcpConfig: deps.loadMcpConfig,
|
|
2600
2628
|
loadRegisteredMcp: deps.loadRegisteredMcp,
|
|
2601
2629
|
loadIdeMcp: deps.loadIdeMcp,
|
|
@@ -2749,9 +2777,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2749
2777
|
// the single-prompt runner + the REPL /add-dir path. Best-effort.
|
|
2750
2778
|
if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
|
|
2751
2779
|
try {
|
|
2752
|
-
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
2753
|
-
"../repl/add-dir.js"
|
|
2754
|
-
);
|
|
2780
|
+
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
2781
|
+
await import("../repl/add-dir.js");
|
|
2755
2782
|
notifyMcpRootsChanged(
|
|
2756
2783
|
[hostMcp.mcpClient],
|
|
2757
2784
|
workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
|
|
@@ -2817,6 +2844,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2817
2844
|
.startHeadlessRemoteApproval;
|
|
2818
2845
|
_remoteApproval = await startRemoteApproval({
|
|
2819
2846
|
agentSessionId: sessionId,
|
|
2847
|
+
allowLan: options.remoteControlAllowLan === true,
|
|
2848
|
+
env: process.env,
|
|
2820
2849
|
});
|
|
2821
2850
|
streamCleanup.setRemoteApproval(_remoteApproval);
|
|
2822
2851
|
emit({
|
|
@@ -2840,6 +2869,78 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2840
2869
|
}
|
|
2841
2870
|
}
|
|
2842
2871
|
|
|
2872
|
+
const streamInteraction = {};
|
|
2873
|
+
if (interactiveQuestions) streamInteraction.askUser = interactionAskUser;
|
|
2874
|
+
if (options.includeHookEvents === true) {
|
|
2875
|
+
streamInteraction.emit = (kind, payload = {}) => {
|
|
2876
|
+
const subAgentId =
|
|
2877
|
+
typeof payload.subAgentId === "string" && payload.subAgentId.trim()
|
|
2878
|
+
? payload.subAgentId.slice(0, 160)
|
|
2879
|
+
: null;
|
|
2880
|
+
if (!subAgentId) return;
|
|
2881
|
+
const base = {
|
|
2882
|
+
schema_version: 1,
|
|
2883
|
+
subagent_id: subAgentId,
|
|
2884
|
+
parent_id:
|
|
2885
|
+
typeof payload.parentSessionId === "string" &&
|
|
2886
|
+
payload.parentSessionId.trim()
|
|
2887
|
+
? payload.parentSessionId.slice(0, 160)
|
|
2888
|
+
: sessionId,
|
|
2889
|
+
...(typeof payload.role === "string" && payload.role.trim()
|
|
2890
|
+
? { role: payload.role.trim().slice(0, 96) }
|
|
2891
|
+
: {}),
|
|
2892
|
+
};
|
|
2893
|
+
if (kind === "sub-agent.started") {
|
|
2894
|
+
emit({
|
|
2895
|
+
type: "subagent_started",
|
|
2896
|
+
...base,
|
|
2897
|
+
background: payload.background === true,
|
|
2898
|
+
});
|
|
2899
|
+
} else if (
|
|
2900
|
+
kind === "sub-agent.completed" ||
|
|
2901
|
+
kind === "sub-agent.failed"
|
|
2902
|
+
) {
|
|
2903
|
+
emit({
|
|
2904
|
+
type: "subagent_completed",
|
|
2905
|
+
...base,
|
|
2906
|
+
status: kind === "sub-agent.failed" ? "failed" : "completed",
|
|
2907
|
+
background: payload.background === true,
|
|
2908
|
+
...(Number.isFinite(payload.iterationCount)
|
|
2909
|
+
? {
|
|
2910
|
+
iteration_count: Math.max(
|
|
2911
|
+
0,
|
|
2912
|
+
Math.floor(payload.iterationCount),
|
|
2913
|
+
),
|
|
2914
|
+
}
|
|
2915
|
+
: {}),
|
|
2916
|
+
});
|
|
2917
|
+
} else if (kind === "sub-agent.progress") {
|
|
2918
|
+
emit({
|
|
2919
|
+
type: "subagent_progress",
|
|
2920
|
+
...base,
|
|
2921
|
+
event_type:
|
|
2922
|
+
typeof payload.event_type === "string"
|
|
2923
|
+
? payload.event_type.slice(0, 96)
|
|
2924
|
+
: "unknown",
|
|
2925
|
+
...(typeof payload.tool === "string" && payload.tool
|
|
2926
|
+
? { tool: payload.tool.slice(0, 128) }
|
|
2927
|
+
: {}),
|
|
2928
|
+
...(Number.isFinite(payload.iteration_count)
|
|
2929
|
+
? {
|
|
2930
|
+
iteration_count: Math.max(
|
|
2931
|
+
0,
|
|
2932
|
+
Math.floor(payload.iteration_count),
|
|
2933
|
+
),
|
|
2934
|
+
}
|
|
2935
|
+
: {}),
|
|
2936
|
+
...(Number.isFinite(payload.token_count)
|
|
2937
|
+
? { token_count: Math.max(0, Math.floor(payload.token_count)) }
|
|
2938
|
+
: {}),
|
|
2939
|
+
});
|
|
2940
|
+
}
|
|
2941
|
+
};
|
|
2942
|
+
}
|
|
2943
|
+
|
|
2843
2944
|
const loopOptionsBase = {
|
|
2844
2945
|
model,
|
|
2845
2946
|
provider,
|
|
@@ -2853,6 +2954,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2853
2954
|
additionalDirectories,
|
|
2854
2955
|
sessionId,
|
|
2855
2956
|
sessionBudget: options.sessionBudget || null,
|
|
2957
|
+
hostResourceBudget,
|
|
2856
2958
|
sessionHostSnapshot: canonicalResume?.snapshot || null,
|
|
2857
2959
|
// Auto-checkpoint (Claude-Code parity): snapshot the work tree before each
|
|
2858
2960
|
// mutating tool so a stream consumer (e.g. the IDE chat panel) can rewind.
|
|
@@ -2881,9 +2983,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2881
2983
|
// ask_user_question round-trip (opt-in via CC_INTERACTIVE_QUESTIONS): give
|
|
2882
2984
|
// the tool handler an askUser that emits question_request + blocks on stdin.
|
|
2883
2985
|
// Absent → agent-core returns user_not_reachable (graceful proceed).
|
|
2884
|
-
interaction:
|
|
2885
|
-
?
|
|
2886
|
-
: undefined,
|
|
2986
|
+
interaction:
|
|
2987
|
+
Object.keys(streamInteraction).length > 0 ? streamInteraction : undefined,
|
|
2887
2988
|
prepareCall: goalPrepareCallFn,
|
|
2888
2989
|
// --mcp-config wiring (tool defs + dispatch map + live client).
|
|
2889
2990
|
mcpClient: mcp?.mcpClient || null,
|
|
@@ -3085,13 +3186,43 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3085
3186
|
// Stop / Claude-Code Esc parity) instead of waiting in line behind it.
|
|
3086
3187
|
// Normal events queue for the serial turn loop below; interrupts act on the
|
|
3087
3188
|
// live per-turn AbortController and are never queued.
|
|
3189
|
+
// A normal input can contain arbitrary user data, so retain it only while it
|
|
3190
|
+
// is waiting for the serial turn loop. Interrupts/approvals/answers remain
|
|
3191
|
+
// out-of-band controls and never consume a queue slot.
|
|
3088
3192
|
const queue = [];
|
|
3089
3193
|
let wakeQueue = null;
|
|
3090
3194
|
let inputDone = false;
|
|
3091
3195
|
let currentAbort = null;
|
|
3196
|
+
let inputBacklogFailure = false;
|
|
3092
3197
|
let slashRequestSeq = 0;
|
|
3093
3198
|
const inputLines = readJsonLines(input);
|
|
3094
|
-
|
|
3199
|
+
const releaseQueuedInputEvents = () => {
|
|
3200
|
+
while (queue.length > 0) {
|
|
3201
|
+
const queued = queue.shift();
|
|
3202
|
+
try {
|
|
3203
|
+
queued?.lease?.release?.();
|
|
3204
|
+
} catch {
|
|
3205
|
+
// Drain every opaque slot even when an injected test authority has a
|
|
3206
|
+
// faulty disposer. Its payload is deliberately never inspected here.
|
|
3207
|
+
}
|
|
3208
|
+
}
|
|
3209
|
+
};
|
|
3210
|
+
const failInputEventBacklog = () => {
|
|
3211
|
+
if (inputBacklogFailure) return;
|
|
3212
|
+
inputBacklogFailure = true;
|
|
3213
|
+
releaseQueuedInputEvents();
|
|
3214
|
+
// A flood can happen while a model turn is running. Abort that turn before
|
|
3215
|
+
// surfacing the stable host diagnostic; otherwise it could continue to do
|
|
3216
|
+
// paid/tool work after the host has refused its input backlog.
|
|
3217
|
+
currentAbort?.abort();
|
|
3218
|
+
streamCleanup.setReason("host_event_backlog_exhausted");
|
|
3219
|
+
streamCleanup.requestStop();
|
|
3220
|
+
wakeQueue?.();
|
|
3221
|
+
};
|
|
3222
|
+
streamCleanup.setInputCancel(() => {
|
|
3223
|
+
releaseQueuedInputEvents();
|
|
3224
|
+
return inputLines.return?.();
|
|
3225
|
+
});
|
|
3095
3226
|
(async () => {
|
|
3096
3227
|
try {
|
|
3097
3228
|
for await (const line of inputLines) {
|
|
@@ -3161,7 +3292,26 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3161
3292
|
);
|
|
3162
3293
|
continue;
|
|
3163
3294
|
}
|
|
3164
|
-
|
|
3295
|
+
try {
|
|
3296
|
+
if (typeof hostResourceBudget?.admitEvent !== "function") {
|
|
3297
|
+
throw new TypeError(
|
|
3298
|
+
"host resource budget does not provide admitEvent()",
|
|
3299
|
+
);
|
|
3300
|
+
}
|
|
3301
|
+
const lease = hostResourceBudget.admitEvent();
|
|
3302
|
+
if (!lease || typeof lease.release !== "function") {
|
|
3303
|
+
throw new TypeError(
|
|
3304
|
+
"host resource budget event admission is invalid",
|
|
3305
|
+
);
|
|
3306
|
+
}
|
|
3307
|
+
queue.push({ parsed, lease });
|
|
3308
|
+
} catch {
|
|
3309
|
+
// Refuse the whole input stream rather than dropping one unbounded
|
|
3310
|
+
// event and then accepting more. The externally-visible error below
|
|
3311
|
+
// is fixed and contains none of the rejected line's content.
|
|
3312
|
+
failInputEventBacklog();
|
|
3313
|
+
break;
|
|
3314
|
+
}
|
|
3165
3315
|
if (wakeQueue) wakeQueue();
|
|
3166
3316
|
}
|
|
3167
3317
|
} catch {
|
|
@@ -3181,7 +3331,15 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3181
3331
|
})();
|
|
3182
3332
|
const nextEvent = async () => {
|
|
3183
3333
|
for (;;) {
|
|
3184
|
-
if (queue.length > 0)
|
|
3334
|
+
if (queue.length > 0) {
|
|
3335
|
+
const queued = queue.shift();
|
|
3336
|
+
try {
|
|
3337
|
+
return queued.parsed;
|
|
3338
|
+
} finally {
|
|
3339
|
+
// The serial loop now owns the event; it is no longer backlog.
|
|
3340
|
+
queued.lease.release();
|
|
3341
|
+
}
|
|
3342
|
+
}
|
|
3185
3343
|
if (inputDone || options.signal?.aborted) return null;
|
|
3186
3344
|
await new Promise((r) => {
|
|
3187
3345
|
let settled = false;
|
|
@@ -3202,6 +3360,18 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3202
3360
|
for (;;) {
|
|
3203
3361
|
await deps.outputFlow?.wait?.();
|
|
3204
3362
|
const parsed = await nextEvent();
|
|
3363
|
+
if (inputBacklogFailure) {
|
|
3364
|
+
emit({
|
|
3365
|
+
type: "result",
|
|
3366
|
+
subtype: "error_host_resource_budget",
|
|
3367
|
+
is_error: true,
|
|
3368
|
+
code: HOST_EVENT_BACKLOG_CODE,
|
|
3369
|
+
error: HOST_EVENT_BACKLOG_ERROR,
|
|
3370
|
+
session_id: sessionId,
|
|
3371
|
+
});
|
|
3372
|
+
sawError = true;
|
|
3373
|
+
break;
|
|
3374
|
+
}
|
|
3205
3375
|
if (parsed == null) break; // stdin closed
|
|
3206
3376
|
sessionHostLease?.assert?.();
|
|
3207
3377
|
if (turnBindingPersistenceError) {
|
|
@@ -3690,9 +3860,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3690
3860
|
// session can honour the user's standing preferences ("越用越聪明"
|
|
3691
3861
|
// flywheel). Best-effort — a learning ledger must never break the chat.
|
|
3692
3862
|
try {
|
|
3693
|
-
const { appendFeedback } =
|
|
3694
|
-
"../lib/pdh-feedback-ledger.js"
|
|
3695
|
-
);
|
|
3863
|
+
const { appendFeedback } =
|
|
3864
|
+
await import("../lib/pdh-feedback-ledger.js");
|
|
3696
3865
|
appendFeedback({ sessionId, turnId, kind, comment });
|
|
3697
3866
|
} catch {
|
|
3698
3867
|
/* persistence is best-effort */
|
|
@@ -3823,9 +3992,8 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3823
3992
|
// settings.json UserPromptSubmit hooks. block → skip this turn; context → inject.
|
|
3824
3993
|
if (settingsHooks) {
|
|
3825
3994
|
try {
|
|
3826
|
-
const { runUserPromptSubmitHooks } =
|
|
3827
|
-
"../lib/settings-hook-events.js"
|
|
3828
|
-
);
|
|
3995
|
+
const { runUserPromptSubmitHooks } =
|
|
3996
|
+
await import("../lib/settings-hook-events.js");
|
|
3829
3997
|
const ups = runUserPromptSubmitHooks(settingsHooks, {
|
|
3830
3998
|
prompt: userContent,
|
|
3831
3999
|
cwd,
|
|
@@ -4315,6 +4483,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4315
4483
|
: "completed",
|
|
4316
4484
|
);
|
|
4317
4485
|
await streamCleanup.cleanup();
|
|
4486
|
+
removeHookObserver?.();
|
|
4318
4487
|
|
|
4319
4488
|
if (!pipeState.closed) {
|
|
4320
4489
|
emit({ type: "system", subtype: "end", session_id: sessionId, turns });
|