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
|
@@ -12,6 +12,10 @@ import fs from "node:fs";
|
|
|
12
12
|
import path from "node:path";
|
|
13
13
|
import { PackError, EXIT } from "./errors.js";
|
|
14
14
|
import executionBroker from "../process-execution-broker/index.js";
|
|
15
|
+
import {
|
|
16
|
+
createPackerBuildPolicy,
|
|
17
|
+
PACKER_BUILD_TIMEOUT_MS,
|
|
18
|
+
} from "../process-execution-broker/packer-build-policy.js";
|
|
15
19
|
|
|
16
20
|
export const _deps = {
|
|
17
21
|
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
@@ -61,6 +65,9 @@ export function ensureWebPanel(ctx) {
|
|
|
61
65
|
origin: "packer:web-panel-build",
|
|
62
66
|
scope: "pack",
|
|
63
67
|
policy: "allow",
|
|
68
|
+
sandboxPolicy: createPackerBuildPolicy("packer:web-panel-build"),
|
|
69
|
+
timeout: PACKER_BUILD_TIMEOUT_MS,
|
|
70
|
+
killSignal: "SIGKILL",
|
|
64
71
|
shell: false,
|
|
65
72
|
cwd: cliRoot,
|
|
66
73
|
stdio: "inherit",
|
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
import settingsLoader from "./settings-loader.cjs";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
ScopedPermissionStore,
|
|
7
|
+
getScopedPermissionRevision,
|
|
8
|
+
subscribeScopedPermissionRevision,
|
|
9
|
+
} from "./scoped-permission-store.js";
|
|
6
10
|
|
|
7
11
|
const {
|
|
8
12
|
applyManagedPermissionPolicy,
|
|
9
|
-
|
|
13
|
+
inspectSettingsSources,
|
|
14
|
+
projectSettingsObservation,
|
|
10
15
|
getSettingsPermissionRevision,
|
|
11
16
|
subscribeSettingsPermissionRevision,
|
|
12
17
|
} = settingsLoader;
|
|
@@ -16,11 +21,41 @@ const settingsAuthority = Object.freeze({
|
|
|
16
21
|
getSnapshot: getSettingsPermissionRevision,
|
|
17
22
|
subscribePolicyRevision: subscribeSettingsPermissionRevision,
|
|
18
23
|
});
|
|
24
|
+
let combinedSnapshot = null;
|
|
25
|
+
function getCombinedSnapshot() {
|
|
26
|
+
const settings = getSettingsPermissionRevision();
|
|
27
|
+
const scoped = getScopedPermissionRevision();
|
|
28
|
+
if (
|
|
29
|
+
combinedSnapshot?.settings !== settings ||
|
|
30
|
+
combinedSnapshot?.scoped !== scoped
|
|
31
|
+
) {
|
|
32
|
+
combinedSnapshot = Object.freeze({ settings, scoped });
|
|
33
|
+
}
|
|
34
|
+
return combinedSnapshot;
|
|
35
|
+
}
|
|
36
|
+
const combinedAuthority = Object.freeze({
|
|
37
|
+
getSnapshot: getCombinedSnapshot,
|
|
38
|
+
subscribePolicyRevision(listener) {
|
|
39
|
+
if (typeof listener !== "function")
|
|
40
|
+
throw new TypeError("permission revision listener must be a function");
|
|
41
|
+
const removeSettings = subscribeSettingsPermissionRevision(listener);
|
|
42
|
+
const removeScoped = subscribeScopedPermissionRevision(listener);
|
|
43
|
+
return () => {
|
|
44
|
+
removeSettings();
|
|
45
|
+
removeScoped();
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
});
|
|
19
49
|
|
|
20
50
|
function freezeSnapshot(value) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
51
|
+
const pending = [value];
|
|
52
|
+
const seen = new WeakSet();
|
|
53
|
+
while (pending.length) {
|
|
54
|
+
const current = pending.pop();
|
|
55
|
+
if (!current || typeof current !== "object" || seen.has(current)) continue;
|
|
56
|
+
seen.add(current);
|
|
57
|
+
for (const child of Object.values(current)) pending.push(child);
|
|
58
|
+
Object.freeze(current);
|
|
24
59
|
}
|
|
25
60
|
return value;
|
|
26
61
|
}
|
|
@@ -53,12 +88,14 @@ export function loadPermissionAuthority({
|
|
|
53
88
|
scopedStore = null,
|
|
54
89
|
} = {}) {
|
|
55
90
|
const settingsRevision = getSettingsPermissionRevision();
|
|
56
|
-
const
|
|
91
|
+
const scopedRevision = baseRules ? null : getScopedPermissionRevision();
|
|
92
|
+
const settingsObservation = inspectSettingsSources({
|
|
57
93
|
cwd,
|
|
58
94
|
settingsFile,
|
|
59
95
|
managedSettingsFile,
|
|
60
96
|
env,
|
|
61
97
|
});
|
|
98
|
+
const loaded = projectSettingsObservation(settingsObservation, { env });
|
|
62
99
|
const sources = baseRules ? {} : { ...loaded.sources };
|
|
63
100
|
let rules = baseRules
|
|
64
101
|
? applyManagedPermissionPolicy(baseRules, loaded.managed, sources)
|
|
@@ -99,6 +136,13 @@ export function loadPermissionAuthority({
|
|
|
99
136
|
error.code = "CC_SETTINGS_PERMISSION_AUTHORITY_CHANGED";
|
|
100
137
|
throw error;
|
|
101
138
|
}
|
|
139
|
+
if (!baseRules && getScopedPermissionRevision() !== scopedRevision) {
|
|
140
|
+
const error = new Error(
|
|
141
|
+
"scoped permissions changed while permission authority was loading",
|
|
142
|
+
);
|
|
143
|
+
error.code = "CC_SCOPED_PERMISSION_AUTHORITY_CHANGED";
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
102
146
|
return freezeSnapshot({
|
|
103
147
|
...loaded,
|
|
104
148
|
rules,
|
|
@@ -106,6 +150,8 @@ export function loadPermissionAuthority({
|
|
|
106
150
|
scoped,
|
|
107
151
|
hasRules: hasRules(rules),
|
|
108
152
|
settingsRevision,
|
|
153
|
+
settingsObservation,
|
|
154
|
+
...(scopedRevision ? { scopedRevision } : {}),
|
|
109
155
|
});
|
|
110
156
|
}
|
|
111
157
|
|
|
@@ -128,7 +174,10 @@ export function createPermissionRulesProvider(options = {}) {
|
|
|
128
174
|
scopedStore: options.scopedStore || null,
|
|
129
175
|
});
|
|
130
176
|
const provider = () => loadPermissionAuthority(captured);
|
|
131
|
-
providers.set(
|
|
177
|
+
providers.set(
|
|
178
|
+
provider,
|
|
179
|
+
captured.baseRules ? settingsAuthority : combinedAuthority,
|
|
180
|
+
);
|
|
132
181
|
return Object.freeze(provider);
|
|
133
182
|
}
|
|
134
183
|
|
|
@@ -86,11 +86,13 @@ import {
|
|
|
86
86
|
mcpStdioCapsuleNativeCodePolicyDigest,
|
|
87
87
|
} from "../mcp-stdio-native-code-policy.js";
|
|
88
88
|
|
|
89
|
+
import { isPackerBuildPolicy } from "./packer-build-policy.js";
|
|
89
90
|
const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
|
|
90
91
|
const SUPPORTED_SANDBOX_PROFILES = new Set([
|
|
91
92
|
"default",
|
|
92
93
|
"strict",
|
|
93
94
|
"network-only",
|
|
95
|
+
"build",
|
|
94
96
|
]);
|
|
95
97
|
// Broker-private admission state. Public runtime-probe fields are audit
|
|
96
98
|
// evidence, not authority to invoke a privileged post-spawn closure.
|
|
@@ -1590,6 +1592,15 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1590
1592
|
}
|
|
1591
1593
|
|
|
1592
1594
|
const profile = rawPolicy?.profile ?? null;
|
|
1595
|
+
if (
|
|
1596
|
+
profile === "build" &&
|
|
1597
|
+
!isPackerBuildPolicy(rawPolicy, options, launch)
|
|
1598
|
+
) {
|
|
1599
|
+
throw this._sandboxBoundaryError(
|
|
1600
|
+
"untrusted_build_sandbox_policy",
|
|
1601
|
+
"The build CPU budget requires an original packer policy for this origin and scope",
|
|
1602
|
+
);
|
|
1603
|
+
}
|
|
1593
1604
|
if (profile !== null && !SUPPORTED_SANDBOX_PROFILES.has(profile)) {
|
|
1594
1605
|
throw this._sandboxBoundaryError(
|
|
1595
1606
|
"invalid_sandbox_profile",
|
|
@@ -67,10 +67,77 @@ function compilerPath() {
|
|
|
67
67
|
return compiler;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
function isPkgRuntime() {
|
|
71
|
+
if (!process.pkg) return false;
|
|
72
|
+
// The location is derived only from this module and pkg's bootstrap, never
|
|
73
|
+
// from cwd, executable siblings, environment variables or caller paths.
|
|
74
|
+
if (
|
|
75
|
+
typeof process.pkg.defaultEntrypoint !== "string" ||
|
|
76
|
+
!process.pkg.defaultEntrypoint.startsWith("/snapshot/") ||
|
|
77
|
+
!fileURLToPath(import.meta.url).startsWith("/snapshot/")
|
|
78
|
+
)
|
|
79
|
+
throw failure("invalid-standalone-runtime");
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function readPkgAsset(file, maximum) {
|
|
84
|
+
// pkg's snapshot descriptors refer to /dev/null in the kernel and are read
|
|
85
|
+
// through its immutable payload reader. They are NOT native directory FDs.
|
|
86
|
+
// Reject real files mounted under a snapshot-looking pathname as well as
|
|
87
|
+
// symlink aliases; a pathname prefix alone never establishes this identity.
|
|
88
|
+
if (fs.realpathSync(file) !== file || fs.lstatSync(file).isSymbolicLink())
|
|
89
|
+
throw failure("invalid-standalone-asset");
|
|
90
|
+
const fd = fs.openSync(file, fs.constants.O_RDONLY);
|
|
91
|
+
try {
|
|
92
|
+
if (fs.readlinkSync(`/proc/self/fd/${fd}`) !== "/dev/null")
|
|
93
|
+
throw failure("standalone-asset-not-embedded");
|
|
94
|
+
const stat = fs.fstatSync(fd);
|
|
95
|
+
if (
|
|
96
|
+
!stat.isFile() ||
|
|
97
|
+
stat.size < 1 ||
|
|
98
|
+
stat.size > maximum ||
|
|
99
|
+
stat.nlink !== 0 ||
|
|
100
|
+
stat.ino !== 0 ||
|
|
101
|
+
stat.dev !== 0
|
|
102
|
+
)
|
|
103
|
+
throw failure("invalid-standalone-asset");
|
|
104
|
+
// readFileSync(path) reads the embedded payload directly. pkg readSync(fd)
|
|
105
|
+
// can instead read a decompressed external cache when compression is on.
|
|
106
|
+
// Never trust those cache bytes as supervision executable content.
|
|
107
|
+
const bytes = fs.readFileSync(file);
|
|
108
|
+
if (
|
|
109
|
+
!Buffer.isBuffer(bytes) ||
|
|
110
|
+
bytes.length !== stat.size ||
|
|
111
|
+
bytes.length > maximum
|
|
112
|
+
)
|
|
113
|
+
throw failure("invalid-standalone-asset");
|
|
114
|
+
return bytes;
|
|
115
|
+
} finally {
|
|
116
|
+
fs.closeSync(fd);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
70
120
|
function packagedImage() {
|
|
71
121
|
const root = fileURLToPath(
|
|
72
122
|
new URL("../../assets/linux-subreaper/", import.meta.url),
|
|
73
123
|
);
|
|
124
|
+
if (isPkgRuntime()) {
|
|
125
|
+
const directory = path.join(root, `linux-${process.arch}`);
|
|
126
|
+
const manifest = readPkgAsset(
|
|
127
|
+
path.join(directory, "manifest.json"),
|
|
128
|
+
MAX_SUBREAPER_MANIFEST_BYTES,
|
|
129
|
+
);
|
|
130
|
+
const bytes = readPkgAsset(
|
|
131
|
+
path.join(directory, "supervisor"),
|
|
132
|
+
MAX_IMAGE_BYTES,
|
|
133
|
+
);
|
|
134
|
+
return {
|
|
135
|
+
bytes,
|
|
136
|
+
identity: validateLinuxSubreaperArtifact(manifest, bytes, {
|
|
137
|
+
arch: process.arch,
|
|
138
|
+
}),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
74
141
|
// Only source checkouts with no packaged directory may use the development
|
|
75
142
|
// compiler path. A partial/corrupt installed payload must never fall back.
|
|
76
143
|
try {
|
|
@@ -135,23 +202,28 @@ function compileImage(spawnSync) {
|
|
|
135
202
|
const source = fileURLToPath(
|
|
136
203
|
new URL("./linux-subreaper-supervisor.c", import.meta.url),
|
|
137
204
|
);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
205
|
+
const packed = isPkgRuntime();
|
|
206
|
+
let sourceSnapshot;
|
|
207
|
+
if (packed) {
|
|
208
|
+
sourceSnapshot = readPkgAsset(source, MAX_SOURCE_BYTES);
|
|
209
|
+
} else {
|
|
210
|
+
sourceFd = fs.openSync(
|
|
211
|
+
source,
|
|
212
|
+
fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW,
|
|
213
|
+
);
|
|
214
|
+
const snapshot = readDescriptor(sourceFd, MAX_SOURCE_BYTES);
|
|
215
|
+
if (snapshot.stat.nlink !== 1n) throw failure("source-digest-mismatch");
|
|
216
|
+
sourceSnapshot = snapshot.bytes;
|
|
217
|
+
fs.closeSync(sourceFd);
|
|
218
|
+
sourceFd = null;
|
|
219
|
+
}
|
|
143
220
|
// npm/git may transport text with CRLF. Compile the exact canonical bytes
|
|
144
221
|
// that the source digest commits to, passed on stdin rather than reopened.
|
|
145
222
|
const sourceBytes = Buffer.from(
|
|
146
|
-
|
|
223
|
+
sourceSnapshot.toString("utf8").replace(/\r\n/g, "\n"),
|
|
147
224
|
);
|
|
148
|
-
if (
|
|
149
|
-
snapshot.stat.nlink !== 1n ||
|
|
150
|
-
sha(sourceBytes) !== LINUX_SUBREAPER_SOURCE_DIGEST
|
|
151
|
-
)
|
|
225
|
+
if (sha(sourceBytes) !== LINUX_SUBREAPER_SOURCE_DIGEST)
|
|
152
226
|
throw failure("source-digest-mismatch");
|
|
153
|
-
fs.closeSync(sourceFd);
|
|
154
|
-
sourceFd = null;
|
|
155
227
|
const packaged = packagedImage();
|
|
156
228
|
const compiler = packaged ? null : compilerPath();
|
|
157
229
|
temporaryRoot = fs.mkdtempSync(
|
|
@@ -253,7 +325,9 @@ function compileImage(spawnSync) {
|
|
|
253
325
|
// Do not expose compiler stdout/stderr, paths, environment, or native argv.
|
|
254
326
|
throw failure(
|
|
255
327
|
error.code === "ENOENT"
|
|
256
|
-
?
|
|
328
|
+
? process.pkg
|
|
329
|
+
? "standalone-asset-missing"
|
|
330
|
+
: "system-compiler-or-source-missing"
|
|
257
331
|
: "native-build-setup-failed",
|
|
258
332
|
);
|
|
259
333
|
} finally {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// In-process identity, not a JSON profile name, admits the packer's larger
|
|
2
|
+
// finite CPU budget. This grants no process permission: the broker's ordinary
|
|
3
|
+
// deny/prompt checks and strict-mode override still apply.
|
|
4
|
+
const policies = new WeakMap();
|
|
5
|
+
const origins = new Set(["packer:pkg", "packer:web-panel-build"]);
|
|
6
|
+
|
|
7
|
+
export const PACKER_BUILD_TIMEOUT_MS = 900_000;
|
|
8
|
+
|
|
9
|
+
export function createPackerBuildPolicy(origin) {
|
|
10
|
+
if (!origins.has(origin)) throw new Error("Unknown packer build origin");
|
|
11
|
+
const policy = Object.freeze({ profile: "build" });
|
|
12
|
+
policies.set(policy, origin);
|
|
13
|
+
return policy;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function isPackerBuildPolicy(policy, options, launch = {}) {
|
|
17
|
+
const { origin, scope, shell, detached, timeout, killSignal } = options;
|
|
18
|
+
return (
|
|
19
|
+
scope === "pack" &&
|
|
20
|
+
origins.has(origin) &&
|
|
21
|
+
policies.get(policy) === origin &&
|
|
22
|
+
launch.sync === true &&
|
|
23
|
+
launch.pty !== true &&
|
|
24
|
+
shell === false &&
|
|
25
|
+
(detached === undefined || detached === false) &&
|
|
26
|
+
Number.isSafeInteger(timeout) &&
|
|
27
|
+
timeout > 0 &&
|
|
28
|
+
timeout <= PACKER_BUILD_TIMEOUT_MS &&
|
|
29
|
+
killSignal === "SIGKILL"
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -2128,7 +2128,7 @@ export function applyMacSandbox(
|
|
|
2128
2128
|
// non-strict mode records the unavailable primitive and executes the
|
|
2129
2129
|
// original invocation, while strict mode fails closed. Explicit strict or
|
|
2130
2130
|
// network-only profiles still opt in to the sandbox-exec wrapper below.
|
|
2131
|
-
if ((sandboxOpts.profileName || "default")
|
|
2131
|
+
if (["default", "build"].includes(sandboxOpts.profileName || "default")) {
|
|
2132
2132
|
return createSandboxPlan({
|
|
2133
2133
|
...base,
|
|
2134
2134
|
reason: "macos_default_profile_requires_explicit_policy",
|
|
@@ -9969,8 +9969,16 @@ export function applySandbox(
|
|
|
9969
9969
|
};
|
|
9970
9970
|
|
|
9971
9971
|
const profile = {
|
|
9972
|
-
...(
|
|
9973
|
-
|
|
9972
|
+
...(profileName === "build"
|
|
9973
|
+
? {
|
|
9974
|
+
...profiles.default,
|
|
9975
|
+
limits: { ...profiles.default.limits, cpu: 600 },
|
|
9976
|
+
}
|
|
9977
|
+
: profiles[profileName] || profiles.default),
|
|
9978
|
+
profileName:
|
|
9979
|
+
profileName === "build" || profiles[profileName]
|
|
9980
|
+
? profileName
|
|
9981
|
+
: "default",
|
|
9974
9982
|
requiredBoundaries: sandboxRequest.requiredBoundaries,
|
|
9975
9983
|
sync: sandboxRequest.sync,
|
|
9976
9984
|
pty: sandboxRequest.pty,
|