chainlesschain 0.162.179 → 0.162.181
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 +6 -3
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BF13YdB-.js → AIOps-cq0dwbnf.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B9y67AjF.js → ActionButton-CvcgGl3w.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-FcdDHoSC.js → Analytics-hM2-jFqg.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CRm_zwSp.js → AppLayout-B9_Gsd_g.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Cbo7-usf.js → Artifacts-B7bu52Og.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-vMaLpkHC.js → Audit-DThfDgqB.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-FiUY692t.js → BackgroundAgents-DjlFiD4v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BK80j_GQ.js → Backup-CK9xJKnG.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-ChNMuYR1.js → BaseInput-DEiSU8K8.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-928UREpm.js → Chat-CpT96czj.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BKPPNmZI.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-dFW-zDbe.js → Checkbox-C1GfDnO0.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BCcNJUj2.js → Codegen-3DAKgiLx.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DcEkLv70.js → Col-74cOwZU1.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DihBRRqg.js → Community-tn9Kkz9j.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DGYxwWET.js → Compact-BcoXH7m4.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-OnYe1vS4.js → Compliance-DIPGUBgi.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CmWB54c2.js → Cowork-doD5_91c.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BrANb2uw.js → Cron-C-IDvubz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-2HgWzSxg.js → Crosschain-CdcCoBdj.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DdDwNI6K.js → DID-DdH5aMMA.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-D6PnE78-.js → Dashboard-DHLA4mm0.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-ClzvSN4O.js → Dropdown-dEeCt7Md.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BUk9B727.js → EmailListRenderer-BMaecFv9.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C8hi3v7i.js → FamilyGuardDashboard-DUaUukTN.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B5SP8xkg.js → Federation-CMBE0_rp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DWzJ8AU5.js → FormItemContext-PG-JDbXq.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-3E3Q3rjG.js → GenericCardRenderer-Bcb0p88m.js} +1 -1
- package/src/assets/web-panel/assets/{Git-z8IdCMId.js → Git-Bgv15myB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CgqCF9lX.js → Governance-DB8YTArI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-zgS-AuH9.js → Inference-BQMwCWaS.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BdbgmESJ.js → KnowledgeGraph-B1_ZziiB.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BHpknnjy.js → Logs-DovEEnt_.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-D201OL4T.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Di9sAR7j.js → Marketplace-BlCXSpyB.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DtnR9Z_A.js → McpTools-CsCR09Wj.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BaX9uuXD.js → Memory-CBVRLKno.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-xelyKWTY.js → MobileBridge-C9OIafgA.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BiFTOGBN.js → MobileProjects-D_zoJ8Xs.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-bV3OzTiO.js → Mtc-vE-HdvLj.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BkwvFTdZ.js → MtcAudit-CPLaekCd.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-_6HQQ-oC.js → Multisig-C_UP9C2o.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BBYhmWQZ.js → NLProgramming-2nODJcU1.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cq-6dQnU.js → Notes-BhE-SJGu.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-ILZ9zkX6.js → NotificationSettings-D21q7BNU.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DgmTBEvk.js → OrderTableRenderer-0b62GYOD.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CkLnWwCk.js → Organization-CEqmw_sb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CWVHZbhf.js → Overflow-MW-gMDO_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BXbqETkr.js → P2P-CY0hjI_G.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser--0JR-0ex.js → PdhVaultBrowser-BbWh7Man.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Cz9_tfSy.js → Permissions-ChqEA_4Q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dq7OWYtx.js → PersonalDataHub-B3YrbYfD.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DHPUNcc-.js → Pipeline-B8WBhhlW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CEAbrDkS.js → Privacy-Cmb0PXNx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CJYfclXE.js → ProjectInit-hF6zW3Nz.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-oCTgPCgp.js → ProjectSettings-BFSVfpW0.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DAWkVFkc.js +1 -0
- package/src/assets/web-panel/assets/{Providers-BLTZtzTG.js → Providers-B8yux8Dx.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C0b0TQB3.js → QrScannerModal-N76cQluO.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-tOl6N_gM.js → QuickAsk-ClvZ0KYR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPzKr8yr.js → Recommend-B-GfgBpT.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-mlglCdQi.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-Cji1Vl79.js → Reputation-DJIZzQeG.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D-NERWf2.js → Row-COzxu_bb.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DzlgmAlB.js → RssFeed-CoYsJQuE.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Cs0SWSa4.js → Search-DC77Mq9S.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DL7EzcUO.js → Security-Loy2EdMO.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CT-PzgTd.js → Services-GUD07Eu0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-tByJWdJg.js → Skeleton-DWzkptYU.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Dnr_6TTl.js → Skills-CEDn1r-Z.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-4O-yq0LY.js → Sla-ub_k4pXh.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BYBVg1oR.js → SpeechSettings-D7HLX9CA.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CpOYPbE5.js → SyncSettings-DbwOvl6m.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CGVhOVh6.js → Tasks-CBQzoAu5.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BuHFxR4X.js → Templates-BNVeIhud.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DxDxHzgf.js → Tenant-PS9AzhXU.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B9g_nISg.js → Terminal-Cgb4eLB_.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DlrBC_4A.js → TimelineRenderer-CrmXMOkg.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DvBlYZ6i.js → Tokens-DD-VDHw1.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dg8G9bhF.js → Trigger-BsoN_n-n.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-COICx4E-.js → Trust-n8LmN4ZV.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4pOBv7T.js → UkeySign-C9_7MImA.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Qt4NMA8Q.js → VideoEditing-DyBteNgn.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-X1EkQc2Z.js → Wallet-BS5ixeXI.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CyeEFBE5.js → WebAuthn-spc4UImU.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-nwzbMiVQ.js → WorkflowEditor-D7iVvaBO.js} +1 -1
- package/src/assets/web-panel/assets/chat-6CmBkHrL.js +1 -0
- package/src/assets/web-panel/assets/{colors-5Isz5lhJ.js → colors-BGoCLkxI.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DsFQS3Oy.js → compact-item-fYZBetMO.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-OcEXp2uz.js → createContext-BeM-1UVj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BzPwHnw8.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CZvC4p09.js → hasIn-CE7ZuEnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BF1sab0Q.js → index--lap6cf7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7yeL3rf.js → index-ATcSr_2O.js} +1 -1
- package/src/assets/web-panel/assets/{index-VkFXA9N-.js → index-B2U-ObMq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSmGGg5h.js → index-B3CDgvNW.js} +1 -1
- package/src/assets/web-panel/assets/{index-jrNIrpq4.js → index-B4wiTEOM.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8ibl7bc.js → index-B8BsdNV_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOLozRk8.js → index-BEVm0lCS.js} +10 -10
- package/src/assets/web-panel/assets/{index-BPgc_bdR.js → index-BNZDILcO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTZZzlMO.js → index-BU_2qiDk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Vubi6Tf5.js → index-BV551878.js} +1 -1
- package/src/assets/web-panel/assets/{index-nXrnztXp.js → index-BfPL-m46.js} +1 -1
- package/src/assets/web-panel/assets/{index-CN8lPVpQ.js → index-BowH1eLQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgE2BZl2.js → index-BsMfoaeo.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd5b2JHB.js → index-BunaQCa0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQlGw0nQ.js → index-C0v6YKKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Do6FJK32.js → index-C4SJVjs4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqvo1f9T.js → index-C9Y3k0HI.js} +1 -1
- package/src/assets/web-panel/assets/{index-LUdgPZg9.js → index-CIpVrf5P.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpD2O7_p.js → index-CRLjEP1H.js} +1 -1
- package/src/assets/web-panel/assets/{index-r_9NG6P7.js → index-CRnUE8Cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-FIgMAfBh.js → index-Cip8emOQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-RsQ1lFDV.js → index-CpIGIB85.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGJupV0S.js → index-D1r9tT3J.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpglwPWl.js → index-DT3zPSVX.js} +1 -1
- package/src/assets/web-panel/assets/index-DacrAdc-.js +1 -0
- package/src/assets/web-panel/assets/{index-CG3B2wCF.js → index-De0quFDw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxA2PDK1.js → index-DoXk5KJ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaGKOVvQ.js → index-DsvfrESp.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7CtJYXq.js → index-Dw1PyYPm.js} +1 -1
- package/src/assets/web-panel/assets/index-EHzNJozo.js +1 -0
- package/src/assets/web-panel/assets/{index-Bu9NXvIa.js → index-MtOuq2i6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsZkTaa3.js → index-Puq6Luf1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPE4zHXF.js → index-QIpnpZgz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bsb-iylv.js → index-RMZ8a7Yt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMtGRQqw.js → index-WUrJ6S1j.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3lWvhk4.js → index-YjcumOZ4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmVbCGx_.js → index-lJBjB1QX.js} +1 -1
- package/src/assets/web-panel/assets/{index-A5SHQW_M.js → index-ukg99D1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFJgt6qM.js → index-zb7rVOhV.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Cdgep9YT.js → initDefaultProps-CYHMs1ag.js} +1 -1
- package/src/assets/web-panel/assets/{motion-7yn1ACEm.js → motion-DDB2Ffk5.js} +1 -1
- package/src/assets/web-panel/assets/{move-D8o133Xc.js → move-Bg3cD-dX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CClHIG9V.js → mtc-parser-B5nedjTS.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CLnrPE2d.js → omit-BHyuUILu.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-1CTWoZWl.js → pickAttrs-C9YQnEN9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-xNNtS4Sp.js → placementArrow-DBUFYUe7.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-ypzAofs7.js → responsiveObserve-nBs2Obnk.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QsrY9UwD.js → slide-DkCEaXNU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DSdThzOB.js → statusUtils-aqE1Wi6U.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B_kKM8Ob.js → styleChecker-CN5bhfHB.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CcdTBNV9.js → useFlexGapSupport-B_oX_kvJ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BuAH2XFU.js → useFs-rCuXHeme.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B3zWiG4A.js → usePersonalDataHub-DZR9Abyd.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B45Rc-CQ.js → vnode-ConCYQlX.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DaYZDU5f.js → zoom-CUdDxG5M.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +4 -1
- package/src/commands/background-session.js +2 -1
- package/src/commands/context.js +69 -2
- package/src/commands/hub.js +30 -24
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/background-agent-protocol.js +38 -0
- package/src/gateways/ws/message-dispatcher.js +1 -0
- package/src/gateways/ws/remote-session-protocol.js +65 -6
- package/src/gateways/ws/ws-server.js +8 -1
- package/src/harness/feature-flags.js +15 -8
- package/src/harness/mcp-client.js +618 -43
- package/src/lazy-dispatch.js +30 -1
- package/src/lib/agent-authority.js +22 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +161 -0
- package/src/lib/agent-team/team-runner.js +22 -0
- package/src/lib/artifact-store.js +35 -0
- package/src/lib/async-hook-supervisor.cjs +13 -2
- package/src/lib/audit-mtc.js +3 -2
- package/src/lib/background-agent-supervisor.js +104 -3
- package/src/lib/background-interaction-journal.js +407 -0
- package/src/lib/background-interaction-resolver.js +23 -34
- package/src/lib/background-session-transport.js +12 -2
- package/src/lib/capability-manifest.js +41 -3
- package/src/lib/capability-negotiation.js +1 -1
- package/src/lib/channels/channel-manager.js +33 -0
- package/src/lib/channels/telegram-channel.js +23 -5
- package/src/lib/channels/webhook-channel.js +38 -15
- package/src/lib/chrome-connector.js +169 -23
- package/src/lib/config-manager.js +23 -9
- package/src/lib/context-breakdown.js +31 -0
- package/src/lib/cowork-cron.js +274 -32
- package/src/lib/cross-chain-mtc.js +3 -2
- package/src/lib/durable-security-store.js +124 -0
- package/src/lib/event-runtime-host.js +67 -6
- package/src/lib/event-runtime-store.js +163 -0
- package/src/lib/goal-store.js +32 -12
- package/src/lib/headless-manifest.js +2 -1
- package/src/lib/hook-environment.cjs +58 -0
- package/src/lib/hook-manager.js +12 -5
- package/src/lib/hook-runner.cjs +122 -28
- package/src/lib/hook-runner.js +1 -0
- package/src/lib/hooks-v2-producers.js +36 -0
- package/src/lib/hooks-v2-runtime.js +329 -52
- package/src/lib/interaction-adapter.js +60 -19
- package/src/lib/interaction-binding.js +64 -0
- package/src/lib/json-schema-output.js +439 -14
- package/src/lib/json-schema-validate.js +514 -883
- package/src/lib/lan-pairing-tokens.js +115 -57
- package/src/lib/lsp/__tests__/lsp-client.test.js +32 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +25 -0
- package/src/lib/lsp/lsp-client.js +4 -0
- package/src/lib/lsp/lsp-manager.js +3 -0
- package/src/lib/lsp/lsp-server-registry.js +18 -0
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-oauth.js +35 -21
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/permission-decision.js +99 -0
- package/src/lib/plugin-monitor-supervisor.js +3 -0
- package/src/lib/plugin-runtime/capabilities.js +50 -0
- package/src/lib/plugin-runtime/capability-consent.js +42 -35
- package/src/lib/plugin-runtime/hooks.js +36 -9
- package/src/lib/plugin-runtime/install.js +23 -7
- package/src/lib/plugin-runtime/lsp.js +4 -0
- package/src/lib/plugin-runtime/manifest.js +50 -2
- package/src/lib/plugin-runtime/mcp.js +30 -5
- package/src/lib/plugin-runtime/monitors.js +11 -0
- package/src/lib/plugin-runtime/plugin-options.js +94 -38
- package/src/lib/plugin-runtime/policy.js +29 -2
- package/src/lib/plugin-runtime/sandbox-policy.js +84 -0
- package/src/lib/plugin-runtime/scopes.js +7 -3
- package/src/lib/plugin-runtime/trust.js +36 -31
- package/src/lib/process-execution-broker/credential-agent.js +114 -16
- package/src/lib/process-execution-broker/credential-transport-worker.js +312 -0
- package/src/lib/process-execution-broker/credential-transport.js +378 -0
- package/src/lib/process-execution-broker/index.js +408 -19
- package/src/lib/process-execution-broker/platform-sandbox.js +561 -21
- package/src/lib/process-execution-broker/windows-sandbox.ps1 +999 -0
- package/src/lib/project-mcp-trust.js +21 -26
- package/src/lib/protocol-replay.js +19 -12
- package/src/lib/settings-hooks.cjs +13 -0
- package/src/lib/skill-loader.js +83 -10
- package/src/lib/sync-credentials.js +5 -4
- package/src/lib/turn-binding.js +8 -6
- package/src/repl/agent-repl.js +113 -28
- package/src/repl/repl-turn-binding.js +5 -2
- package/src/runtime/agent-core.js +331 -26
- package/src/runtime/coding-agent-contract-shared.cjs +3 -3
- package/src/runtime/headless-runner.js +101 -4
- package/src/runtime/headless-stream.js +209 -23
- package/src/runtime/mcp-config.js +29 -17
- package/src/runtime/policies/agent-policy.js +2 -0
- package/src/workers/background-agent-worker.js +128 -13
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DvySUzxJ.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DkxCweb1.js +0 -1
- package/src/assets/web-panel/assets/Projects-ClomCrN0.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-pRgaWsUK.js +0 -4
- package/src/assets/web-panel/assets/chat-Bvl-ojg2.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CSVgo71Z.js +0 -1
- package/src/assets/web-panel/assets/index-DMIWh9fu.js +0 -1
- package/src/assets/web-panel/assets/index-ssTvV1l6.js +0 -1
|
@@ -93,6 +93,8 @@ import {
|
|
|
93
93
|
formatProviderHttpError,
|
|
94
94
|
formatProviderResponseError,
|
|
95
95
|
} from "../lib/provider-http-error.js";
|
|
96
|
+
import { buildPermissionDecision } from "../lib/permission-decision.js";
|
|
97
|
+
import { resolveSandboxPolicyPath } from "../lib/agent-sandbox.js";
|
|
96
98
|
|
|
97
99
|
export { formatProviderHttpError };
|
|
98
100
|
|
|
@@ -1172,6 +1174,95 @@ const GUARDED_FILE_MUTATION_TOOLS = new Set([
|
|
|
1172
1174
|
"notebook_edit",
|
|
1173
1175
|
]);
|
|
1174
1176
|
|
|
1177
|
+
function agentFileToolPathRequests(name, args = {}, workspaceRoots = []) {
|
|
1178
|
+
const one = (argument, access) =>
|
|
1179
|
+
typeof args[argument] === "string" && args[argument].length > 0
|
|
1180
|
+
? [{ argument, path: args[argument], access }]
|
|
1181
|
+
: [];
|
|
1182
|
+
switch (name) {
|
|
1183
|
+
case "read_file":
|
|
1184
|
+
return one("path", "read");
|
|
1185
|
+
case "write_file":
|
|
1186
|
+
case "edit_file":
|
|
1187
|
+
case "edit_file_hashed":
|
|
1188
|
+
case "delete_file":
|
|
1189
|
+
case "notebook_edit":
|
|
1190
|
+
return one("path", "write");
|
|
1191
|
+
case "move_file":
|
|
1192
|
+
return [
|
|
1193
|
+
...one("path", "write"),
|
|
1194
|
+
...one("target_path", "write"),
|
|
1195
|
+
];
|
|
1196
|
+
case "list_dir":
|
|
1197
|
+
return [
|
|
1198
|
+
{
|
|
1199
|
+
argument: "path",
|
|
1200
|
+
path:
|
|
1201
|
+
typeof args.path === "string" && args.path.length > 0
|
|
1202
|
+
? args.path
|
|
1203
|
+
: ".",
|
|
1204
|
+
access: "read",
|
|
1205
|
+
},
|
|
1206
|
+
];
|
|
1207
|
+
case "search_files":
|
|
1208
|
+
return typeof args.directory === "string" && args.directory.length > 0
|
|
1209
|
+
? [
|
|
1210
|
+
{
|
|
1211
|
+
argument: "directory",
|
|
1212
|
+
path: args.directory,
|
|
1213
|
+
access: "read",
|
|
1214
|
+
},
|
|
1215
|
+
]
|
|
1216
|
+
: workspaceRoots.map((root) => ({
|
|
1217
|
+
argument: "directory",
|
|
1218
|
+
path: root,
|
|
1219
|
+
access: "read",
|
|
1220
|
+
}));
|
|
1221
|
+
case "code_intelligence":
|
|
1222
|
+
return args.action === "workspace_symbols"
|
|
1223
|
+
? workspaceRoots.map((root) => ({
|
|
1224
|
+
argument: "file",
|
|
1225
|
+
path: root,
|
|
1226
|
+
access: "read",
|
|
1227
|
+
}))
|
|
1228
|
+
: one("file", "read");
|
|
1229
|
+
case "publish_artifact":
|
|
1230
|
+
return one("path", "read");
|
|
1231
|
+
default:
|
|
1232
|
+
return [];
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
function guardAgentFileToolPaths(name, args, context, cwd) {
|
|
1237
|
+
const workspaceRoots = workspaceRootsFor(
|
|
1238
|
+
cwd,
|
|
1239
|
+
context.additionalDirectories,
|
|
1240
|
+
);
|
|
1241
|
+
const requests = agentFileToolPathRequests(name, args || {}, workspaceRoots);
|
|
1242
|
+
for (const request of requests) {
|
|
1243
|
+
const verdict = resolveSandboxPolicyPath(request.path, {
|
|
1244
|
+
access: request.access,
|
|
1245
|
+
cwd,
|
|
1246
|
+
workspaceRoots,
|
|
1247
|
+
sandbox: context.sandbox || null,
|
|
1248
|
+
});
|
|
1249
|
+
if (!verdict.ok) {
|
|
1250
|
+
return {
|
|
1251
|
+
error:
|
|
1252
|
+
`[Workspace Path Guard] ${name}.${request.argument} ` +
|
|
1253
|
+
`"${request.path}" was blocked: ${verdict.error}.`,
|
|
1254
|
+
policy: {
|
|
1255
|
+
decision: "deny",
|
|
1256
|
+
via: "workspace-path-guard",
|
|
1257
|
+
reason: verdict.reason,
|
|
1258
|
+
access: request.access,
|
|
1259
|
+
},
|
|
1260
|
+
};
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
return null;
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1175
1266
|
function fileMutationPaths(name, args = {}) {
|
|
1176
1267
|
return [
|
|
1177
1268
|
args.path,
|
|
@@ -1553,6 +1644,16 @@ export async function executeTool(name, args, context = {}) {
|
|
|
1553
1644
|
}
|
|
1554
1645
|
context = { ...context, toolAttribution: attribution };
|
|
1555
1646
|
}
|
|
1647
|
+
|
|
1648
|
+
// Built-in file tools are confined to the declared workspace roots even
|
|
1649
|
+
// when no process sandbox is enabled. Resolve existing targets (and the
|
|
1650
|
+
// nearest existing parent for creates) through symlinks/junctions before any
|
|
1651
|
+
// permission hook, IDE preview, credential check, or filesystem operation
|
|
1652
|
+
// can touch them. Explicit --add-dir roots and sandbox allowRead/allowWrite
|
|
1653
|
+
// paths are the only supported expansions beyond cwd; deny paths still win.
|
|
1654
|
+
const workspacePathDenial = guardAgentFileToolPaths(name, args, context, cwd);
|
|
1655
|
+
if (workspacePathDenial) return workspacePathDenial;
|
|
1656
|
+
|
|
1556
1657
|
const toolContext = createToolContext({
|
|
1557
1658
|
toolName: runtimeDescriptor?.name || name,
|
|
1558
1659
|
cwd,
|
|
@@ -2758,6 +2859,39 @@ async function filterSkillsByCwd(skills, cwd) {
|
|
|
2758
2859
|
}
|
|
2759
2860
|
}
|
|
2760
2861
|
|
|
2862
|
+
async function promoteBrowserScreenshot(
|
|
2863
|
+
filePath,
|
|
2864
|
+
{ sessionId = null, title = "Browser screenshot" } = {},
|
|
2865
|
+
) {
|
|
2866
|
+
if (!filePath) return { artifact: null, error: null };
|
|
2867
|
+
try {
|
|
2868
|
+
const { ArtifactStore, publicArtifactMetadata } =
|
|
2869
|
+
await import("../lib/artifact-store.js");
|
|
2870
|
+
const entry = new ArtifactStore().publish({
|
|
2871
|
+
filePath,
|
|
2872
|
+
title,
|
|
2873
|
+
kind: "screenshot",
|
|
2874
|
+
sessionId: sessionId ? String(sessionId) : null,
|
|
2875
|
+
});
|
|
2876
|
+
return { artifact: publicArtifactMetadata(entry), error: null };
|
|
2877
|
+
} catch (err) {
|
|
2878
|
+
const code =
|
|
2879
|
+
typeof err?.code === "string"
|
|
2880
|
+
? err.code.replace(/[^A-Z0-9_-]/gi, "").slice(0, 40)
|
|
2881
|
+
: "";
|
|
2882
|
+
return {
|
|
2883
|
+
artifact: null,
|
|
2884
|
+
error: `browser screenshot artifact publication failed${code ? ` (${code})` : ""}`,
|
|
2885
|
+
};
|
|
2886
|
+
} finally {
|
|
2887
|
+
try {
|
|
2888
|
+
fs.rmSync(filePath, { force: true });
|
|
2889
|
+
} catch {
|
|
2890
|
+
/* best-effort cleanup */
|
|
2891
|
+
}
|
|
2892
|
+
}
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2761
2895
|
async function executeToolInner(
|
|
2762
2896
|
name,
|
|
2763
2897
|
args,
|
|
@@ -4219,7 +4353,8 @@ async function executeToolInner(
|
|
|
4219
4353
|
// Only METADATA returns to the conversation (the transcript never
|
|
4220
4354
|
// carries the file body); `cc artifacts` lists/inspects/cleans.
|
|
4221
4355
|
try {
|
|
4222
|
-
const { ArtifactStore } =
|
|
4356
|
+
const { ArtifactStore, publicArtifactMetadata } =
|
|
4357
|
+
await import("../lib/artifact-store.js");
|
|
4223
4358
|
const store = new ArtifactStore();
|
|
4224
4359
|
const entry = store.publish({
|
|
4225
4360
|
filePath: path.resolve(cwd, String(args.path || "")),
|
|
@@ -4229,7 +4364,7 @@ async function executeToolInner(
|
|
|
4229
4364
|
sessionId: sessionId ? String(sessionId) : null,
|
|
4230
4365
|
});
|
|
4231
4366
|
return attachDescriptor({
|
|
4232
|
-
published: entry,
|
|
4367
|
+
published: publicArtifactMetadata(entry),
|
|
4233
4368
|
hint: "The user can browse this with `cc artifacts list` / `cc artifacts show <id>`.",
|
|
4234
4369
|
});
|
|
4235
4370
|
} catch (err) {
|
|
@@ -4265,7 +4400,25 @@ async function executeToolInner(
|
|
|
4265
4400
|
error: `browser_state failed: ${state.error}`,
|
|
4266
4401
|
});
|
|
4267
4402
|
}
|
|
4268
|
-
|
|
4403
|
+
const safeState = { ...state };
|
|
4404
|
+
if (state.screenshotPath) {
|
|
4405
|
+
const promoted = await promoteBrowserScreenshot(
|
|
4406
|
+
state.screenshotPath,
|
|
4407
|
+
{
|
|
4408
|
+
sessionId,
|
|
4409
|
+
title: `Browser state — ${state.title || "page"}`,
|
|
4410
|
+
},
|
|
4411
|
+
);
|
|
4412
|
+
delete safeState.screenshotPath;
|
|
4413
|
+
delete safeState.screenshotRef;
|
|
4414
|
+
if (promoted.artifact) {
|
|
4415
|
+
safeState.screenshotArtifact = promoted.artifact;
|
|
4416
|
+
safeState.screenshotRef = promoted.artifact.id;
|
|
4417
|
+
} else {
|
|
4418
|
+
safeState.screenshotArtifactError = promoted.error;
|
|
4419
|
+
}
|
|
4420
|
+
}
|
|
4421
|
+
return attachDescriptor(safeState);
|
|
4269
4422
|
} catch (err) {
|
|
4270
4423
|
return attachDescriptor({
|
|
4271
4424
|
error: `browser_state failed: ${err.message}`,
|
|
@@ -4336,7 +4489,32 @@ async function executeToolInner(
|
|
|
4336
4489
|
error: `browser_act failed: ${result.error}`,
|
|
4337
4490
|
});
|
|
4338
4491
|
}
|
|
4339
|
-
|
|
4492
|
+
const safeResult = { ...result, steps: [] };
|
|
4493
|
+
for (let i = 0; i < (result.steps || []).length; i += 1) {
|
|
4494
|
+
const originalStep = result.steps[i];
|
|
4495
|
+
const step = { ...originalStep };
|
|
4496
|
+
if (originalStep.screenshotPath) {
|
|
4497
|
+
const promoted = await promoteBrowserScreenshot(
|
|
4498
|
+
originalStep.screenshotPath,
|
|
4499
|
+
{
|
|
4500
|
+
sessionId,
|
|
4501
|
+
title: `Browser action screenshot ${i + 1}`,
|
|
4502
|
+
},
|
|
4503
|
+
);
|
|
4504
|
+
delete step.screenshotPath;
|
|
4505
|
+
delete step.screenshotRef;
|
|
4506
|
+
if (promoted.artifact) {
|
|
4507
|
+
step.screenshotArtifact = promoted.artifact;
|
|
4508
|
+
step.screenshotRef = promoted.artifact.id;
|
|
4509
|
+
step.detail = `screenshot artifact: ${promoted.artifact.id}`;
|
|
4510
|
+
} else {
|
|
4511
|
+
step.screenshotArtifactError = promoted.error;
|
|
4512
|
+
step.detail = promoted.error;
|
|
4513
|
+
}
|
|
4514
|
+
}
|
|
4515
|
+
safeResult.steps.push(step);
|
|
4516
|
+
}
|
|
4517
|
+
return attachDescriptor(safeResult);
|
|
4340
4518
|
} catch (err) {
|
|
4341
4519
|
return attachDescriptor({
|
|
4342
4520
|
error: `browser_act failed: ${err.message}`,
|
|
@@ -5297,7 +5475,7 @@ export function safeStringifyToolResult(value) {
|
|
|
5297
5475
|
}
|
|
5298
5476
|
}
|
|
5299
5477
|
|
|
5300
|
-
function emitToolHookLifecycle({
|
|
5478
|
+
export function emitToolHookLifecycle({
|
|
5301
5479
|
tool,
|
|
5302
5480
|
args,
|
|
5303
5481
|
result,
|
|
@@ -5306,6 +5484,7 @@ function emitToolHookLifecycle({
|
|
|
5306
5484
|
turnId = null,
|
|
5307
5485
|
toolUseId = null,
|
|
5308
5486
|
cwd = process.cwd(),
|
|
5487
|
+
emit = emitHooksV2Event,
|
|
5309
5488
|
}) {
|
|
5310
5489
|
const failed = Boolean(error || result?.error);
|
|
5311
5490
|
const base = {
|
|
@@ -5317,7 +5496,7 @@ function emitToolHookLifecycle({
|
|
|
5317
5496
|
duration_ms: Number(result?.toolTelemetryRecord?.durationMs || 0),
|
|
5318
5497
|
cwd,
|
|
5319
5498
|
};
|
|
5320
|
-
|
|
5499
|
+
emit(failed ? "PostToolUseFailure" : "PostToolUse", {
|
|
5321
5500
|
...base,
|
|
5322
5501
|
...(failed
|
|
5323
5502
|
? {
|
|
@@ -5337,7 +5516,7 @@ function emitToolHookLifecycle({
|
|
|
5337
5516
|
args?.targetPath ||
|
|
5338
5517
|
args?.target_path ||
|
|
5339
5518
|
null;
|
|
5340
|
-
|
|
5519
|
+
emit("FileChanged", {
|
|
5341
5520
|
...base,
|
|
5342
5521
|
path: changedPath == null ? null : String(changedPath),
|
|
5343
5522
|
operation: tool,
|
|
@@ -5346,6 +5525,32 @@ function emitToolHookLifecycle({
|
|
|
5346
5525
|
return failed;
|
|
5347
5526
|
}
|
|
5348
5527
|
|
|
5528
|
+
export function emitToolBatchHookLifecycle({
|
|
5529
|
+
records = [],
|
|
5530
|
+
sessionId = null,
|
|
5531
|
+
turnId = null,
|
|
5532
|
+
cwd = process.cwd(),
|
|
5533
|
+
parallel = false,
|
|
5534
|
+
emit = emitHooksV2Event,
|
|
5535
|
+
}) {
|
|
5536
|
+
if (!Array.isArray(records) || records.length === 0) return null;
|
|
5537
|
+
const failed = records.filter((record) => record?.failed === true).length;
|
|
5538
|
+
const payload = {
|
|
5539
|
+
schema_version: 1,
|
|
5540
|
+
session_id: sessionId,
|
|
5541
|
+
turn_id: turnId,
|
|
5542
|
+
cwd,
|
|
5543
|
+
parallel: parallel === true,
|
|
5544
|
+
total: records.length,
|
|
5545
|
+
succeeded: records.length - failed,
|
|
5546
|
+
failed,
|
|
5547
|
+
tool_names: records.map((record) => record?.tool || "(unknown)"),
|
|
5548
|
+
tool_use_ids: records.map((record) => record?.toolUseId || null),
|
|
5549
|
+
};
|
|
5550
|
+
emit("PostToolBatch", payload);
|
|
5551
|
+
return payload;
|
|
5552
|
+
}
|
|
5553
|
+
|
|
5349
5554
|
/**
|
|
5350
5555
|
* Execute a spawn_sub_agent tool call.
|
|
5351
5556
|
* Creates an isolated SubAgentContext, runs it, and returns only the summary.
|
|
@@ -7507,11 +7712,12 @@ function extractInitialPromptText(messages) {
|
|
|
7507
7712
|
* recompute it. Not exported (no shim-parity impact) — only the telemetry seam
|
|
7508
7713
|
* uses it.
|
|
7509
7714
|
*/
|
|
7510
|
-
function
|
|
7511
|
-
|
|
7512
|
-
|
|
7513
|
-
|
|
7514
|
-
|
|
7715
|
+
function permissionDecision(callId, tool, result) {
|
|
7716
|
+
return buildPermissionDecision({
|
|
7717
|
+
toolUseId: callId,
|
|
7718
|
+
tool,
|
|
7719
|
+
result,
|
|
7720
|
+
});
|
|
7515
7721
|
}
|
|
7516
7722
|
|
|
7517
7723
|
export async function* agentLoop(messages, options) {
|
|
@@ -7931,6 +8137,14 @@ export async function* agentLoop(messages, options) {
|
|
|
7931
8137
|
// self-persist is best-effort
|
|
7932
8138
|
}
|
|
7933
8139
|
}
|
|
8140
|
+
emitHooksV2Event("PostCompact", {
|
|
8141
|
+
schema_version: 1,
|
|
8142
|
+
trigger: "auto",
|
|
8143
|
+
session_id: options.sessionId || null,
|
|
8144
|
+
messages_after: messages.length,
|
|
8145
|
+
stats,
|
|
8146
|
+
cwd: options.cwd || process.cwd(),
|
|
8147
|
+
});
|
|
7934
8148
|
yield { type: "compaction", stats, runId };
|
|
7935
8149
|
}
|
|
7936
8150
|
}
|
|
@@ -8182,7 +8396,33 @@ export async function* agentLoop(messages, options) {
|
|
|
8182
8396
|
},
|
|
8183
8397
|
{ cwd: options.cwd || process.cwd() },
|
|
8184
8398
|
);
|
|
8185
|
-
|
|
8399
|
+
const failures = (stopOutcome?.results || []).filter(
|
|
8400
|
+
(result) =>
|
|
8401
|
+
result?.nonBlockingError === true ||
|
|
8402
|
+
result?.malformedDecision === true ||
|
|
8403
|
+
result?.breakerOpen === true,
|
|
8404
|
+
);
|
|
8405
|
+
if (failures.length > 0) {
|
|
8406
|
+
emitHooksV2Event("StopFailure", {
|
|
8407
|
+
schema_version: 1,
|
|
8408
|
+
session_id: options.sessionId || null,
|
|
8409
|
+
run_id: runId,
|
|
8410
|
+
phase: "stop-hook",
|
|
8411
|
+
failures: failures.map((failure) => ({
|
|
8412
|
+
command: failure.command || null,
|
|
8413
|
+
exit_code: failure.exitCode ?? null,
|
|
8414
|
+
reason: failure.reason || failure.error || null,
|
|
8415
|
+
})),
|
|
8416
|
+
});
|
|
8417
|
+
}
|
|
8418
|
+
} catch (error) {
|
|
8419
|
+
emitHooksV2Event("StopFailure", {
|
|
8420
|
+
schema_version: 1,
|
|
8421
|
+
session_id: options.sessionId || null,
|
|
8422
|
+
run_id: runId,
|
|
8423
|
+
phase: "stop-hook",
|
|
8424
|
+
reason: error?.message || String(error),
|
|
8425
|
+
});
|
|
8186
8426
|
stopOutcome = null; // never affect the run outcome
|
|
8187
8427
|
}
|
|
8188
8428
|
if (stopOutcome && stopOutcome.decision === "block") {
|
|
@@ -8243,6 +8483,8 @@ export async function* agentLoop(messages, options) {
|
|
|
8243
8483
|
);
|
|
8244
8484
|
if (parallelReads) {
|
|
8245
8485
|
throwIfAborted(signal);
|
|
8486
|
+
const turnId = `${runId}:t${budget.consumed}`;
|
|
8487
|
+
const toolBatchRecords = [];
|
|
8246
8488
|
// Kick every read off now; settle into {result,error} so an unawaited
|
|
8247
8489
|
// promise can never surface as an unhandled rejection if the loop aborts
|
|
8248
8490
|
// before it is consumed.
|
|
@@ -8277,6 +8519,21 @@ export async function* agentLoop(messages, options) {
|
|
|
8277
8519
|
};
|
|
8278
8520
|
const { result: toolResult, error: toolError } = await promise;
|
|
8279
8521
|
throwIfAborted(signal);
|
|
8522
|
+
const failed = emitToolHookLifecycle({
|
|
8523
|
+
tool: call.function.name,
|
|
8524
|
+
args: toolArgs,
|
|
8525
|
+
result: toolResult,
|
|
8526
|
+
error: toolError,
|
|
8527
|
+
sessionId: options.sessionId || null,
|
|
8528
|
+
turnId,
|
|
8529
|
+
toolUseId: call.id,
|
|
8530
|
+
cwd: options.cwd || process.cwd(),
|
|
8531
|
+
});
|
|
8532
|
+
toolBatchRecords.push({
|
|
8533
|
+
tool: call.function.name,
|
|
8534
|
+
toolUseId: call.id,
|
|
8535
|
+
failed,
|
|
8536
|
+
});
|
|
8280
8537
|
const warningMsg = budget.toWarningMessage();
|
|
8281
8538
|
const resultStr = capToolResultString(
|
|
8282
8539
|
safeStringifyToolResult(toolResult),
|
|
@@ -8284,6 +8541,11 @@ export async function* agentLoop(messages, options) {
|
|
|
8284
8541
|
const toolContent = warningMsg
|
|
8285
8542
|
? `${resultStr}\n\n${warningMsg}`
|
|
8286
8543
|
: resultStr;
|
|
8544
|
+
const decision = permissionDecision(
|
|
8545
|
+
call.id,
|
|
8546
|
+
call.function.name,
|
|
8547
|
+
toolResult,
|
|
8548
|
+
);
|
|
8287
8549
|
yield {
|
|
8288
8550
|
type: "tool-result",
|
|
8289
8551
|
tool: call.function.name,
|
|
@@ -8291,10 +8553,8 @@ export async function* agentLoop(messages, options) {
|
|
|
8291
8553
|
error: toolError,
|
|
8292
8554
|
tool_use_id: call.id,
|
|
8293
8555
|
turn_id: `${runId}:t${budget.consumed}`,
|
|
8294
|
-
permission_decision_id:
|
|
8295
|
-
|
|
8296
|
-
toolResult?.policy,
|
|
8297
|
-
),
|
|
8556
|
+
permission_decision_id: decision?.id || null,
|
|
8557
|
+
permission_decision: decision,
|
|
8298
8558
|
};
|
|
8299
8559
|
messages.push({
|
|
8300
8560
|
role: "tool",
|
|
@@ -8302,9 +8562,18 @@ export async function* agentLoop(messages, options) {
|
|
|
8302
8562
|
tool_call_id: call.id,
|
|
8303
8563
|
});
|
|
8304
8564
|
}
|
|
8565
|
+
emitToolBatchHookLifecycle({
|
|
8566
|
+
records: toolBatchRecords,
|
|
8567
|
+
sessionId: options.sessionId || null,
|
|
8568
|
+
turnId,
|
|
8569
|
+
cwd: options.cwd || process.cwd(),
|
|
8570
|
+
parallel: true,
|
|
8571
|
+
});
|
|
8305
8572
|
continue; // all read results in place — back to the LLM call
|
|
8306
8573
|
}
|
|
8307
8574
|
|
|
8575
|
+
const turnId = `${runId}:t${budget.consumed}`;
|
|
8576
|
+
const toolBatchRecords = [];
|
|
8308
8577
|
for (const call of toolCalls) {
|
|
8309
8578
|
throwIfAborted(signal);
|
|
8310
8579
|
const fn = call?.function;
|
|
@@ -8318,6 +8587,21 @@ export async function* agentLoop(messages, options) {
|
|
|
8318
8587
|
// malformed call.
|
|
8319
8588
|
if (typeof toolName !== "string" || !toolName) {
|
|
8320
8589
|
const reason = "malformed tool call: missing function name";
|
|
8590
|
+
emitToolHookLifecycle({
|
|
8591
|
+
tool: "(unknown)",
|
|
8592
|
+
args: null,
|
|
8593
|
+
result: { error: reason },
|
|
8594
|
+
error: reason,
|
|
8595
|
+
sessionId: options.sessionId || null,
|
|
8596
|
+
turnId,
|
|
8597
|
+
toolUseId: call?.id || null,
|
|
8598
|
+
cwd: options.cwd || process.cwd(),
|
|
8599
|
+
});
|
|
8600
|
+
toolBatchRecords.push({
|
|
8601
|
+
tool: "(unknown)",
|
|
8602
|
+
toolUseId: call?.id || null,
|
|
8603
|
+
failed: true,
|
|
8604
|
+
});
|
|
8321
8605
|
yield {
|
|
8322
8606
|
type: "tool-result",
|
|
8323
8607
|
tool: "(unknown)",
|
|
@@ -8413,14 +8697,14 @@ export async function* agentLoop(messages, options) {
|
|
|
8413
8697
|
// (derived from the call + gate, so it's recomputable from the
|
|
8414
8698
|
// tool-result's policy + tool_call_id) plus the low-cardinality
|
|
8415
8699
|
// decision, letting a blocked tool span be tied to its decision.
|
|
8416
|
-
const
|
|
8700
|
+
const decision =
|
|
8417
8701
|
r && typeof r === "object"
|
|
8418
|
-
?
|
|
8702
|
+
? permissionDecision(call.id, toolName, r)
|
|
8419
8703
|
: null;
|
|
8420
|
-
if (
|
|
8704
|
+
if (decision?.id) {
|
|
8421
8705
|
const permAttrs = buildTelemetryAttributes({
|
|
8422
|
-
decisionId:
|
|
8423
|
-
"permission.decision":
|
|
8706
|
+
decisionId: decision.id,
|
|
8707
|
+
"permission.decision": decision.decision,
|
|
8424
8708
|
});
|
|
8425
8709
|
if (permAttrs["permission.decision_id"]) {
|
|
8426
8710
|
span.setAttribute(
|
|
@@ -8458,6 +8742,7 @@ export async function* agentLoop(messages, options) {
|
|
|
8458
8742
|
? `${resultStr}\n\n${warningMsg}`
|
|
8459
8743
|
: resultStr;
|
|
8460
8744
|
|
|
8745
|
+
const decision = permissionDecision(call.id, toolName, toolResult);
|
|
8461
8746
|
yield {
|
|
8462
8747
|
type: "tool-result",
|
|
8463
8748
|
tool: toolName,
|
|
@@ -8465,10 +8750,8 @@ export async function* agentLoop(messages, options) {
|
|
|
8465
8750
|
error: toolError,
|
|
8466
8751
|
tool_use_id: call.id,
|
|
8467
8752
|
turn_id: `${runId}:t${budget.consumed}`,
|
|
8468
|
-
permission_decision_id:
|
|
8469
|
-
|
|
8470
|
-
toolResult?.policy,
|
|
8471
|
-
),
|
|
8753
|
+
permission_decision_id: decision?.id || null,
|
|
8754
|
+
permission_decision: decision,
|
|
8472
8755
|
};
|
|
8473
8756
|
|
|
8474
8757
|
messages.push({
|
|
@@ -8476,7 +8759,29 @@ export async function* agentLoop(messages, options) {
|
|
|
8476
8759
|
content: toolContent,
|
|
8477
8760
|
tool_call_id: call.id,
|
|
8478
8761
|
});
|
|
8762
|
+
const failed = emitToolHookLifecycle({
|
|
8763
|
+
tool: toolName,
|
|
8764
|
+
args: toolArgs,
|
|
8765
|
+
result: toolResult,
|
|
8766
|
+
error: toolError,
|
|
8767
|
+
sessionId: options.sessionId || null,
|
|
8768
|
+
turnId,
|
|
8769
|
+
toolUseId: call.id,
|
|
8770
|
+
cwd: options.cwd || process.cwd(),
|
|
8771
|
+
});
|
|
8772
|
+
toolBatchRecords.push({
|
|
8773
|
+
tool: toolName,
|
|
8774
|
+
toolUseId: call.id,
|
|
8775
|
+
failed,
|
|
8776
|
+
});
|
|
8479
8777
|
}
|
|
8778
|
+
emitToolBatchHookLifecycle({
|
|
8779
|
+
records: toolBatchRecords,
|
|
8780
|
+
sessionId: options.sessionId || null,
|
|
8781
|
+
turnId,
|
|
8782
|
+
cwd: options.cwd || process.cwd(),
|
|
8783
|
+
parallel: false,
|
|
8784
|
+
});
|
|
8480
8785
|
}
|
|
8481
8786
|
|
|
8482
8787
|
// Budget exhausted — flush any child usage the final iteration produced,
|
|
@@ -1155,7 +1155,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
1155
1155
|
kind: "browser",
|
|
1156
1156
|
tier: "extension",
|
|
1157
1157
|
description:
|
|
1158
|
-
"Capture live state from the user's real Chrome over CDP: current URL/title, open tabs, console messages and failed/error network requests observed during a short watch window, a capped DOM snapshot, and optionally a screenshot (
|
|
1158
|
+
"Capture live state from the user's real Chrome over CDP: current URL/title, open tabs, console messages and failed/error network requests observed during a short watch window, a capped DOM snapshot, and optionally a screenshot (published as a session-bound Artifact; no host temp path enters the agent result). Requires a debuggable Chrome — the user starts one with `cc browse chrome launch`. Console/network capture starts at attach time (CDP keeps no history) — set reload=true to observe load-time errors. Use to verify web changes in the user's logged-in browser.",
|
|
1159
1159
|
inputSchema: {
|
|
1160
1160
|
type: "object",
|
|
1161
1161
|
properties: {
|
|
@@ -1187,7 +1187,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
1187
1187
|
screenshot: {
|
|
1188
1188
|
type: "boolean",
|
|
1189
1189
|
description:
|
|
1190
|
-
"
|
|
1190
|
+
"Capture a screenshot and return opaque, session-bound Artifact metadata (default false)",
|
|
1191
1191
|
},
|
|
1192
1192
|
},
|
|
1193
1193
|
required: [],
|
|
@@ -1208,7 +1208,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
1208
1208
|
kind: "browser",
|
|
1209
1209
|
tier: "extension",
|
|
1210
1210
|
description:
|
|
1211
|
-
"Perform EXPLICIT actions in the user's connected Chrome over loopback CDP: click, type, press, navigate (http/https only), waitForSelector, screenshot (
|
|
1211
|
+
"Perform EXPLICIT actions in the user's connected Chrome over loopback CDP: click, type, press, navigate (http/https only), waitForSelector, screenshot (published as a session-bound Artifact; never a caller-chosen path), assertText. Approval-gated (HIGH risk): use browser_state first to observe; only act when the task genuinely requires driving the browser. Steps run in order and fail fast unless continue_on_error; each returns {ok, action, detail, durationMs} and every executed step is audit-logged under ~/.chainlesschain/browser-actions/. Requires a debuggable Chrome (`cc browse chrome launch`).",
|
|
1212
1212
|
inputSchema: {
|
|
1213
1213
|
type: "object",
|
|
1214
1214
|
properties: {
|