chainlesschain 0.162.188 → 0.162.189
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DbZft8w0.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-DoOZpwfN.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-B0J0KLTW.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-D9eIR0qq.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-BnZXEVeo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-X1ce4Bjn.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-BvWR-y5v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BublSGEd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-CR_77Hso.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-DixW52tq.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CCv1C87K.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-B03Cc3dd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CA06-6pU.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-Bj881J52.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-UZLTPoaL.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-kGwzRb_0.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-KundoYM8.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-BYZyoqDe.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BhrrppBX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-CdC6EguZ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-CcQx3J4y.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-BpijtEzQ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-DfZjeZTe.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-Okdi3pJm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-mH-HebKW.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-xivV69x7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-1rh_YBwg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-eAXkNxdY.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-CS6dMVTN.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-KchHtiHt.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-TabqHW9B.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-CsmGcX5X.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-BaPFnnyz.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-2m-sUUf7.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-D5nVZBRu.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bo8MLZvT.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-3GDvamGa.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-D2zGuZCH.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-BBVQ4t6t.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-BIOCyOGp.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DVwBGpzc.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-BDnHfIfX.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BU2Yqq5H.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D3SRKaa7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-C2B8ahyn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-2iwQzG65.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-69ca_WeR.js → PdhVaultBrowser-CoPiWqMN.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-yV5XNXo5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-uCDJhMUF.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-hN7ucMOA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-CgU0ptN4.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-CfYPiT6j.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-B0A2C4nw.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-BE5C0ajn.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-CstQPf8W.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-Co3z_ynk.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-DMTS6pQ6.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-ETw4odUa.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-BTVqQgKq.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CBKKwwtO.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BHUQ438I.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-B4NqeUsF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-BRjoYG5_.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-CxQzu3p3.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton-BKzwwmWO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-DrsFcgth.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-D21tmXCH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-CjyjLfp8.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-Cu45-tnx.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-oMcILYOj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-Bh-Zcr5R.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-68ns63aI.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BLJkFykE.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-xcrJLq-O.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-C6PpFJtf.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-BaKA7tdM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-BzhA57Jc.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-4_U3JkIR.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-162AANxX.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-B1viuql_.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-ZVWazhCy.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-tzdyUk-1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-DmrHNuwq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-DAJ_M-PK.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-uIzmYwLs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-D_ZmuLwb.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-CDt_shTL.js} +1 -1
- package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-BAvSmJXW.js} +1 -1
- package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-BDF6EQBs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-BHvlm0In.js} +1 -1
- package/src/assets/web-panel/assets/{index-COG61sRv.js → index-BRa4kJ_S.js} +1 -1
- package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-BTCXf1t-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Bbxjfstq.js} +1 -1
- package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-Bx4d6c1k.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-ByzGvpR9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-C16fYKFD.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-C5WcdJH2.js} +3 -3
- package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-CG0lY4h3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-CKyd472S.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-CaelyMgF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CbD_WW_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-CcZ9xJI9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CeUpKjvi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-Cvak6Oe2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-CzXqvMuP.js} +1 -1
- package/src/assets/web-panel/assets/index-D-Swwqld.js +1 -0
- package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-D4n1lGTB.js} +1 -1
- package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-D9OE8B3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-DBFmcaCQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-DdUMcwRB.js} +1 -1
- package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-DeGBoLQA.js} +1 -1
- package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-DfSSy9uy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-DqDSF2RW.js} +1 -1
- package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-DvFhhe6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaslYch6.js → index-DwfvPe-j.js} +1 -1
- package/src/assets/web-panel/assets/index-FMZAMKy8.js +1 -0
- package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-FyplHuNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-GcKOHD_c.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-OzTxFIJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-QsgfSZrV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-Z8P4BexE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-clSX4PEc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-ifxmu8SY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-rS3gl_68.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-rXdwUeE3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-saf3VNeP.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-pmfaD-aK.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-CaQ2CpYF.js} +1 -1
- package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-CkKTqNbI.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-Dd4xsgRI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-BFuA5YEs.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-DDfxOAJc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-Be595JCp.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-7byljUM3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-CTWfOTaY.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-CNZOuIxM.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-DwOcBV78.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-CzyQjH9r.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-DVfZiS5N.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-BYme7fbY.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +22 -0
- package/src/commands/checkpoint-managed.js +1059 -0
- package/src/commands/checkpoint.js +3 -0
- package/src/commands/team-distributed.js +3324 -0
- package/src/commands/team.js +1130 -74
- package/src/data/changelog.json +13 -0
- package/src/lib/agent-core.js +1 -0
- package/src/lib/agent-team/task-lease.js +271 -3
- package/src/lib/agent-team/team-adjudication.js +1501 -0
- package/src/lib/agent-team/team-budget.js +4 -1
- package/src/lib/agent-team/team-control-store.js +582 -0
- package/src/lib/agent-team/team-distributed-queue.js +5246 -0
- package/src/lib/agent-team/team-process-checkpoint.js +211 -0
- package/src/lib/agent-team/team-runner.js +319 -22
- package/src/lib/agent-team/team-worktree.js +1403 -95
- package/src/lib/managed-checkpoint-render.js +60 -0
- package/src/lib/managed-tool-checkpoint.js +194 -0
- package/src/lib/process-execution-broker/index.js +438 -5
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
- package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
- package/src/lib/process-execution-broker/workspace-transaction.js +3556 -0
- package/src/lib/secure-file-identity.js +433 -0
- package/src/lib/turn-binding.js +160 -2
- package/src/lib/with-file-lock.js +140 -23
- package/src/repl/agent-repl.js +19 -1
- package/src/runtime/agent-core.js +366 -122
- package/src/runtime/headless-runner.js +12 -0
- package/src/runtime/headless-stream.js +3 -0
- package/src/runtime/policies/agent-policy.js +14 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-COBbEOlj.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-oOVIv9wq.js +0 -5
- package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
- package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
- package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
|
@@ -90,12 +90,14 @@ const OPAQUE_NON_ROOT_FILESYSTEMS = new Set([
|
|
|
90
90
|
const REQUIRED_BWRAP_OPTIONS = [
|
|
91
91
|
"--assert-userns-disabled",
|
|
92
92
|
"--bind-fd",
|
|
93
|
+
"--die-with-parent",
|
|
93
94
|
"--disable-userns",
|
|
94
95
|
"--file",
|
|
95
96
|
"--perms",
|
|
96
97
|
"--remount-ro",
|
|
97
98
|
"--ro-bind-fd",
|
|
98
99
|
"--seccomp",
|
|
100
|
+
"--unshare-pid",
|
|
99
101
|
];
|
|
100
102
|
const SECCOMP_ARCHITECTURES = Object.freeze({
|
|
101
103
|
x64: Object.freeze({
|
|
@@ -127,6 +129,8 @@ const DEFAULT_RUNTIME = Object.freeze({
|
|
|
127
129
|
homedir: () => os.homedir(),
|
|
128
130
|
tmpdir: () => os.tmpdir(),
|
|
129
131
|
randomBytes: (size) => crypto.randomBytes(size),
|
|
132
|
+
sleepSync: (milliseconds) =>
|
|
133
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds),
|
|
130
134
|
spawnSync: nativeSpawnSync,
|
|
131
135
|
});
|
|
132
136
|
|
|
@@ -771,6 +775,12 @@ function createTrustedResources(
|
|
|
771
775
|
if (!/^net:\[\d+\]$/.test(hostNetworkNamespace)) {
|
|
772
776
|
throw new Error("host_network_namespace_identity_unavailable");
|
|
773
777
|
}
|
|
778
|
+
const hostPidNamespace = String(
|
|
779
|
+
runtime.fs.readlinkSync("/proc/self/ns/pid"),
|
|
780
|
+
);
|
|
781
|
+
if (!/^pid:\[\d+\]$/.test(hostPidNamespace)) {
|
|
782
|
+
throw new Error("host_pid_namespace_identity_unavailable");
|
|
783
|
+
}
|
|
774
784
|
|
|
775
785
|
const workspace = openPair(contract.workspaceRoot, {
|
|
776
786
|
directory: true,
|
|
@@ -1245,6 +1255,10 @@ function createTrustedResources(
|
|
|
1245
1255
|
contract.workspaceRoot,
|
|
1246
1256
|
`.chainless-bwrap-probe-${nonce}`,
|
|
1247
1257
|
);
|
|
1258
|
+
const processTreeMarker = path.posix.join(
|
|
1259
|
+
contract.workspaceRoot,
|
|
1260
|
+
`.chainless-bwrap-tree-probe-${nonce}`,
|
|
1261
|
+
);
|
|
1248
1262
|
const outsideMarker = path.posix.join(
|
|
1249
1263
|
runtime.tmpdir(),
|
|
1250
1264
|
`.chainless-bwrap-outside-${nonce}`,
|
|
@@ -1368,10 +1382,16 @@ function createTrustedResources(
|
|
|
1368
1382
|
`test "$(readlink /proc/self/ns/net)" != ${shellQuote(
|
|
1369
1383
|
hostNetworkNamespace,
|
|
1370
1384
|
)}`,
|
|
1385
|
+
`test "$(readlink /proc/self/ns/pid)" != ${shellQuote(
|
|
1386
|
+
hostPidNamespace,
|
|
1387
|
+
)}`,
|
|
1371
1388
|
`printf %s ${shellQuote(nonce)} > ${shellQuote(workspaceMarker)}`,
|
|
1372
1389
|
`test "$(cat ${shellQuote(workspaceMarker)})" = ${shellQuote(nonce)}`,
|
|
1373
1390
|
`rm -f ${shellQuote(workspaceMarker)}`,
|
|
1374
1391
|
socketProbeCommand,
|
|
1392
|
+
`( sleep 0.05; printf late-writer > ${shellQuote(
|
|
1393
|
+
processTreeMarker,
|
|
1394
|
+
)} ) &`,
|
|
1375
1395
|
`printf '%s\\n%s\\n' ${shellQuote(call.policyDigest)} ${shellQuote(
|
|
1376
1396
|
call.contractDigest,
|
|
1377
1397
|
)}`,
|
|
@@ -1392,6 +1412,8 @@ function createTrustedResources(
|
|
|
1392
1412
|
devShmCreated &&
|
|
1393
1413
|
String(runtime.fs.readFileSync(devShmMarker, "utf8")) ===
|
|
1394
1414
|
`host-dev-shm-${nonce}`;
|
|
1415
|
+
runtime.sleepSync(75);
|
|
1416
|
+
const processTreeClosed = !runtime.fs.existsSync(processTreeMarker);
|
|
1395
1417
|
const expectedOutput = `${call.policyDigest}\n${call.contractDigest}\n`;
|
|
1396
1418
|
const runnable =
|
|
1397
1419
|
!result?.error &&
|
|
@@ -1399,7 +1421,8 @@ function createTrustedResources(
|
|
|
1399
1421
|
String(result.stdout) === expectedOutput &&
|
|
1400
1422
|
outsideUnchanged &&
|
|
1401
1423
|
homeUnchanged &&
|
|
1402
|
-
devShmUnchanged
|
|
1424
|
+
devShmUnchanged &&
|
|
1425
|
+
processTreeClosed;
|
|
1403
1426
|
return {
|
|
1404
1427
|
runnable,
|
|
1405
1428
|
policyDigest: runnable ? call.policyDigest : null,
|
|
@@ -1414,6 +1437,9 @@ function createTrustedResources(
|
|
|
1414
1437
|
outsideMarkerHidden: runnable,
|
|
1415
1438
|
networkNamespace: runnable,
|
|
1416
1439
|
networkNamespaceChanged: runnable,
|
|
1440
|
+
pidNamespace: runnable,
|
|
1441
|
+
pidNamespaceChanged: runnable,
|
|
1442
|
+
processTreeCloseProbe: runnable,
|
|
1417
1443
|
socketCreationDenied: runnable,
|
|
1418
1444
|
};
|
|
1419
1445
|
} catch {
|
|
@@ -1421,6 +1447,7 @@ function createTrustedResources(
|
|
|
1421
1447
|
} finally {
|
|
1422
1448
|
for (const marker of [
|
|
1423
1449
|
workspaceMarker,
|
|
1450
|
+
processTreeMarker,
|
|
1424
1451
|
outsideMarker,
|
|
1425
1452
|
homeMarker,
|
|
1426
1453
|
devShmMarker,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module is intentionally independent from platform-sandbox.js so the
|
|
5
5
|
* Broker can adopt it without weakening the narrow Plugin-bin contract. A raw
|
|
6
|
-
* manifest policy can request filesystem/network boundaries, but it cannot
|
|
6
|
+
* manifest policy can request filesystem/network/process-tree boundaries, but it cannot
|
|
7
7
|
* nominate a writable root: only an exact object issued here is accepted, and
|
|
8
8
|
* every contract is single-use.
|
|
9
9
|
*
|
|
@@ -26,7 +26,7 @@ export const LINUX_GENERIC_BWRAP_BACKEND = "linux-bwrap-workspace";
|
|
|
26
26
|
export const LINUX_GENERIC_CONTRACT_KIND = "strict-workspace-command";
|
|
27
27
|
export const LINUX_GENERIC_PTY_LAUNCHER_PATH = "/usr/bin/setsid";
|
|
28
28
|
|
|
29
|
-
const SUPPORTED_BOUNDARIES = new Set(["filesystem", "network"]);
|
|
29
|
+
const SUPPORTED_BOUNDARIES = new Set(["filesystem", "network", "process-tree"]);
|
|
30
30
|
const SYSTEM_RUNTIME_DESTINATIONS = new Set([
|
|
31
31
|
"/usr",
|
|
32
32
|
"/bin",
|
|
@@ -185,7 +185,7 @@ function normalizeBoundaries(boundaries) {
|
|
|
185
185
|
)
|
|
186
186
|
) {
|
|
187
187
|
throw new TypeError(
|
|
188
|
-
"requiredBoundaries may contain only filesystem and
|
|
188
|
+
"requiredBoundaries may contain only filesystem, network, and process-tree",
|
|
189
189
|
);
|
|
190
190
|
}
|
|
191
191
|
return Object.freeze(normalized);
|
|
@@ -1018,6 +1018,13 @@ function policyBinding({
|
|
|
1018
1018
|
namespace: "new",
|
|
1019
1019
|
seccomp: validated.seccomp,
|
|
1020
1020
|
},
|
|
1021
|
+
processTree: {
|
|
1022
|
+
namespace: "new",
|
|
1023
|
+
init: "bubblewrap-pid1-reaper",
|
|
1024
|
+
dieWithParent: true,
|
|
1025
|
+
asPid1: false,
|
|
1026
|
+
closeFence: "pid-namespace-empty-or-killed",
|
|
1027
|
+
},
|
|
1021
1028
|
target: {
|
|
1022
1029
|
requestedCommand: validated.target.requestedCommand,
|
|
1023
1030
|
command: validated.target.resolvedCommand,
|
|
@@ -1199,6 +1206,9 @@ export function planLinuxGenericBubblewrap(
|
|
|
1199
1206
|
probeResult.outsideMarkerHidden !== true ||
|
|
1200
1207
|
probeResult.networkNamespace !== true ||
|
|
1201
1208
|
probeResult.networkNamespaceChanged !== true ||
|
|
1209
|
+
probeResult.pidNamespace !== true ||
|
|
1210
|
+
probeResult.pidNamespaceChanged !== true ||
|
|
1211
|
+
probeResult.processTreeCloseProbe !== true ||
|
|
1202
1212
|
probeResult.socketCreationDenied !== true
|
|
1203
1213
|
) {
|
|
1204
1214
|
return unavailablePlan(
|
|
@@ -1268,7 +1278,7 @@ export function planLinuxGenericBubblewrap(
|
|
|
1268
1278
|
enforcement: LINUX_GENERIC_BWRAP_BACKEND,
|
|
1269
1279
|
backend: LINUX_GENERIC_BWRAP_BACKEND,
|
|
1270
1280
|
candidateBackend: null,
|
|
1271
|
-
guarantees: Object.freeze(["filesystem", "network"]),
|
|
1281
|
+
guarantees: Object.freeze(["filesystem", "network", "process-tree"]),
|
|
1272
1282
|
requiredBoundaries: Object.freeze([...requiredBoundaries]),
|
|
1273
1283
|
policyAttested: true,
|
|
1274
1284
|
policyDigest,
|
|
@@ -1303,6 +1313,12 @@ export function planLinuxGenericBubblewrap(
|
|
|
1303
1313
|
outsideMarkerHidden: true,
|
|
1304
1314
|
networkNamespace: true,
|
|
1305
1315
|
networkNamespaceChanged: true,
|
|
1316
|
+
pidNamespace: true,
|
|
1317
|
+
pidNamespaceChanged: true,
|
|
1318
|
+
processTreeCloseProbe: true,
|
|
1319
|
+
bubblewrapPid1Reaper: true,
|
|
1320
|
+
dieWithParent: true,
|
|
1321
|
+
closeImpliesProcessTreeClosed: true,
|
|
1306
1322
|
socketCreationDenied: true,
|
|
1307
1323
|
descriptorMounts: true,
|
|
1308
1324
|
}),
|
|
@@ -1339,6 +1355,14 @@ export function planLinuxGenericBubblewrap(
|
|
|
1339
1355
|
namespaceIdentityChanged: true,
|
|
1340
1356
|
seccomp: "deny-network-creation",
|
|
1341
1357
|
}),
|
|
1358
|
+
processTreePolicy: Object.freeze({
|
|
1359
|
+
namespace: "new",
|
|
1360
|
+
namespaceIdentityChanged: true,
|
|
1361
|
+
init: "bubblewrap-pid1-reaper",
|
|
1362
|
+
parentDeathSignal: "SIGKILL",
|
|
1363
|
+
asPid1: false,
|
|
1364
|
+
closeFence: "pid-namespace-empty-or-killed",
|
|
1365
|
+
}),
|
|
1342
1366
|
ptyPolicy: issued.pty
|
|
1343
1367
|
? Object.freeze({
|
|
1344
1368
|
mode: "dedicated-controlling-terminal",
|
|
@@ -1113,8 +1113,8 @@ function buildWindowsAdapterInvocation(entry, invocation) {
|
|
|
1113
1113
|
};
|
|
1114
1114
|
}
|
|
1115
1115
|
|
|
1116
|
-
function
|
|
1117
|
-
if (loaderMode !== "powershell-byte-assembly") return
|
|
1116
|
+
function resolveWindowsPowerShellHosts(runtime, loaderMode) {
|
|
1117
|
+
if (loaderMode !== "powershell-byte-assembly") return [];
|
|
1118
1118
|
const windowsDirectory = path.win32.resolve(runtime.windowsDir());
|
|
1119
1119
|
const driveRoot = path.win32.parse(windowsDirectory).root;
|
|
1120
1120
|
const modernHost = runtime.joinPath(
|
|
@@ -1126,13 +1126,14 @@ function resolveWindowsPowerShellHost(runtime, loaderMode) {
|
|
|
1126
1126
|
);
|
|
1127
1127
|
const realpath =
|
|
1128
1128
|
runtime.fs.realpathSync?.native || runtime.fs.realpathSync || null;
|
|
1129
|
+
const hosts = [];
|
|
1129
1130
|
if (runtime.fs.existsSync(modernHost) && typeof realpath === "function") {
|
|
1130
1131
|
try {
|
|
1131
1132
|
if (
|
|
1132
1133
|
windowsCanonicalPathKey(realpath.call(runtime.fs, modernHost)) ===
|
|
1133
1134
|
windowsCanonicalPathKey(modernHost)
|
|
1134
1135
|
) {
|
|
1135
|
-
|
|
1136
|
+
hosts.push(modernHost);
|
|
1136
1137
|
}
|
|
1137
1138
|
} catch {
|
|
1138
1139
|
// Fall through to the protected in-box host.
|
|
@@ -1146,15 +1147,24 @@ function resolveWindowsPowerShellHost(runtime, loaderMode) {
|
|
|
1146
1147
|
"v1.0",
|
|
1147
1148
|
"powershell.exe",
|
|
1148
1149
|
);
|
|
1149
|
-
|
|
1150
|
+
if (runtime.fs.existsSync(inboxHost) && !hosts.includes(inboxHost)) {
|
|
1151
|
+
hosts.push(inboxHost);
|
|
1152
|
+
}
|
|
1153
|
+
return hosts;
|
|
1150
1154
|
}
|
|
1151
1155
|
|
|
1152
1156
|
function createFreshWindowsAdapter(runtime, source, hostEnvironment) {
|
|
1153
1157
|
const materialized = materializeWindowsAdapter(runtime, source);
|
|
1154
1158
|
if (!materialized.assemblyPath) return materialized;
|
|
1155
1159
|
|
|
1156
|
-
const
|
|
1157
|
-
|
|
1160
|
+
const powershellHosts = resolveWindowsPowerShellHosts(
|
|
1161
|
+
runtime,
|
|
1162
|
+
source.loaderMode,
|
|
1163
|
+
);
|
|
1164
|
+
if (
|
|
1165
|
+
source.loaderMode === "powershell-byte-assembly" &&
|
|
1166
|
+
powershellHosts.length === 0
|
|
1167
|
+
) {
|
|
1158
1168
|
const assemblyDeleted = materialized.cleanupAssembly();
|
|
1159
1169
|
return {
|
|
1160
1170
|
reason: assemblyDeleted
|
|
@@ -1188,7 +1198,7 @@ function createFreshWindowsAdapter(runtime, source, hostEnvironment) {
|
|
|
1188
1198
|
sourceDigest: source.sourceDigest,
|
|
1189
1199
|
sourceContractDigest: source.sourceContractDigest,
|
|
1190
1200
|
loaderMode: source.loaderMode,
|
|
1191
|
-
powershellPath:
|
|
1201
|
+
powershellPath: powershellHosts[0] || null,
|
|
1192
1202
|
adapterDirectory: materialized.adapterDirectory,
|
|
1193
1203
|
assemblyPath: materialized.assemblyPath,
|
|
1194
1204
|
assemblyDigest: attestation.assemblyDigest,
|
|
@@ -1198,69 +1208,76 @@ function createFreshWindowsAdapter(runtime, source, hostEnvironment) {
|
|
|
1198
1208
|
retired: false,
|
|
1199
1209
|
cleaned: false,
|
|
1200
1210
|
};
|
|
1201
|
-
const
|
|
1202
|
-
"
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
const
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1211
|
+
const probeHosts =
|
|
1212
|
+
source.loaderMode === "powershell-byte-assembly" ? powershellHosts : [null];
|
|
1213
|
+
for (const powershellPath of probeHosts) {
|
|
1214
|
+
entry.powershellPath = powershellPath;
|
|
1215
|
+
const probePayload = materializeWindowsAdapterInvocation(runtime, [
|
|
1216
|
+
"--probe-helper",
|
|
1217
|
+
]);
|
|
1218
|
+
if (!probePayload.payloadPath) {
|
|
1219
|
+
const assemblyDeleted = materialized.cleanupAssembly();
|
|
1220
|
+
return assemblyDeleted
|
|
1221
|
+
? probePayload
|
|
1222
|
+
: { reason: "windows_native_adapter_compile_cleanup_unverified" };
|
|
1223
|
+
}
|
|
1224
|
+
const probeInvocation = buildWindowsAdapterInvocation(entry, probePayload);
|
|
1225
|
+
let probeResult;
|
|
1226
|
+
let probePayloadDeleted = false;
|
|
1227
|
+
try {
|
|
1228
|
+
probeResult = runtime.spawnSync(
|
|
1229
|
+
probeInvocation.command,
|
|
1230
|
+
probeInvocation.args,
|
|
1231
|
+
{
|
|
1232
|
+
shell: false,
|
|
1233
|
+
windowsHide: true,
|
|
1234
|
+
encoding: "utf8",
|
|
1235
|
+
timeout: WINDOWS_SANDBOX_HELPER_OPERATION_TIMEOUT_MS,
|
|
1236
|
+
cwd: runtime.joinPath(runtime.windowsDir(), "System32"),
|
|
1237
|
+
env: hostEnvironment,
|
|
1238
|
+
},
|
|
1239
|
+
);
|
|
1240
|
+
} catch (error) {
|
|
1241
|
+
probeResult = { error, status: null };
|
|
1242
|
+
} finally {
|
|
1243
|
+
probePayloadDeleted = probeInvocation.cleanup();
|
|
1244
|
+
}
|
|
1245
|
+
if (!probePayloadDeleted) {
|
|
1246
|
+
materialized.cleanupAssembly();
|
|
1247
|
+
return {
|
|
1248
|
+
reason: "windows_native_adapter_compile_cleanup_unverified",
|
|
1249
|
+
};
|
|
1250
|
+
}
|
|
1251
|
+
let probeReady = false;
|
|
1252
|
+
try {
|
|
1253
|
+
const probe = JSON.parse(String(probeResult?.stdout || "").trim());
|
|
1254
|
+
probeReady =
|
|
1255
|
+
probeResult?.status === 0 &&
|
|
1256
|
+
probe?.ready === true &&
|
|
1257
|
+
probe?.hostRuntime ===
|
|
1258
|
+
(source.loaderMode === "managed-executable"
|
|
1259
|
+
? "managed-executable-v1"
|
|
1260
|
+
: "powershell-byte-assembly-v1") &&
|
|
1261
|
+
(source.sourceContractDigest === null ||
|
|
1262
|
+
probe?.sourceSha256 === source.sourceContractDigest);
|
|
1263
|
+
} catch {
|
|
1264
|
+
probeReady = false;
|
|
1265
|
+
}
|
|
1266
|
+
if (!probeReady) continue;
|
|
1267
|
+
if (!verifyWindowsAdapterEntry(entry, runtime, source)) break;
|
|
1268
|
+
|
|
1269
|
+
windowsAdapterCacheEntries.add(entry);
|
|
1270
|
+
windowsAdapterCache = entry;
|
|
1271
|
+
registerWindowsAdapterExitCleanup();
|
|
1272
|
+
return { entry };
|
|
1258
1273
|
}
|
|
1259
1274
|
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1275
|
+
const assemblyDeleted = materialized.cleanupAssembly();
|
|
1276
|
+
return {
|
|
1277
|
+
reason: assemblyDeleted
|
|
1278
|
+
? "windows_in_memory_adapter_probe_failed"
|
|
1279
|
+
: "windows_native_adapter_compile_cleanup_unverified",
|
|
1280
|
+
};
|
|
1264
1281
|
}
|
|
1265
1282
|
|
|
1266
1283
|
function acquireWindowsAdapterLease(runtime, source, hostEnvironment) {
|
|
@@ -5418,7 +5435,8 @@ export function applyLinuxSandbox(
|
|
|
5418
5435
|
const requiresStrongLinuxBoundary = requiredBoundaries.some(
|
|
5419
5436
|
(boundary) =>
|
|
5420
5437
|
boundary === SANDBOX_BOUNDARIES.FILESYSTEM ||
|
|
5421
|
-
boundary === SANDBOX_BOUNDARIES.NETWORK
|
|
5438
|
+
boundary === SANDBOX_BOUNDARIES.NETWORK ||
|
|
5439
|
+
boundary === SANDBOX_BOUNDARIES.PROCESS_TREE,
|
|
5422
5440
|
);
|
|
5423
5441
|
|
|
5424
5442
|
if (requiresStrongLinuxBoundary) {
|
|
@@ -6116,7 +6134,11 @@ export function applyLinuxSandbox(
|
|
|
6116
6134
|
policyDigest,
|
|
6117
6135
|
runtimeProbe,
|
|
6118
6136
|
reason: null,
|
|
6119
|
-
guarantees: [
|
|
6137
|
+
guarantees: [
|
|
6138
|
+
SANDBOX_BOUNDARIES.FILESYSTEM,
|
|
6139
|
+
SANDBOX_BOUNDARIES.NETWORK,
|
|
6140
|
+
SANDBOX_BOUNDARIES.PROCESS_TREE,
|
|
6141
|
+
],
|
|
6120
6142
|
command: finalLaunch.command,
|
|
6121
6143
|
args: [...policyArgs, "--", ...targetArgs],
|
|
6122
6144
|
options,
|
|
Binary file
|
|
Binary file
|