chainlesschain 0.166.84 → 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 (175) 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-OYLnAlB5.js → AIOps-Cgo7OFpi.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-uc9kbLR6.js → ActionButton-lUMnE2Ln.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-BH901FG0.js → Analytics-CsvKzTot.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-qypKb8GL.js → AppLayout-C2z1h1Pv.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-Q-uPWyLY.js → Artifacts-C5Q0ZhNb.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-B8hMGMim.js → Audit-DXnfPKsI.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BSs8rJL_.js → BackgroundAgents-DjbGcLm3.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-2YMU_nCd.js → Backup-9bVrKvXE.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-DyMppTuT.js → BaseInput-bx5ri7BD.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-B5QGMaDO.js → Chat-CCFmeUMY.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-ClqsIfTT.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-DAvtgEGd.js → Checkbox-ei7MQXe9.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-BSChEVM3.js → Codegen-CXgBJ9iu.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-G0zYohIP.js → Col-DMkMsizS.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CzCN0B_p.js → Community-CvpB_UFR.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-DrIN3G8z.js → Compact-gay5hbFX.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CIsLa64Z.js → Compliance-dG8JQyRL.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-CGYoafsB.js → Cowork-BA3xfaTW.js} +4 -4
  23. package/src/assets/web-panel/assets/{Cron-DJ1JPXuH.js → Cron-D1_HsxyY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-B-IqVFJl.js → Crosschain-DZqoqoy5.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CAAczPz_.js → DID-Cwnr8hCO.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-Dkpel8VE.js → Dashboard-CxevypiI.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-ETNBf8-Z.js → Dropdown-Bs7-yWgr.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-CJGDyjVD.js → EmailListRenderer-CcEs2Puo.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-CL_hvVYe.js → EvolutionSettings-C9ipBzAQ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-iexOh6Dh.js → FamilyGuardDashboard-Dt6--mGn.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-DnDHvV5D.js → Federation-CD0JN5FF.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DLCDJjUp.js → FormItemContext-POypz3Xv.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-CaCgXCjS.js → GenericCardRenderer-Dv9f-0F5.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BVm-euUF.js → Git-BbTh5Atv.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-DPnUvLWr.js → Governance-C71dgoir.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-5qCWSYKl.js → Inference-DwSHxbJB.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-DXdv2oEh.js → KnowledgeGraph-Cx1oQYQZ.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BF2f7bBA.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-Bp-0Y7Ng.js → Marketplace-fwuY7P7Y.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-dm-Xdi63.js → McpTools-Di4693uc.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-TBHK031z.js → Memory-Cz3L-GUB.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-BTILAlds.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-BvyWkmRw.js → Mtc-LnACMFd0.js} +5 -5
  46. package/src/assets/web-panel/assets/{MtcAudit-D7ksLoNa.js → MtcAudit-BZy7yE0t.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-Dpzu7X1t.js → Multisig-BFG5iVrE.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-DZ0ADHSB.js → NLProgramming-DgXi04vJ.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-hIdkmRug.js → Notes-BAj0Kgg4.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-R3jyP6Vf.js → NotificationSettings-AixrsHw5.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-d1zrFkqx.js → OrderTableRenderer-Dwqk3FlG.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DoA5WMcc.js → Organization-UNCBC3ux.js} +2 -2
  53. package/src/assets/web-panel/assets/{Overflow-DHjIloAQ.js → Overflow-Drh8oAFT.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-2TMon_Wy.js → P2P-bc2q0xEB.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DEUxGSWO.js → PdhVaultBrowser-BGwKxcDM.js} +5 -5
  56. package/src/assets/web-panel/assets/{Permissions-CxKcZ-8X.js → Permissions-DOnUxUzu.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-CcYtkHqc.js → PersonalDataHub-B3qPZkrr.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-BxwOuq22.js → Pipeline-B6hfa4-i.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-VIx9pdsH.js → Privacy-Bun3c35F.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-COjp_erK.js → ProjectInit-CCObdzk9.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-x9NrZU80.js → ProjectSettings-C6lKrSXY.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-DMgkw7QJ.js → Projects-DYcta7MZ.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-B_fR7Y7Y.js → Providers-BtykxKCe.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-BUvzrn3V.js → QrScannerModal-D9CDyroY.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-C0sJwLy2.js → QuickAsk-CJauCxXx.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-CJC7Wpce.js → Recommend-BbiYZofR.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-B62J6ZP0.js → RemoteSession-BymCrgFW.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-4f48kVBn.js → Reputation-BWrGpMpF.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-EzEMaYoV.js → Row-9pOYIhiW.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-Dy0wD83j.js → RssFeed-D3bQJ4qB.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-GeVRHQND.js → Search-BpKOOFE0.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-omLr1J7w.js → Security-DC6C0NSz.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-DmGPaDAs.js → Services-Lkf1046J.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CAla21Gm.js → Skeleton-eCQ_SsDb.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-QqEyIKOI.js → Skills-BvDSQ3-d.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-Cwi15-pZ.js → Sla-BQbKy8XJ.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Cs8Zi1J8.js → SpeechSettings-DHsRx-XA.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-ipuJsDKP.js → SyncSettings-CC281X_J.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-BbVAg9Z7.js → Tasks-CHHSWHom.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-slUp9yXF.js → Templates-Cr2vC0tg.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-6edCSG5K.js → Tenant-DeYO5pIG.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-DKq84G3h.js → Terminal-DBNgbfPr.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-Dg0Aw6se.js → TimelineRenderer-MoxgaF3x.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-D63h7qYd.js → Tokens-CT2QfAN7.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-F7gTP_gv.js → Trigger-DPUnomxs.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-zw8Zqp8k.js → Trust-DnufuaTx.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-C-YBUmod.js → UkeySign-CJ6iOdPs.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-AhVxTgmC.js → VideoEditing-xBWkH8bL.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-C58zxjIg.js → Wallet-WYV-4hMR.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-D-n-rlfI.js → WebAuthn-DJ5Mhd9L.js} +2 -2
  91. package/src/assets/web-panel/assets/{WorkflowEditor-Ddc8gGD4.js → WorkflowEditor-B__UdOjN.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-C66V_U7w.js → chat-CLlmBVhp.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BcJyVZRj.js → colors-B8zoPQYm.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-UgUXWcgP.js → compact-item-CvJ-dUsH.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-oxEKHKYP.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-CbqzrKQO.js → hasIn-CLYvg42H.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CuZupgUw.js → index-09YzRb6Z.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-7lSY8B9T.js → index-4rr5jFOL.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CH13yc9x.js → index-B02qgCao.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DR4YKlLt.js → index-B1hHp9_M.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BdFgUn1S.js → index-B6zlMzZz.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D3xNhHF3.js → index-BCzyJ1xS.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DO-5vgTW.js → index-BGrQ2uEl.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CUmYwZyf.js → index-BM2HqHdT.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DWFNv_EG.js → index-BUVrYDNV.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BT2PZ9df.js → index-B_RPWP_5.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C6X26RJu.js → index-BkcQJvsz.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BZ7mv_oS.js → index-Bu7-I2L4.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BMOY4PSW.js → index-C2KFnUsv.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-B-h0Jgtj.js → index-C3uD5H7u.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D8rgeCoC.js → index-C5v7cEtm.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Ov77O9mH.js → index-C6PETyel.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BrWZmUdA.js → index-CUcE6rIa.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CJluGB2F.js → index-CVDcRQuX.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Crqqbu-W.js → index-C_dq-6_3.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BpqJNeIj.js → index-CnLXLaEF.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DBEL07sa.js → index-Cpda0SAz.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-UpN_kC9R.js → index-Cv7vwX3z.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CM2S5TJZ.js → index-CxJ4NPVq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-SzGgAqai.js → index-D0Z13xcZ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bu1A2sXy.js → index-DDm9m4vC.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DMbJ06sF.js → index-DHq2Of6z.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C-p9hhAz.js → index-DNQUdPam.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BQlGMcZ9.js → index-DX0aHEHL.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DRrxJygS.js → index-DX99e8Xy.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C3j9jTfB.js → index-DYW4Z3y-.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CrG-1Kqs.js → index-DfOOACfd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DAIuMvVR.js → index-Di9vKira.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-RnxuL8wM.js → index-DpeV-6y4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BNIq0NAn.js → index-GR3omApz.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Bmhw_Ler.js → index-f1ptYBMr.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-YvNh1UdB.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-Bp9rfr-P.js → index-oX216HRH.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BK9ncFiF.js → initDefaultProps-QD-koeaw.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BxzXi1Pe.js → motion-CTItLW4-.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CRmwRuah.js → move-CGsdTOdN.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BQq5_Znx.js → mtc-parser-C1kW_CNU.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-Ch4VNY2j.js → omit-B4PilaYy.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CUioBhrz.js → pickAttrs-DBGUE12e.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-Hj3o1CrW.js → placementArrow-DZxCLjuo.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-PfqJrlkI.js → responsiveObserve-CZjQiocN.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-BXcnR-Lu.js → slide-Btz5hh2_.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-C74a-ofo.js → statusUtils-CfuxuLIt.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-Bq57I3ls.js → styleChecker-DdO0Obo_.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-ITPUjcDw.js → useFlexGapSupport-CxftJ-Zs.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-DzPuXDIS.js → useFs-pVJChh6K.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DYSgt9L5.js → usePersonalDataHub-wv7Q0uNE.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-NPs_EJEk.js → vnode-DVOVfAqC.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-DZzO6KVS.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 +13 -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 +13 -5
  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 +15 -5
  169. package/src/lib/settings-loader.cjs +45 -8
  170. package/src/assets/web-panel/assets/ChatBubbleRenderer-B8ts_JnN.js +0 -1
  171. package/src/assets/web-panel/assets/MarkdownRenderer-qNJS3ygh.js +0 -1
  172. package/src/assets/web-panel/assets/MobileProjects-DC0Clgzs.js +0 -1
  173. package/src/assets/web-panel/assets/devWarning-BoDvrsgY.js +0 -1
  174. package/src/assets/web-panel/assets/index-BhqRbl5P.js +0 -1
  175. package/src/assets/web-panel/assets/index-DreT6MIR.js +0 -1
@@ -10,7 +10,8 @@ import {
10
10
 
11
11
  const {
12
12
  applyManagedPermissionPolicy,
13
- loadSettings,
13
+ inspectSettingsSources,
14
+ projectSettingsObservation,
14
15
  getSettingsPermissionRevision,
15
16
  subscribeSettingsPermissionRevision,
16
17
  } = settingsLoader;
@@ -47,9 +48,14 @@ const combinedAuthority = Object.freeze({
47
48
  });
48
49
 
49
50
  function freezeSnapshot(value) {
50
- if (value && typeof value === "object") {
51
- for (const child of Object.values(value)) freezeSnapshot(child);
52
- 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);
53
59
  }
54
60
  return value;
55
61
  }
@@ -83,12 +89,13 @@ export function loadPermissionAuthority({
83
89
  } = {}) {
84
90
  const settingsRevision = getSettingsPermissionRevision();
85
91
  const scopedRevision = baseRules ? null : getScopedPermissionRevision();
86
- const loaded = loadSettings({
92
+ const settingsObservation = inspectSettingsSources({
87
93
  cwd,
88
94
  settingsFile,
89
95
  managedSettingsFile,
90
96
  env,
91
97
  });
98
+ const loaded = projectSettingsObservation(settingsObservation, { env });
92
99
  const sources = baseRules ? {} : { ...loaded.sources };
93
100
  let rules = baseRules
94
101
  ? applyManagedPermissionPolicy(baseRules, loaded.managed, sources)
@@ -143,6 +150,7 @@ export function loadPermissionAuthority({
143
150
  scoped,
144
151
  hasRules: hasRules(rules),
145
152
  settingsRevision,
153
+ settingsObservation,
146
154
  ...(scopedRevision ? { scopedRevision } : {}),
147
155
  });
148
156
  }
@@ -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,
@@ -143,7 +143,7 @@ function validateRecord(record, seenIds) {
143
143
  seenIds.has(record.id) ||
144
144
  !DECISIONS.has(record.decision) ||
145
145
  !parseRule(record.rule) ||
146
- !Number.isInteger(record.revision) ||
146
+ !Number.isSafeInteger(record.revision) ||
147
147
  record.revision < 1 ||
148
148
  !Number.isFinite(record.createdAt) ||
149
149
  !Number.isFinite(record.expiresAt) ||
@@ -165,7 +165,7 @@ function validateState(value, workspace) {
165
165
  !value ||
166
166
  value.schema !== STATE_SCHEMA ||
167
167
  value.schemaVersion !== STATE_SCHEMA_VERSION ||
168
- !Number.isInteger(value.generation) ||
168
+ !Number.isSafeInteger(value.generation) ||
169
169
  value.generation < 0 ||
170
170
  !value.workspace ||
171
171
  value.workspace.id !== workspace.id ||
@@ -188,6 +188,16 @@ function statusFor(record, now) {
188
188
  return "active";
189
189
  }
190
190
 
191
+ function nextVersion(value, label) {
192
+ if (value === Number.MAX_SAFE_INTEGER) {
193
+ throw scopedPermissionError(
194
+ SCOPED_PERMISSION_ERROR_CODES.INVALID,
195
+ `Scoped permission ${label} is exhausted`,
196
+ );
197
+ }
198
+ return value + 1;
199
+ }
200
+
191
201
  function projectRecord(record, now, filePath) {
192
202
  return Object.freeze({
193
203
  ...structuredClone(record),
@@ -412,7 +422,7 @@ export class ScopedPermissionStore {
412
422
  reason: normalizedReason,
413
423
  };
414
424
  Object.assign(draft, current, {
415
- generation: current.generation + 1,
425
+ generation: nextVersion(current.generation, "generation"),
416
426
  updatedAt: now,
417
427
  rules: [...retained, created],
418
428
  });
@@ -462,13 +472,13 @@ export class ScopedPermissionStore {
462
472
  }
463
473
  revoked = {
464
474
  ...record,
465
- revision: record.revision + 1,
475
+ revision: nextVersion(record.revision, "revision"),
466
476
  revokedAt: now,
467
477
  };
468
478
  const rules = [...current.rules];
469
479
  rules[index] = revoked;
470
480
  Object.assign(draft, current, {
471
- generation: current.generation + 1,
481
+ generation: nextVersion(current.generation, "generation"),
472
482
  updatedAt: now,
473
483
  rules,
474
484
  });
@@ -50,6 +50,7 @@ const _deps = {
50
50
  writeSecurityStore: (...args) => securityStore().writeSecurityStore(...args),
51
51
  withFileLock: (...args) => lockHelper()(...args),
52
52
  };
53
+ const settingsObservations = new WeakSet();
53
54
 
54
55
  // A process-wide owner deliberately revokes unrelated projects too. Matching
55
56
  // only contributing paths misses absent files, parent discovery and aliases.
@@ -173,7 +174,7 @@ function inspectSettingsSources(opts = {}) {
173
174
  ...settingsPaths(cwd, opts.settingsFile),
174
175
  managedSettingsPath(opts),
175
176
  ];
176
- return Object.freeze({
177
+ const observation = Object.freeze({
177
178
  schema: "chainlesschain.settings-source-observation/v1",
178
179
  cwd,
179
180
  sources: observeSettingsSources(candidates, {
@@ -181,6 +182,8 @@ function inspectSettingsSources(opts = {}) {
181
182
  maxBytes: opts.maxBytes,
182
183
  }),
183
184
  });
185
+ settingsObservations.add(observation);
186
+ return observation;
184
187
  }
185
188
 
186
189
  /** Organization-controlled settings file. This layer is always highest. */
@@ -273,13 +276,50 @@ function loadSettings(opts = {}) {
273
276
  const cwd = opts.cwd || process.cwd();
274
277
  const env = opts.env || process.env;
275
278
  const onWarn = opts.onWarn;
279
+ function* layers() {
280
+ for (const file of settingsPaths(cwd, opts.settingsFile)) {
281
+ yield { file, settings: readSettingsFile(file, { onWarn }) };
282
+ }
283
+ }
284
+ return mergePermissionSettings(layers(), env, () =>
285
+ loadManagedSettings({
286
+ env,
287
+ managedSettingsFile: opts.managedSettingsFile,
288
+ onWarn,
289
+ }),
290
+ );
291
+ }
292
+
293
+ /**
294
+ * Project the exact JSON trees read and hashed by inspectSettingsSources.
295
+ * No path discovery or filesystem read occurs here. The final source has the
296
+ * managed role even when an earlier explicit/user/project source has the same
297
+ * path; retaining both positions preserves precedence and provenance.
298
+ *
299
+ * This is a byte-bound projection, not a fresh authority check or an atomic
300
+ * inventory snapshot. Environment inputs retain their existing sampling rules.
301
+ */
302
+ function projectSettingsObservation(observation, { env = {} } = {}) {
303
+ if (!settingsObservations.has(observation)) {
304
+ throw new TypeError("A strict settings source observation is required");
305
+ }
306
+ const managed = observation.sources[observation.sources.length - 1];
307
+ return mergePermissionSettings(
308
+ observation.sources.slice(0, -1).map((source) => ({
309
+ file: source.logicalPath,
310
+ settings: source.settings,
311
+ })),
312
+ env,
313
+ () => ({ file: managed.logicalPath, settings: managed.settings }),
314
+ );
315
+ }
276
316
 
317
+ function mergePermissionSettings(layers, env, readManaged) {
277
318
  let rules = emptyRules();
278
319
  const sources = {};
279
320
  const files = [];
280
321
 
281
- for (const file of settingsPaths(cwd, opts.settingsFile)) {
282
- const data = readSettingsFile(file, { onWarn });
322
+ for (const { file, settings: data } of layers) {
283
323
  if (!data) continue;
284
324
  const perms =
285
325
  data.permissions && typeof data.permissions === "object"
@@ -308,11 +348,7 @@ function loadSettings(opts = {}) {
308
348
  }
309
349
  if (envContributed) files.push("<env>");
310
350
 
311
- const managedLoaded = loadManagedSettings({
312
- env,
313
- managedSettingsFile: opts.managedSettingsFile,
314
- onWarn,
315
- });
351
+ const managedLoaded = readManaged();
316
352
  if (managedLoaded.settings) {
317
353
  rules = applyManagedPermissionPolicy(
318
354
  rules,
@@ -662,6 +698,7 @@ function readStringArraySetting(key, opts = {}) {
662
698
 
663
699
  module.exports = {
664
700
  inspectSettingsSources,
701
+ projectSettingsObservation,
665
702
  loadSettings,
666
703
  loadSettingsConfig,
667
704
  readSettingsFile,
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as s,R as a,S as y,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-CuZupgUw.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",M,[s("span",R,a(r.actorLabel),1),s("span",V,a(r.formattedTime),1)]),s("div",q,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-eIdfn0/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
@@ -1 +0,0 @@
1
- import{P as c,J as d,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as p}from"./index-CuZupgUw.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),d("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=p(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-eIdfn0/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-CuZupgUw.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-eIdfn0/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-CuZupgUw.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-G0zYohIP.js";import{a0 as t}from"./index-CuZupgUw.js";import"./vendor-Bn1JzzAn.js";import"./index-BZ7mv_oS.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-EzEMaYoV.js";import{a0 as t}from"./index-CuZupgUw.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-PfqJrlkI.js";import"./useFlexGapSupport-ITPUjcDw.js";import"./styleChecker-Bq57I3ls.js";import"./index-BZ7mv_oS.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};