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
|
@@ -164,6 +164,22 @@ export function capabilityConsentRequired(managed, env) {
|
|
|
164
164
|
);
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Require every loadable plugin to opt into the capability model with an
|
|
169
|
+
* explicit `permissions` block. Mandatory consent implies this gate: otherwise
|
|
170
|
+
* a legacy plugin could bypass consent simply by omitting the declaration.
|
|
171
|
+
*/
|
|
172
|
+
export function capabilityDeclarationsRequired(managed, env) {
|
|
173
|
+
const runtimeEnv = env || process.env;
|
|
174
|
+
const raw = runtimeEnv.CC_REQUIRE_PLUGIN_CAPABILITIES;
|
|
175
|
+
if (raw != null && /^(1|true|yes|on)$/i.test(String(raw).trim())) return true;
|
|
176
|
+
return (
|
|
177
|
+
managed?.requirePluginCapabilityDeclarations === true ||
|
|
178
|
+
managed?.requirePluginCapabilityDeclarations === "require" ||
|
|
179
|
+
capabilityConsentRequired(managed, runtimeEnv)
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
167
183
|
/**
|
|
168
184
|
* Drop plugins that DECLARE capabilities but whose current capability SET has
|
|
169
185
|
* not been consented (first request or any widening). Fail-closed: a consent
|
|
@@ -175,12 +191,23 @@ export function capabilityConsentRequired(managed, env) {
|
|
|
175
191
|
* @param {Array<{name, scope, manifest}>} plugins
|
|
176
192
|
* @returns {{ kept: Array, dropped: Array<{name, reason}> }}
|
|
177
193
|
*/
|
|
178
|
-
export function filterByCapabilityConsent(
|
|
194
|
+
export function filterByCapabilityConsent(
|
|
195
|
+
plugins,
|
|
196
|
+
{ requireDeclarations = false } = {},
|
|
197
|
+
) {
|
|
179
198
|
const kept = [];
|
|
180
199
|
const dropped = [];
|
|
181
200
|
for (const p of plugins) {
|
|
182
201
|
if (!p.manifest?.capabilitiesDeclared) {
|
|
183
|
-
|
|
202
|
+
if (requireDeclarations) {
|
|
203
|
+
dropped.push({
|
|
204
|
+
name: p.name,
|
|
205
|
+
reason:
|
|
206
|
+
"capability declaration required: add an explicit `permissions` block to plugin.json",
|
|
207
|
+
});
|
|
208
|
+
} else {
|
|
209
|
+
kept.push(p); // migration window: legacy declaration remains compatible
|
|
210
|
+
}
|
|
184
211
|
continue;
|
|
185
212
|
}
|
|
186
213
|
let consented = false;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize the small, declarative sandbox contract exposed to plugins.
|
|
3
|
+
*
|
|
4
|
+
* Plugins may require filesystem and/or network isolation for processes they
|
|
5
|
+
* cause the CLI to spawn. They may not select a sandbox profile or claim other
|
|
6
|
+
* broker guarantees. Keeping this layer narrower than ProcessExecutionBroker's
|
|
7
|
+
* internal contract prevents plugin-controlled policy from weakening managed
|
|
8
|
+
* defaults while still allowing an explicit requirement to fail closed.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const PLUGIN_SANDBOX_BOUNDARIES = Object.freeze([
|
|
12
|
+
"filesystem",
|
|
13
|
+
"network",
|
|
14
|
+
]);
|
|
15
|
+
|
|
16
|
+
const SUPPORTED_BOUNDARIES = new Set(PLUGIN_SANDBOX_BOUNDARIES);
|
|
17
|
+
|
|
18
|
+
function invalidPolicy(message) {
|
|
19
|
+
const error = new Error(message);
|
|
20
|
+
error.code = "ERR_PLUGIN_SANDBOX_POLICY_INVALID";
|
|
21
|
+
return error;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {unknown} raw
|
|
26
|
+
* @param {{ label?: string }} [opts]
|
|
27
|
+
* @returns {{requiredBoundaries: string[]}|null}
|
|
28
|
+
*/
|
|
29
|
+
export function normalizePluginSandboxPolicy(raw, opts = {}) {
|
|
30
|
+
const label = opts.label || "sandboxPolicy";
|
|
31
|
+
if (raw === undefined || raw === null) return null;
|
|
32
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
33
|
+
throw invalidPolicy(`${label} must be an object`);
|
|
34
|
+
}
|
|
35
|
+
const unsupportedKeys = Object.keys(raw).filter(
|
|
36
|
+
(key) => key !== "requiredBoundaries",
|
|
37
|
+
);
|
|
38
|
+
if (unsupportedKeys.length > 0) {
|
|
39
|
+
throw invalidPolicy(
|
|
40
|
+
`${label} contains unsupported field: ${unsupportedKeys[0]}`,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const boundaries = raw.requiredBoundaries;
|
|
45
|
+
if (boundaries === undefined) return null;
|
|
46
|
+
if (!Array.isArray(boundaries)) {
|
|
47
|
+
throw invalidPolicy(`${label}.requiredBoundaries must be an array`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const requiredBoundaries = [];
|
|
51
|
+
for (const boundary of boundaries) {
|
|
52
|
+
if (
|
|
53
|
+
typeof boundary !== "string" ||
|
|
54
|
+
!SUPPORTED_BOUNDARIES.has(boundary)
|
|
55
|
+
) {
|
|
56
|
+
throw invalidPolicy(
|
|
57
|
+
`${label}.requiredBoundaries contains unsupported boundary: ${String(boundary)}`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (!requiredBoundaries.includes(boundary)) {
|
|
61
|
+
requiredBoundaries.push(boundary);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return requiredBoundaries.length > 0 ? { requiredBoundaries } : null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Merge manifest/component/descriptor requirements additively. A child
|
|
70
|
+
* descriptor can require more isolation, but cannot remove a manifest-level
|
|
71
|
+
* requirement.
|
|
72
|
+
*/
|
|
73
|
+
export function mergePluginSandboxPolicies(...policies) {
|
|
74
|
+
const requiredBoundaries = [];
|
|
75
|
+
for (const raw of policies) {
|
|
76
|
+
const policy = normalizePluginSandboxPolicy(raw);
|
|
77
|
+
for (const boundary of policy?.requiredBoundaries || []) {
|
|
78
|
+
if (!requiredBoundaries.includes(boundary)) {
|
|
79
|
+
requiredBoundaries.push(boundary);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return requiredBoundaries.length > 0 ? { requiredBoundaries } : null;
|
|
84
|
+
}
|
|
@@ -29,6 +29,7 @@ import {
|
|
|
29
29
|
filterByManagedPolicy,
|
|
30
30
|
filterByCapabilityConsent,
|
|
31
31
|
capabilityConsentRequired,
|
|
32
|
+
capabilityDeclarationsRequired,
|
|
32
33
|
warnDroppedOnce,
|
|
33
34
|
} from "./policy.js";
|
|
34
35
|
|
|
@@ -163,9 +164,10 @@ export function discoverPlugins(opts = {}) {
|
|
|
163
164
|
managedSettingsFile: opts.managedSettingsFile,
|
|
164
165
|
});
|
|
165
166
|
const consentGate = capabilityConsentRequired(managed, opts.env);
|
|
167
|
+
const declarationsGate = capabilityDeclarationsRequired(managed, opts.env);
|
|
166
168
|
// Default (no managed policy AND consent enforcement off): byte-identical —
|
|
167
169
|
// return every discovered plugin, exactly as before.
|
|
168
|
-
if (!managed && !consentGate) return all;
|
|
170
|
+
if (!managed && !consentGate && !declarationsGate) return all;
|
|
169
171
|
let list = all;
|
|
170
172
|
if (managed) {
|
|
171
173
|
const { kept, dropped } = filterByManagedPolicy(list, managed);
|
|
@@ -174,8 +176,10 @@ export function discoverPlugins(opts = {}) {
|
|
|
174
176
|
}
|
|
175
177
|
// Capability-consent enforcement funnels through the SAME chokepoint, so an
|
|
176
178
|
// un-consented plugin loads NONE of its six component types (opt-in).
|
|
177
|
-
if (consentGate) {
|
|
178
|
-
const { kept, dropped } = filterByCapabilityConsent(list
|
|
179
|
+
if (consentGate || declarationsGate) {
|
|
180
|
+
const { kept, dropped } = filterByCapabilityConsent(list, {
|
|
181
|
+
requireDeclarations: declarationsGate,
|
|
182
|
+
});
|
|
179
183
|
if (dropped.length > 0) warnDroppedOnce(dropped);
|
|
180
184
|
list = kept;
|
|
181
185
|
}
|
|
@@ -21,16 +21,17 @@
|
|
|
21
21
|
* running untrusted SHELL/binaries behind the user's back.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import fs from "fs";
|
|
25
24
|
import path from "path";
|
|
26
25
|
import { getElectronUserDataDir } from "../paths.js";
|
|
26
|
+
import { withFileLock } from "../with-file-lock.js";
|
|
27
|
+
import {
|
|
28
|
+
mutateSecurityStore,
|
|
29
|
+
readSecurityStore,
|
|
30
|
+
} from "../durable-security-store.js";
|
|
27
31
|
|
|
28
32
|
export const _deps = {
|
|
29
|
-
existsSync: fs.existsSync,
|
|
30
|
-
readFileSync: fs.readFileSync,
|
|
31
|
-
writeFileSync: fs.writeFileSync,
|
|
32
|
-
mkdirSync: fs.mkdirSync,
|
|
33
33
|
now: () => new Date().toISOString(),
|
|
34
|
+
withFileLock,
|
|
34
35
|
// Path of the trust store; injectable so unit tests never touch the real
|
|
35
36
|
// user-data dir.
|
|
36
37
|
storePath: () => path.join(getElectronUserDataDir(), "plugin-trust.json"),
|
|
@@ -39,20 +40,7 @@ export const _deps = {
|
|
|
39
40
|
const AUTO_TRUSTED_SCOPES = new Set(["user", "local"]);
|
|
40
41
|
|
|
41
42
|
export function loadTrustStore() {
|
|
42
|
-
|
|
43
|
-
const p = _deps.storePath();
|
|
44
|
-
if (!_deps.existsSync(p)) return {};
|
|
45
|
-
const data = JSON.parse(_deps.readFileSync(p, "utf8"));
|
|
46
|
-
return data && typeof data === "object" && !Array.isArray(data) ? data : {};
|
|
47
|
-
} catch {
|
|
48
|
-
return {};
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function saveTrustStore(store) {
|
|
53
|
-
const p = _deps.storePath();
|
|
54
|
-
_deps.mkdirSync(path.dirname(p), { recursive: true });
|
|
55
|
-
_deps.writeFileSync(p, JSON.stringify(store, null, 2), "utf8");
|
|
43
|
+
return readSecurityStore(_deps.storePath(), "plugin trust");
|
|
56
44
|
}
|
|
57
45
|
|
|
58
46
|
function trustKey(scope, name) {
|
|
@@ -66,27 +54,44 @@ function trustKey(scope, name) {
|
|
|
66
54
|
export function isPluginTrusted(plugin) {
|
|
67
55
|
if (!plugin || !plugin.name) return false;
|
|
68
56
|
if (AUTO_TRUSTED_SCOPES.has(plugin.scope)) return true;
|
|
69
|
-
|
|
70
|
-
|
|
57
|
+
try {
|
|
58
|
+
const entry = loadTrustStore()[trustKey(plugin.scope, plugin.name)];
|
|
59
|
+
return Boolean(entry && entry.version === plugin.version);
|
|
60
|
+
} catch {
|
|
61
|
+
// Project code must stay disabled when the trust store is unavailable.
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
71
64
|
}
|
|
72
65
|
|
|
73
66
|
/** Trust a plugin (records the exact version). */
|
|
74
67
|
export function trustPlugin(name, { scope = "project", version } = {}) {
|
|
75
68
|
if (!version) throw new Error("trustPlugin requires a version");
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
const file = _deps.storePath();
|
|
70
|
+
return mutateSecurityStore(
|
|
71
|
+
file,
|
|
72
|
+
"plugin trust",
|
|
73
|
+
(store) => {
|
|
74
|
+
store[trustKey(scope, name)] = { version, trustedAt: _deps.now() };
|
|
75
|
+
return { name, scope, version };
|
|
76
|
+
},
|
|
77
|
+
{ lock: _deps.withFileLock },
|
|
78
|
+
);
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
/** Revoke trust for a plugin at a scope. */
|
|
83
82
|
export function untrustPlugin(name, { scope = "project" } = {}) {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
const file = _deps.storePath();
|
|
84
|
+
return mutateSecurityStore(
|
|
85
|
+
file,
|
|
86
|
+
"plugin trust",
|
|
87
|
+
(store) => {
|
|
88
|
+
const key = trustKey(scope, name);
|
|
89
|
+
const existed = Object.prototype.hasOwnProperty.call(store, key);
|
|
90
|
+
delete store[key];
|
|
91
|
+
return { name, scope, removed: existed };
|
|
92
|
+
},
|
|
93
|
+
{ lock: _deps.withFileLock },
|
|
94
|
+
);
|
|
90
95
|
}
|
|
91
96
|
|
|
92
97
|
/** All trust entries (for `cc plugin trust --list`). */
|
|
@@ -6,12 +6,14 @@
|
|
|
6
6
|
* receives short-lived opaque references. Resolving a reference requires an
|
|
7
7
|
* attested agent id and the exact process/host target recorded at issuance.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* The production singleton also mirrors issued references into a broker-owned
|
|
10
|
+
* authenticated local transport. Per-launch capability tokens bind resolution
|
|
11
|
+
* to the approved process and destination host without putting credential
|
|
12
|
+
* values in the child environment or argv.
|
|
12
13
|
*/
|
|
13
14
|
|
|
14
15
|
import crypto from "node:crypto";
|
|
16
|
+
import { CredentialTransport } from "./credential-transport.js";
|
|
15
17
|
|
|
16
18
|
const REDACTED_VALUE = "***REDACTED***";
|
|
17
19
|
const DEFAULT_TTL_MS = 60_000;
|
|
@@ -33,6 +35,7 @@ const CREDENTIAL_ERROR_CODES = Object.freeze({
|
|
|
33
35
|
REVOKED: "CC_CREDENTIAL_REF_REVOKED",
|
|
34
36
|
AGENT_MISMATCH: "CC_CREDENTIAL_AGENT_MISMATCH",
|
|
35
37
|
TARGET_MISMATCH: "CC_CREDENTIAL_TARGET_MISMATCH",
|
|
38
|
+
TRANSPORT_UNAVAILABLE: "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
36
39
|
});
|
|
37
40
|
|
|
38
41
|
// Patterns for environment variables that contain secrets.
|
|
@@ -126,6 +129,10 @@ const RESERVED_AGENT_ENV_KEYS = new Set([
|
|
|
126
129
|
"CC_CREDENTIAL_AGENT_ID",
|
|
127
130
|
"CC_CREDENTIAL_PROXY",
|
|
128
131
|
"CC_CREDENTIAL_TRANSPORT",
|
|
132
|
+
"CC_CREDENTIAL_ENDPOINT",
|
|
133
|
+
"CC_CREDENTIAL_AUTH_TOKEN",
|
|
134
|
+
"CC_CREDENTIAL_TARGET_PROCESS",
|
|
135
|
+
"CC_CREDENTIAL_TARGET_HOST",
|
|
129
136
|
]);
|
|
130
137
|
|
|
131
138
|
function credentialError(code, message) {
|
|
@@ -251,9 +258,21 @@ class CredentialAgent {
|
|
|
251
258
|
Number.MAX_SAFE_INTEGER,
|
|
252
259
|
);
|
|
253
260
|
|
|
254
|
-
|
|
255
|
-
this.
|
|
256
|
-
|
|
261
|
+
this._transportMode = "broker-api";
|
|
262
|
+
this._credentialTransport = null;
|
|
263
|
+
if (options.transport) {
|
|
264
|
+
this._credentialTransport =
|
|
265
|
+
options.transport === true
|
|
266
|
+
? new CredentialTransport({
|
|
267
|
+
agentId: this._agentId,
|
|
268
|
+
onAudit: (entry) => this._recordAudit(entry),
|
|
269
|
+
onSettlement: (settlement) =>
|
|
270
|
+
this._applyTransportSettlement(settlement),
|
|
271
|
+
})
|
|
272
|
+
: options.transport;
|
|
273
|
+
this._transportMode =
|
|
274
|
+
this._credentialTransport?.version || "local-ipc-v1";
|
|
275
|
+
}
|
|
257
276
|
this._lastEnabledState = this._computeEnabled();
|
|
258
277
|
}
|
|
259
278
|
|
|
@@ -270,10 +289,11 @@ class CredentialAgent {
|
|
|
270
289
|
|
|
271
290
|
if (!enabled) {
|
|
272
291
|
let revoked = 0;
|
|
273
|
-
for (const record of this._credentialStore
|
|
292
|
+
for (const [refId, record] of this._credentialStore) {
|
|
274
293
|
if (record.status === "active") {
|
|
275
294
|
record.value = null;
|
|
276
295
|
record.status = "disabled";
|
|
296
|
+
this._credentialTransport?.revokeCredential(refId);
|
|
277
297
|
revoked += 1;
|
|
278
298
|
}
|
|
279
299
|
}
|
|
@@ -387,6 +407,19 @@ class CredentialAgent {
|
|
|
387
407
|
}
|
|
388
408
|
}
|
|
389
409
|
|
|
410
|
+
_applyTransportSettlement(settlement) {
|
|
411
|
+
const record = this._credentialStore.get(settlement?.refId);
|
|
412
|
+
if (!record || record.status !== "active") return;
|
|
413
|
+
const useCount = Number(settlement.useCount);
|
|
414
|
+
if (Number.isFinite(useCount) && useCount > record.useCount) {
|
|
415
|
+
record.useCount = useCount;
|
|
416
|
+
}
|
|
417
|
+
if (settlement.status && settlement.status !== "active") {
|
|
418
|
+
record.status = settlement.status;
|
|
419
|
+
record.value = null;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
390
423
|
_ensureStoreCapacity() {
|
|
391
424
|
this._expireStaleCredentials();
|
|
392
425
|
if (this._credentialStore.size < this._maxCredentials) return;
|
|
@@ -447,6 +480,9 @@ class CredentialAgent {
|
|
|
447
480
|
"Credential maxUses",
|
|
448
481
|
),
|
|
449
482
|
origin: String(request.origin ?? "unknown"),
|
|
483
|
+
capabilityToken: request.capabilityToken
|
|
484
|
+
? String(request.capabilityToken)
|
|
485
|
+
: null,
|
|
450
486
|
};
|
|
451
487
|
}
|
|
452
488
|
|
|
@@ -556,6 +592,38 @@ class CredentialAgent {
|
|
|
556
592
|
target: normalized.target,
|
|
557
593
|
approvalFingerprint: this._fingerprint(normalized.approvalId),
|
|
558
594
|
});
|
|
595
|
+
if (this._credentialTransport && normalized.capabilityToken) {
|
|
596
|
+
try {
|
|
597
|
+
this._credentialTransport.registerCredential({
|
|
598
|
+
refId,
|
|
599
|
+
key: normalized.key,
|
|
600
|
+
value: normalized.value,
|
|
601
|
+
target: normalized.target,
|
|
602
|
+
createdAt,
|
|
603
|
+
expiresAt: createdAt + normalized.ttlMs,
|
|
604
|
+
maxUses: normalized.maxUses,
|
|
605
|
+
useCount: 0,
|
|
606
|
+
status: "active",
|
|
607
|
+
capabilityToken: normalized.capabilityToken,
|
|
608
|
+
});
|
|
609
|
+
} catch (error) {
|
|
610
|
+
const record = this._credentialStore.get(refId);
|
|
611
|
+
record.value = null;
|
|
612
|
+
record.status = "revoked";
|
|
613
|
+
this._recordAudit({
|
|
614
|
+
event: "credential_ref_issue",
|
|
615
|
+
outcome: "denied",
|
|
616
|
+
reason: CREDENTIAL_ERROR_CODES.TRANSPORT_UNAVAILABLE,
|
|
617
|
+
key: normalized.key,
|
|
618
|
+
target: normalized.target,
|
|
619
|
+
refFingerprint: this._fingerprint(refId),
|
|
620
|
+
});
|
|
621
|
+
throw credentialError(
|
|
622
|
+
CREDENTIAL_ERROR_CODES.TRANSPORT_UNAVAILABLE,
|
|
623
|
+
error?.message || "Credential transport is unavailable",
|
|
624
|
+
);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
559
627
|
this._recordAudit({
|
|
560
628
|
event: "credential_ref_issue",
|
|
561
629
|
outcome: "allowed",
|
|
@@ -695,6 +763,7 @@ class CredentialAgent {
|
|
|
695
763
|
record.value = null;
|
|
696
764
|
record.status = "exhausted";
|
|
697
765
|
}
|
|
766
|
+
this._credentialTransport?.updateCredential(refId, record);
|
|
698
767
|
this._recordAudit({
|
|
699
768
|
event: "credential_ref_resolve",
|
|
700
769
|
outcome: "allowed",
|
|
@@ -717,6 +786,7 @@ class CredentialAgent {
|
|
|
717
786
|
if (!record) return false;
|
|
718
787
|
record.value = null;
|
|
719
788
|
record.status = "revoked";
|
|
789
|
+
this._credentialTransport?.revokeCredential(refId);
|
|
720
790
|
this._recordAudit({
|
|
721
791
|
event: "credential_ref_revoke",
|
|
722
792
|
outcome: "allowed",
|
|
@@ -786,9 +856,18 @@ class CredentialAgent {
|
|
|
786
856
|
);
|
|
787
857
|
}
|
|
788
858
|
|
|
789
|
-
_setReferenceMarkers(safeEnv) {
|
|
859
|
+
_setReferenceMarkers(safeEnv, context) {
|
|
790
860
|
safeEnv.CC_CREDENTIAL_AGENT_ID = this._agentId;
|
|
791
|
-
safeEnv.CC_CREDENTIAL_TRANSPORT = this.
|
|
861
|
+
safeEnv.CC_CREDENTIAL_TRANSPORT = this._transportMode;
|
|
862
|
+
if (this._credentialTransport && context?.capabilityToken) {
|
|
863
|
+
safeEnv.CC_CREDENTIAL_ENDPOINT = this._credentialTransport.endpoint;
|
|
864
|
+
safeEnv.CC_CREDENTIAL_AUTH_TOKEN = context.capabilityToken;
|
|
865
|
+
safeEnv.CC_CREDENTIAL_TARGET_PROCESS = normalizeProcessTarget(
|
|
866
|
+
context.target?.process ?? context.process,
|
|
867
|
+
);
|
|
868
|
+
const host = normalizeHostTarget(context.target?.host ?? context.host);
|
|
869
|
+
if (host) safeEnv.CC_CREDENTIAL_TARGET_HOST = host;
|
|
870
|
+
}
|
|
792
871
|
}
|
|
793
872
|
|
|
794
873
|
/**
|
|
@@ -830,7 +909,7 @@ class CredentialAgent {
|
|
|
830
909
|
redacted.push(entry);
|
|
831
910
|
}
|
|
832
911
|
|
|
833
|
-
if (refsIssued > 0) this._setReferenceMarkers(safeEnv);
|
|
912
|
+
if (refsIssued > 0) this._setReferenceMarkers(safeEnv, context);
|
|
834
913
|
return {
|
|
835
914
|
safeEnv,
|
|
836
915
|
redacted,
|
|
@@ -984,7 +1063,17 @@ class CredentialAgent {
|
|
|
984
1063
|
);
|
|
985
1064
|
}
|
|
986
1065
|
|
|
987
|
-
|
|
1066
|
+
let context = this._contextForSpawn(spawnOptions);
|
|
1067
|
+
if (
|
|
1068
|
+
this._credentialTransport &&
|
|
1069
|
+
this.isEnabled() &&
|
|
1070
|
+
this._canIssueForContext(context)
|
|
1071
|
+
) {
|
|
1072
|
+
context = {
|
|
1073
|
+
...context,
|
|
1074
|
+
capabilityToken: this._credentialTransport.createCapabilityToken(),
|
|
1075
|
+
};
|
|
1076
|
+
}
|
|
988
1077
|
const env = spawnOptions.env || process.env;
|
|
989
1078
|
const {
|
|
990
1079
|
safeEnv,
|
|
@@ -1019,7 +1108,7 @@ class CredentialAgent {
|
|
|
1019
1108
|
}
|
|
1020
1109
|
|
|
1021
1110
|
const refsIssued = envRefsIssued + argRefsIssued;
|
|
1022
|
-
if (refsIssued > 0) this._setReferenceMarkers(safeEnv);
|
|
1111
|
+
if (refsIssued > 0) this._setReferenceMarkers(safeEnv, context);
|
|
1023
1112
|
spawnOptions.env = safeEnv;
|
|
1024
1113
|
spawnOptions.args = sanitizedArgs;
|
|
1025
1114
|
|
|
@@ -1094,6 +1183,14 @@ class CredentialAgent {
|
|
|
1094
1183
|
this._accessLog = [];
|
|
1095
1184
|
}
|
|
1096
1185
|
|
|
1186
|
+
waitForTransportReady() {
|
|
1187
|
+
return this._credentialTransport?.waitUntilReady() ?? Promise.resolve(null);
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
closeTransport() {
|
|
1191
|
+
return this._credentialTransport?.close() ?? Promise.resolve();
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1097
1194
|
/**
|
|
1098
1195
|
* Get credential agent info for status reporting. No raw references or
|
|
1099
1196
|
* credential values are included.
|
|
@@ -1111,9 +1208,10 @@ class CredentialAgent {
|
|
|
1111
1208
|
mode: this._lastEnabledState
|
|
1112
1209
|
? "broker-reference"
|
|
1113
1210
|
: "redact-only-disabled",
|
|
1114
|
-
transport: this.
|
|
1115
|
-
proxyReady: this.
|
|
1116
|
-
ipcAvailable:
|
|
1211
|
+
transport: this._transportMode,
|
|
1212
|
+
proxyReady: this._credentialTransport?.ready === true,
|
|
1213
|
+
ipcAvailable: this._credentialTransport?.isAvailable() === true,
|
|
1214
|
+
transportInfo: this._credentialTransport?.getInfo() || null,
|
|
1117
1215
|
credentialsTracked: this._credentialStore.size,
|
|
1118
1216
|
activeCredentials: statusCounts.active || 0,
|
|
1119
1217
|
accessCount: this._accessLog.length,
|
|
@@ -1126,7 +1224,7 @@ class CredentialAgent {
|
|
|
1126
1224
|
}
|
|
1127
1225
|
}
|
|
1128
1226
|
|
|
1129
|
-
const credentialAgent = new CredentialAgent();
|
|
1227
|
+
const credentialAgent = new CredentialAgent({ transport: true });
|
|
1130
1228
|
|
|
1131
1229
|
export {
|
|
1132
1230
|
credentialAgent,
|