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
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broker-owned credential transport worker.
|
|
3
|
+
*
|
|
4
|
+
* The worker owns the local named-pipe / Unix-domain-socket server so it can
|
|
5
|
+
* answer a child while the broker's main thread is blocked in spawnSync().
|
|
6
|
+
* Credential values never enter the spawned command's argv or environment.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import crypto from "node:crypto";
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import net from "node:net";
|
|
12
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
13
|
+
|
|
14
|
+
const MAX_FRAME_BYTES = 1024 * 1024;
|
|
15
|
+
const records = new Map();
|
|
16
|
+
const endpoint = workerData.endpoint;
|
|
17
|
+
const agentId = workerData.agentId;
|
|
18
|
+
const platform = workerData.platform;
|
|
19
|
+
|
|
20
|
+
function normalizeProcessTarget(value) {
|
|
21
|
+
const normalized = String(value ?? "").trim();
|
|
22
|
+
if (!normalized) return null;
|
|
23
|
+
return platform === "win32"
|
|
24
|
+
? normalized.replaceAll("/", "\\").toLowerCase()
|
|
25
|
+
: normalized;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function normalizeHostTarget(value) {
|
|
29
|
+
const candidate = String(value ?? "").trim();
|
|
30
|
+
if (!candidate) return null;
|
|
31
|
+
try {
|
|
32
|
+
const parsed = candidate.includes("://")
|
|
33
|
+
? new URL(candidate)
|
|
34
|
+
: new URL(`https://${candidate}`);
|
|
35
|
+
return parsed.hostname.toLowerCase().replace(/\.$/, "");
|
|
36
|
+
} catch {
|
|
37
|
+
return candidate.toLowerCase().replace(/\.$/, "");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function fingerprint(value) {
|
|
42
|
+
return crypto
|
|
43
|
+
.createHash("sha256")
|
|
44
|
+
.update(String(value ?? ""))
|
|
45
|
+
.digest("hex")
|
|
46
|
+
.slice(0, 16);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function capabilityMatches(expected, supplied) {
|
|
50
|
+
const expectedBuffer = Buffer.from(String(expected ?? ""));
|
|
51
|
+
const suppliedBuffer = Buffer.from(String(supplied ?? ""));
|
|
52
|
+
return (
|
|
53
|
+
expectedBuffer.length > 0 &&
|
|
54
|
+
expectedBuffer.length === suppliedBuffer.length &&
|
|
55
|
+
crypto.timingSafeEqual(expectedBuffer, suppliedBuffer)
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function send(socket, message) {
|
|
60
|
+
if (!socket.destroyed) {
|
|
61
|
+
socket.end(`${JSON.stringify(message)}\n`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function deny(socket, code, message, record, refId) {
|
|
66
|
+
parentPort.postMessage({
|
|
67
|
+
type: "audit",
|
|
68
|
+
entry: {
|
|
69
|
+
event: "credential_transport_resolve",
|
|
70
|
+
outcome: "denied",
|
|
71
|
+
reason: code,
|
|
72
|
+
key: record?.key,
|
|
73
|
+
target: record?.target,
|
|
74
|
+
refFingerprint: fingerprint(refId),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
send(socket, { ok: false, code, message });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function handleResolution(socket, request) {
|
|
81
|
+
const refId = typeof request.refId === "string" ? request.refId : "";
|
|
82
|
+
const record = records.get(refId);
|
|
83
|
+
if (!record) {
|
|
84
|
+
deny(
|
|
85
|
+
socket,
|
|
86
|
+
"CC_CREDENTIAL_REF_NOT_FOUND",
|
|
87
|
+
"Credential reference was not found",
|
|
88
|
+
null,
|
|
89
|
+
refId,
|
|
90
|
+
);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (
|
|
94
|
+
request.agentId !== agentId ||
|
|
95
|
+
!capabilityMatches(record.capabilityToken, request.capabilityToken)
|
|
96
|
+
) {
|
|
97
|
+
deny(
|
|
98
|
+
socket,
|
|
99
|
+
"CC_CREDENTIAL_TRANSPORT_UNAUTHORIZED",
|
|
100
|
+
"Credential transport authentication failed",
|
|
101
|
+
record,
|
|
102
|
+
refId,
|
|
103
|
+
);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const requestTarget = {
|
|
108
|
+
process: normalizeProcessTarget(request.process),
|
|
109
|
+
host: normalizeHostTarget(request.host),
|
|
110
|
+
};
|
|
111
|
+
if (
|
|
112
|
+
!requestTarget.process ||
|
|
113
|
+
requestTarget.process !== record.target.process ||
|
|
114
|
+
requestTarget.host !== record.target.host
|
|
115
|
+
) {
|
|
116
|
+
deny(
|
|
117
|
+
socket,
|
|
118
|
+
"CC_CREDENTIAL_TARGET_MISMATCH",
|
|
119
|
+
"Credential resolution target does not match",
|
|
120
|
+
record,
|
|
121
|
+
refId,
|
|
122
|
+
);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (record.status !== "active") {
|
|
127
|
+
const code =
|
|
128
|
+
record.status === "expired"
|
|
129
|
+
? "CC_CREDENTIAL_REF_EXPIRED"
|
|
130
|
+
: record.status === "exhausted"
|
|
131
|
+
? "CC_CREDENTIAL_REF_EXHAUSTED"
|
|
132
|
+
: "CC_CREDENTIAL_REF_REVOKED";
|
|
133
|
+
deny(socket, code, "Credential reference is not active", record, refId);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (Date.now() >= record.expiresAt) {
|
|
137
|
+
record.status = "expired";
|
|
138
|
+
record.value = null;
|
|
139
|
+
deny(
|
|
140
|
+
socket,
|
|
141
|
+
"CC_CREDENTIAL_REF_EXPIRED",
|
|
142
|
+
"Credential reference has expired",
|
|
143
|
+
record,
|
|
144
|
+
refId,
|
|
145
|
+
);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (record.useCount >= record.maxUses) {
|
|
149
|
+
record.status = "exhausted";
|
|
150
|
+
record.value = null;
|
|
151
|
+
deny(
|
|
152
|
+
socket,
|
|
153
|
+
"CC_CREDENTIAL_REF_EXHAUSTED",
|
|
154
|
+
"Credential reference usage limit has been reached",
|
|
155
|
+
record,
|
|
156
|
+
refId,
|
|
157
|
+
);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const value = record.value;
|
|
162
|
+
record.useCount += 1;
|
|
163
|
+
const remainingUses = record.maxUses - record.useCount;
|
|
164
|
+
if (remainingUses <= 0) {
|
|
165
|
+
record.status = "exhausted";
|
|
166
|
+
record.value = null;
|
|
167
|
+
}
|
|
168
|
+
parentPort.postMessage({
|
|
169
|
+
type: "audit",
|
|
170
|
+
entry: {
|
|
171
|
+
event: "credential_transport_resolve",
|
|
172
|
+
outcome: "allowed",
|
|
173
|
+
key: record.key,
|
|
174
|
+
target: record.target,
|
|
175
|
+
refFingerprint: fingerprint(refId),
|
|
176
|
+
useCount: record.useCount,
|
|
177
|
+
remainingUses: Math.max(remainingUses, 0),
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
parentPort.postMessage({
|
|
181
|
+
type: "settlement",
|
|
182
|
+
refId,
|
|
183
|
+
useCount: record.useCount,
|
|
184
|
+
status: record.status,
|
|
185
|
+
});
|
|
186
|
+
send(socket, { ok: true, value });
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (platform !== "win32") {
|
|
190
|
+
try {
|
|
191
|
+
fs.unlinkSync(endpoint);
|
|
192
|
+
} catch {
|
|
193
|
+
// A socket normally does not exist on first start.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const server = net.createServer((socket) => {
|
|
198
|
+
let carry = "";
|
|
199
|
+
let handled = false;
|
|
200
|
+
socket.setTimeout(5000, () => socket.destroy());
|
|
201
|
+
socket.on("data", (chunk) => {
|
|
202
|
+
if (handled) return;
|
|
203
|
+
carry += chunk.toString("utf8");
|
|
204
|
+
if (Buffer.byteLength(carry, "utf8") > MAX_FRAME_BYTES) {
|
|
205
|
+
handled = true;
|
|
206
|
+
deny(
|
|
207
|
+
socket,
|
|
208
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
209
|
+
"Credential transport request is too large",
|
|
210
|
+
null,
|
|
211
|
+
"",
|
|
212
|
+
);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const newline = carry.indexOf("\n");
|
|
216
|
+
if (newline === -1) return;
|
|
217
|
+
handled = true;
|
|
218
|
+
const line = carry.slice(0, newline).replace(/\r$/, "");
|
|
219
|
+
let request;
|
|
220
|
+
try {
|
|
221
|
+
request = JSON.parse(line);
|
|
222
|
+
} catch {
|
|
223
|
+
deny(
|
|
224
|
+
socket,
|
|
225
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
226
|
+
"Credential transport request is not valid JSON",
|
|
227
|
+
null,
|
|
228
|
+
"",
|
|
229
|
+
);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (!request || request.type !== "resolve") {
|
|
233
|
+
deny(
|
|
234
|
+
socket,
|
|
235
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
236
|
+
"Credential transport request type is invalid",
|
|
237
|
+
null,
|
|
238
|
+
request?.refId,
|
|
239
|
+
);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
handleResolution(socket, request);
|
|
243
|
+
});
|
|
244
|
+
socket.on("error", () => {
|
|
245
|
+
// Per-client failures must not take down the credential service.
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
server.on("error", (error) => {
|
|
250
|
+
parentPort.postMessage({
|
|
251
|
+
type: "fatal",
|
|
252
|
+
error: {
|
|
253
|
+
code: error.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
254
|
+
message: error.message,
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
server.listen(endpoint, () => {
|
|
260
|
+
if (platform !== "win32") {
|
|
261
|
+
try {
|
|
262
|
+
fs.chmodSync(endpoint, 0o600);
|
|
263
|
+
} catch {
|
|
264
|
+
// The random per-launch capability remains mandatory if chmod is absent.
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
parentPort.postMessage({ type: "ready", endpoint });
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
parentPort.on("message", (message) => {
|
|
271
|
+
if (!message || typeof message !== "object") return;
|
|
272
|
+
if (message.type === "register") {
|
|
273
|
+
records.set(message.record.refId, {
|
|
274
|
+
...message.record,
|
|
275
|
+
target: {
|
|
276
|
+
process: normalizeProcessTarget(message.record.target?.process),
|
|
277
|
+
host: normalizeHostTarget(message.record.target?.host),
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (message.type === "update") {
|
|
283
|
+
const record = records.get(message.refId);
|
|
284
|
+
if (!record) return;
|
|
285
|
+
record.useCount = message.useCount;
|
|
286
|
+
record.status = message.status;
|
|
287
|
+
if (record.status !== "active") record.value = null;
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (message.type === "revoke") {
|
|
291
|
+
const record = records.get(message.refId);
|
|
292
|
+
if (!record) return;
|
|
293
|
+
record.status = "revoked";
|
|
294
|
+
record.value = null;
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (message.type === "close") {
|
|
298
|
+
for (const record of records.values()) record.value = null;
|
|
299
|
+
records.clear();
|
|
300
|
+
server.close(() => {
|
|
301
|
+
if (platform !== "win32") {
|
|
302
|
+
try {
|
|
303
|
+
fs.unlinkSync(endpoint);
|
|
304
|
+
} catch {
|
|
305
|
+
// The socket may already have been removed.
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
parentPort.postMessage({ type: "closed" });
|
|
309
|
+
parentPort.close();
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
});
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated local transport for broker-issued credential references.
|
|
3
|
+
*
|
|
4
|
+
* A worker thread hosts the pipe so spawnSync children can resolve a reference
|
|
5
|
+
* while the broker's main JavaScript thread is blocked.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import crypto from "node:crypto";
|
|
9
|
+
import net from "node:net";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { Worker } from "node:worker_threads";
|
|
13
|
+
|
|
14
|
+
const TRANSPORT_VERSION = "local-ipc-v1";
|
|
15
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
16
|
+
const MAX_RESPONSE_BYTES = 1024 * 1024;
|
|
17
|
+
|
|
18
|
+
function transportError(code, message) {
|
|
19
|
+
const error = new Error(message);
|
|
20
|
+
error.code = code;
|
|
21
|
+
return error;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function credentialTransportEndpoint(agentId, options = {}) {
|
|
25
|
+
const platform = options.platform || process.platform;
|
|
26
|
+
const safeId = crypto
|
|
27
|
+
.createHash("sha256")
|
|
28
|
+
.update(String(agentId))
|
|
29
|
+
.digest("hex")
|
|
30
|
+
.slice(0, 24);
|
|
31
|
+
if (platform === "win32") return `\\\\.\\pipe\\cc-cred-${safeId}`;
|
|
32
|
+
return path.join(options.tmpdir || os.tmpdir(), `cc-cred-${safeId}.sock`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class CredentialTransport {
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
if (!options.agentId) {
|
|
38
|
+
throw transportError(
|
|
39
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
40
|
+
"Credential transport requires an agent id",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
this.agentId = String(options.agentId);
|
|
44
|
+
this.platform = options.platform || process.platform;
|
|
45
|
+
this.endpoint =
|
|
46
|
+
options.endpoint ||
|
|
47
|
+
credentialTransportEndpoint(this.agentId, {
|
|
48
|
+
platform: this.platform,
|
|
49
|
+
tmpdir: options.tmpdir,
|
|
50
|
+
});
|
|
51
|
+
this.version = TRANSPORT_VERSION;
|
|
52
|
+
this.ready = false;
|
|
53
|
+
this.closed = false;
|
|
54
|
+
this.error = null;
|
|
55
|
+
this._onAudit =
|
|
56
|
+
typeof options.onAudit === "function" ? options.onAudit : () => {};
|
|
57
|
+
this._onSettlement =
|
|
58
|
+
typeof options.onSettlement === "function"
|
|
59
|
+
? options.onSettlement
|
|
60
|
+
: () => {};
|
|
61
|
+
this._workerFactory =
|
|
62
|
+
options.workerFactory ||
|
|
63
|
+
((url, workerOptions) => new Worker(url, workerOptions));
|
|
64
|
+
|
|
65
|
+
this._readyPromise = new Promise((resolve, reject) => {
|
|
66
|
+
this._resolveReady = resolve;
|
|
67
|
+
this._rejectReady = reject;
|
|
68
|
+
});
|
|
69
|
+
this._readyPromise.catch(() => {});
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
this._worker = this._workerFactory(
|
|
73
|
+
new URL("./credential-transport-worker.js", import.meta.url),
|
|
74
|
+
{
|
|
75
|
+
type: "module",
|
|
76
|
+
workerData: {
|
|
77
|
+
agentId: this.agentId,
|
|
78
|
+
endpoint: this.endpoint,
|
|
79
|
+
platform: this.platform,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
);
|
|
83
|
+
this._worker.on("message", (message) =>
|
|
84
|
+
this._handleWorkerMessage(message),
|
|
85
|
+
);
|
|
86
|
+
this._worker.on("error", (error) => this._handleWorkerFailure(error));
|
|
87
|
+
this._worker.on("exit", (code) => {
|
|
88
|
+
if (!this.closed && code !== 0) {
|
|
89
|
+
this._handleWorkerFailure(
|
|
90
|
+
transportError(
|
|
91
|
+
"CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
92
|
+
`Credential transport worker exited with code ${code}`,
|
|
93
|
+
),
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
this._worker.unref?.();
|
|
98
|
+
} catch (error) {
|
|
99
|
+
this._handleWorkerFailure(error);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
_handleWorkerMessage(message) {
|
|
104
|
+
if (message?.type === "ready") {
|
|
105
|
+
this.ready = true;
|
|
106
|
+
this._resolveReady(this);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (message?.type === "audit" && message.entry) {
|
|
110
|
+
this._onAudit(message.entry);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (message?.type === "settlement") {
|
|
114
|
+
this._onSettlement(message);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (message?.type === "fatal") {
|
|
118
|
+
this._handleWorkerFailure(
|
|
119
|
+
transportError(
|
|
120
|
+
message.error?.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
121
|
+
message.error?.message || "Credential transport failed",
|
|
122
|
+
),
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
_handleWorkerFailure(error) {
|
|
128
|
+
if (this.error) return;
|
|
129
|
+
this.error = transportError(
|
|
130
|
+
error?.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
131
|
+
error?.message || "Credential transport is unavailable",
|
|
132
|
+
);
|
|
133
|
+
this.ready = false;
|
|
134
|
+
this._rejectReady(this.error);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
isAvailable() {
|
|
138
|
+
return Boolean(this._worker && !this.closed && !this.error);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
waitUntilReady() {
|
|
142
|
+
return this._readyPromise;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
createCapabilityToken() {
|
|
146
|
+
if (!this.isAvailable()) {
|
|
147
|
+
throw (
|
|
148
|
+
this.error ||
|
|
149
|
+
transportError(
|
|
150
|
+
"CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
151
|
+
"Credential transport is unavailable",
|
|
152
|
+
)
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
return crypto.randomBytes(32).toString("base64url");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
registerCredential(record) {
|
|
159
|
+
if (!this.isAvailable()) {
|
|
160
|
+
throw (
|
|
161
|
+
this.error ||
|
|
162
|
+
transportError(
|
|
163
|
+
"CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
164
|
+
"Credential transport is unavailable",
|
|
165
|
+
)
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
this._worker.postMessage({ type: "register", record });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
updateCredential(refId, state) {
|
|
172
|
+
if (!this.isAvailable()) return;
|
|
173
|
+
this._worker.postMessage({
|
|
174
|
+
type: "update",
|
|
175
|
+
refId,
|
|
176
|
+
useCount: state.useCount,
|
|
177
|
+
status: state.status,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
revokeCredential(refId) {
|
|
182
|
+
if (!this.isAvailable()) return;
|
|
183
|
+
this._worker.postMessage({ type: "revoke", refId });
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async close() {
|
|
187
|
+
if (this.closed) return;
|
|
188
|
+
this.closed = true;
|
|
189
|
+
if (!this._worker) return;
|
|
190
|
+
const worker = this._worker;
|
|
191
|
+
await new Promise((resolve) => {
|
|
192
|
+
const timer = setTimeout(resolve, 1000);
|
|
193
|
+
const onMessage = (message) => {
|
|
194
|
+
if (message?.type !== "closed") return;
|
|
195
|
+
clearTimeout(timer);
|
|
196
|
+
worker.removeListener("message", onMessage);
|
|
197
|
+
resolve();
|
|
198
|
+
};
|
|
199
|
+
worker.on("message", onMessage);
|
|
200
|
+
worker.postMessage({ type: "close" });
|
|
201
|
+
});
|
|
202
|
+
await worker.terminate();
|
|
203
|
+
this.ready = false;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
getInfo() {
|
|
207
|
+
return {
|
|
208
|
+
version: this.version,
|
|
209
|
+
endpoint: this.endpoint,
|
|
210
|
+
available: this.isAvailable(),
|
|
211
|
+
ready: this.ready,
|
|
212
|
+
error: this.error
|
|
213
|
+
? {
|
|
214
|
+
code: this.error.code,
|
|
215
|
+
message: this.error.message,
|
|
216
|
+
}
|
|
217
|
+
: null,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function connectOnce(endpoint) {
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
const socket = net.connect(endpoint);
|
|
225
|
+
const onError = (error) => {
|
|
226
|
+
socket.removeListener("connect", onConnect);
|
|
227
|
+
reject(error);
|
|
228
|
+
};
|
|
229
|
+
const onConnect = () => {
|
|
230
|
+
socket.removeListener("error", onError);
|
|
231
|
+
resolve(socket);
|
|
232
|
+
};
|
|
233
|
+
socket.once("error", onError);
|
|
234
|
+
socket.once("connect", onConnect);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async function connectWithRetry(endpoint, deadline) {
|
|
239
|
+
let lastError = null;
|
|
240
|
+
while (Date.now() < deadline) {
|
|
241
|
+
try {
|
|
242
|
+
return await connectOnce(endpoint);
|
|
243
|
+
} catch (error) {
|
|
244
|
+
lastError = error;
|
|
245
|
+
const retryable = ["ENOENT", "ECONNREFUSED", "EPIPE"].includes(
|
|
246
|
+
error?.code,
|
|
247
|
+
);
|
|
248
|
+
if (!retryable) throw error;
|
|
249
|
+
await new Promise((resolve) => {
|
|
250
|
+
setTimeout(resolve, 25);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
throw (
|
|
255
|
+
lastError ||
|
|
256
|
+
transportError(
|
|
257
|
+
"CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
258
|
+
"Credential transport connection timed out",
|
|
259
|
+
)
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Resolve one reference using only the capability material inherited by the
|
|
265
|
+
* approved target process.
|
|
266
|
+
*/
|
|
267
|
+
export async function resolveCredentialRefOverTransport(refId, options = {}) {
|
|
268
|
+
const env = options.env || process.env;
|
|
269
|
+
const endpoint = options.endpoint || env.CC_CREDENTIAL_ENDPOINT;
|
|
270
|
+
const capabilityToken =
|
|
271
|
+
options.capabilityToken || env.CC_CREDENTIAL_AUTH_TOKEN;
|
|
272
|
+
const agentId = options.agentId || env.CC_CREDENTIAL_AGENT_ID;
|
|
273
|
+
const processTarget =
|
|
274
|
+
options.process ||
|
|
275
|
+
options.processTarget ||
|
|
276
|
+
env.CC_CREDENTIAL_TARGET_PROCESS;
|
|
277
|
+
const host =
|
|
278
|
+
options.host !== undefined
|
|
279
|
+
? options.host
|
|
280
|
+
: env.CC_CREDENTIAL_TARGET_HOST || null;
|
|
281
|
+
const timeoutMs = Math.max(
|
|
282
|
+
1,
|
|
283
|
+
Number(options.timeoutMs || DEFAULT_TIMEOUT_MS),
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
if (!endpoint || !capabilityToken || !agentId || !processTarget || !refId) {
|
|
287
|
+
throw transportError(
|
|
288
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
289
|
+
"Credential transport environment is incomplete",
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const deadline = Date.now() + timeoutMs;
|
|
294
|
+
const socket = await connectWithRetry(endpoint, deadline);
|
|
295
|
+
return await new Promise((resolve, reject) => {
|
|
296
|
+
let settled = false;
|
|
297
|
+
let carry = "";
|
|
298
|
+
const finish = (error, value) => {
|
|
299
|
+
if (settled) return;
|
|
300
|
+
settled = true;
|
|
301
|
+
clearTimeout(timer);
|
|
302
|
+
socket.destroy();
|
|
303
|
+
if (error) reject(error);
|
|
304
|
+
else resolve(value);
|
|
305
|
+
};
|
|
306
|
+
const timer = setTimeout(
|
|
307
|
+
() => {
|
|
308
|
+
finish(
|
|
309
|
+
transportError(
|
|
310
|
+
"CC_CREDENTIAL_TRANSPORT_TIMEOUT",
|
|
311
|
+
"Credential transport response timed out",
|
|
312
|
+
),
|
|
313
|
+
);
|
|
314
|
+
},
|
|
315
|
+
Math.max(1, deadline - Date.now()),
|
|
316
|
+
);
|
|
317
|
+
timer.unref?.();
|
|
318
|
+
socket.on("data", (chunk) => {
|
|
319
|
+
carry += chunk.toString("utf8");
|
|
320
|
+
if (Buffer.byteLength(carry, "utf8") > MAX_RESPONSE_BYTES) {
|
|
321
|
+
finish(
|
|
322
|
+
transportError(
|
|
323
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
324
|
+
"Credential transport response is too large",
|
|
325
|
+
),
|
|
326
|
+
);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const newline = carry.indexOf("\n");
|
|
330
|
+
if (newline === -1) return;
|
|
331
|
+
let response;
|
|
332
|
+
try {
|
|
333
|
+
response = JSON.parse(carry.slice(0, newline).replace(/\r$/, ""));
|
|
334
|
+
} catch {
|
|
335
|
+
finish(
|
|
336
|
+
transportError(
|
|
337
|
+
"CC_CREDENTIAL_INVALID_REQUEST",
|
|
338
|
+
"Credential transport returned invalid JSON",
|
|
339
|
+
),
|
|
340
|
+
);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (!response.ok) {
|
|
344
|
+
finish(
|
|
345
|
+
transportError(
|
|
346
|
+
response.code || "CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
347
|
+
response.message || "Credential transport denied the request",
|
|
348
|
+
),
|
|
349
|
+
);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
finish(null, response.value);
|
|
353
|
+
});
|
|
354
|
+
socket.once("error", (error) => finish(error));
|
|
355
|
+
socket.once("close", () => {
|
|
356
|
+
if (!settled) {
|
|
357
|
+
finish(
|
|
358
|
+
transportError(
|
|
359
|
+
"CC_CREDENTIAL_TRANSPORT_UNAVAILABLE",
|
|
360
|
+
"Credential transport closed without a response",
|
|
361
|
+
),
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
socket.write(
|
|
366
|
+
`${JSON.stringify({
|
|
367
|
+
type: "resolve",
|
|
368
|
+
refId,
|
|
369
|
+
agentId,
|
|
370
|
+
capabilityToken,
|
|
371
|
+
process: processTarget,
|
|
372
|
+
host,
|
|
373
|
+
})}\n`,
|
|
374
|
+
);
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export { TRANSPORT_VERSION };
|