chainlesschain 0.164.0 → 0.165.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +248 -2
- package/package.json +7 -4
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-D2MEn7fI.js → AIOps-lS1R0Cza.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-lCW_4Gf0.js → ActionButton-BmlgBPsj.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bs7i-nsS.js → Analytics-CNKczv1S.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CK7B6S_j.js → AppLayout-BuZGJARQ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C8ILjpyo.js → Artifacts-Dm73Sl-O.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bb9cNaWc.js → Audit-BGMW7A5e.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sC9ooXIf.js → BackgroundAgents-BQ6M54JR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D-DrsplT.js → Backup-DBzGP0bR.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uCNZpwSK.js → BaseInput-D1mLCoOV.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CsDK1uE9.js → Chat-BUfcN7p8.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-OqSDt50w.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-JhTXM1-K.js → Checkbox-Du0Yg5Pi.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BbzZLnyD.js → Codegen-B2RXziHW.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D4VW4m4j.js → Col-DWhekOrR.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BXrYawxV.js → Community-HQhrkon4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DCihGy1u.js → Compact-izHNb4uz.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DlyZ-lk8.js → Compliance-BDwLy41-.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DvGZrhbO.js → Cowork-DFJhLa7K.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DUncZi8h.js → Cron-DYY9RG7-.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C_hLuUcm.js → Crosschain-rr7tJTtv.js} +1 -1
- package/src/assets/web-panel/assets/{DID-b6YSUqxr.js → DID-D2sfHRLi.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-uvM15Cfb.js → Dashboard-q_eGdhha.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D1-Nd4qY.js → Dropdown-Cufrh2Bz.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-8ApvL6Zc.js → EmailListRenderer-B-kdv10f.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-LYJt8811.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BbI3HGpv.js → Federation-CAwRTLZH.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DSoEKuFu.js → FormItemContext-vx3daNDF.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B0S9OWd5.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DIs9Zhf3.js → Git-Q6SwauyD.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-jzZXrxcl.js → Governance-BJ1q4IQZ.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-JUPjf2ZI.js → Inference-CSWjROgD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DxnfJvlP.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-iXiz8BEE.js → Logs-DVF8Mnns.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Y3Xch312.js → Marketplace-BQP7LOA4.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D7kGGbO7.js → McpTools-BNlJCmNc.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-Do_hVxzh.js → Memory-DLLg5WQ4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CtrR0Tas.js → MobileBridge-CR2skNAF.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BxVavObl.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-qo5QCTGd.js → Mtc-B17pgqMI.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-cq5mnjYj.js → MtcAudit-4UmV5cIL.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Bq0MAQHw.js → Multisig-DoMEXEcU.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DdWE6Vi2.js → NLProgramming-h9DMXFX4.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BxMBFcIp.js → Notes-Cihn-xX8.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-RTrAcbUe.js → NotificationSettings-BE6ZGa3R.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DJbpGqzT.js → OrderTableRenderer-CnwojoSI.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-SQzIPdqC.js → Organization-B2vpwmjb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-02yECh22.js → Overflow-C4z28R0-.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BNg4pNCM.js → P2P-BVlFkwhW.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BxPJZsD3.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CLnDnPAz.js → Permissions-C28xs4lp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C5m0AjGf.js → PersonalDataHub-Dgl_rBjM.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-VwOf5Dhv.js → Pipeline-3QUIhrKI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CC0W2hZd.js → Privacy-8Gh33OZ5.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Dz893Bob.js → ProjectInit-BNmg4tZi.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CxQkvl0k.js → ProjectSettings-vgMfeCf9.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DeB9IkxK.js → Providers-CXoOa8eX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-OCeoaswn.js → QrScannerModal-BhfTF0oS.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DenotaAj.js → QuickAsk-C746HEAj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cies_jjI.js → Recommend-BSej8Eo0.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-f3gmnlG3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-CW0mvxgZ.js → Reputation-CyvybpkN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-SEd32qZU.js → Row-DwV2PeYn.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BSwnJ3Lm.js → RssFeed-11GrzjZy.js} +3 -3
- package/src/assets/web-panel/assets/{Search-xe2m8bkC.js → Search-BjKXkrAY.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Mq2F9Nro.js → Security-eWiFb9Yk.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BKGw2V3P.js → Services-CdCsMAtt.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DW95-Rxf.js → Skeleton-4Q2UTKQ5.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CHgChCv_.js → Skills-v4rtYrRj.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-tKh6k3R7.js → Sla-CRhsFvd_.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-D0Fw8fVL.js → SyncSettings-D16zonl7.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-20x1GB3D.js → Tasks-Xxozz0i_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DJ-lts-a.js → Templates-CXJpPtCT.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BFdGpbs7.js → Tenant-XRV0L1ZF.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Xpx61vHL.js → Terminal-CYuO1i_w.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C6UIvyZQ.js → TimelineRenderer-BXqitWsu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Dellq08f.js → Tokens-BvPrDHIy.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-VKw8d0J-.js → Trigger-DhCrSTf5.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DNftdKT5.js → Trust-DmsuZD6K.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DX9VAKJI.js → UkeySign-D_yrts5C.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B2h3jO8q.js → VideoEditing-B01ihPrm.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CjGkof7f.js → Wallet-DpUjKa-N.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-2Zfcu55P.js → WebAuthn-CL07yON6.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B9eZ8UxZ.js → WorkflowEditor-CLMflnRr.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CQNfD-YO.js → chat-DtUqe8h_.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D4usyFT2.js → colors-DPKrgVfy.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-s4TpjvjX.js → compact-item-BTt2GtOm.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BRCSvYxj.js → createContext-D_VeUc1J.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-AdkUbkV-.js → hasIn-1kndiylj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIoG5yYf.js → index-2eyAXE3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-nXyk8GZ9.js → index-4bna2_SR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2V-eKfK.js → index-8nz_fmlj.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_XBHopw.js → index-B9KvcS7R.js} +1 -1
- package/src/assets/web-panel/assets/{index-s_buFMEG.js → index-BAXfRKfG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZT36ZYq.js → index-BHpBMWCh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcimU-2.js → index-BaZAbw9A.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzRjHxEv.js → index-BepLZwgB.js} +1 -1
- package/src/assets/web-panel/assets/{index--00U6vXZ.js → index-Bhudc_Ez.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7Y8Aluc.js → index-BlDNVgBt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtobShro.js → index-By5n8up9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cvyt-zhm.js → index-CHG-KcS4.js} +1 -1
- package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
- package/src/assets/web-panel/assets/{index-MMN9V6JF.js → index-CX81qSM4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bad4VNvz.js → index-CauoBQkH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCsM_Ybx.js → index-CcO04eDn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DARsAyUp.js → index-CtF7EN49.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5KAQFPQ.js → index-CzjkKUmR.js} +1 -1
- package/src/assets/web-panel/assets/{index-RfMr79MW.js → index-D95OFht7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdCB70SS.js → index-DFIZ_1Sf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYdoQsa1.js → index-DG2MZQ3f.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPhkFZ1I.js → index-DJ8vXGOa.js} +1 -1
- package/src/assets/web-panel/assets/{index-_IRVsV9X.js → index-Dbbymxpj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVKfQ0Ux.js → index-DdkplL9R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkwiSLhU.js → index-DfGl8CqG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJVEOa4i.js → index-DfKBRdSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1mJtE6q.js → index-DsJCDUJG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgiXR_-_.js → index-Dwqmtk65.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJCFe2Qf.js → index-DxdTdBix.js} +1 -1
- package/src/assets/web-panel/assets/{index-C484EJiS.js → index-FzdwcSy2.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4JJCfQ2.js → index-GsoUQ2M7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQhAVU5t.js → index-brCInrzq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKC1t3Ic.js → index-dVc-CXY4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQ3DXBtD.js → index-fk2Rjacw.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cduu2Hhr.js → index-l1BETrDb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw2MEnUk.js → index-m31Ka8hZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2GjI2oe.js → index-ocf06EVQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJdQrZth.js → index-sDoMHTNA.js} +1 -1
- package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-Blmpk7HL.js → initDefaultProps-CvyYJd7z.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DPBJMv1n.js → motion-DYZkhUdz.js} +1 -1
- package/src/assets/web-panel/assets/{move-ButdzCM7.js → move-slnJRVT1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-cyRC_QCe.js → mtc-parser-DVc0CKmy.js} +1 -1
- package/src/assets/web-panel/assets/{omit-1epSV7hz.js → omit-BCXAtHCq.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DuPY8xJs.js → pickAttrs-DBsemz_K.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-6XZqarhe.js → placementArrow-BRtkJ-nv.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B40pXBWM.js → responsiveObserve-Cebq7EZn.js} +1 -1
- package/src/assets/web-panel/assets/{slide-jbZ9Wu4n.js → slide-DT7qvId2.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BKQQcVy4.js → statusUtils-pQiITLkG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-NiKfWjUT.js → styleChecker-c-19BVKQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-bQUCvPeb.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CUGji7ph.js → useFs-CxGiMe5n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-4veyN2N2.js → usePersonalDataHub-D9btVID5.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-1-nLug-Z.js → vnode-CUYFsFEN.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-dhCeRDMo.js → zoom-CXmn_35j.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/cowork.js +559 -62
- package/src/commands/plugin.js +819 -64
- package/src/commands/session-location.js +318 -7
- package/src/constants.js +2 -2
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/action-protocol.js +293 -19
- package/src/gateways/ws/message-dispatcher.js +30 -0
- package/src/gateways/ws/remote-session-protocol.js +542 -35
- package/src/gateways/ws/ws-approval-gate.js +5 -0
- package/src/gateways/ws/ws-server.js +462 -38
- package/src/harness/jsonl-session-store.js +638 -2
- package/src/harness/prompt-compressor.js +4 -0
- package/src/harness/remote-session-audit.js +1 -0
- package/src/harness/remote-session-crypto.js +750 -50
- package/src/harness/remote-session-registry.js +795 -27
- package/src/lib/auto-mode-config.js +98 -3
- package/src/lib/background-agent-keeper-client.js +29 -0
- package/src/lib/background-agent-keeper-protocol.js +158 -10
- package/src/lib/background-agent-supervisor.js +870 -48
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +64 -0
- package/src/lib/cowork-task-runner.js +70 -0
- package/src/lib/cowork-workflow.js +887 -62
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/doctor-checkup.js +34 -10
- package/src/lib/dynamic-workflow-draft.js +535 -0
- package/src/lib/dynamic-workflow-facade.js +1105 -17
- package/src/lib/dynamic-workflow-runtime.js +2974 -0
- package/src/lib/execution-location-contract.js +111 -7
- package/src/lib/execution-location-runtime.js +3 -1
- package/src/lib/execution-location-target.js +910 -0
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/mcp-call-ledger-store.js +35 -0
- package/src/lib/mcp-call-ledger.js +30 -0
- package/src/lib/mcp-stdio-package-materialization.js +1 -1
- package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
- package/src/lib/plugin-runtime/install.js +4956 -657
- package/src/lib/plugin-runtime/manifest.js +3 -1
- package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
- package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
- package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
- package/src/lib/plugin-runtime/marketplace-network.js +317 -0
- package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
- package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
- package/src/lib/plugin-runtime/policy.js +21 -6
- package/src/lib/plugin-runtime/publisher-trust.js +332 -0
- package/src/lib/plugin-runtime/remote-source.js +323 -27
- package/src/lib/plugin-runtime/scopes.js +317 -41
- package/src/lib/plugin-runtime/transaction-journal.js +806 -0
- package/src/lib/public-ide-capability-manifest.js +1 -1
- package/src/lib/remote-approval-bridge.js +745 -108
- package/src/lib/remote-control.js +2 -0
- package/src/lib/remote-membership-coordinator.js +612 -46
- package/src/lib/remote-membership-host-store.js +59 -10
- package/src/lib/runtime-provenance-ledger.js +171 -46
- package/src/lib/shell-approval.js +169 -6
- package/src/lib/sub-agent-context.js +268 -2
- package/src/lib/task-model-selector.js +1 -1
- package/src/lib/with-file-lock.js +167 -42
- package/src/repl/agent-repl.js +70 -29
- package/src/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1695 -194
- package/src/runtime/headless-runner.js +22 -5
- package/src/runtime/headless-stream.js +19 -3
- package/src/workers/background-agent-keeper.js +279 -58
- package/src/workers/background-agent-worker.js +7 -0
- package/src/workers/background-turn-bootstrap.js +29 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-GmB6DOr6.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +0 -1
- package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Dxzl5n2T.js +0 -5
- package/src/assets/web-panel/assets/SpeechSettings-D6UL3dA5.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +0 -1
- package/src/assets/web-panel/assets/index-C61cnl3K.js +0 -1
- package/src/assets/web-panel/assets/index-D4XFHxBr.js +0 -1
|
@@ -14,6 +14,8 @@ import {
|
|
|
14
14
|
parsePluginDependencies,
|
|
15
15
|
} from "./governance.js";
|
|
16
16
|
import { describeCapabilities, normalizeCapabilities } from "./capabilities.js";
|
|
17
|
+
import { normalizePublisherDeclaration } from "./publisher-trust.js";
|
|
18
|
+
import { normalizeMarketplaceNetworkAuthority } from "./marketplace-network.js";
|
|
17
19
|
|
|
18
20
|
export const PLUGIN_MARKETPLACE_CATALOG_SCHEMA =
|
|
19
21
|
"cc-plugin-marketplace-catalog/v1";
|
|
@@ -42,6 +44,8 @@ export function buildPluginMarketplaceInstallPreflight({
|
|
|
42
44
|
registryUrl,
|
|
43
45
|
entry,
|
|
44
46
|
fromCache = false,
|
|
47
|
+
registryDocumentSha256 = null,
|
|
48
|
+
registryNetworkAuthority = null,
|
|
45
49
|
installed = {},
|
|
46
50
|
hostVersion = null,
|
|
47
51
|
strict = false,
|
|
@@ -53,6 +57,8 @@ export function buildPluginMarketplaceInstallPreflight({
|
|
|
53
57
|
url: registryUrl,
|
|
54
58
|
registry: { plugins: [entry] },
|
|
55
59
|
fromCache,
|
|
60
|
+
documentSha256: registryDocumentSha256,
|
|
61
|
+
networkAuthority: registryNetworkAuthority,
|
|
56
62
|
},
|
|
57
63
|
],
|
|
58
64
|
installed,
|
|
@@ -108,6 +114,9 @@ export function buildPluginMarketplaceCandidateSelection({
|
|
|
108
114
|
),
|
|
109
115
|
);
|
|
110
116
|
}
|
|
117
|
+
if (catalog.dependencyGraph?.truncated === true) {
|
|
118
|
+
blockers.push(issue("DEPENDENCY_GRAPH_TRUNCATED"));
|
|
119
|
+
}
|
|
111
120
|
if (selected) {
|
|
112
121
|
for (const blocker of effectiveInstallBlockers(selected)) {
|
|
113
122
|
blockers.push({
|
|
@@ -221,6 +230,9 @@ function buildInstallPreflight({ catalog, candidate, observedAt, selection }) {
|
|
|
221
230
|
candidateDigest: candidate.candidateDigest,
|
|
222
231
|
contentDigest: candidate.contentDigest,
|
|
223
232
|
name: candidate.name,
|
|
233
|
+
...(candidate.publisherIdentity
|
|
234
|
+
? { publisherIdentity: candidate.publisherIdentity }
|
|
235
|
+
: {}),
|
|
224
236
|
registry: candidate.registry,
|
|
225
237
|
package: candidate.package,
|
|
226
238
|
registryVersion: candidate.version,
|
|
@@ -331,6 +343,7 @@ export function buildPluginMarketplaceCatalog({
|
|
|
331
343
|
candidates.sort(compareCandidates);
|
|
332
344
|
sourceRows.sort((a, b) => a.priority - b.priority);
|
|
333
345
|
const dependencyGraph = buildDependencyGraph(candidates, installedVersions);
|
|
346
|
+
applyDependencyCycleBlockers(candidates, dependencyGraph.cycles);
|
|
334
347
|
|
|
335
348
|
const summary = {
|
|
336
349
|
sourceCount: sourceRows.length,
|
|
@@ -359,7 +372,11 @@ export function buildPluginMarketplaceCatalog({
|
|
|
359
372
|
schemaVersion: PLUGIN_MARKETPLACE_CATALOG_SCHEMA,
|
|
360
373
|
strict: strict === true,
|
|
361
374
|
hostVersion: boundedString(hostVersion, 128) || null,
|
|
362
|
-
sources: sourceRows.map((
|
|
375
|
+
sources: sourceRows.map((source) => {
|
|
376
|
+
const authoritySource = { ...source };
|
|
377
|
+
delete authoritySource.error;
|
|
378
|
+
return authoritySource;
|
|
379
|
+
}),
|
|
363
380
|
candidates,
|
|
364
381
|
dependencyGraph,
|
|
365
382
|
};
|
|
@@ -387,7 +404,7 @@ function normalizeCatalogSource(input, priority) {
|
|
|
387
404
|
const raw = input && typeof input === "object" ? input : {};
|
|
388
405
|
const sanitizedUrl = sanitizeUrl(raw.url);
|
|
389
406
|
const url = sanitizedUrl || `invalid-source-${priority + 1}`;
|
|
390
|
-
|
|
407
|
+
let error = raw.error
|
|
391
408
|
? {
|
|
392
409
|
code: boundedString(raw.error.code, 64) || "REGISTRY_FETCH_FAILED",
|
|
393
410
|
message: scrubError(raw.error.message || raw.error),
|
|
@@ -398,6 +415,24 @@ function normalizeCatalogSource(input, priority) {
|
|
|
398
415
|
message: "registry source URL is missing or invalid",
|
|
399
416
|
}
|
|
400
417
|
: null;
|
|
418
|
+
const documentSha256 = boundedString(raw.documentSha256, 64).toLowerCase();
|
|
419
|
+
if (raw.documentSha256 != null && !SHA256_RE.test(documentSha256)) {
|
|
420
|
+
error = {
|
|
421
|
+
code: "INVALID_REGISTRY_DOCUMENT_DIGEST",
|
|
422
|
+
message: "registry document SHA-256 is invalid",
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
let networkAuthority = null;
|
|
426
|
+
try {
|
|
427
|
+
networkAuthority = normalizeMarketplaceNetworkAuthority(
|
|
428
|
+
raw.networkAuthority,
|
|
429
|
+
);
|
|
430
|
+
} catch (networkError) {
|
|
431
|
+
error = {
|
|
432
|
+
code: "INVALID_REGISTRY_NETWORK_AUTHORITY",
|
|
433
|
+
message: scrubError(networkError.message),
|
|
434
|
+
};
|
|
435
|
+
}
|
|
401
436
|
const registry =
|
|
402
437
|
raw.registry && typeof raw.registry === "object" ? raw.registry : null;
|
|
403
438
|
return {
|
|
@@ -408,6 +443,8 @@ function normalizeCatalogSource(input, priority) {
|
|
|
408
443
|
url,
|
|
409
444
|
name: boundedString(registry?.name, 256) || null,
|
|
410
445
|
status: error ? "unavailable" : raw.fromCache ? "cached" : "online",
|
|
446
|
+
...(documentSha256 ? { documentSha256 } : {}),
|
|
447
|
+
...(networkAuthority ? { networkAuthority } : {}),
|
|
411
448
|
candidateCount: 0,
|
|
412
449
|
...(error ? { error } : {}),
|
|
413
450
|
},
|
|
@@ -504,6 +541,10 @@ function normalizeCandidate(entry, context) {
|
|
|
504
541
|
}
|
|
505
542
|
|
|
506
543
|
const publisherHealth = normalizePublisherHealth(raw.health);
|
|
544
|
+
const publisherIdentity = normalizePublisherDeclaration(raw.publisher);
|
|
545
|
+
if (raw.publisher != null && !publisherIdentity) {
|
|
546
|
+
warnings.push(issue("PUBLISHER_IDENTITY_DECLARATION_INVALID"));
|
|
547
|
+
}
|
|
507
548
|
if (publisherHealth.status === "unhealthy") {
|
|
508
549
|
blockers.push(issue("PUBLISHER_HEALTH_UNHEALTHY"));
|
|
509
550
|
}
|
|
@@ -546,12 +587,19 @@ function normalizeCandidate(entry, context) {
|
|
|
546
587
|
candidateId,
|
|
547
588
|
name,
|
|
548
589
|
version,
|
|
590
|
+
...(publisherIdentity ? { publisherIdentity } : {}),
|
|
549
591
|
description,
|
|
550
592
|
registry: {
|
|
551
593
|
sourceId: context.source.sourceId,
|
|
552
594
|
priority: context.source.priority,
|
|
553
595
|
url: context.source.url,
|
|
554
596
|
status: context.source.status,
|
|
597
|
+
...(context.source.documentSha256
|
|
598
|
+
? { documentSha256: context.source.documentSha256 }
|
|
599
|
+
: {}),
|
|
600
|
+
...(context.source.networkAuthority
|
|
601
|
+
? { networkAuthority: context.source.networkAuthority }
|
|
602
|
+
: {}),
|
|
555
603
|
},
|
|
556
604
|
package: { source: sourceUrl, ref },
|
|
557
605
|
integrity,
|
|
@@ -625,6 +673,9 @@ function normalizeCandidate(entry, context) {
|
|
|
625
673
|
errors: candidate.dependencies.errors,
|
|
626
674
|
},
|
|
627
675
|
publisherHealth: candidate.health.publisher,
|
|
676
|
+
...(candidate.publisherIdentity
|
|
677
|
+
? { publisherIdentity: candidate.publisherIdentity }
|
|
678
|
+
: {}),
|
|
628
679
|
governance: candidate.governance,
|
|
629
680
|
};
|
|
630
681
|
candidate.contentDigest = sha256Canonical(contentAuthority);
|
|
@@ -1006,6 +1057,21 @@ function findDependencyCycles(candidates, edges) {
|
|
|
1006
1057
|
);
|
|
1007
1058
|
}
|
|
1008
1059
|
|
|
1060
|
+
function applyDependencyCycleBlockers(candidates, cycles) {
|
|
1061
|
+
const cyclicIds = new Set(cycles.flat());
|
|
1062
|
+
for (const candidate of candidates) {
|
|
1063
|
+
if (!cyclicIds.has(candidate.candidateId)) continue;
|
|
1064
|
+
if (
|
|
1065
|
+
!candidate.installability.blockers.some(
|
|
1066
|
+
(blocker) => blocker.code === "DEPENDENCY_CYCLE",
|
|
1067
|
+
)
|
|
1068
|
+
) {
|
|
1069
|
+
candidate.installability.blockers.push(issue("DEPENDENCY_CYCLE"));
|
|
1070
|
+
}
|
|
1071
|
+
candidate.installability.status = "blocked";
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1009
1075
|
function canonicalCycle(cycle) {
|
|
1010
1076
|
if (cycle.length < 2) return cycle;
|
|
1011
1077
|
const rotations = cycle.map((_, index) => [
|
|
@@ -6,15 +6,20 @@
|
|
|
6
6
|
import crypto from "node:crypto";
|
|
7
7
|
import semver from "semver";
|
|
8
8
|
import { diffCapabilities, normalizeCapabilities } from "./capabilities.js";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
PLUGIN_MARKETPLACE_CANONICAL_PAYLOAD_SBOM_SCHEMA,
|
|
11
|
+
isMarketplacePayloadSbomFormat,
|
|
12
|
+
} from "./marketplace-artifact-readback.js";
|
|
10
13
|
import { PLUGIN_MARKETPLACE_INSTALL_PREFLIGHT_SCHEMA } from "./marketplace-catalog.js";
|
|
11
14
|
|
|
12
15
|
export const PLUGIN_MARKETPLACE_UPDATE_IMPACT_SCHEMA =
|
|
13
|
-
"cc-plugin-marketplace-update-impact/
|
|
16
|
+
"cc-plugin-marketplace-update-impact/v2";
|
|
14
17
|
|
|
15
18
|
export function buildPluginMarketplaceUpdateImpact({
|
|
16
19
|
preflight,
|
|
17
20
|
installed = null,
|
|
21
|
+
installedScopes = null,
|
|
22
|
+
targetScope = null,
|
|
18
23
|
observedAt = new Date().toISOString(),
|
|
19
24
|
} = {}) {
|
|
20
25
|
if (
|
|
@@ -26,8 +31,25 @@ export function buildPluginMarketplaceUpdateImpact({
|
|
|
26
31
|
);
|
|
27
32
|
}
|
|
28
33
|
const current = normalizeInstalled(installed);
|
|
34
|
+
const hasScopedInventory = Array.isArray(installedScopes);
|
|
35
|
+
const physical = normalizeInstalledScopes(installedScopes, current);
|
|
29
36
|
const version = compareVersion(current?.version, preflight.registryVersion);
|
|
30
|
-
const
|
|
37
|
+
const sourceTransitions = physical.map((entry) => ({
|
|
38
|
+
scope: entry.scope,
|
|
39
|
+
transition: compareSource(entry.source, preflight),
|
|
40
|
+
}));
|
|
41
|
+
const physicalSourceSwitches = hasScopedInventory
|
|
42
|
+
? sourceTransitions
|
|
43
|
+
.filter(({ transition }) => transition.requiresApproval)
|
|
44
|
+
.map(({ scope }) => scope)
|
|
45
|
+
: [];
|
|
46
|
+
const source = {
|
|
47
|
+
...compareSource(current?.source, preflight),
|
|
48
|
+
requiresApproval:
|
|
49
|
+
compareSource(current?.source, preflight).requiresApproval ||
|
|
50
|
+
physicalSourceSwitches.length > 0,
|
|
51
|
+
physicalSourceSwitches,
|
|
52
|
+
};
|
|
31
53
|
const integrity = compareIntegrity(
|
|
32
54
|
current?.integrity,
|
|
33
55
|
preflight.integrity,
|
|
@@ -46,21 +68,65 @@ export function buildPluginMarketplaceUpdateImpact({
|
|
|
46
68
|
preflight.dependencies?.declared || {},
|
|
47
69
|
);
|
|
48
70
|
const approvals = [];
|
|
71
|
+
const blockers = [...preflight.blockers];
|
|
49
72
|
if (source.requiresApproval) {
|
|
50
|
-
approvals
|
|
73
|
+
pushUniqueFinding(approvals, {
|
|
51
74
|
code: "SOURCE_SWITCH_APPROVAL_REQUIRED",
|
|
52
|
-
detail:
|
|
75
|
+
detail:
|
|
76
|
+
physicalSourceSwitches.length > 0
|
|
77
|
+
? `scopes: ${physicalSourceSwitches.join(", ")}`
|
|
78
|
+
: source.kind,
|
|
53
79
|
});
|
|
54
80
|
}
|
|
55
81
|
if (version.kind === "downgrade") {
|
|
56
|
-
approvals
|
|
82
|
+
pushUniqueFinding(approvals, {
|
|
83
|
+
code: "VERSION_DOWNGRADE_APPROVAL_REQUIRED",
|
|
84
|
+
});
|
|
57
85
|
}
|
|
58
86
|
if (capabilities.widened) {
|
|
59
|
-
approvals
|
|
87
|
+
pushUniqueFinding(approvals, {
|
|
60
88
|
code: "CAPABILITY_WIDENING_CONSENT_REQUIRED",
|
|
61
89
|
detail: capabilities.added.join(", "),
|
|
62
90
|
});
|
|
63
91
|
}
|
|
92
|
+
if (integrity.semanticPayloadBinding.downgraded) {
|
|
93
|
+
pushUniqueFinding(blockers, {
|
|
94
|
+
code: "SEMANTIC_SBOM_BINDING_DOWNGRADE",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (current && version.kind === "candidate-version-deferred") {
|
|
98
|
+
pushUniqueFinding(blockers, {
|
|
99
|
+
code: "REGISTRY_VERSION_REQUIRED_FOR_UPDATE",
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const candidateSemanticFormat = candidateSemanticPayloadFormat(preflight);
|
|
104
|
+
const semanticDowngradeScopes = hasScopedInventory
|
|
105
|
+
? physical
|
|
106
|
+
.filter(
|
|
107
|
+
(entry) =>
|
|
108
|
+
semanticPayloadStrength(
|
|
109
|
+
entry.integrity?.sbom?.semanticPayloadFormat,
|
|
110
|
+
) > semanticPayloadStrength(candidateSemanticFormat),
|
|
111
|
+
)
|
|
112
|
+
.map((entry) => entry.scope)
|
|
113
|
+
: [];
|
|
114
|
+
if (semanticDowngradeScopes.length > 0) {
|
|
115
|
+
pushUniqueFinding(blockers, {
|
|
116
|
+
code: "SEMANTIC_SBOM_BINDING_DOWNGRADE",
|
|
117
|
+
detail: `scopes: ${semanticDowngradeScopes.join(", ")}`,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const scopeAuthority =
|
|
121
|
+
hasScopedInventory || targetScope
|
|
122
|
+
? buildScopeAuthorityChange({
|
|
123
|
+
current,
|
|
124
|
+
physical,
|
|
125
|
+
targetScope,
|
|
126
|
+
physicalSourceSwitches,
|
|
127
|
+
semanticDowngradeScopes,
|
|
128
|
+
})
|
|
129
|
+
: null;
|
|
64
130
|
|
|
65
131
|
const changes = {
|
|
66
132
|
version,
|
|
@@ -73,6 +139,7 @@ export function buildPluginMarketplaceUpdateImpact({
|
|
|
73
139
|
status: preflight.governance.status,
|
|
74
140
|
missing: preflight.governance.missing,
|
|
75
141
|
},
|
|
142
|
+
...(scopeAuthority ? { scopeAuthority } : {}),
|
|
76
143
|
};
|
|
77
144
|
const changeCount = countChanges(changes);
|
|
78
145
|
const authority = {
|
|
@@ -83,20 +150,22 @@ export function buildPluginMarketplaceUpdateImpact({
|
|
|
83
150
|
? { selectionDigest: preflight.selectionDigest }
|
|
84
151
|
: {}),
|
|
85
152
|
installed: current,
|
|
153
|
+
installedScopes: physical,
|
|
86
154
|
changes,
|
|
87
|
-
blockers
|
|
155
|
+
blockers,
|
|
88
156
|
approvals,
|
|
89
157
|
};
|
|
90
158
|
return {
|
|
91
159
|
schemaVersion: PLUGIN_MARKETPLACE_UPDATE_IMPACT_SCHEMA,
|
|
92
160
|
observedAt,
|
|
93
161
|
impactDigest: sha256Canonical(authority),
|
|
94
|
-
status:
|
|
162
|
+
status: blockers.length
|
|
95
163
|
? "blocked"
|
|
96
164
|
: approvals.length || changeCount
|
|
97
165
|
? "review-required"
|
|
98
166
|
: "no-change",
|
|
99
167
|
installed: current,
|
|
168
|
+
installedScopes: physical,
|
|
100
169
|
candidate: {
|
|
101
170
|
candidateId: preflight.candidateId,
|
|
102
171
|
candidateDigest: preflight.candidateDigest,
|
|
@@ -114,13 +183,13 @@ export function buildPluginMarketplaceUpdateImpact({
|
|
|
114
183
|
},
|
|
115
184
|
changes,
|
|
116
185
|
changeCount,
|
|
117
|
-
blockers
|
|
186
|
+
blockers,
|
|
118
187
|
requiredApprovals: approvals,
|
|
119
188
|
claims: {
|
|
120
189
|
candidateMetadataVerified: false,
|
|
121
190
|
candidateBytesFetched: false,
|
|
122
191
|
candidateCodeExecuted: false,
|
|
123
|
-
installedEvidenceAuthority: "local-
|
|
192
|
+
installedEvidenceAuthority: "local-installed-state",
|
|
124
193
|
},
|
|
125
194
|
};
|
|
126
195
|
}
|
|
@@ -131,6 +200,7 @@ function normalizeInstalled(value) {
|
|
|
131
200
|
name: clean(value.name, 256) || null,
|
|
132
201
|
version: clean(value.version, 128) || null,
|
|
133
202
|
scope: clean(value.scope, 32) || null,
|
|
203
|
+
enabled: value.enabled !== false,
|
|
134
204
|
source: normalizeInstalledSource(value.source),
|
|
135
205
|
integrity: normalizeInstalledIntegrity(value.integrity),
|
|
136
206
|
license: {
|
|
@@ -142,6 +212,22 @@ function normalizeInstalled(value) {
|
|
|
142
212
|
};
|
|
143
213
|
}
|
|
144
214
|
|
|
215
|
+
function normalizeInstalledScopes(values, current) {
|
|
216
|
+
const normalized = (Array.isArray(values) ? values : [])
|
|
217
|
+
.map(normalizeInstalled)
|
|
218
|
+
.filter(Boolean);
|
|
219
|
+
if (normalized.length === 0 && current) normalized.push(current);
|
|
220
|
+
const byScope = new Map();
|
|
221
|
+
for (const entry of normalized) {
|
|
222
|
+
if (!entry.scope || byScope.has(entry.scope)) continue;
|
|
223
|
+
byScope.set(entry.scope, entry);
|
|
224
|
+
}
|
|
225
|
+
const rank = (scope) => ["user", "project", "local"].indexOf(scope);
|
|
226
|
+
return [...byScope.values()].sort(
|
|
227
|
+
(left, right) => rank(left.scope) - rank(right.scope),
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
145
231
|
function normalizeInstalledSource(value) {
|
|
146
232
|
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
147
233
|
const authority = value.catalogAuthority;
|
|
@@ -183,6 +269,7 @@ function normalizeInstalledSource(value) {
|
|
|
183
269
|
function normalizeInstalledIntegrity(value) {
|
|
184
270
|
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
185
271
|
const payloadSchema = clean(value.sbom?.payloadSchema, 128) || null;
|
|
272
|
+
const semanticPayloadFormat = clean(value.sbom?.semanticPayloadFormat, 128);
|
|
186
273
|
return {
|
|
187
274
|
signature: {
|
|
188
275
|
present: value.signature?.present === true,
|
|
@@ -193,11 +280,15 @@ function normalizeInstalledIntegrity(value) {
|
|
|
193
280
|
sbom: {
|
|
194
281
|
present: value.sbom?.present === true,
|
|
195
282
|
digest: clean(value.sbom?.digest, 128) || null,
|
|
196
|
-
payloadSha256:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
: null,
|
|
283
|
+
payloadSha256: isMarketplacePayloadSbomFormat(payloadSchema)
|
|
284
|
+
? clean(value.sbom?.payloadSha256, 128) || null
|
|
285
|
+
: null,
|
|
200
286
|
payloadSchema,
|
|
287
|
+
semanticPayloadFormat: isMarketplacePayloadSbomFormat(
|
|
288
|
+
semanticPayloadFormat,
|
|
289
|
+
)
|
|
290
|
+
? semanticPayloadFormat
|
|
291
|
+
: null,
|
|
201
292
|
fileCount: Number.isSafeInteger(value.sbom?.fileCount)
|
|
202
293
|
? value.sbom.fileCount
|
|
203
294
|
: null,
|
|
@@ -294,6 +385,21 @@ function compareIntegrity(current, candidate, currentSource = null) {
|
|
|
294
385
|
current?.signature?.publicKeySha256,
|
|
295
386
|
candidate?.signature?.publicKeySha256,
|
|
296
387
|
);
|
|
388
|
+
const installedSemanticFormat = isMarketplacePayloadSbomFormat(
|
|
389
|
+
current?.sbom?.semanticPayloadFormat,
|
|
390
|
+
)
|
|
391
|
+
? current.sbom.semanticPayloadFormat
|
|
392
|
+
: null;
|
|
393
|
+
const candidateSemanticFormat =
|
|
394
|
+
isMarketplacePayloadSbomFormat(candidate?.sbom?.format) &&
|
|
395
|
+
candidate?.sbom?.status === "declared" &&
|
|
396
|
+
candidate?.sbom?.remoteVerification === "complete"
|
|
397
|
+
? candidate.sbom.format
|
|
398
|
+
: null;
|
|
399
|
+
const semanticPayloadBinding = compareSemanticPayloadBinding(
|
|
400
|
+
installedSemanticFormat,
|
|
401
|
+
candidateSemanticFormat,
|
|
402
|
+
);
|
|
297
403
|
return {
|
|
298
404
|
manifestDigest: compareScalar(installedManifest, candidateManifest),
|
|
299
405
|
signature: {
|
|
@@ -313,9 +419,94 @@ function compareIntegrity(current, candidate, currentSource = null) {
|
|
|
313
419
|
installedSbomDocument,
|
|
314
420
|
candidateSbomDocument,
|
|
315
421
|
),
|
|
422
|
+
semanticPayloadBinding,
|
|
316
423
|
};
|
|
317
424
|
}
|
|
318
425
|
|
|
426
|
+
function compareSemanticPayloadBinding(from, to) {
|
|
427
|
+
const fromStrength = semanticPayloadStrength(from);
|
|
428
|
+
const toStrength = semanticPayloadStrength(to);
|
|
429
|
+
return {
|
|
430
|
+
from: from || null,
|
|
431
|
+
to: to || null,
|
|
432
|
+
kind: !from
|
|
433
|
+
? to
|
|
434
|
+
? "added"
|
|
435
|
+
: "absent"
|
|
436
|
+
: !to
|
|
437
|
+
? "removed"
|
|
438
|
+
: from === to
|
|
439
|
+
? "same"
|
|
440
|
+
: toStrength < fromStrength
|
|
441
|
+
? "weakened"
|
|
442
|
+
: "changed-format",
|
|
443
|
+
changed: from !== to,
|
|
444
|
+
downgraded: fromStrength > toStrength,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function semanticPayloadStrength(format) {
|
|
449
|
+
return format === PLUGIN_MARKETPLACE_CANONICAL_PAYLOAD_SBOM_SCHEMA
|
|
450
|
+
? 2
|
|
451
|
+
: isMarketplacePayloadSbomFormat(format)
|
|
452
|
+
? 1
|
|
453
|
+
: 0;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function candidateSemanticPayloadFormat(preflight) {
|
|
457
|
+
const sbom = preflight.integrity?.sbom;
|
|
458
|
+
return isMarketplacePayloadSbomFormat(sbom?.format) &&
|
|
459
|
+
sbom.status === "declared" &&
|
|
460
|
+
sbom.remoteVerification === "complete"
|
|
461
|
+
? sbom.format
|
|
462
|
+
: null;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function buildScopeAuthorityChange({
|
|
466
|
+
current,
|
|
467
|
+
physical,
|
|
468
|
+
targetScope,
|
|
469
|
+
physicalSourceSwitches,
|
|
470
|
+
semanticDowngradeScopes,
|
|
471
|
+
}) {
|
|
472
|
+
const target = clean(targetScope, 32) || null;
|
|
473
|
+
if (!target && physical.length === 0) return null;
|
|
474
|
+
const rank = (scope) => ["user", "project", "local"].indexOf(scope);
|
|
475
|
+
const targetInstalled = physical.find((entry) => entry.scope === target);
|
|
476
|
+
const targetEnabled = targetInstalled?.enabled !== false;
|
|
477
|
+
const candidateWouldBeEffective = Boolean(
|
|
478
|
+
target &&
|
|
479
|
+
targetEnabled &&
|
|
480
|
+
(!current || rank(target) >= rank(current.scope)),
|
|
481
|
+
);
|
|
482
|
+
const effectiveTo = candidateWouldBeEffective
|
|
483
|
+
? target
|
|
484
|
+
: current?.scope || null;
|
|
485
|
+
return {
|
|
486
|
+
targetScope: target,
|
|
487
|
+
effectiveFrom: current?.scope || null,
|
|
488
|
+
effectiveTo,
|
|
489
|
+
changed: (current?.scope || null) !== effectiveTo,
|
|
490
|
+
candidateWouldBeEffective,
|
|
491
|
+
physical: physical.map((entry) => ({
|
|
492
|
+
scope: entry.scope,
|
|
493
|
+
version: entry.version,
|
|
494
|
+
enabled: entry.enabled,
|
|
495
|
+
sourceType: entry.source?.type || null,
|
|
496
|
+
sourceRegistry: entry.source?.registry || null,
|
|
497
|
+
semanticPayloadFormat:
|
|
498
|
+
entry.integrity?.sbom?.semanticPayloadFormat || null,
|
|
499
|
+
})),
|
|
500
|
+
sourceSwitchScopes: physicalSourceSwitches,
|
|
501
|
+
semanticDowngradeScopes,
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function pushUniqueFinding(list, finding) {
|
|
506
|
+
if (list.some((entry) => entry?.code === finding.code)) return;
|
|
507
|
+
list.push(finding);
|
|
508
|
+
}
|
|
509
|
+
|
|
319
510
|
function compareScalar(fromValue, toValue) {
|
|
320
511
|
const from = clean(fromValue, 4096) || null;
|
|
321
512
|
const to = clean(toValue, 4096) || null;
|
|
@@ -372,6 +563,7 @@ function countChanges(changes) {
|
|
|
372
563
|
if (changes.integrity.signingKey.changed) count += 1;
|
|
373
564
|
if (changes.integrity.sbomDigest.changed) count += 1;
|
|
374
565
|
if (changes.integrity.sbomDocumentDigest.changed) count += 1;
|
|
566
|
+
if (changes.integrity.semanticPayloadBinding.changed) count += 1;
|
|
375
567
|
if (changes.license.changed) count += 1;
|
|
376
568
|
count +=
|
|
377
569
|
changes.capabilities.added.length + changes.capabilities.removed.length;
|
|
@@ -379,6 +571,7 @@ function countChanges(changes) {
|
|
|
379
571
|
changes.dependencies.added.length +
|
|
380
572
|
changes.dependencies.removed.length +
|
|
381
573
|
changes.dependencies.changed.length;
|
|
574
|
+
if (changes.scopeAuthority?.changed) count += 1;
|
|
382
575
|
return count;
|
|
383
576
|
}
|
|
384
577
|
|