chainlesschain 0.166.130 → 0.166.131
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 +20 -4
- package/package.json +2 -2
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-CHItp4vg.js +1 -0
- package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
- package/src/assets/web-panel/assets/{ActionButton-Dzv1ReHF.js → ActionButton-nhMNWW_d.js} +1 -1
- package/src/assets/web-panel/assets/Analytics-DRc81BBI.js +3 -0
- package/src/assets/web-panel/assets/Analytics-Dr-1kvaM.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-BTBIIl1e.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-CVt7HMkp.js +3 -0
- package/src/assets/web-panel/assets/Artifacts-BuJgG5jf.js +1 -0
- package/src/assets/web-panel/assets/Artifacts-Dohtjyfl.css +1 -0
- package/src/assets/web-panel/assets/Audit-DDnViLtj.css +1 -0
- package/src/assets/web-panel/assets/Audit-msNg0aH-.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-BpcV8yWC.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-CH3Uc9sF.css +1 -0
- package/src/assets/web-panel/assets/Backup-CYh10zO3.css +1 -0
- package/src/assets/web-panel/assets/Backup-P53DADwG.js +1 -0
- package/src/assets/web-panel/assets/BaseInput-DFxT2yWN.js +1 -0
- package/src/assets/web-panel/assets/Chat-B5JvvQJb.css +1 -0
- package/src/assets/web-panel/assets/Chat-BXoHisHW.js +7 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +1 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DMGtSdDx.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-B5uzaLLP.js → Checkbox-B4g_ckJq.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
- package/src/assets/web-panel/assets/Codegen-C6SSSOfp.js +1 -0
- package/src/assets/web-panel/assets/{Col-D3I2kUGu.js → Col-IO1NEUYL.js} +1 -1
- package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
- package/src/assets/web-panel/assets/Community-CdEBl93F.js +1 -0
- package/src/assets/web-panel/assets/{Compact-5GigOmb8.js → Compact-DYs0a9k7.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-BPnk7948.js +1 -0
- package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
- package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
- package/src/assets/web-panel/assets/Cowork-VLOTGbza.js +6 -0
- package/src/assets/web-panel/assets/Cron-_9GgQLJo.js +2 -0
- package/src/assets/web-panel/assets/Crosschain-B21yn0qy.js +1 -0
- package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
- package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
- package/src/assets/web-panel/assets/DID-mBeDgRZ7.js +2 -0
- package/src/assets/web-panel/assets/Dashboard-BckYYzhP.js +3 -0
- package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
- package/src/assets/web-panel/assets/Dropdown-DEedqFiE.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CMs0k9TB.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-B00Qd0fN.js +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-BnQ91YHJ.css +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-DxMTAMa8.js +1 -0
- package/src/assets/web-panel/assets/Federation-B-UZw0LO.js +1 -0
- package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
- package/src/assets/web-panel/assets/FormItemContext-CkafazEw.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-DEUG25ZJ.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +1 -0
- package/src/assets/web-panel/assets/Git-D7dr9oz9.js +2 -0
- package/src/assets/web-panel/assets/{Git-BdHhxBWR.css → Git-DPuaGtg7.css} +1 -1
- package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
- package/src/assets/web-panel/assets/Governance-DKlUJ1wg.js +1 -0
- package/src/assets/web-panel/assets/Inference-BJKqplap.js +1 -0
- package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-B78fB-bz.js +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
- package/src/assets/web-panel/assets/Logs-DJGcHYH_.js +2 -0
- package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-BAxj61I3.css +1 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-DkcG_MxW.js +1 -0
- package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
- package/src/assets/web-panel/assets/Marketplace-ucTbwByD.js +1 -0
- package/src/assets/web-panel/assets/McpTools-Cu1xZYYk.js +2 -0
- package/src/assets/web-panel/assets/McpTools-DSGHWYS_.css +1 -0
- package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
- package/src/assets/web-panel/assets/Memory-DCGpXmi-.js +2 -0
- package/src/assets/web-panel/assets/MobileBridge-BQ-Uwwg7.css +1 -0
- package/src/assets/web-panel/assets/MobileBridge-BnKr0aAS.js +1 -0
- package/src/assets/web-panel/assets/MobileProjects-C5UvYJTP.js +1 -0
- package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
- package/src/assets/web-panel/assets/Mtc-D1UUl4WH.js +6 -0
- package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-D3aa8XP4.js +19 -0
- package/src/assets/web-panel/assets/Multisig-DiXdfJjO.js +7 -0
- package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-DbWABgSE.js +1 -0
- package/src/assets/web-panel/assets/Notes-BP1DPl-R.js +7 -0
- package/src/assets/web-panel/assets/Notes-COE2q2gD.css +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-xaB6ONe7.js +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-D1uNcz3b.js +1 -0
- package/src/assets/web-panel/assets/Organization-BM3Lh8Q8.css +1 -0
- package/src/assets/web-panel/assets/Organization-DMLDGaf1.js +4 -0
- package/src/assets/web-panel/assets/{Overflow-ky9UfGv4.js → Overflow-DH4QPEoI.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-C0w0P4A3.js → OverrideContext-DLR1AtLy.js} +1 -1
- package/src/assets/web-panel/assets/P2P-Bl4OS10o.js +2 -0
- package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9XSE2YI.js +7 -0
- package/src/assets/web-panel/assets/Permissions-CUaPlr6d.js +4 -0
- package/src/assets/web-panel/assets/Permissions-Diejgkbs.css +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-Ba92dZk-.js +3 -0
- package/src/assets/web-panel/assets/PersonalDataHub-C_xhspRy.css +1 -0
- package/src/assets/web-panel/assets/Pipeline-Bh2okm-8.js +1 -0
- package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
- package/src/assets/web-panel/assets/Privacy-Bmq3p4gC.js +1 -0
- package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
- package/src/assets/web-panel/assets/ProjectInit-BPu2fdKR.js +2 -0
- package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +1 -0
- package/src/assets/web-panel/assets/ProjectSettings-D6ABLpmt.js +2 -0
- package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
- package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
- package/src/assets/web-panel/assets/Projects-qWHEve0z.js +1 -0
- package/src/assets/web-panel/assets/Providers-CpAXh_6c.css +1 -0
- package/src/assets/web-panel/assets/Providers-D9DI-2hc.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-er_HkLCI.js → QrScannerModal-CxifoeD5.js} +1 -1
- package/src/assets/web-panel/assets/QrScannerModal-DFrn7rxS.css +1 -0
- package/src/assets/web-panel/assets/QuickAsk-DC1BvwR7.js +1 -0
- package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
- package/src/assets/web-panel/assets/Recommend-CKqbMB5o.js +1 -0
- package/src/assets/web-panel/assets/RemoteSession-BGGzPdS5.js +5 -0
- package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
- package/src/assets/web-panel/assets/Reputation-DH90O9-5.js +1 -0
- package/src/assets/web-panel/assets/Row-h7ovueJc.js +1 -0
- package/src/assets/web-panel/assets/RssFeed-Cze7YLaG.css +1 -0
- package/src/assets/web-panel/assets/RssFeed-DaHxXTZg.js +3 -0
- package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
- package/src/assets/web-panel/assets/Search-Bn6Nqpn4.js +1 -0
- package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
- package/src/assets/web-panel/assets/Security-ClbBmPJi.js +4 -0
- package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
- package/src/assets/web-panel/assets/Services-ChHLQwRn.js +2 -0
- package/src/assets/web-panel/assets/{Skeleton-CrFs6rUL.js → Skeleton-DfN6BFzt.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
- package/src/assets/web-panel/assets/Skills-C926wDev.js +1 -0
- package/src/assets/web-panel/assets/Sla-DJzi1l1M.js +1 -0
- package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-_GSyVjm_.js +1 -0
- package/src/assets/web-panel/assets/SyncSettings-B67xnERe.js +1 -0
- package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BaYZadcG.js +1 -0
- package/src/assets/web-panel/assets/Templates-BsMmCdZI.css +1 -0
- package/src/assets/web-panel/assets/Templates-Bu8kN1Xt.js +1 -0
- package/src/assets/web-panel/assets/Tenant-BM9qufw1.js +1 -0
- package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
- package/src/assets/web-panel/assets/Terminal-MEdd5DjB.js +3 -0
- package/src/assets/web-panel/assets/Terminal-qPp9MaPu.css +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-C27kL2oU.js +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +1 -0
- package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
- package/src/assets/web-panel/assets/Tokens-Cvjd98VC.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-CXrW4Nry.js → Trigger-CLym84HI.js} +1 -1
- package/src/assets/web-panel/assets/Trust-Bv2JTaNN.js +1 -0
- package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
- package/src/assets/web-panel/assets/UkeySign-CSCkNbtm.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-BFDXB4xh.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
- package/src/assets/web-panel/assets/Wallet-CMEFrG_b.js +4 -0
- package/src/assets/web-panel/assets/Wallet-Dw8uV4Ug.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-DKx6xPPl.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-x4eO_Q4y.js +5 -0
- package/src/assets/web-panel/assets/WorkflowEditor-ClWEPgV1.js +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
- package/src/assets/web-panel/assets/{_getTag-DnrRH4E6.js → _getTag-BVc6NQ_K.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BpJsXlTK.js → chat-BdYOI4gM.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-CqM1QOwM.js → collapseMotion-B4IZiILV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CUNg0-fh.js → colors-DcTBrGvS.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C3tFHnhu.js → compact-item-Dn2ktVuj.js} +1 -1
- package/src/assets/web-panel/assets/createContext-XTreuyqp.js +1 -0
- package/src/assets/web-panel/assets/{debounce-CFGTTtN3.js → debounce-D9xTw4Sx.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
- package/src/assets/web-panel/assets/echarts-CDp6K7pj.js +19 -0
- package/src/assets/web-panel/assets/{hasIn-CU6RIciB.js → hasIn-CFRNsYQd.js} +1 -1
- package/src/assets/web-panel/assets/{icons-DG5UD-6K.js → icons-DlxlFL4g.js} +4 -4
- package/src/assets/web-panel/assets/index-3RqDry-K.js +71 -0
- package/src/assets/web-panel/assets/{index-BPWJw4Ji.js → index-8METW_Wr.js} +1 -1
- package/src/assets/web-panel/assets/index-BBd64wj8.js +31 -0
- package/src/assets/web-panel/assets/index-BEyVNbNE.js +3 -0
- package/src/assets/web-panel/assets/index-BMLpP8QQ.js +1 -0
- package/src/assets/web-panel/assets/{index-BzhobTgZ.js → index-BSqydcDa.js} +1 -1
- package/src/assets/web-panel/assets/index-BV6LojRv.js +21 -0
- package/src/assets/web-panel/assets/index-BbMWvjLZ.js +1 -0
- package/src/assets/web-panel/assets/{index-KgR1f2Gq.js → index-Brc0BF-k.js} +2 -2
- package/src/assets/web-panel/assets/{index-D4njcYFw.js → index-CG9YLDmI.js} +1 -1
- package/src/assets/web-panel/assets/{index-6EwPIfXu.js → index-CNHWMMDX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEIoRm_c.js → index-COuEJdmr.js} +3 -3
- package/src/assets/web-panel/assets/{index-BG4zuFf0.js → index-CRW3AWdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOlAutGy.js → index-CUT4h5JB.js} +2 -2
- package/src/assets/web-panel/assets/index-CXMa7Z-S.js +1 -0
- package/src/assets/web-panel/assets/index-CbaPXyNc.js +19 -0
- package/src/assets/web-panel/assets/{index-Cq93VfoF.css → index-CfX1DEtk.css} +1 -1
- package/src/assets/web-panel/assets/{index-X6e0cGRU.js → index-CjHA_Q7s.js} +1 -1
- package/src/assets/web-panel/assets/index-CsnYp4qF.js +1 -0
- package/src/assets/web-panel/assets/index-D45vulkq.js +12 -0
- package/src/assets/web-panel/assets/index-D9kPBEqD.js +55 -0
- package/src/assets/web-panel/assets/index-DDTSgpXz.js +1 -0
- package/src/assets/web-panel/assets/index-DFl_a0n5.js +1 -0
- package/src/assets/web-panel/assets/index-DNdiAymC.js +1 -0
- package/src/assets/web-panel/assets/{index-BJjEAoDb.js → index-DQEu7uW0.js} +1 -1
- package/src/assets/web-panel/assets/index-DW9XncMy.js +21 -0
- package/src/assets/web-panel/assets/index-Daa1yCt_.js +1 -0
- package/src/assets/web-panel/assets/index-DdVpoNEQ.js +12 -0
- package/src/assets/web-panel/assets/index-Dhi4Oybt.js +1 -0
- package/src/assets/web-panel/assets/index-DoVoNjtJ.js +1 -0
- package/src/assets/web-panel/assets/{index-111hR8WZ.js → index-Vo7A4aiN.js} +4 -4
- package/src/assets/web-panel/assets/{index-lo9rgpyj.js → index-XdlYkgCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-1L0tt7G2.js → index-ir2ZwWz5.js} +2 -2
- package/src/assets/web-panel/assets/index-kzyCd8a0.js +3 -0
- package/src/assets/web-panel/assets/{index-CyyhilXV.js → index-lnTt0Jps.js} +2 -2
- package/src/assets/web-panel/assets/{index-CLQjdKmE.js → index-ma-rJkfE.js} +1 -1
- package/src/assets/web-panel/assets/index-oE4jTpHK.js +13 -0
- package/src/assets/web-panel/assets/{index-K2Uqqkr1.js → index-r5sNECM5.js} +1 -1
- package/src/assets/web-panel/assets/index-uT4fRDzU.js +1 -0
- package/src/assets/web-panel/assets/index-xlS8pDS2.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-FI8D7E2x.js → initDefaultProps-mdL0oeZa.js} +1 -1
- package/src/assets/web-panel/assets/{isPlainObject-BWRMT62c.js → isPlainObject-_gz-soRW.js} +1 -1
- package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +1 -0
- package/src/assets/web-panel/assets/motion-ZgVCKcEX.js +11 -0
- package/src/assets/web-panel/assets/{move-Vl1vUReW.js → move-A_28O5T2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-6Cu2aFME.js → mtc-parser-0zlMjabo.js} +1 -1
- package/src/assets/web-panel/assets/{omit-VRKL8iSO.js → omit-DF7mU3yG.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZfWsOe0.js → pickAttrs-Cmt8liJP.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-qmcOUc4W.js → placementArrow-DaMDC57b.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BLB6SsSw.js → responsiveObserve-CHw_f2d3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-41jdYeSH.js → slide-DJS9fFQq.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Yn8OQ5ey.js → statusUtils-Bk3XdZwh.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-4CEwz9Zd.js → styleChecker-DMybAFsA.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-_tbIIFMu.js +1 -0
- package/src/assets/web-panel/assets/{useFs-Bugo8HuF.js → useFs-KPklVptS.js} +1 -1
- package/src/assets/web-panel/assets/{useMergedState-DXbJa_zE.js → useMergedState-d-EXs3xd.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B-q2ElB0.js → usePersonalDataHub-C7FrKDhD.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-BrCfMLMc.js → useRefs-DHeCQehi.js} +1 -1
- package/src/assets/web-panel/assets/{useState-CnxtbLoC.js → useState-Dlgl7fUg.js} +1 -1
- package/src/assets/web-panel/assets/vendor-BXcBOG8b.js +1 -0
- package/src/assets/web-panel/assets/vnode-DB3JBusp.js +1 -0
- package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
- package/src/assets/web-panel/assets/{zoom-DM1y_KKP.js → zoom-C8rAdf81.js} +1 -1
- package/src/assets/web-panel/index.html +4 -4
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +1 -1
- package/src/commands/governed-skill-marketplace.js +24 -10
- package/src/commands/llm.js +4 -3
- package/src/data/changelog.json +14 -1
- package/src/harness/worktree-isolator.js +4 -1
- package/src/lib/compaction-host-provenance.js +24 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +46 -34
- package/src/lib/context-memory-kernel/live-compaction.js +12 -3
- package/src/lib/context-memory-kernel/memory-query-bundle.js +375 -0
- package/src/lib/context-memory-kernel/memory-query-control.js +28 -0
- package/src/lib/context-memory-kernel/memory-service.js +30 -16
- package/src/lib/context-memory-kernel/memory-shard-snapshots.js +63 -0
- package/src/lib/context-memory-kernel/provider-context.js +55 -24
- package/src/lib/context-memory-kernel/segmented-memory-port.js +347 -138
- package/src/lib/cost-budget.js +2 -0
- package/src/lib/ephemeral-worktree-scope.js +24 -0
- package/src/lib/evolution/evolution-deployment-loader.js +6 -4
- package/src/lib/evolution/governed-skill-marketplace-abort.js +14 -0
- package/src/lib/evolution/governed-skill-marketplace-candidate.js +10 -2
- package/src/lib/evolution/governed-skill-marketplace-cli-host.js +47 -20
- package/src/lib/evolution/governed-skill-marketplace.js +47 -24
- package/src/lib/goal-condition-engine.js +20 -3
- package/src/lib/goal-verification-command.js +221 -0
- package/src/lib/goal-verification-plan.js +372 -0
- package/src/lib/llm-connection-probe.js +12 -5
- package/src/lib/llm-onboarding-catalog.json +1 -1
- package/src/lib/llm-pricing.js +34 -8
- package/src/lib/mcp-tool-catalog-authority.js +244 -0
- package/src/lib/model-capabilities.js +6 -0
- package/src/lib/model-catalog-review.js +3 -0
- package/src/lib/model-context-catalog.js +44 -2
- package/src/lib/openai-responses.js +35 -6
- package/src/lib/sub-agent-context.js +12 -4
- package/src/lib/subagent-inheritance.js +162 -2
- package/src/lib/usage-pricing-context.js +34 -17
- package/src/repl/agent-repl.js +34 -2
- package/src/runtime/agent-core.js +199 -9
- package/src/runtime/compaction-host-context.js +72 -0
- package/src/runtime/headless-runner.js +133 -37
- package/src/runtime/headless-stream.js +38 -21
- package/src/runtime/mcp-agent-catalog.js +257 -0
- package/src/runtime/mcp-config.js +18 -69
- package/src/runtime/mcp-tool-search.js +16 -1
- package/src/runtime/system-prompt.js +9 -0
- package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +0 -1
- package/src/assets/web-panel/assets/AIOps-o-rFKEYL.js +0 -1
- package/src/assets/web-panel/assets/Analytics-Bt7H_jrh.js +0 -3
- package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-CgynsRFP.js +0 -9
- package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +0 -1
- package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +0 -1
- package/src/assets/web-panel/assets/Artifacts-gghOGDyE.js +0 -1
- package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +0 -1
- package/src/assets/web-panel/assets/Audit-DBXn-AZ6.js +0 -1
- package/src/assets/web-panel/assets/BackgroundAgents--dxPftKa.js +0 -1
- package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +0 -1
- package/src/assets/web-panel/assets/Backup-D9Zf_2tH.js +0 -1
- package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +0 -1
- package/src/assets/web-panel/assets/BaseInput-DDTOjovq.js +0 -1
- package/src/assets/web-panel/assets/Chat-2ETqdBLn.js +0 -8
- package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DSg2Xs8G.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +0 -1
- package/src/assets/web-panel/assets/Codegen-4ieEEIwt.js +0 -1
- package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +0 -1
- package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +0 -1
- package/src/assets/web-panel/assets/Community-DeYxFMJb.js +0 -1
- package/src/assets/web-panel/assets/Compliance-DLVjbVUh.js +0 -1
- package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +0 -1
- package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +0 -1
- package/src/assets/web-panel/assets/Cowork-DfUKa0T5.js +0 -6
- package/src/assets/web-panel/assets/Cron-_RpktpO5.js +0 -2
- package/src/assets/web-panel/assets/Crosschain-7x6xdbwH.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +0 -1
- package/src/assets/web-panel/assets/DID-DVsYcgvs.css +0 -1
- package/src/assets/web-panel/assets/DID-ccVhToC1.js +0 -2
- package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-DhygcaoK.js +0 -3
- package/src/assets/web-panel/assets/Dropdown-DFplwXK7.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-Bm01soCN.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-C4v--DkD.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-ChQXDBA3.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +0 -1
- package/src/assets/web-panel/assets/Federation-C0yomE-M.js +0 -1
- package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +0 -1
- package/src/assets/web-panel/assets/FormItemContext-DtT3ZEZK.js +0 -2
- package/src/assets/web-panel/assets/GenericCardRenderer-DgITtFRv.js +0 -1
- package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +0 -1
- package/src/assets/web-panel/assets/Git-CCY42R8S.js +0 -2
- package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +0 -1
- package/src/assets/web-panel/assets/Governance-N66Bwvqg.js +0 -1
- package/src/assets/web-panel/assets/Inference-BkbPuR_2.js +0 -1
- package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-B3PibXdA.js +0 -1
- package/src/assets/web-panel/assets/Logs-CUtNB_N6.js +0 -2
- package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-D-V4dOe3.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-DLNJb6Nr.js +0 -1
- package/src/assets/web-panel/assets/McpTools-2zGjJb5K.js +0 -4
- package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +0 -1
- package/src/assets/web-panel/assets/Memory-9rNZ1EvR.js +0 -2
- package/src/assets/web-panel/assets/Memory-CleW_R6V.css +0 -1
- package/src/assets/web-panel/assets/MobileBridge-Cw7sAAgn.js +0 -1
- package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +0 -1
- package/src/assets/web-panel/assets/MobileProjects-8XACrqqy.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +0 -1
- package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +0 -1
- package/src/assets/web-panel/assets/Mtc-mg02JNy-.js +0 -6
- package/src/assets/web-panel/assets/MtcAudit-B1Vkhj2l.js +0 -19
- package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +0 -1
- package/src/assets/web-panel/assets/Multisig-BQEeA7GG.js +0 -13
- package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +0 -1
- package/src/assets/web-panel/assets/NLProgramming-BIbkjZV3.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +0 -1
- package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +0 -1
- package/src/assets/web-panel/assets/Notes-DIwhkZNY.js +0 -7
- package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +0 -1
- package/src/assets/web-panel/assets/NotificationSettings-Cj9175ce.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-IfNpXT2R.js +0 -1
- package/src/assets/web-panel/assets/Organization-DPFp6G9o.js +0 -4
- package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +0 -1
- package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +0 -1
- package/src/assets/web-panel/assets/P2P-tXck8GLq.js +0 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DSvpQl9k.js +0 -7
- package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +0 -1
- package/src/assets/web-panel/assets/Permissions-CKPkdLj-.js +0 -4
- package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-DnqXc12l.js +0 -9
- package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +0 -1
- package/src/assets/web-panel/assets/Pipeline-BKjFU_kd.js +0 -1
- package/src/assets/web-panel/assets/Privacy-ChC-J5Tn.js +0 -1
- package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +0 -1
- package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +0 -1
- package/src/assets/web-panel/assets/ProjectInit-ByFZG9sY.js +0 -2
- package/src/assets/web-panel/assets/ProjectSettings-Bbv1Kiw-.js +0 -2
- package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +0 -1
- package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +0 -1
- package/src/assets/web-panel/assets/Projects-QYyGW31-.js +0 -1
- package/src/assets/web-panel/assets/Providers-C6q_fvea.css +0 -1
- package/src/assets/web-panel/assets/Providers-CJLnWw0r.js +0 -1
- package/src/assets/web-panel/assets/QrScannerModal-NwAHNfiJ.css +0 -1
- package/src/assets/web-panel/assets/QuickAsk-DoXU0np9.js +0 -1
- package/src/assets/web-panel/assets/Recommend-DCo_vuaf.js +0 -1
- package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +0 -1
- package/src/assets/web-panel/assets/RemoteSession-CLuL925Z.js +0 -5
- package/src/assets/web-panel/assets/Reputation-CNNCA_-M.js +0 -1
- package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +0 -1
- package/src/assets/web-panel/assets/Row-Vu4j631i.js +0 -1
- package/src/assets/web-panel/assets/RssFeed-C18B4xiy.js +0 -3
- package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +0 -1
- package/src/assets/web-panel/assets/Search-DxiqccE2.js +0 -1
- package/src/assets/web-panel/assets/Search-Klk29S7C.css +0 -1
- package/src/assets/web-panel/assets/Security-BmrukMHn.css +0 -1
- package/src/assets/web-panel/assets/Security-Droe_hHI.js +0 -4
- package/src/assets/web-panel/assets/Services-CwmmyXzq.js +0 -2
- package/src/assets/web-panel/assets/Services-DAnVNhUG.css +0 -1
- package/src/assets/web-panel/assets/Skills-BUu9owbR.css +0 -1
- package/src/assets/web-panel/assets/Skills-Dp-d2miK.js +0 -1
- package/src/assets/web-panel/assets/Sla-2DFXVbK4.js +0 -1
- package/src/assets/web-panel/assets/Sla-sodqCU4a.css +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-Cdd9lCoy.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-CxQhcYSk.js +0 -2
- package/src/assets/web-panel/assets/Tasks-BHWVRfXx.js +0 -1
- package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +0 -1
- package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +0 -1
- package/src/assets/web-panel/assets/Templates-DNFk3a5_.js +0 -1
- package/src/assets/web-panel/assets/Tenant-B6X6dPo8.js +0 -1
- package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +0 -1
- package/src/assets/web-panel/assets/Terminal-BuUNoLGM.js +0 -3
- package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-DThrBYj8.js +0 -1
- package/src/assets/web-panel/assets/Tokens-CA_u4Blu.js +0 -1
- package/src/assets/web-panel/assets/Tokens-CynVae-o.css +0 -1
- package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +0 -1
- package/src/assets/web-panel/assets/Trust-DHcLpNy3.js +0 -1
- package/src/assets/web-panel/assets/UkeySign-B_fni4C2.js +0 -1
- package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +0 -1
- package/src/assets/web-panel/assets/VideoEditing-g9nf2EhS.js +0 -1
- package/src/assets/web-panel/assets/Wallet-C8pOjIve.js +0 -4
- package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-BaKNjxZt.js +0 -5
- package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-CX030Wb1.js +0 -1
- package/src/assets/web-panel/assets/createContext-B8rTvO61.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B4_IVU_n.js +0 -1
- package/src/assets/web-panel/assets/echarts-C61Vn3mP.js +0 -25
- package/src/assets/web-panel/assets/index--6BUI55w.js +0 -1
- package/src/assets/web-panel/assets/index-5Q1bepcM.js +0 -1
- package/src/assets/web-panel/assets/index-B10Ia2KL.js +0 -21
- package/src/assets/web-panel/assets/index-B1SLBLli.js +0 -3
- package/src/assets/web-panel/assets/index-B8_VQAav.js +0 -1
- package/src/assets/web-panel/assets/index-BMuPJra-.js +0 -1
- package/src/assets/web-panel/assets/index-BOCjph-k.js +0 -12
- package/src/assets/web-panel/assets/index-BpBaOWmV.js +0 -1
- package/src/assets/web-panel/assets/index-CDlHvQtw.js +0 -1
- package/src/assets/web-panel/assets/index-CPF7Vqri.js +0 -55
- package/src/assets/web-panel/assets/index-CPmgKQcl.js +0 -1
- package/src/assets/web-panel/assets/index-CcpMHPWd.js +0 -21
- package/src/assets/web-panel/assets/index-Cyksnofp.js +0 -1
- package/src/assets/web-panel/assets/index-Dc9pcin6.js +0 -1
- package/src/assets/web-panel/assets/index-DfAC55QA.js +0 -19
- package/src/assets/web-panel/assets/index-DgNCfwvg.js +0 -1
- package/src/assets/web-panel/assets/index-DvfhIBNZ.js +0 -1
- package/src/assets/web-panel/assets/index-Hbzd9WeI.js +0 -1
- package/src/assets/web-panel/assets/index-IiS7WoUl.js +0 -13
- package/src/assets/web-panel/assets/index-Xa6TlaD7.js +0 -31
- package/src/assets/web-panel/assets/index-YczWc2_0.js +0 -12
- package/src/assets/web-panel/assets/index-h_ANnbR8.js +0 -3
- package/src/assets/web-panel/assets/index-k7QsBwyo.js +0 -75
- package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +0 -1
- package/src/assets/web-panel/assets/motion-B1hpJYSD.js +0 -11
- package/src/assets/web-panel/assets/useFlexGapSupport-BClv53kR.js +0 -1
- package/src/assets/web-panel/assets/vendor-Bn1JzzAn.js +0 -42
- package/src/assets/web-panel/assets/vnode-ejVeFJ0x.js +0 -1
package/src/lib/cost-budget.js
CHANGED
|
@@ -75,6 +75,8 @@ export class CostBudget {
|
|
|
75
75
|
cacheCreationTokens,
|
|
76
76
|
cacheCreation5mTokens: pricingContext.cacheCreation5mTokens,
|
|
77
77
|
cacheCreation1hTokens: pricingContext.cacheCreation1hTokens,
|
|
78
|
+
cacheCreation30mTokens: pricingContext.cacheCreation30mTokens,
|
|
79
|
+
cacheCreation12hTokens: pricingContext.cacheCreation12hTokens,
|
|
78
80
|
cacheCreationInvalid: pricingContext.cacheCreationInvalid,
|
|
79
81
|
pricingContextInvalid:
|
|
80
82
|
pricingContext.pricingContextInvalid === true ||
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
|
|
3
|
+
const scopes = new AsyncLocalStorage();
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* An ephemeral checkout belongs to its awaited callback. This host scope is a
|
|
7
|
+
* capability restriction, not a process lease: tools that return before their
|
|
8
|
+
* consumers settle must refuse dispatch until they can transfer that ownership.
|
|
9
|
+
* Async descendants retain the restriction even after the callback returns.
|
|
10
|
+
*/
|
|
11
|
+
export function withEphemeralWorktreeScope(worktreePath, callback) {
|
|
12
|
+
return scopes.run(Object.freeze({ worktreePath }), callback);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function ephemeralWorktreeConsumerRefusal(operation) {
|
|
16
|
+
const scope = scopes.getStore();
|
|
17
|
+
if (!scope) return null;
|
|
18
|
+
return {
|
|
19
|
+
error: `${operation} cannot outlive an ephemeral worktree. Run this work in the foreground, or launch it from a persistent checkout with its own lifecycle owner.`,
|
|
20
|
+
code: "CC_EPHEMERAL_WORKTREE_CONSUMER_UNOWNED",
|
|
21
|
+
worktreePath: scope.worktreePath,
|
|
22
|
+
policy: { decision: "deny", via: "ephemeral-worktree-lifetime" },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -8,10 +8,6 @@ import {
|
|
|
8
8
|
assertEvolutionDeploymentRevisionFloor,
|
|
9
9
|
readEvolutionDeploymentProfile,
|
|
10
10
|
} from "./evolution-deployment-profile.js";
|
|
11
|
-
import {
|
|
12
|
-
readEvolutionEnabled,
|
|
13
|
-
resolveEvolutionEnabled,
|
|
14
|
-
} from "./evolution-enabled.js";
|
|
15
11
|
|
|
16
12
|
export const EVOLUTION_DEPLOYMENT_DESCRIPTOR_SCHEMA =
|
|
17
13
|
"chainlesschain.evolution-deployment-descriptor/v1";
|
|
@@ -1038,6 +1034,12 @@ export async function loadEvolutionDeploymentCommandDependencies(
|
|
|
1038
1034
|
} = {},
|
|
1039
1035
|
) {
|
|
1040
1036
|
if (!SUPPORTED_COMMANDS.has(commandName)) return null;
|
|
1037
|
+
// Unsupported commands (including read-only session show) need no deployment
|
|
1038
|
+
// configuration. Loading it eagerly also loads secret-store and the full
|
|
1039
|
+
// process broker/platform sandbox graph before this early return.
|
|
1040
|
+
const { readEvolutionEnabled, resolveEvolutionEnabled } = await import(
|
|
1041
|
+
"./evolution-enabled.js"
|
|
1042
|
+
);
|
|
1041
1043
|
const localModelDependencies = () =>
|
|
1042
1044
|
dependencies(
|
|
1043
1045
|
{
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { raceWithAbort, throwIfAborted } from "../abort-utils.js";
|
|
2
|
+
|
|
3
|
+
// Only race reads/preparation. Durable commits must retain their acknowledgement
|
|
4
|
+
// and recovery path even when the caller interrupts after the append starts.
|
|
5
|
+
export function awaitMarketplaceRead(operation, signal) {
|
|
6
|
+
throwIfAborted(signal);
|
|
7
|
+
return raceWithAbort(
|
|
8
|
+
Promise.resolve().then(() => {
|
|
9
|
+
throwIfAborted(signal);
|
|
10
|
+
return operation();
|
|
11
|
+
}),
|
|
12
|
+
signal,
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { isAbsolute } from "node:path";
|
|
3
3
|
import { types as utilTypes } from "node:util";
|
|
4
|
+
import { throwIfAborted } from "../abort-utils.js";
|
|
5
|
+
import { awaitMarketplaceRead } from "./governed-skill-marketplace-abort.js";
|
|
4
6
|
import {
|
|
5
7
|
SkillCandidateRegistry,
|
|
6
8
|
SKILL_CANDIDATE_MAX_ARTIFACT_BYTES,
|
|
@@ -250,7 +252,8 @@ export function createGovernedSkillMarketplaceCandidateInstaller({
|
|
|
250
252
|
};
|
|
251
253
|
const installer = Object.freeze({
|
|
252
254
|
tenantId,
|
|
253
|
-
async materialize(inspected) {
|
|
255
|
+
async materialize(inspected, { signal } = {}) {
|
|
256
|
+
throwIfAborted(signal);
|
|
254
257
|
const { manifest, adapted, target } = inspected;
|
|
255
258
|
if (manifest.tenantId !== tenantId)
|
|
256
259
|
throw new Error("marketplace candidate tenant mismatch");
|
|
@@ -262,7 +265,11 @@ export function createGovernedSkillMarketplaceCandidateInstaller({
|
|
|
262
265
|
adaptedOutputDigest: adapted.outputDigest,
|
|
263
266
|
sbomDigest: manifest.sbomDigest,
|
|
264
267
|
});
|
|
265
|
-
const resolved = await
|
|
268
|
+
const resolved = await awaitMarketplaceRead(
|
|
269
|
+
() => Reflect.apply(resolve, artifacts, [request, { signal }]),
|
|
270
|
+
signal,
|
|
271
|
+
);
|
|
272
|
+
throwIfAborted(signal);
|
|
266
273
|
const sourceBytes = bytes(
|
|
267
274
|
resolved?.packageBytes,
|
|
268
275
|
request.packageDigest,
|
|
@@ -307,6 +314,7 @@ export function createGovernedSkillMarketplaceCandidateInstaller({
|
|
|
307
314
|
...core,
|
|
308
315
|
bindingDigest: bindingDigest(core),
|
|
309
316
|
});
|
|
317
|
+
throwIfAborted(signal);
|
|
310
318
|
const result = create(candidateInput(candidate));
|
|
311
319
|
if (result.candidate.candidateId !== candidate.candidateId)
|
|
312
320
|
throw new Error(
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { types as utilTypes } from "node:util";
|
|
2
|
+
import { throwIfAborted } from "../abort-utils.js";
|
|
3
|
+
import { awaitMarketplaceRead } from "./governed-skill-marketplace-abort.js";
|
|
2
4
|
import { GovernedSkillMarketplace } from "./governed-skill-marketplace.js";
|
|
3
5
|
import { isGovernedSkillMarketplaceLedgerAdapter } from "./governed-skill-marketplace-ledger-adapter.js";
|
|
4
6
|
import { isGovernedSkillMarketplaceCandidateInstaller } from "./governed-skill-marketplace-candidate.js";
|
|
@@ -105,12 +107,16 @@ export function createGovernedSkillMarketplaceCliHost({
|
|
|
105
107
|
candidateInstaller.verify(state);
|
|
106
108
|
return state;
|
|
107
109
|
};
|
|
108
|
-
const resolveManifest = async (skillName, version) => {
|
|
110
|
+
const resolveManifest = async (skillName, version, { signal } = {}) => {
|
|
111
|
+
throwIfAborted(signal);
|
|
109
112
|
id(skillName, "skillName");
|
|
110
113
|
if (version !== null) id(version, "version");
|
|
111
|
-
const manifest = await
|
|
112
|
-
|
|
114
|
+
const manifest = await awaitMarketplaceRead(
|
|
115
|
+
() =>
|
|
116
|
+
resolve(Object.freeze({ tenantId, skillName, version }), { signal }),
|
|
117
|
+
signal,
|
|
113
118
|
);
|
|
119
|
+
throwIfAborted(signal);
|
|
114
120
|
if (
|
|
115
121
|
manifest?.tenantId !== tenantId ||
|
|
116
122
|
manifest.skillName !== skillName ||
|
|
@@ -217,20 +223,30 @@ export function createGovernedSkillMarketplaceCliHost({
|
|
|
217
223
|
});
|
|
218
224
|
},
|
|
219
225
|
state: ({ skillName } = {}) => stateFor(skillName),
|
|
220
|
-
async install(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
+
async install(
|
|
227
|
+
{
|
|
228
|
+
skillName,
|
|
229
|
+
version = null,
|
|
230
|
+
manifestDigest,
|
|
231
|
+
expectedStateDigest = null,
|
|
232
|
+
} = {},
|
|
233
|
+
{ signal } = {},
|
|
234
|
+
) {
|
|
235
|
+
throwIfAborted(signal);
|
|
226
236
|
digest(manifestDigest, "manifestDigest");
|
|
227
237
|
if (expectedStateDigest !== null)
|
|
228
238
|
digest(expectedStateDigest, "expectedStateDigest");
|
|
229
|
-
const manifest = await resolveManifest(skillName, version);
|
|
239
|
+
const manifest = await resolveManifest(skillName, version, { signal });
|
|
230
240
|
if (manifest.manifestDigest !== manifestDigest)
|
|
231
241
|
throw new Error("marketplace catalog manifest changed; inspect again");
|
|
232
|
-
const inspected = await marketplace.inspect(manifest, target);
|
|
233
|
-
|
|
242
|
+
const inspected = await marketplace.inspect(manifest, target, { signal });
|
|
243
|
+
throwIfAborted(signal);
|
|
244
|
+
if (
|
|
245
|
+
await awaitMarketplaceRead(
|
|
246
|
+
() => isManifestRevoked({ skillName, manifestDigest }),
|
|
247
|
+
signal,
|
|
248
|
+
)
|
|
249
|
+
)
|
|
234
250
|
throw new Error(
|
|
235
251
|
"marketplace manifest was revoked and cannot be staged again",
|
|
236
252
|
);
|
|
@@ -251,7 +267,12 @@ export function createGovernedSkillMarketplaceCliHost({
|
|
|
251
267
|
state,
|
|
252
268
|
});
|
|
253
269
|
};
|
|
254
|
-
|
|
270
|
+
throwIfAborted(signal);
|
|
271
|
+
const current = await awaitMarketplaceRead(
|
|
272
|
+
() => stateFor(skillName),
|
|
273
|
+
signal,
|
|
274
|
+
);
|
|
275
|
+
throwIfAborted(signal);
|
|
255
276
|
if (isReplay(current)) return result(current, true);
|
|
256
277
|
if (
|
|
257
278
|
current?.manifestDigest === manifestDigest &&
|
|
@@ -264,15 +285,21 @@ export function createGovernedSkillMarketplaceCliHost({
|
|
|
264
285
|
);
|
|
265
286
|
if ((current?.stateDigest ?? null) !== expectedStateDigest)
|
|
266
287
|
throw new Error("marketplace install baseline changed");
|
|
267
|
-
const candidateBinding = await candidateInstaller.materialize(inspected
|
|
288
|
+
const candidateBinding = await candidateInstaller.materialize(inspected, {
|
|
289
|
+
signal,
|
|
290
|
+
});
|
|
291
|
+
throwIfAborted(signal);
|
|
268
292
|
try {
|
|
269
293
|
return result(
|
|
270
|
-
await marketplace.stage(
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
294
|
+
await marketplace.stage(
|
|
295
|
+
{
|
|
296
|
+
manifest,
|
|
297
|
+
target,
|
|
298
|
+
expectedStateDigest,
|
|
299
|
+
candidateBinding,
|
|
300
|
+
},
|
|
301
|
+
{ signal },
|
|
302
|
+
),
|
|
276
303
|
false,
|
|
277
304
|
);
|
|
278
305
|
} catch (error) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { types as utilTypes } from "node:util";
|
|
3
|
+
import { throwIfAborted } from "../abort-utils.js";
|
|
4
|
+
import { awaitMarketplaceRead } from "./governed-skill-marketplace-abort.js";
|
|
3
5
|
import { verifyGovernedSkillMarketplaceCandidateBinding } from "./governed-skill-marketplace-candidate.js";
|
|
4
6
|
|
|
5
7
|
import {
|
|
@@ -322,23 +324,33 @@ export class GovernedSkillMarketplace {
|
|
|
322
324
|
this._verifyRevocation = capture(ports, "verifyRevocation");
|
|
323
325
|
}
|
|
324
326
|
|
|
325
|
-
async verifyListing(input, target) {
|
|
327
|
+
async verifyListing(input, target, { signal } = {}) {
|
|
328
|
+
throwIfAborted(signal);
|
|
326
329
|
const manifest = normalizeManifest(input, this.tenantId);
|
|
327
|
-
if (
|
|
330
|
+
if (
|
|
331
|
+
(await awaitMarketplaceRead(
|
|
332
|
+
() => this._verifySignature({ manifest }, { signal }),
|
|
333
|
+
signal,
|
|
334
|
+
)) !== true
|
|
335
|
+
)
|
|
328
336
|
throw new Error("marketplace manifest signature is invalid");
|
|
337
|
+
throwIfAborted(signal);
|
|
329
338
|
const cell = targetCell(manifest, target);
|
|
330
339
|
if (cell.safetyPassed !== true)
|
|
331
340
|
throw new Error("marketplace target safety gate failed");
|
|
332
341
|
return freeze({ manifest, target: clone(target), cell });
|
|
333
342
|
}
|
|
334
343
|
|
|
335
|
-
async inspect(input, target) {
|
|
336
|
-
const { manifest, cell } = await this.verifyListing(input, target
|
|
337
|
-
|
|
338
|
-
manifest,
|
|
339
|
-
target: clone(target),
|
|
340
|
-
cell,
|
|
344
|
+
async inspect(input, target, { signal } = {}) {
|
|
345
|
+
const { manifest, cell } = await this.verifyListing(input, target, {
|
|
346
|
+
signal,
|
|
341
347
|
});
|
|
348
|
+
throwIfAborted(signal);
|
|
349
|
+
const adapted = await awaitMarketplaceRead(
|
|
350
|
+
() => this._adapt({ manifest, target: clone(target), cell }, { signal }),
|
|
351
|
+
signal,
|
|
352
|
+
);
|
|
353
|
+
throwIfAborted(signal);
|
|
342
354
|
if (
|
|
343
355
|
adapted?.authenticated !== true ||
|
|
344
356
|
adapted.manifestDigest !== manifest.manifestDigest ||
|
|
@@ -357,16 +369,22 @@ export class GovernedSkillMarketplace {
|
|
|
357
369
|
});
|
|
358
370
|
}
|
|
359
371
|
|
|
360
|
-
async stage(
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
});
|
|
372
|
+
async stage(
|
|
373
|
+
{
|
|
374
|
+
manifest: input,
|
|
375
|
+
target,
|
|
376
|
+
expectedStateDigest = null,
|
|
377
|
+
candidateBinding = null,
|
|
378
|
+
} = {},
|
|
379
|
+
{ signal } = {},
|
|
380
|
+
) {
|
|
381
|
+
const inspected = await this.inspect(input, target, { signal });
|
|
382
|
+
throwIfAborted(signal);
|
|
383
|
+
const current = await awaitMarketplaceRead(
|
|
384
|
+
() => this._load({ skillName: inspected.manifest.skillName }),
|
|
385
|
+
signal,
|
|
386
|
+
);
|
|
387
|
+
throwIfAborted(signal);
|
|
370
388
|
if ((current?.stateDigest || null) !== expectedStateDigest)
|
|
371
389
|
throw new Error("marketplace install baseline changed");
|
|
372
390
|
const state = {
|
|
@@ -400,6 +418,9 @@ export class GovernedSkillMarketplace {
|
|
|
400
418
|
);
|
|
401
419
|
state.candidateBinding = binding;
|
|
402
420
|
}
|
|
421
|
+
// Once the durable append starts, await its acknowledgement/recovery. An
|
|
422
|
+
// abort cannot truthfully turn a committed state into a cancelled install.
|
|
423
|
+
throwIfAborted(signal);
|
|
403
424
|
return this._persist(state, expectedStateDigest, "marketplace.staged");
|
|
404
425
|
}
|
|
405
426
|
|
|
@@ -629,12 +650,14 @@ export class GovernedSkillMarketplace {
|
|
|
629
650
|
}
|
|
630
651
|
let current = await this._verifiedState(request.skillName);
|
|
631
652
|
const expectedStateDigest = request.dependency.digest;
|
|
632
|
-
if (
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
653
|
+
if (
|
|
654
|
+
!(
|
|
655
|
+
current.revoked === true &&
|
|
656
|
+
current.stage === "rolled-back" &&
|
|
657
|
+
current.revocationBaselineStateDigest === expectedStateDigest &&
|
|
658
|
+
current.revocationPropagationRequestDigest === request.requestDigest
|
|
659
|
+
)
|
|
660
|
+
) {
|
|
638
661
|
if (current.stateDigest !== expectedStateDigest) {
|
|
639
662
|
throw new Error("marketplace revocation dependency baseline changed");
|
|
640
663
|
}
|
|
@@ -81,6 +81,7 @@ export function normalizeGoalBudget(input = {}) {
|
|
|
81
81
|
* file-exists:dist/app.js → met iff the path exists
|
|
82
82
|
* contains:ALL GREEN → met iff the last output contains the text
|
|
83
83
|
* regex:^BUILD OK$ → met iff the last output matches
|
|
84
|
+
* verify:acceptance.json → all frozen host acceptance commands must pass
|
|
84
85
|
* model:the tests pass → a model judges the transcript
|
|
85
86
|
* the tests pass → (bare) model-judged
|
|
86
87
|
*/
|
|
@@ -99,6 +100,9 @@ export function parseGoalCondition(spec) {
|
|
|
99
100
|
case "file":
|
|
100
101
|
if (!rest) throw new Error("file-exists condition needs a path");
|
|
101
102
|
return { kind: "file-exists", path: rest, source: raw };
|
|
103
|
+
case "verify":
|
|
104
|
+
if (!rest) throw new Error("verify condition needs a manifest path");
|
|
105
|
+
return { kind: "verify", path: rest, source: raw };
|
|
102
106
|
case "contains":
|
|
103
107
|
if (!rest) throw new Error("contains condition needs text");
|
|
104
108
|
return { kind: "contains", text: rest, source: raw };
|
|
@@ -387,9 +391,22 @@ export class GoalConditionEngine {
|
|
|
387
391
|
const state = snap?.state;
|
|
388
392
|
if (
|
|
389
393
|
!snap?.condition ||
|
|
390
|
-
![
|
|
391
|
-
|
|
392
|
-
|
|
394
|
+
![
|
|
395
|
+
"model",
|
|
396
|
+
"exit-zero",
|
|
397
|
+
"file-exists",
|
|
398
|
+
"contains",
|
|
399
|
+
"regex",
|
|
400
|
+
"verify",
|
|
401
|
+
].includes(snap.condition.kind) ||
|
|
402
|
+
(snap.condition.kind === "verify" &&
|
|
403
|
+
(typeof snap.condition.path !== "string" ||
|
|
404
|
+
!snap.condition.path.trim() ||
|
|
405
|
+
snap.condition.verification?.schema !==
|
|
406
|
+
"chainlesschain.prepared-goal-verification/v1" ||
|
|
407
|
+
!/^sha256:[a-f0-9]{64}$/u.test(
|
|
408
|
+
snap.condition.verification?.digest || "",
|
|
409
|
+
))) ||
|
|
393
410
|
!state ||
|
|
394
411
|
!Number.isSafeInteger(state.outerTurns) ||
|
|
395
412
|
state.outerTurns < 0 ||
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
3
|
+
import { terminateOwnedProcessTree } from "./process-tree-termination.js";
|
|
4
|
+
import { redactSecrets } from "./secret-scan.js";
|
|
5
|
+
|
|
6
|
+
const MAX_OUTPUT_BYTES = 128 * 1024;
|
|
7
|
+
const RESULT_PREFIX = "CC_GOAL_CHECK_RESULT ";
|
|
8
|
+
export const GOAL_CHECK_RESULT_SCHEMA = "chainlesschain.goal-check-result/v1";
|
|
9
|
+
|
|
10
|
+
function checkReceipt(stdout, check, invocationId) {
|
|
11
|
+
const lines = stdout
|
|
12
|
+
.toString("utf8")
|
|
13
|
+
.split(/\r?\n/u)
|
|
14
|
+
.filter((line) => line.startsWith(RESULT_PREFIX));
|
|
15
|
+
if (lines.length !== 1 || lines[0].length > 16 * 1024) return null;
|
|
16
|
+
try {
|
|
17
|
+
const receipt = JSON.parse(lines[0].slice(RESULT_PREFIX.length));
|
|
18
|
+
if (
|
|
19
|
+
!receipt ||
|
|
20
|
+
typeof receipt !== "object" ||
|
|
21
|
+
Array.isArray(receipt) ||
|
|
22
|
+
Object.keys(receipt).some(
|
|
23
|
+
(key) =>
|
|
24
|
+
!["schema", "checkId", "invocationId", "requirements"].includes(key),
|
|
25
|
+
) ||
|
|
26
|
+
receipt.schema !== GOAL_CHECK_RESULT_SCHEMA ||
|
|
27
|
+
receipt.checkId !== check.id ||
|
|
28
|
+
receipt.invocationId !== invocationId ||
|
|
29
|
+
!Array.isArray(receipt.requirements) ||
|
|
30
|
+
receipt.requirements.length !== check.requirements.length
|
|
31
|
+
)
|
|
32
|
+
return null;
|
|
33
|
+
const ids = new Set();
|
|
34
|
+
for (const entry of receipt.requirements) {
|
|
35
|
+
if (
|
|
36
|
+
!entry ||
|
|
37
|
+
typeof entry !== "object" ||
|
|
38
|
+
Array.isArray(entry) ||
|
|
39
|
+
Object.keys(entry).some((key) => !["id", "passed"].includes(key)) ||
|
|
40
|
+
!check.requirements.includes(entry.id) ||
|
|
41
|
+
ids.has(entry.id) ||
|
|
42
|
+
entry.passed !== true
|
|
43
|
+
)
|
|
44
|
+
return null;
|
|
45
|
+
ids.add(entry.id);
|
|
46
|
+
}
|
|
47
|
+
return receipt;
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function goalVerificationError(message, reason = "error") {
|
|
53
|
+
return Object.assign(new Error(message), {
|
|
54
|
+
code: "CC_GOAL_VERIFICATION_FAILED",
|
|
55
|
+
goalVerificationFailure: true,
|
|
56
|
+
subtype: "error_goal_verification",
|
|
57
|
+
endReason: reason,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function checkGoalVerificationCancellation(signal) {
|
|
62
|
+
if (signal?.aborted)
|
|
63
|
+
throw goalVerificationError("Goal verification was cancelled", "cancelled");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function outputEvidence(bytes, truncated) {
|
|
67
|
+
const text = bytes.toString("utf8");
|
|
68
|
+
const preview =
|
|
69
|
+
text.length <= 4000
|
|
70
|
+
? text
|
|
71
|
+
: `${text.slice(0, 1980)}\n[... truncated ...]\n${text.slice(-1980)}`;
|
|
72
|
+
return {
|
|
73
|
+
bytes: bytes.length,
|
|
74
|
+
digest: `sha256:${createHash("sha256").update(bytes).digest("hex")}`,
|
|
75
|
+
truncated,
|
|
76
|
+
preview: redactSecrets(preview),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Execute a user-selected, frozen acceptance command, never model tool text.
|
|
81
|
+
* Use argv without a shell and wait for the actual close / cleanup fence.
|
|
82
|
+
*/
|
|
83
|
+
export async function runGoalVerificationCommand(
|
|
84
|
+
check,
|
|
85
|
+
{ cwd, signal, timeoutMs } = {},
|
|
86
|
+
) {
|
|
87
|
+
checkGoalVerificationCancellation(signal);
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const startedAt = Date.now();
|
|
90
|
+
const invocationId = randomUUID();
|
|
91
|
+
let child, timer, stopping, stopReason, spawnError;
|
|
92
|
+
let closed = false,
|
|
93
|
+
settled = false,
|
|
94
|
+
exitCode = null,
|
|
95
|
+
exitSignal = null;
|
|
96
|
+
const streams = {
|
|
97
|
+
stdout: { chunks: [], size: 0, truncated: false },
|
|
98
|
+
stderr: { chunks: [], size: 0, truncated: false },
|
|
99
|
+
};
|
|
100
|
+
const finish = (cleanup) => {
|
|
101
|
+
if (settled || (stopping && cleanup === undefined)) return;
|
|
102
|
+
settled = true;
|
|
103
|
+
clearTimeout(timer);
|
|
104
|
+
signal?.removeEventListener("abort", onAbort);
|
|
105
|
+
if (cleanup && !cleanup.confirmed) {
|
|
106
|
+
const error = goalVerificationError(
|
|
107
|
+
"Goal checker process cleanup is unconfirmed; reconcile it before continuing",
|
|
108
|
+
);
|
|
109
|
+
error.cleanup = cleanup;
|
|
110
|
+
error.verification = {
|
|
111
|
+
checkId: check.id,
|
|
112
|
+
status: "cleanup-unconfirmed",
|
|
113
|
+
manualReviewRequired: true,
|
|
114
|
+
cleanup,
|
|
115
|
+
};
|
|
116
|
+
reject(error);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (signal?.aborted || stopReason === "cancelled") {
|
|
120
|
+
reject(
|
|
121
|
+
goalVerificationError("Goal verification was cancelled", "cancelled"),
|
|
122
|
+
);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const stdout = Buffer.concat(streams.stdout.chunks);
|
|
126
|
+
const receipt = checkReceipt(stdout, check, invocationId);
|
|
127
|
+
resolve({
|
|
128
|
+
id: check.id,
|
|
129
|
+
invocationId,
|
|
130
|
+
command: { executable: check.executable, args: check.args },
|
|
131
|
+
exitCode: closed && !spawnError ? exitCode : null,
|
|
132
|
+
signal: exitSignal,
|
|
133
|
+
status:
|
|
134
|
+
stopReason ||
|
|
135
|
+
(spawnError
|
|
136
|
+
? "spawn-failed"
|
|
137
|
+
: exitCode === 0 && !exitSignal
|
|
138
|
+
? receipt
|
|
139
|
+
? "passed"
|
|
140
|
+
: "receipt-invalid"
|
|
141
|
+
: "failed"),
|
|
142
|
+
receipt,
|
|
143
|
+
durationMs: Date.now() - startedAt,
|
|
144
|
+
stdout: outputEvidence(stdout, streams.stdout.truncated),
|
|
145
|
+
stderr: outputEvidence(
|
|
146
|
+
Buffer.concat(streams.stderr.chunks),
|
|
147
|
+
streams.stderr.truncated,
|
|
148
|
+
),
|
|
149
|
+
...(cleanup ? { cleanup } : {}),
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
const stop = (reason) => {
|
|
153
|
+
if (settled || stopping) return;
|
|
154
|
+
stopReason = reason;
|
|
155
|
+
stopping = Promise.resolve().then(() =>
|
|
156
|
+
terminateOwnedProcessTree(child, { alreadyClosed: closed }),
|
|
157
|
+
);
|
|
158
|
+
stopping.then(finish, () => finish({ confirmed: false }));
|
|
159
|
+
};
|
|
160
|
+
const onAbort = () => stop("cancelled");
|
|
161
|
+
try {
|
|
162
|
+
// Acceptance programs do not inherit provider credentials or Node preload
|
|
163
|
+
// hooks. They can read the explicitly selected workspace as ordinary tests.
|
|
164
|
+
const env = Object.fromEntries(
|
|
165
|
+
Object.entries(process.env).filter(([key]) =>
|
|
166
|
+
/^(path|systemroot|windir|temp|tmp|home|userprofile|lang|lc_all)$/i.test(
|
|
167
|
+
key,
|
|
168
|
+
),
|
|
169
|
+
),
|
|
170
|
+
);
|
|
171
|
+
env.CC_GOAL_CHECK_ID = check.id;
|
|
172
|
+
env.CC_GOAL_CHECK_INVOCATION = invocationId;
|
|
173
|
+
child = executionBroker.spawn(
|
|
174
|
+
check.executable === "node" ? process.execPath : check.executable,
|
|
175
|
+
check.args,
|
|
176
|
+
{
|
|
177
|
+
cwd,
|
|
178
|
+
env,
|
|
179
|
+
shell: false,
|
|
180
|
+
windowsHide: true,
|
|
181
|
+
detached: process.platform !== "win32",
|
|
182
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
183
|
+
origin: "headless-goal:verification",
|
|
184
|
+
scope: "headless-goal",
|
|
185
|
+
policy: "allow",
|
|
186
|
+
},
|
|
187
|
+
);
|
|
188
|
+
for (const name of ["stdout", "stderr"])
|
|
189
|
+
child[name]?.on("data", (chunk) => {
|
|
190
|
+
const bytes = Buffer.from(chunk),
|
|
191
|
+
stream = streams[name];
|
|
192
|
+
const remaining = MAX_OUTPUT_BYTES - stream.size;
|
|
193
|
+
if (remaining > 0) {
|
|
194
|
+
const kept = bytes.subarray(0, remaining);
|
|
195
|
+
stream.chunks.push(kept);
|
|
196
|
+
stream.size += kept.length;
|
|
197
|
+
}
|
|
198
|
+
if (bytes.length > remaining) {
|
|
199
|
+
stream.truncated = true;
|
|
200
|
+
stop("output-limit");
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
child.once("error", (error) => {
|
|
204
|
+
spawnError = error;
|
|
205
|
+
});
|
|
206
|
+
child.once("close", (code, childSignal) => {
|
|
207
|
+
closed = true;
|
|
208
|
+
exitCode = code;
|
|
209
|
+
exitSignal = childSignal;
|
|
210
|
+
finish();
|
|
211
|
+
});
|
|
212
|
+
timer = setTimeout(() => stop("timed-out"), timeoutMs);
|
|
213
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
214
|
+
if (signal?.aborted) onAbort();
|
|
215
|
+
} catch (error) {
|
|
216
|
+
spawnError = error;
|
|
217
|
+
if (child?.pid) stop("spawn-failed");
|
|
218
|
+
else finish();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|