chainlesschain 0.166.83 → 0.166.85
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 +9 -4
- package/package.json +1 -1
- 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/assets/{AIOps-D5a4i3N7.js → AIOps-Cgo7OFpi.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DxsRk5n1.js → ActionButton-lUMnE2Ln.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D-7EvH4S.js → Analytics-CsvKzTot.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DDEWVr-d.js → AppLayout-C2z1h1Pv.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-CAlJAjRB.js → Artifacts-C5Q0ZhNb.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-tuaWDOAM.js → Audit-DXnfPKsI.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CIwRFJ50.js → BackgroundAgents-DjbGcLm3.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CpBepJlH.js → Backup-9bVrKvXE.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-eKguCzQc.js → BaseInput-bx5ri7BD.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CFrUfXDV.js → Chat-CCFmeUMY.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-ClqsIfTT.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-o5FEn6a1.js → Checkbox-ei7MQXe9.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Dih8HogC.js → Codegen-CXgBJ9iu.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D5r-6WZe.js → Col-DMkMsizS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-jeQ6bGey.js → Community-CvpB_UFR.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CEP7QsWp.js → Compact-gay5hbFX.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B8NydOHd.js → Compliance-dG8JQyRL.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bmi1zuPy.js → Cowork-BA3xfaTW.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-BAL9bwSp.js → Cron-D1_HsxyY.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D8WUi2dS.js → Crosschain-DZqoqoy5.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CQCkYcLY.js → DID-Cwnr8hCO.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DogXg6kh.js → Dashboard-CxevypiI.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BJBJyQJn.js → Dropdown-Bs7-yWgr.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CxPWquJx.js → EmailListRenderer-CcEs2Puo.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BijH1x8G.js → EvolutionSettings-C9ipBzAQ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DStwf-00.js → FamilyGuardDashboard-Dt6--mGn.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-LU9_sNxC.js → Federation-CD0JN5FF.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DNfWhj7P.js → FormItemContext-POypz3Xv.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DWYsPjzk.js → GenericCardRenderer-Dv9f-0F5.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CA0O9ulB.js → Git-BbTh5Atv.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-ECShL7BJ.js → Governance-C71dgoir.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-9GA2542e.js → Inference-DwSHxbJB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-nC5mTbEH.js → KnowledgeGraph-Cx1oQYQZ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-B7IqgnDy.js → Logs-BAJWe00o.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CD8a7lHT.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CEr0suM8.js → Marketplace-fwuY7P7Y.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DhTPQKOE.js → McpTools-Di4693uc.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-mHRZP1w4.js → Memory-Cz3L-GUB.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BNfX6Rdo.js → MobileBridge-BuXKIkSb.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bk-lK4Um.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CzkV3wsn.js → Mtc-LnACMFd0.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DWYljJik.js → MtcAudit-BZy7yE0t.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-kHgtvZY_.js → Multisig-BFG5iVrE.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-56uQiPiY.js → NLProgramming-DgXi04vJ.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DxGOZqRf.js → Notes-BAj0Kgg4.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DabaCpmo.js → NotificationSettings-AixrsHw5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-SzeQNlGT.js → OrderTableRenderer-Dwqk3FlG.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D9gnPpK2.js → Organization-UNCBC3ux.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cqp_bXm4.js → Overflow-Drh8oAFT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DTeK-r0G.js → P2P-bc2q0xEB.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CsjG85GT.js → PdhVaultBrowser-BGwKxcDM.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B4ofZq3j.js → Permissions-DOnUxUzu.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-Cvas5cYd.js → PersonalDataHub-B3qPZkrr.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Er3wmAew.js → Pipeline-B6hfa4-i.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DMFYeZox.js → Privacy-Bun3c35F.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DaVaYPy0.js → ProjectInit-CCObdzk9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-dPx5q2Ac.js → ProjectSettings-C6lKrSXY.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-N0JNeCui.js → Projects-DYcta7MZ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BPQo_gQa.js → Providers-BtykxKCe.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CD-sEsWh.js → QrScannerModal-D9CDyroY.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-LOKRJiN_.js → QuickAsk-CJauCxXx.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BwPXqcWy.js → Recommend-BbiYZofR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BjotndxF.js → RemoteSession-BymCrgFW.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BlZ2gcbU.js → Reputation-BWrGpMpF.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D399HM-d.js → Row-9pOYIhiW.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C7H-ibnY.js → RssFeed-D3bQJ4qB.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CNHCVmM1.js → Search-BpKOOFE0.js} +1 -1
- package/src/assets/web-panel/assets/{Security-C70eDGYY.js → Security-DC6C0NSz.js} +4 -4
- package/src/assets/web-panel/assets/{Services-6xfq9G-H.js → Services-Lkf1046J.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BbY2zeZV.js → Skeleton-eCQ_SsDb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DYtyZ7_6.js → Skills-BvDSQ3-d.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CkWcl5OH.js → Sla-BQbKy8XJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CiknYk2P.js → SpeechSettings-DHsRx-XA.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D-8JVip4.js → SyncSettings-CC281X_J.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-B2KnR9XC.js → Tasks-CHHSWHom.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CipXkOE-.js → Templates-Cr2vC0tg.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DbwgIMmx.js → Tenant-DeYO5pIG.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-OtCriHEE.js → Terminal-DBNgbfPr.js} +2 -2
- package/src/assets/web-panel/assets/TimelineRenderer-MoxgaF3x.js +1 -0
- package/src/assets/web-panel/assets/{Tokens-B4iFVxvH.js → Tokens-CT2QfAN7.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BegM2v8q.js → Trigger-DPUnomxs.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-COkqnnFj.js → Trust-DnufuaTx.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BzqKPChj.js → UkeySign-CJ6iOdPs.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D-F2XL3C.js → VideoEditing-xBWkH8bL.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-22PzRY9T.js → Wallet-WYV-4hMR.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-eSMq_qtz.js → WebAuthn-DJ5Mhd9L.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BvdAakpq.js → WorkflowEditor-B__UdOjN.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C6jhpF7E.js → chat-CLlmBVhp.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BbbW2Pfv.js → colors-B8zoPQYm.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CVFeLTqt.js → compact-item-CvJ-dUsH.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DS0m7NZc.js → createContext-LAtMm8SC.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DgZ4fdGI.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DVouP0t6.js → hasIn-CLYvg42H.js} +1 -1
- package/src/assets/web-panel/assets/{index-Be12HoCS.js → index-09YzRb6Z.js} +3 -3
- package/src/assets/web-panel/assets/{index-CPS8E-J6.js → index-4rr5jFOL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXw6ivB8.js → index-B02qgCao.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaUah6TO.js → index-B1hHp9_M.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ds4wbrgk.js → index-B6zlMzZz.js} +1 -1
- package/src/assets/web-panel/assets/{index-JeJqXbUU.js → index-BCzyJ1xS.js} +1 -1
- package/src/assets/web-panel/assets/{index-54aHB4FL.js → index-BGrQ2uEl.js} +1 -1
- package/src/assets/web-panel/assets/{index-eaXEQFuP.js → index-BM2HqHdT.js} +1 -1
- package/src/assets/web-panel/assets/{index-C74emdKD.js → index-BUVrYDNV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrIv7C9a.js → index-B_RPWP_5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGYX17YW.js → index-BkcQJvsz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DotRL126.js → index-Bu7-I2L4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvCgzl0X.js → index-C2KFnUsv.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4xmLgLa.js → index-C3uD5H7u.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwozzG6k.js → index-C5v7cEtm.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6q2MkIG.js → index-C6PETyel.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUBkae39.js → index-CUcE6rIa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwZnPiFd.js → index-CVDcRQuX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIk7mg6G.js → index-C_dq-6_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8a_c_qZ.js → index-CnLXLaEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIg4nqyp.js → index-Cpda0SAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhvnNFfd.js → index-Cv7vwX3z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpTbnbUI.js → index-CxJ4NPVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzL3LWFX.js → index-D0Z13xcZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BE_u-rXr.js → index-DDm9m4vC.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByLsH9CL.js → index-DHq2Of6z.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOOsA080.js → index-DNQUdPam.js} +1 -1
- package/src/assets/web-panel/assets/{index-SdFkCtiC.js → index-DX0aHEHL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw-ZGQCH.js → index-DX99e8Xy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkdYB0_g.js → index-DYW4Z3y-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuVjTDcW.js → index-DfOOACfd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpReoAGb.js → index-Di9vKira.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwYFDMn_.js → index-DpeV-6y4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DR6TDz5H.js → index-GR3omApz.js} +1 -1
- package/src/assets/web-panel/assets/{index--AdzSlH7.js → index-f1ptYBMr.js} +1 -1
- package/src/assets/web-panel/assets/{index-8QbwhE3i.js → index-iJ6s24bA.js} +1 -1
- package/src/assets/web-panel/assets/index-jLEdASOV.js +1 -0
- package/src/assets/web-panel/assets/index-jesGo4rl.js +1 -0
- package/src/assets/web-panel/assets/{index-B5JRIZXi.js → index-oX216HRH.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CB5cUnQ5.js → initDefaultProps-QD-koeaw.js} +1 -1
- package/src/assets/web-panel/assets/{motion-bn_fWhQV.js → motion-CTItLW4-.js} +1 -1
- package/src/assets/web-panel/assets/{move-DY4-Odtu.js → move-CGsdTOdN.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B5l5mjoh.js → mtc-parser-C1kW_CNU.js} +1 -1
- package/src/assets/web-panel/assets/{omit-rJ-Ci8CW.js → omit-B4PilaYy.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BMwGJd6C.js → pickAttrs-DBGUE12e.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CaiQyGXG.js → placementArrow-DZxCLjuo.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DQTO5wDH.js → responsiveObserve-CZjQiocN.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dg6ZDtbz.js → slide-Btz5hh2_.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-bvjrktKc.js → statusUtils-CfuxuLIt.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-C1geIU_x.js → styleChecker-DdO0Obo_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BzU3RJRi.js → useFlexGapSupport-CxftJ-Zs.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B7l6OwLe.js → useFs-pVJChh6K.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BYF1L_8x.js → usePersonalDataHub-wv7Q0uNE.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-6c2GVkT-.js → vnode-DVOVfAqC.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BYAY6QeD.js → zoom-B5tebZuT.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/permissions.js +27 -2
- package/src/data/changelog.json +26 -0
- package/src/lib/background-interaction-resolver.js +4 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +68 -15
- package/src/lib/packer/pack-update-applier.js +28 -9
- package/src/lib/packer/pkg-config-generator.js +119 -2
- package/src/lib/packer/pkg-runner.js +7 -0
- package/src/lib/packer/pkg-targets.js +83 -0
- package/src/lib/packer/web-panel-builder.js +7 -0
- package/src/lib/permission-authority.js +56 -7
- package/src/lib/process-execution-broker/index.js +11 -0
- package/src/lib/process-execution-broker/linux-subreaper-helper.js +87 -13
- package/src/lib/process-execution-broker/packer-build-policy.js +31 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +11 -3
- package/src/lib/scoped-permission-store.js +241 -121
- package/src/lib/settings-authority-domain.cjs +966 -0
- package/src/lib/settings-authority-record.cjs +701 -0
- package/src/lib/settings-loader.cjs +45 -8
- package/src/lib/settings-source-observation.cjs +8 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DaRtY87l.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BqlqrJkY.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-8zG8f5li.js +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-B9LU5qrl.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D50gzPS9.js +0 -1
- package/src/assets/web-panel/assets/index-CgensV-n.js +0 -1
- package/src/assets/web-panel/assets/index-Ctkf06Z_.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as v}from"./index-
|
|
1
|
+
import{u as v}from"./index-09YzRb6Z.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-09YzRb6Z.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-09YzRb6Z.js";import{i as f}from"./motion-CTItLW4-.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-09YzRb6Z.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
|
@@ -29,6 +29,23 @@ const KIND_COLOR = {
|
|
|
29
29
|
const RUNTIME_ADVISORY =
|
|
30
30
|
"permission rules are enforced by Agent Core; scoped rules are refreshed before every tool call, while managed host policy and ApprovalGate still apply.";
|
|
31
31
|
|
|
32
|
+
const SETTINGS_SOURCE_ERROR_CODES = new Set([
|
|
33
|
+
"CC_SETTINGS_SOURCE_INVALID",
|
|
34
|
+
"CC_SETTINGS_SOURCE_UNAVAILABLE",
|
|
35
|
+
"CC_SETTINGS_SOURCE_TOO_LARGE",
|
|
36
|
+
"CC_SETTINGS_SOURCE_UNSAFE",
|
|
37
|
+
"CC_SETTINGS_SOURCE_CHANGED",
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
function formatAuthorityReadError(error) {
|
|
41
|
+
if (SETTINGS_SOURCE_ERROR_CODES.has(error?.code)) {
|
|
42
|
+
// Source failures can retain parser or filesystem details in their cause.
|
|
43
|
+
// Expose only the stable category and the reader's generic diagnosis.
|
|
44
|
+
return `[${error.code}] Settings source observation is unavailable`;
|
|
45
|
+
}
|
|
46
|
+
return error.message;
|
|
47
|
+
}
|
|
48
|
+
|
|
32
49
|
const DURATION_UNITS = Object.freeze({
|
|
33
50
|
s: 1000,
|
|
34
51
|
m: 60 * 1000,
|
|
@@ -244,7 +261,11 @@ export function registerPermissionsCommand(program) {
|
|
|
244
261
|
logger.log(chalk.dim(` authority: ${scoped.file}`));
|
|
245
262
|
}
|
|
246
263
|
} catch (err) {
|
|
247
|
-
logger.error(
|
|
264
|
+
logger.error(
|
|
265
|
+
chalk.red(
|
|
266
|
+
`permissions list failed: ${formatAuthorityReadError(err)}`,
|
|
267
|
+
),
|
|
268
|
+
);
|
|
248
269
|
process.exitCode = 1;
|
|
249
270
|
}
|
|
250
271
|
});
|
|
@@ -446,7 +467,11 @@ export function registerPermissionsCommand(program) {
|
|
|
446
467
|
);
|
|
447
468
|
}
|
|
448
469
|
} catch (err) {
|
|
449
|
-
logger.error(
|
|
470
|
+
logger.error(
|
|
471
|
+
chalk.red(
|
|
472
|
+
`permissions test failed: ${formatAuthorityReadError(err)}`,
|
|
473
|
+
),
|
|
474
|
+
);
|
|
450
475
|
process.exitCode = 1;
|
|
451
476
|
}
|
|
452
477
|
});
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.166.85",
|
|
7
|
+
"cliVersions": ["0.166.85"],
|
|
8
|
+
"date": null,
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Fixed - cc CLI 0.166.85: preserve durable state at capacity and revision limits",
|
|
13
|
+
"body": "- Reject oversized memory commits and reconciliation before replacing durable\n data; bound reads even if the backing file grows during the read.\n- Refuse exhausted memory and scoped permission revisions before mutation,\n preserving safe integer identities, idempotent revocation, and stale CAS.\n- Include pending packaged-build, settings observation, and disabled background\n IPC lifetime fixes since the previous CLI release.\n- Pair VS Code `0.37.130` image draft recovery and JetBrains `0.4.147` with this\n CLI only after complete exact-commit CI and public npm verification."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.166.84",
|
|
20
|
+
"cliVersions": ["0.166.84"],
|
|
21
|
+
"date": null,
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Fixed - cc CLI 0.166.84: revoke scoped permissions before durable writes",
|
|
26
|
+
"body": "- Begin synchronous shell revocation before official workspace-scoped permission\n additions or revocations are persisted in the same runtime. Restoring the\n effective rules does not restore an earlier execution permit.\n- Reject reentrant reads and writes during notification, retain fixed storage\n targets, and keep uncertain persistence outcomes unavailable. Duplicate\n revocations preserve the existing bytes and authority revision.\n- Combine settings and scoped permission revisions through the existing shell\n lifecycle; reject stale approvals and late success receipts, close running\n proxies and containers, and remove both subscriptions after completion.\n- Pair VS Code `0.37.126` and JetBrains `0.4.146` with CLI `0.166.84` after\n complete exact-commit CLI and IDE validation. Cross-process notifications and\n arbitrary external edits remain outside this in-process guarantee."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.166.83",
|
|
@@ -265,6 +265,10 @@ export function createBackgroundInteractionClient(options = {}) {
|
|
|
265
265
|
close(reason = "Background interaction channel closed") {
|
|
266
266
|
if (closed) return;
|
|
267
267
|
closed = true;
|
|
268
|
+
// A disabled client never acquired this channel. It may belong to an
|
|
269
|
+
// embedding host (including a test runner), which still needs it alive
|
|
270
|
+
// to finish its own IPC protocol after this headless invocation returns.
|
|
271
|
+
if (!enabled) return;
|
|
268
272
|
removeMessageListener();
|
|
269
273
|
for (const entry of [...pending.values()]) {
|
|
270
274
|
settle(
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
closeSync,
|
|
3
|
+
constants,
|
|
3
4
|
existsSync,
|
|
5
|
+
fstatSync,
|
|
4
6
|
fsyncSync,
|
|
5
7
|
lstatSync,
|
|
6
8
|
mkdirSync,
|
|
7
9
|
openSync,
|
|
8
|
-
|
|
10
|
+
readSync,
|
|
9
11
|
renameSync,
|
|
10
12
|
rmSync,
|
|
11
13
|
writeFileSync,
|
|
@@ -124,6 +126,55 @@ function initializeState() {
|
|
|
124
126
|
return state;
|
|
125
127
|
}
|
|
126
128
|
|
|
129
|
+
function storeLimit(reason) {
|
|
130
|
+
const error = new Error(`Context/Memory store limit reached: ${reason}`);
|
|
131
|
+
error.code = "CONTEXT_MEMORY_STORE_LIMIT";
|
|
132
|
+
return error;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function advanceRevision(state) {
|
|
136
|
+
if (state.storeRevision >= Number.MAX_SAFE_INTEGER) {
|
|
137
|
+
throw storeLimit("store revision is exhausted");
|
|
138
|
+
}
|
|
139
|
+
state.storeRevision += 1;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function readBoundedState(filePath, maxStoreBytes) {
|
|
143
|
+
const descriptor = openSync(
|
|
144
|
+
filePath,
|
|
145
|
+
constants.O_RDONLY |
|
|
146
|
+
(constants.O_NOFOLLOW || 0) |
|
|
147
|
+
(constants.O_NONBLOCK || 0),
|
|
148
|
+
);
|
|
149
|
+
try {
|
|
150
|
+
const stat = fstatSync(descriptor);
|
|
151
|
+
if (!stat.isFile()) {
|
|
152
|
+
throw corruptStore(filePath, "authority path is not a regular file");
|
|
153
|
+
}
|
|
154
|
+
if (stat.size > maxStoreBytes) {
|
|
155
|
+
throw corruptStore(filePath, "store exceeds its configured byte limit");
|
|
156
|
+
}
|
|
157
|
+
// Bound reads even when a non-cooperating writer grows the opened file.
|
|
158
|
+
// The extra byte distinguishes an exact-limit file from an oversized one.
|
|
159
|
+
const chunks = [];
|
|
160
|
+
let total = 0;
|
|
161
|
+
while (true) {
|
|
162
|
+
const chunk = Buffer.allocUnsafe(
|
|
163
|
+
Math.min(64 * 1024, maxStoreBytes - total + 1),
|
|
164
|
+
);
|
|
165
|
+
const count = readSync(descriptor, chunk, 0, chunk.length, null);
|
|
166
|
+
if (count === 0) return Buffer.concat(chunks, total);
|
|
167
|
+
total += count;
|
|
168
|
+
if (total > maxStoreBytes) {
|
|
169
|
+
throw corruptStore(filePath, "store exceeds its configured byte limit");
|
|
170
|
+
}
|
|
171
|
+
chunks.push(chunk.subarray(0, count));
|
|
172
|
+
}
|
|
173
|
+
} finally {
|
|
174
|
+
closeSync(descriptor);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
127
178
|
function syncDirectory(directory) {
|
|
128
179
|
if (process.platform === "win32") return;
|
|
129
180
|
const descriptor = openSync(directory, "r");
|
|
@@ -134,13 +185,16 @@ function syncDirectory(directory) {
|
|
|
134
185
|
}
|
|
135
186
|
}
|
|
136
187
|
|
|
137
|
-
function writeState(filePath, state) {
|
|
138
|
-
const directory = dirname(filePath);
|
|
139
|
-
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
188
|
+
function writeState(filePath, state, maxStoreBytes) {
|
|
140
189
|
const output = cloneCanonical(state);
|
|
141
190
|
delete output.digest;
|
|
142
191
|
output.digest = stateDigest(output);
|
|
143
192
|
const bytes = `${JSON.stringify(output)}\n`;
|
|
193
|
+
if (Buffer.byteLength(bytes, "utf8") > maxStoreBytes) {
|
|
194
|
+
throw storeLimit("store exceeds its configured byte limit");
|
|
195
|
+
}
|
|
196
|
+
const directory = dirname(filePath);
|
|
197
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
144
198
|
const temporary = join(
|
|
145
199
|
directory,
|
|
146
200
|
`.${filePath.split(/[\\/]/u).at(-1)}.${process.pid}.${randomUUID()}.tmp`,
|
|
@@ -172,6 +226,11 @@ export class DurableJsonMemoryPort {
|
|
|
172
226
|
maxEvents = DEFAULT_MAX_EVENTS,
|
|
173
227
|
lockObserver = null,
|
|
174
228
|
} = {}) {
|
|
229
|
+
for (const [name, value] of Object.entries({ maxStoreBytes, maxEvents })) {
|
|
230
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
231
|
+
throw new TypeError(`${name} must be a positive safe integer`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
175
234
|
this.name = "cli-context-memory-authority";
|
|
176
235
|
this.filePath = filePath;
|
|
177
236
|
this.maxStoreBytes = maxStoreBytes;
|
|
@@ -183,13 +242,7 @@ export class DurableJsonMemoryPort {
|
|
|
183
242
|
_readUnlocked() {
|
|
184
243
|
assertRegularFile(this.filePath);
|
|
185
244
|
if (!existsSync(this.filePath)) return initializeState();
|
|
186
|
-
const bytes =
|
|
187
|
-
if (bytes.length > this.maxStoreBytes) {
|
|
188
|
-
throw corruptStore(
|
|
189
|
-
this.filePath,
|
|
190
|
-
"store exceeds its configured byte limit",
|
|
191
|
-
);
|
|
192
|
-
}
|
|
245
|
+
const bytes = readBoundedState(this.filePath, this.maxStoreBytes);
|
|
193
246
|
try {
|
|
194
247
|
return normalizeState(JSON.parse(bytes.toString("utf8")), this.filePath);
|
|
195
248
|
} catch (error) {
|
|
@@ -278,8 +331,8 @@ export class DurableJsonMemoryPort {
|
|
|
278
331
|
state.reconciliations[reconciliation.requestId] =
|
|
279
332
|
cloneCanonical(reconciliation);
|
|
280
333
|
}
|
|
281
|
-
state
|
|
282
|
-
writeState(this.filePath, state);
|
|
334
|
+
advanceRevision(state);
|
|
335
|
+
writeState(this.filePath, state, this.maxStoreBytes);
|
|
283
336
|
return {
|
|
284
337
|
ok: true,
|
|
285
338
|
revision: normalized.revision,
|
|
@@ -303,8 +356,8 @@ export class DurableJsonMemoryPort {
|
|
|
303
356
|
return this._locked(() => {
|
|
304
357
|
const state = this._readUnlocked();
|
|
305
358
|
state.reconciliations[operation.requestId] = cloneCanonical(operation);
|
|
306
|
-
state
|
|
307
|
-
writeState(this.filePath, state);
|
|
359
|
+
advanceRevision(state);
|
|
360
|
+
writeState(this.filePath, state, this.maxStoreBytes);
|
|
308
361
|
return { ok: true, storeRevision: state.storeRevision };
|
|
309
362
|
});
|
|
310
363
|
}
|
|
@@ -207,7 +207,7 @@ export async function scheduleReplace(ctx = {}) {
|
|
|
207
207
|
: null;
|
|
208
208
|
|
|
209
209
|
if (platform === "win32") {
|
|
210
|
-
return scheduleWindowsTransaction({
|
|
210
|
+
return await scheduleWindowsTransaction({
|
|
211
211
|
operation: "update",
|
|
212
212
|
resolvedNewPath,
|
|
213
213
|
layout,
|
|
@@ -681,7 +681,7 @@ function rollbackFailedPosixUpdate(ctx) {
|
|
|
681
681
|
}
|
|
682
682
|
}
|
|
683
683
|
|
|
684
|
-
function scheduleWindowsTransaction(ctx) {
|
|
684
|
+
async function scheduleWindowsTransaction(ctx) {
|
|
685
685
|
const {
|
|
686
686
|
operation,
|
|
687
687
|
resolvedNewPath,
|
|
@@ -771,26 +771,39 @@ function scheduleWindowsTransaction(ctx) {
|
|
|
771
771
|
|
|
772
772
|
let ready = false;
|
|
773
773
|
let childError = null;
|
|
774
|
+
let childExited = false;
|
|
775
|
+
const onChildExit = () => {
|
|
776
|
+
childExited = true;
|
|
777
|
+
};
|
|
778
|
+
const hasChildFailed = () =>
|
|
779
|
+
Boolean(childError) ||
|
|
780
|
+
childExited ||
|
|
781
|
+
child.exitCode != null ||
|
|
782
|
+
child.signalCode != null;
|
|
774
783
|
if (typeof child.once === "function") {
|
|
775
784
|
// Native spawn failures are normally emitted asynchronously. Attach
|
|
776
|
-
// before
|
|
785
|
+
// before yielding for readiness so both the no-ready and the
|
|
777
786
|
// post-transfer paths always consume the ChildProcess error event.
|
|
778
787
|
child.once("error", (error) => {
|
|
779
788
|
childError = error;
|
|
780
789
|
});
|
|
790
|
+
child.once("exit", onChildExit);
|
|
781
791
|
}
|
|
782
792
|
try {
|
|
783
793
|
ready =
|
|
784
794
|
Boolean(
|
|
785
|
-
waitForReadyImpl({
|
|
795
|
+
await waitForReadyImpl({
|
|
786
796
|
readyPath,
|
|
787
797
|
transactionId,
|
|
788
798
|
timeoutMs: WINDOWS_SIDECAR_READY_TIMEOUT_MS,
|
|
789
799
|
child,
|
|
800
|
+
hasChildFailed,
|
|
790
801
|
}),
|
|
791
|
-
) && !
|
|
802
|
+
) && !hasChildFailed();
|
|
792
803
|
} catch {
|
|
793
804
|
ready = false;
|
|
805
|
+
} finally {
|
|
806
|
+
child.removeListener?.("exit", onChildExit);
|
|
794
807
|
}
|
|
795
808
|
if (!ready) {
|
|
796
809
|
try {
|
|
@@ -1982,7 +1995,7 @@ export async function rollbackLastKnownGood(ctx = {}) {
|
|
|
1982
1995
|
: null;
|
|
1983
1996
|
|
|
1984
1997
|
if (platform === "win32") {
|
|
1985
|
-
const result = scheduleWindowsTransaction({
|
|
1998
|
+
const result = await scheduleWindowsTransaction({
|
|
1986
1999
|
operation: "rescue",
|
|
1987
2000
|
resolvedNewPath: rescueStagingPath,
|
|
1988
2001
|
layout,
|
|
@@ -2752,10 +2765,15 @@ function restartVerifiedExecutable(targetPath, restart, spawnImpl) {
|
|
|
2752
2765
|
}
|
|
2753
2766
|
}
|
|
2754
2767
|
|
|
2755
|
-
function waitForWindowsSidecarReady({
|
|
2768
|
+
async function waitForWindowsSidecarReady({
|
|
2769
|
+
readyPath,
|
|
2770
|
+
transactionId,
|
|
2771
|
+
timeoutMs,
|
|
2772
|
+
hasChildFailed,
|
|
2773
|
+
}) {
|
|
2756
2774
|
const deadline = Date.now() + timeoutMs;
|
|
2757
|
-
const waitCell = new Int32Array(new SharedArrayBuffer(4));
|
|
2758
2775
|
while (Date.now() < deadline) {
|
|
2776
|
+
if (hasChildFailed()) return false;
|
|
2759
2777
|
const stat = lstatOrNull(readyPath);
|
|
2760
2778
|
if (stat) {
|
|
2761
2779
|
try {
|
|
@@ -2769,7 +2787,8 @@ function waitForWindowsSidecarReady({ readyPath, transactionId, timeoutMs }) {
|
|
|
2769
2787
|
return false;
|
|
2770
2788
|
}
|
|
2771
2789
|
}
|
|
2772
|
-
|
|
2790
|
+
// Yield so native spawn errors and early exits can abort the handshake.
|
|
2791
|
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
2773
2792
|
}
|
|
2774
2793
|
return false;
|
|
2775
2794
|
}
|
|
@@ -20,6 +20,104 @@
|
|
|
20
20
|
import fs from "node:fs";
|
|
21
21
|
import { createRequire } from "node:module";
|
|
22
22
|
import path from "node:path";
|
|
23
|
+
import { linuxSubreaperTargetArchitectures } from "./pkg-targets.js";
|
|
24
|
+
import {
|
|
25
|
+
LINUX_SUBREAPER_SOURCE_DIGEST,
|
|
26
|
+
MAX_SUBREAPER_IMAGE_BYTES,
|
|
27
|
+
MAX_SUBREAPER_MANIFEST_BYTES,
|
|
28
|
+
subreaperDigest,
|
|
29
|
+
validateLinuxSubreaperArtifact,
|
|
30
|
+
} from "../process-execution-broker/linux-subreaper-artifact.js";
|
|
31
|
+
|
|
32
|
+
function linuxSubreaperAssets(cliRoot, targets) {
|
|
33
|
+
const architectures = linuxSubreaperTargetArchitectures(targets);
|
|
34
|
+
if (!architectures.length) return [];
|
|
35
|
+
const root = fs.realpathSync(cliRoot);
|
|
36
|
+
const assets = [];
|
|
37
|
+
function read(relative, maximum) {
|
|
38
|
+
const file = path.join(root, relative);
|
|
39
|
+
let directory = path.dirname(file);
|
|
40
|
+
while (directory !== root) {
|
|
41
|
+
const stat = fs.lstatSync(directory);
|
|
42
|
+
if (stat.isSymbolicLink() || !stat.isDirectory())
|
|
43
|
+
throw new Error("Invalid standalone Linux helper directory");
|
|
44
|
+
directory = path.dirname(directory);
|
|
45
|
+
}
|
|
46
|
+
const before = fs.lstatSync(file, { bigint: true });
|
|
47
|
+
if (
|
|
48
|
+
!before.isFile() ||
|
|
49
|
+
before.isSymbolicLink() ||
|
|
50
|
+
before.nlink !== 1n ||
|
|
51
|
+
before.size < 1n ||
|
|
52
|
+
before.size > BigInt(maximum)
|
|
53
|
+
)
|
|
54
|
+
throw new Error("Invalid standalone Linux helper asset");
|
|
55
|
+
const fd = fs.openSync(
|
|
56
|
+
file,
|
|
57
|
+
fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0),
|
|
58
|
+
);
|
|
59
|
+
try {
|
|
60
|
+
const opened = fs.fstatSync(fd, { bigint: true });
|
|
61
|
+
if (
|
|
62
|
+
opened.dev !== before.dev ||
|
|
63
|
+
opened.ino !== before.ino ||
|
|
64
|
+
opened.size !== before.size
|
|
65
|
+
)
|
|
66
|
+
throw new Error("Standalone Linux helper asset changed");
|
|
67
|
+
const bytes = Buffer.alloc(Number(opened.size));
|
|
68
|
+
let offset = 0;
|
|
69
|
+
while (offset < bytes.length) {
|
|
70
|
+
const count = fs.readSync(
|
|
71
|
+
fd,
|
|
72
|
+
bytes,
|
|
73
|
+
offset,
|
|
74
|
+
bytes.length - offset,
|
|
75
|
+
offset,
|
|
76
|
+
);
|
|
77
|
+
if (count <= 0) throw new Error("Short standalone Linux helper asset");
|
|
78
|
+
offset += count;
|
|
79
|
+
}
|
|
80
|
+
const after = fs.fstatSync(fd, { bigint: true });
|
|
81
|
+
if (
|
|
82
|
+
after.size !== before.size ||
|
|
83
|
+
after.mtimeNs !== before.mtimeNs ||
|
|
84
|
+
after.ctimeNs !== before.ctimeNs ||
|
|
85
|
+
after.nlink !== 1n
|
|
86
|
+
)
|
|
87
|
+
throw new Error("Standalone Linux helper asset changed");
|
|
88
|
+
assets.push(file);
|
|
89
|
+
return bytes;
|
|
90
|
+
} finally {
|
|
91
|
+
fs.closeSync(fd);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const source = read(
|
|
96
|
+
"src/lib/process-execution-broker/linux-subreaper-supervisor.c",
|
|
97
|
+
128 * 1024,
|
|
98
|
+
);
|
|
99
|
+
if (
|
|
100
|
+
subreaperDigest(
|
|
101
|
+
Buffer.from(source.toString("utf8").replace(/\r\n/g, "\n")),
|
|
102
|
+
) !== LINUX_SUBREAPER_SOURCE_DIGEST
|
|
103
|
+
)
|
|
104
|
+
throw new Error("Standalone Linux helper source digest mismatch");
|
|
105
|
+
for (const arch of architectures) {
|
|
106
|
+
const directory = `src/assets/linux-subreaper/linux-${arch}`;
|
|
107
|
+
validateLinuxSubreaperArtifact(
|
|
108
|
+
read(`${directory}/manifest.json`, MAX_SUBREAPER_MANIFEST_BYTES),
|
|
109
|
+
read(`${directory}/supervisor`, MAX_SUBREAPER_IMAGE_BYTES),
|
|
110
|
+
{ arch },
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
return assets.map(posixify);
|
|
114
|
+
} catch (cause) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
"Standalone Linux targets require valid precompiled process supervision assets for every target architecture",
|
|
117
|
+
{ cause },
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
23
121
|
|
|
24
122
|
function capsuleBuilderAssets(cliRoot) {
|
|
25
123
|
const requireFromCli = createRequire(path.join(cliRoot, "package.json"));
|
|
@@ -108,6 +206,13 @@ export function generatePkgConfig(ctx) {
|
|
|
108
206
|
updatePublicKey = null,
|
|
109
207
|
} = ctx;
|
|
110
208
|
|
|
209
|
+
// pkg silently turns an empty target list into a host build. Require an
|
|
210
|
+
// explicit target so asset admission and the emitted build cannot diverge.
|
|
211
|
+
if (!Array.isArray(targets) || targets.length === 0)
|
|
212
|
+
throw new Error(
|
|
213
|
+
"Standalone builds require at least one explicit pkg target",
|
|
214
|
+
);
|
|
215
|
+
|
|
111
216
|
const bakedTokenMode =
|
|
112
217
|
typeof runtime.token === "string" ? runtime.token : "auto";
|
|
113
218
|
const bakedHost =
|
|
@@ -432,6 +537,7 @@ export function generatePkgConfig(ctx) {
|
|
|
432
537
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json`,
|
|
433
538
|
`${posixify(cliRoot)}/install/install.ps1`,
|
|
434
539
|
...capsuleBuilderAssets(cliRoot).map(posixify),
|
|
540
|
+
...linuxSubreaperAssets(cliRoot, targets),
|
|
435
541
|
];
|
|
436
542
|
if (prebuildsDir) assets.push(`${posixify(prebuildsDir)}/**/*`);
|
|
437
543
|
// Project mode: bundle the collected .chainlesschain/ snapshot as an asset.
|
|
@@ -450,8 +556,8 @@ export function generatePkgConfig(ctx) {
|
|
|
450
556
|
`${posixify(cliRoot)}/src/**/*.js`,
|
|
451
557
|
`${posixify(cliRoot)}/src/**/*.cjs`,
|
|
452
558
|
`${posixify(cliRoot)}/bin/**/*.js`,
|
|
453
|
-
],
|
|
454
|
-
assets,
|
|
559
|
+
].map((pattern) => pkgRelativePath(pkgConfigDir, pattern)),
|
|
560
|
+
assets: assets.map((pattern) => pkgRelativePath(pkgConfigDir, pattern)),
|
|
455
561
|
targets,
|
|
456
562
|
outputPath: path.dirname(outputPath),
|
|
457
563
|
compress: compress ? "GZip" : "None",
|
|
@@ -476,3 +582,14 @@ export function generatePkgConfig(ctx) {
|
|
|
476
582
|
function posixify(p) {
|
|
477
583
|
return p.replace(/\\/g, "/");
|
|
478
584
|
}
|
|
585
|
+
|
|
586
|
+
function pkgRelativePath(directory, pattern) {
|
|
587
|
+
// pkg's walker joins every pattern to its config directory, even when the
|
|
588
|
+
// pattern is absolute. Emit relative globs so assets are actually embedded.
|
|
589
|
+
const relative = path.relative(directory, pattern);
|
|
590
|
+
if (path.isAbsolute(relative) || path.win32.isAbsolute(relative))
|
|
591
|
+
throw new Error(
|
|
592
|
+
"Standalone build assets and temporary config must be on the same filesystem drive",
|
|
593
|
+
);
|
|
594
|
+
return posixify(relative);
|
|
595
|
+
}
|
|
@@ -16,6 +16,10 @@ import path from "node:path";
|
|
|
16
16
|
import { createRequire } from "node:module";
|
|
17
17
|
import { PackError, EXIT } from "./errors.js";
|
|
18
18
|
import executionBroker from "../process-execution-broker/index.js";
|
|
19
|
+
import {
|
|
20
|
+
createPackerBuildPolicy,
|
|
21
|
+
PACKER_BUILD_TIMEOUT_MS,
|
|
22
|
+
} from "../process-execution-broker/packer-build-policy.js";
|
|
19
23
|
|
|
20
24
|
export const _deps = {
|
|
21
25
|
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
@@ -55,6 +59,9 @@ export function runPkg(ctx) {
|
|
|
55
59
|
origin: "packer:pkg",
|
|
56
60
|
scope: "pack",
|
|
57
61
|
policy: "allow",
|
|
62
|
+
sandboxPolicy: createPackerBuildPolicy("packer:pkg"),
|
|
63
|
+
timeout: PACKER_BUILD_TIMEOUT_MS,
|
|
64
|
+
killSignal: "SIGKILL",
|
|
58
65
|
shell: false,
|
|
59
66
|
cwd: path.dirname(pkgConfigFile),
|
|
60
67
|
stdio: "inherit",
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Only resolve the platform/architecture needed to admit helper assets. Loading
|
|
2
|
+
// pkg's config module also loads pkg-fetch, whose Linux host probe runs ldd at
|
|
3
|
+
// import time. Target admission must remain free of subprocess side effects.
|
|
4
|
+
// Keep these token aliases aligned with the installed pkg parser via the
|
|
5
|
+
// differential tests. Linux, Alpine and linuxstatic need the same static ELF.
|
|
6
|
+
// ARM32 hosts require an explicit supported target architecture: unlike pkg,
|
|
7
|
+
// admission never invokes uname to infer a different ABI from the kernel.
|
|
8
|
+
const PLATFORMS = new Set([
|
|
9
|
+
"alpine",
|
|
10
|
+
"freebsd",
|
|
11
|
+
"linux",
|
|
12
|
+
"linuxstatic",
|
|
13
|
+
"macos",
|
|
14
|
+
"win",
|
|
15
|
+
]);
|
|
16
|
+
const ARCHITECTURES = new Set([
|
|
17
|
+
"x64",
|
|
18
|
+
"x86",
|
|
19
|
+
"armv7",
|
|
20
|
+
"arm64",
|
|
21
|
+
"ppc64",
|
|
22
|
+
"s390x",
|
|
23
|
+
"riscv64",
|
|
24
|
+
"loong64",
|
|
25
|
+
]);
|
|
26
|
+
const PLATFORM_ALIASES = new Map([
|
|
27
|
+
["darwin", "macos"],
|
|
28
|
+
["lin", "linux"],
|
|
29
|
+
["mac", "macos"],
|
|
30
|
+
["osx", "macos"],
|
|
31
|
+
["win32", "win"],
|
|
32
|
+
["windows", "win"],
|
|
33
|
+
]);
|
|
34
|
+
const ARCHITECTURE_ALIASES = new Map([
|
|
35
|
+
["ia32", "x86"],
|
|
36
|
+
["x86_64", "x64"],
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
export function linuxSubreaperTargetArchitectures(
|
|
40
|
+
targets,
|
|
41
|
+
{ platform = process.platform, arch = process.arch } = {},
|
|
42
|
+
) {
|
|
43
|
+
if (
|
|
44
|
+
!Array.isArray(targets) ||
|
|
45
|
+
targets.length === 0 ||
|
|
46
|
+
targets.some(
|
|
47
|
+
(target) =>
|
|
48
|
+
typeof target !== "string" || !target.trim().replace(/-/g, ""),
|
|
49
|
+
)
|
|
50
|
+
) {
|
|
51
|
+
throw new Error("Standalone builds require explicit nonempty pkg targets");
|
|
52
|
+
}
|
|
53
|
+
const architectures = new Set();
|
|
54
|
+
for (const rawTarget of targets) {
|
|
55
|
+
const target = rawTarget.trim();
|
|
56
|
+
let targetPlatform = PLATFORM_ALIASES.get(platform) || platform;
|
|
57
|
+
let targetArch = ARCHITECTURE_ALIASES.get(arch) || arch;
|
|
58
|
+
if (target !== "host") {
|
|
59
|
+
for (const token of target.split("-")) {
|
|
60
|
+
if (!token || token === "latest" || token.startsWith("node")) continue;
|
|
61
|
+
const resolvedPlatform = PLATFORM_ALIASES.get(token) || token;
|
|
62
|
+
if (PLATFORMS.has(resolvedPlatform)) {
|
|
63
|
+
targetPlatform = resolvedPlatform;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const resolvedArch = ARCHITECTURE_ALIASES.get(token) || token;
|
|
67
|
+
if (ARCHITECTURES.has(resolvedArch)) {
|
|
68
|
+
targetArch = resolvedArch;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
throw new Error(`Unknown token '${token}' in '${target}'`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!["linux", "alpine", "linuxstatic"].includes(targetPlatform)) continue;
|
|
75
|
+
if (targetArch !== "x64" && targetArch !== "arm64") {
|
|
76
|
+
throw new Error(
|
|
77
|
+
`Unsupported standalone Linux process supervision architecture: ${targetArch}`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
architectures.add(targetArch);
|
|
81
|
+
}
|
|
82
|
+
return [...architectures];
|
|
83
|
+
}
|