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.
Files changed (179) hide show
  1. package/README.md +9 -4
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-D5a4i3N7.js → AIOps-Cgo7OFpi.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DxsRk5n1.js → ActionButton-lUMnE2Ln.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-D-7EvH4S.js → Analytics-CsvKzTot.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-DDEWVr-d.js → AppLayout-C2z1h1Pv.js} +3 -3
  9. package/src/assets/web-panel/assets/{Artifacts-CAlJAjRB.js → Artifacts-C5Q0ZhNb.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-tuaWDOAM.js → Audit-DXnfPKsI.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-CIwRFJ50.js → BackgroundAgents-DjbGcLm3.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-CpBepJlH.js → Backup-9bVrKvXE.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-eKguCzQc.js → BaseInput-bx5ri7BD.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CFrUfXDV.js → Chat-CCFmeUMY.js} +4 -4
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-ClqsIfTT.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-o5FEn6a1.js → Checkbox-ei7MQXe9.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-Dih8HogC.js → Codegen-CXgBJ9iu.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-D5r-6WZe.js → Col-DMkMsizS.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-jeQ6bGey.js → Community-CvpB_UFR.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-CEP7QsWp.js → Compact-gay5hbFX.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-B8NydOHd.js → Compliance-dG8JQyRL.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-Bmi1zuPy.js → Cowork-BA3xfaTW.js} +4 -4
  23. package/src/assets/web-panel/assets/{Cron-BAL9bwSp.js → Cron-D1_HsxyY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-D8WUi2dS.js → Crosschain-DZqoqoy5.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CQCkYcLY.js → DID-Cwnr8hCO.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DogXg6kh.js → Dashboard-CxevypiI.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-BJBJyQJn.js → Dropdown-Bs7-yWgr.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-CxPWquJx.js → EmailListRenderer-CcEs2Puo.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-BijH1x8G.js → EvolutionSettings-C9ipBzAQ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DStwf-00.js → FamilyGuardDashboard-Dt6--mGn.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-LU9_sNxC.js → Federation-CD0JN5FF.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DNfWhj7P.js → FormItemContext-POypz3Xv.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DWYsPjzk.js → GenericCardRenderer-Dv9f-0F5.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-CA0O9ulB.js → Git-BbTh5Atv.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-ECShL7BJ.js → Governance-C71dgoir.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-9GA2542e.js → Inference-DwSHxbJB.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-nC5mTbEH.js → KnowledgeGraph-Cx1oQYQZ.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-B7IqgnDy.js → Logs-BAJWe00o.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-CD8a7lHT.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-CEr0suM8.js → Marketplace-fwuY7P7Y.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DhTPQKOE.js → McpTools-Di4693uc.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-mHRZP1w4.js → Memory-Cz3L-GUB.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-BNfX6Rdo.js → MobileBridge-BuXKIkSb.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-Bk-lK4Um.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-CzkV3wsn.js → Mtc-LnACMFd0.js} +5 -5
  46. package/src/assets/web-panel/assets/{MtcAudit-DWYljJik.js → MtcAudit-BZy7yE0t.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-kHgtvZY_.js → Multisig-BFG5iVrE.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-56uQiPiY.js → NLProgramming-DgXi04vJ.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-DxGOZqRf.js → Notes-BAj0Kgg4.js} +4 -4
  50. package/src/assets/web-panel/assets/{NotificationSettings-DabaCpmo.js → NotificationSettings-AixrsHw5.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-SzeQNlGT.js → OrderTableRenderer-Dwqk3FlG.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-D9gnPpK2.js → Organization-UNCBC3ux.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-Cqp_bXm4.js → Overflow-Drh8oAFT.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-DTeK-r0G.js → P2P-bc2q0xEB.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-CsjG85GT.js → PdhVaultBrowser-BGwKxcDM.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-B4ofZq3j.js → Permissions-DOnUxUzu.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-Cvas5cYd.js → PersonalDataHub-B3qPZkrr.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-Er3wmAew.js → Pipeline-B6hfa4-i.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-DMFYeZox.js → Privacy-Bun3c35F.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DaVaYPy0.js → ProjectInit-CCObdzk9.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-dPx5q2Ac.js → ProjectSettings-C6lKrSXY.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-N0JNeCui.js → Projects-DYcta7MZ.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BPQo_gQa.js → Providers-BtykxKCe.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CD-sEsWh.js → QrScannerModal-D9CDyroY.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-LOKRJiN_.js → QuickAsk-CJauCxXx.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BwPXqcWy.js → Recommend-BbiYZofR.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BjotndxF.js → RemoteSession-BymCrgFW.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-BlZ2gcbU.js → Reputation-BWrGpMpF.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-D399HM-d.js → Row-9pOYIhiW.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-C7H-ibnY.js → RssFeed-D3bQJ4qB.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-CNHCVmM1.js → Search-BpKOOFE0.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-C70eDGYY.js → Security-DC6C0NSz.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-6xfq9G-H.js → Services-Lkf1046J.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-BbY2zeZV.js → Skeleton-eCQ_SsDb.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-DYtyZ7_6.js → Skills-BvDSQ3-d.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-CkWcl5OH.js → Sla-BQbKy8XJ.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-CiknYk2P.js → SpeechSettings-DHsRx-XA.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-D-8JVip4.js → SyncSettings-CC281X_J.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-B2KnR9XC.js → Tasks-CHHSWHom.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-CipXkOE-.js → Templates-Cr2vC0tg.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-DbwgIMmx.js → Tenant-DeYO5pIG.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-OtCriHEE.js → Terminal-DBNgbfPr.js} +2 -2
  83. package/src/assets/web-panel/assets/TimelineRenderer-MoxgaF3x.js +1 -0
  84. package/src/assets/web-panel/assets/{Tokens-B4iFVxvH.js → Tokens-CT2QfAN7.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-BegM2v8q.js → Trigger-DPUnomxs.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-COkqnnFj.js → Trust-DnufuaTx.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-BzqKPChj.js → UkeySign-CJ6iOdPs.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-D-F2XL3C.js → VideoEditing-xBWkH8bL.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-22PzRY9T.js → Wallet-WYV-4hMR.js} +3 -3
  90. package/src/assets/web-panel/assets/{WebAuthn-eSMq_qtz.js → WebAuthn-DJ5Mhd9L.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-BvdAakpq.js → WorkflowEditor-B__UdOjN.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-C6jhpF7E.js → chat-CLlmBVhp.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BbbW2Pfv.js → colors-B8zoPQYm.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-CVFeLTqt.js → compact-item-CvJ-dUsH.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DS0m7NZc.js → createContext-LAtMm8SC.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DgZ4fdGI.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-DVouP0t6.js → hasIn-CLYvg42H.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Be12HoCS.js → index-09YzRb6Z.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-CPS8E-J6.js → index-4rr5jFOL.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BXw6ivB8.js → index-B02qgCao.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BaUah6TO.js → index-B1hHp9_M.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Ds4wbrgk.js → index-B6zlMzZz.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-JeJqXbUU.js → index-BCzyJ1xS.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-54aHB4FL.js → index-BGrQ2uEl.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-eaXEQFuP.js → index-BM2HqHdT.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C74emdKD.js → index-BUVrYDNV.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BrIv7C9a.js → index-B_RPWP_5.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DGYX17YW.js → index-BkcQJvsz.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DotRL126.js → index-Bu7-I2L4.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BvCgzl0X.js → index-C2KFnUsv.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-C4xmLgLa.js → index-C3uD5H7u.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BwozzG6k.js → index-C5v7cEtm.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C6q2MkIG.js → index-C6PETyel.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DUBkae39.js → index-CUcE6rIa.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BwZnPiFd.js → index-CVDcRQuX.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CIk7mg6G.js → index-C_dq-6_3.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-B8a_c_qZ.js → index-CnLXLaEF.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CIg4nqyp.js → index-Cpda0SAz.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BhvnNFfd.js → index-Cv7vwX3z.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CpTbnbUI.js → index-CxJ4NPVq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BzL3LWFX.js → index-D0Z13xcZ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BE_u-rXr.js → index-DDm9m4vC.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-ByLsH9CL.js → index-DHq2Of6z.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BOOsA080.js → index-DNQUdPam.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-SdFkCtiC.js → index-DX0aHEHL.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Bw-ZGQCH.js → index-DX99e8Xy.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CkdYB0_g.js → index-DYW4Z3y-.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DuVjTDcW.js → index-DfOOACfd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DpReoAGb.js → index-Di9vKira.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CwYFDMn_.js → index-DpeV-6y4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DR6TDz5H.js → index-GR3omApz.js} +1 -1
  132. package/src/assets/web-panel/assets/{index--AdzSlH7.js → index-f1ptYBMr.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-8QbwhE3i.js → index-iJ6s24bA.js} +1 -1
  134. package/src/assets/web-panel/assets/index-jLEdASOV.js +1 -0
  135. package/src/assets/web-panel/assets/index-jesGo4rl.js +1 -0
  136. package/src/assets/web-panel/assets/{index-B5JRIZXi.js → index-oX216HRH.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-CB5cUnQ5.js → initDefaultProps-QD-koeaw.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-bn_fWhQV.js → motion-CTItLW4-.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-DY4-Odtu.js → move-CGsdTOdN.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-B5l5mjoh.js → mtc-parser-C1kW_CNU.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-rJ-Ci8CW.js → omit-B4PilaYy.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-BMwGJd6C.js → pickAttrs-DBGUE12e.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CaiQyGXG.js → placementArrow-DZxCLjuo.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DQTO5wDH.js → responsiveObserve-CZjQiocN.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-Dg6ZDtbz.js → slide-Btz5hh2_.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-bvjrktKc.js → statusUtils-CfuxuLIt.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-C1geIU_x.js → styleChecker-DdO0Obo_.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-BzU3RJRi.js → useFlexGapSupport-CxftJ-Zs.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-B7l6OwLe.js → useFs-pVJChh6K.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BYF1L_8x.js → usePersonalDataHub-wv7Q0uNE.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-6c2GVkT-.js → vnode-DVOVfAqC.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BYAY6QeD.js → zoom-B5tebZuT.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/commands/permissions.js +27 -2
  155. package/src/data/changelog.json +26 -0
  156. package/src/lib/background-interaction-resolver.js +4 -0
  157. package/src/lib/context-memory-kernel/durable-memory-port.js +68 -15
  158. package/src/lib/packer/pack-update-applier.js +28 -9
  159. package/src/lib/packer/pkg-config-generator.js +119 -2
  160. package/src/lib/packer/pkg-runner.js +7 -0
  161. package/src/lib/packer/pkg-targets.js +83 -0
  162. package/src/lib/packer/web-panel-builder.js +7 -0
  163. package/src/lib/permission-authority.js +56 -7
  164. package/src/lib/process-execution-broker/index.js +11 -0
  165. package/src/lib/process-execution-broker/linux-subreaper-helper.js +87 -13
  166. package/src/lib/process-execution-broker/packer-build-policy.js +31 -0
  167. package/src/lib/process-execution-broker/platform-sandbox.js +11 -3
  168. package/src/lib/scoped-permission-store.js +241 -121
  169. package/src/lib/settings-authority-domain.cjs +966 -0
  170. package/src/lib/settings-authority-record.cjs +701 -0
  171. package/src/lib/settings-loader.cjs +45 -8
  172. package/src/lib/settings-source-observation.cjs +8 -0
  173. package/src/assets/web-panel/assets/ChatBubbleRenderer-DaRtY87l.js +0 -1
  174. package/src/assets/web-panel/assets/MarkdownRenderer-BqlqrJkY.js +0 -1
  175. package/src/assets/web-panel/assets/MobileProjects-8zG8f5li.js +0 -1
  176. package/src/assets/web-panel/assets/TimelineRenderer-B9LU5qrl.js +0 -1
  177. package/src/assets/web-panel/assets/devWarning-D50gzPS9.js +0 -1
  178. package/src/assets/web-panel/assets/index-CgensV-n.js +0 -1
  179. 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 { ScopedPermissionStore } from "./scoped-permission-store.js";
5
+ import {
6
+ ScopedPermissionStore,
7
+ getScopedPermissionRevision,
8
+ subscribeScopedPermissionRevision,
9
+ } from "./scoped-permission-store.js";
6
10
 
7
11
  const {
8
12
  applyManagedPermissionPolicy,
9
- loadSettings,
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
- if (value && typeof value === "object") {
22
- for (const child of Object.values(value)) freezeSnapshot(child);
23
- Object.freeze(value);
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 loaded = loadSettings({
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(provider, settingsAuthority);
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
- sourceFd = fs.openSync(
139
- source,
140
- fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW,
141
- );
142
- const snapshot = readDescriptor(sourceFd, MAX_SOURCE_BYTES);
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
- snapshot.bytes.toString("utf8").replace(/\r\n/g, "\n"),
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
- ? "system-compiler-or-source-missing"
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") === "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
- ...(profiles[profileName] || profiles.default),
9973
- profileName: profiles[profileName] ? profileName : "default",
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,