chainlesschain 0.166.85 → 0.166.87

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 (201) hide show
  1. package/README.md +8 -0
  2. package/package.json +3 -2
  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-Cgo7OFpi.js → AIOps-DdQjhXg9.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-lUMnE2Ln.js → ActionButton-CuwA3hPA.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-CsvKzTot.js → Analytics-DTVXJSAC.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-C2z1h1Pv.js → AppLayout-j06JBfEQ.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-C5Q0ZhNb.js → Artifacts-BFAK8LEW.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-DXnfPKsI.js → Audit-BiGxRpOf.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-DjbGcLm3.js → BackgroundAgents-B6uHaPkZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-9bVrKvXE.js → Backup-BNAesB8q.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-bx5ri7BD.js → BaseInput-BOuetfCd.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CCFmeUMY.js → Chat-cVzo3m_D.js} +4 -4
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-DZ2Ys-CI.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-ei7MQXe9.js → Checkbox-BaCTS-H8.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-CXgBJ9iu.js → Codegen-CBE8NiYh.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-DMkMsizS.js → Col-C9wLiUTN.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CvpB_UFR.js → Community-jdClBSIp.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-gay5hbFX.js → Compact-BIjauIlM.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-dG8JQyRL.js → Compliance-CZ-AoaNj.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BA3xfaTW.js → Cowork-BbTKtDS4.js} +4 -4
  23. package/src/assets/web-panel/assets/{Cron-D1_HsxyY.js → Cron-ImKdtwNi.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-DZqoqoy5.js → Crosschain-B54GSHf5.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-Cwnr8hCO.js → DID-BQt5WUzs.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-CxevypiI.js → Dashboard--gNOffif.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-Bs7-yWgr.js → Dropdown-342A5YJw.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-CcEs2Puo.js → EmailListRenderer-CtIZ3ZHd.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-C9ipBzAQ.js → EvolutionSettings-CyZPoTio.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dt6--mGn.js → FamilyGuardDashboard-B1MCkFEu.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-CD0JN5FF.js → Federation-DZWoERUy.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-POypz3Xv.js → FormItemContext-Onmb0mp3.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-Dv9f-0F5.js → GenericCardRenderer-u1qhNNc7.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BbTh5Atv.js → Git-BEowR1C5.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-C71dgoir.js → Governance-BiYd3AAg.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DwSHxbJB.js → Inference-CsC4Vjh5.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Cx1oQYQZ.js → KnowledgeGraph-BXA7ikPM.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BAJWe00o.js → Logs-C9WoplQm.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-CD8a7lHT.js → MarkdownRenderer-DecEsXsy.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-fwuY7P7Y.js → Marketplace-CCoJBfRL.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-Di4693uc.js → McpTools-CzaOWBoA.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Cz3L-GUB.js → Memory-BPwh7u1-.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-BuXKIkSb.js → MobileBridge-Bk47v6z2.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-D-CY--Sb.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-LnACMFd0.js → Mtc-ExVyAGlW.js} +5 -5
  46. package/src/assets/web-panel/assets/{MtcAudit-BZy7yE0t.js → MtcAudit-Rrw10csE.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-BFG5iVrE.js → Multisig-8TxxwxZZ.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-DgXi04vJ.js → NLProgramming-CNckjtnY.js} +1 -1
  49. package/src/assets/web-panel/assets/Notes-C4j6cZTu.js +7 -0
  50. package/src/assets/web-panel/assets/{NotificationSettings-AixrsHw5.js → NotificationSettings-CchU8rWd.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-ZJBoyJ16.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-UNCBC3ux.js → Organization-F0Je7EdZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{Overflow-Drh8oAFT.js → Overflow-B2k-JA3u.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-bc2q0xEB.js → P2P-yui9Xxe6.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-BGwKxcDM.js → PdhVaultBrowser-CegM7hT6.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-DOnUxUzu.js → Permissions-CSFL0uvh.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-B3qPZkrr.js → PersonalDataHub-BrMcd-vr.js} +6 -6
  58. package/src/assets/web-panel/assets/{Pipeline-B6hfa4-i.js → Pipeline-fzrliaVP.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Bun3c35F.js → Privacy-BrkUjJ_g.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CCObdzk9.js → ProjectInit-CF_QCsW9.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-C6lKrSXY.js → ProjectSettings-Duwrd8aC.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-DYcta7MZ.js → Projects-B0dLVXzU.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BtykxKCe.js → Providers-Db8iS1xQ.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-D9CDyroY.js → QrScannerModal-CHbNzEQs.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-CJauCxXx.js → QuickAsk-CIESMfeR.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BbiYZofR.js → Recommend-BTMbCMtR.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BymCrgFW.js → RemoteSession-DavyK6J-.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-BWrGpMpF.js → Reputation-BFKtMelA.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-9pOYIhiW.js → Row-BI9AZUvw.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-D3bQJ4qB.js → RssFeed-1nwXt8NY.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-BpKOOFE0.js → Search-Ck8PDYbk.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-DC6C0NSz.js → Security-BgDqpCbq.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-Lkf1046J.js → Services-DF8anXm4.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-eCQ_SsDb.js → Skeleton-CoHyY4ZX.js} +1 -1
  75. package/src/assets/web-panel/assets/Skills-dOaD4Ztl.js +1 -0
  76. package/src/assets/web-panel/assets/{Sla-BQbKy8XJ.js → Sla-XuOawvQY.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-DHsRx-XA.js → SpeechSettings-DFJ7nAiu.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-CC281X_J.js → SyncSettings-B2xYj-Pi.js} +2 -2
  79. package/src/assets/web-panel/assets/Tasks-D_SzNTLi.js +1 -0
  80. package/src/assets/web-panel/assets/{Templates-Cr2vC0tg.js → Templates-BXFmKh7W.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-DeYO5pIG.js → Tenant-CRg2AXbd.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-DBNgbfPr.js → Terminal-DQgxnuep.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-MoxgaF3x.js → TimelineRenderer-BrPQhQVc.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-CT2QfAN7.js → Tokens-RByy4USy.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DPUnomxs.js → Trigger-pE3y8u73.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-DnufuaTx.js → Trust-DhID9C33.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CJ6iOdPs.js → UkeySign-CPxEPNBH.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-xBWkH8bL.js → VideoEditing-ZD8DUxeQ.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-WYV-4hMR.js → Wallet-Br9JREEd.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DJ5Mhd9L.js → WebAuthn-Cn-YacJg.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-B__UdOjN.js → WorkflowEditor-BTu0oqMp.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CLlmBVhp.js → chat-CEjws_QF.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-B8zoPQYm.js → colors-Bv2RNebW.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-CvJ-dUsH.js → compact-item-gSc3EofP.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-LAtMm8SC.js → createContext-kyFDaqWC.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-Dcc8pILJ.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-CLYvg42H.js → hasIn-BuMWcjhx.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Cv7vwX3z.js → index--nrQmk8X.js} +1 -1
  99. package/src/assets/web-panel/assets/index-05NB95_V.js +1 -0
  100. package/src/assets/web-panel/assets/{index-BUVrYDNV.js → index-42PTBO7a.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B6zlMzZz.js → index-BCS5j4SQ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-oX216HRH.js → index-BSSIJ-rv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B02qgCao.js → index-BUOCcXou.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B_RPWP_5.js → index-Bg5jis0q.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DX99e8Xy.js → index-C-LPpwe9.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DDm9m4vC.js → index-C56Drzol.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DHq2Of6z.js → index-C7Jo20JB.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C_dq-6_3.js → index-C9U9SjcT.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D0Z13xcZ.js → index-CF3TjDNz.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B1hHp9_M.js → index-CMS3Mk93.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DfOOACfd.js → index-CNt2X-aK.js} +1 -1
  112. package/src/assets/web-panel/assets/index-Cb6q8wlI.js +1 -0
  113. package/src/assets/web-panel/assets/{index-DYW4Z3y-.js → index-Cj4RA7oA.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C2KFnUsv.js → index-CkfvP2dN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BkcQJvsz.js → index-Cm8K8Evn.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CVDcRQuX.js → index-CvSuM_CB.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BCzyJ1xS.js → index-Czo_hw97.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Cpda0SAz.js → index-D3m3EXbL.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-iJ6s24bA.js → index-DR561Sqc.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Di9vKira.js → index-DRa4R7vv.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-09YzRb6Z.js → index-DYKSuD02.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-C5v7cEtm.js → index-DYcPWVN9.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BGrQ2uEl.js → index-DbVUA5l3.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-4rr5jFOL.js → index-DbkyTMj-.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-GR3omApz.js → index-Dej4AGOz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-f1ptYBMr.js → index-EpxWlmip.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C3uD5H7u.js → index-GpvWtvw3.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-C6PETyel.js → index-NQ0c4hJ1.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CnLXLaEF.js → index-OjZUHz5z.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DpeV-6y4.js → index-U-ytt84A.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DNQUdPam.js → index-_0bfDTDu.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BM2HqHdT.js → index-jmMAqBAm.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Bu7-I2L4.js → index-nLemnBZ2.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CUcE6rIa.js → index-q65c1kp8.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DX0aHEHL.js → index-sJ1F5Txa.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CxJ4NPVq.js → index-xfS_WO9b.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-QD-koeaw.js → initDefaultProps-B-wqiSu7.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-CTItLW4-.js → motion-BK4_B4MD.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CGsdTOdN.js → move-BU2TgDDO.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-C1kW_CNU.js → mtc-parser-DA3E4_EX.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-B4PilaYy.js → omit-CaHz1e_q.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-DBGUE12e.js → pickAttrs-NXZ19amf.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DZxCLjuo.js → placementArrow-BCXI9AHO.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-CZjQiocN.js → responsiveObserve-DdlZ9tLk.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-Btz5hh2_.js → slide-DCZm_Vc4.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-CfuxuLIt.js → statusUtils-CuEULKQr.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DdO0Obo_.js → styleChecker-Bo_UXG8x.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-CxftJ-Zs.js → useFlexGapSupport-B9PaTcFH.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-pVJChh6K.js → useFs-DwSTGdVR.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-wv7Q0uNE.js → usePersonalDataHub-FswSxnDC.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-DVOVfAqC.js → vnode-EUztvYTj.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-B5tebZuT.js → zoom-D41MAgV-.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/eval.js +118 -18
  156. package/src/commands/memory.js +34 -15
  157. package/src/commands/sandbox.js +9 -0
  158. package/src/data/changelog.json +26 -0
  159. package/src/lib/causal-observability.js +6 -45
  160. package/src/lib/context-memory-kernel/durable-memory-port.js +54 -12
  161. package/src/lib/context-memory-kernel/index.js +1 -0
  162. package/src/lib/context-memory-kernel/memory-query-index.js +278 -0
  163. package/src/lib/context-memory-kernel/memory-service.js +60 -18
  164. package/src/lib/context-memory-kernel/runtime.js +5 -3
  165. package/src/lib/context-memory-kernel/segmented-memory-port.js +955 -0
  166. package/src/lib/eval/outcomes.js +20 -10
  167. package/src/lib/eval/runner.js +49 -5
  168. package/src/lib/eval/tasks.js +8 -3
  169. package/src/lib/eval/verify01-contracts.js +349 -0
  170. package/src/lib/eval/verify01-execution.js +605 -0
  171. package/src/lib/execution-support.js +58 -0
  172. package/src/lib/llm-pricing.js +98 -11
  173. package/src/lib/model-catalog-review.js +116 -0
  174. package/src/lib/model-context-catalog.js +23 -1
  175. package/src/lib/openai-responses.js +39 -0
  176. package/src/lib/packer/pack-update-applier.js +13 -8
  177. package/src/lib/permission-authority.js +146 -10
  178. package/src/lib/process-execution-broker/index.js +8 -0
  179. package/src/lib/process-execution-broker/linux-subreaper-process.js +24 -2
  180. package/src/lib/process-execution-broker/process-ownership-journal.js +168 -7
  181. package/src/lib/process-execution-broker/process-ownership-quarantine.js +56 -1
  182. package/src/lib/process-execution-broker/process-recovery-cgroup.js +272 -0
  183. package/src/lib/sandbox-egress-authority-monitor.js +62 -5
  184. package/src/lib/scoped-permission-store.js +104 -1
  185. package/src/lib/settings-authority-domain.cjs +37 -2
  186. package/src/lib/settings-loader.cjs +67 -34
  187. package/src/lib/settings-permission-authority.cjs +373 -0
  188. package/src/runtime/agent-core.js +88 -407
  189. package/src/runtime/headless-runner.js +8 -3
  190. package/src/runtime/headless-stream.js +10 -3
  191. package/src/runtime/permission-authority-host.js +151 -0
  192. package/src/runtime/provider-stream-state.js +379 -0
  193. package/src/assets/web-panel/assets/ChatBubbleRenderer-ClqsIfTT.js +0 -1
  194. package/src/assets/web-panel/assets/MobileProjects-Bk-lK4Um.js +0 -1
  195. package/src/assets/web-panel/assets/Notes-BAj0Kgg4.js +0 -7
  196. package/src/assets/web-panel/assets/OrderTableRenderer-Dwqk3FlG.js +0 -1
  197. package/src/assets/web-panel/assets/Skills-BvDSQ3-d.js +0 -1
  198. package/src/assets/web-panel/assets/Tasks-CHHSWHom.js +0 -1
  199. package/src/assets/web-panel/assets/devWarning-DgZ4fdGI.js +0 -1
  200. package/src/assets/web-panel/assets/index-jLEdASOV.js +0 -1
  201. package/src/assets/web-panel/assets/index-jesGo4rl.js +0 -1
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+
3
+ // Trusted-host, cooperative Linux binding. Only explicit provisioning creates
4
+ // an authority; a reader/writer never registers or repairs a missing domain.
5
+ const path = require("node:path");
6
+ const { types } = require("node:util");
7
+ const { createHash } = require("node:crypto");
8
+ const fs = require("node:fs");
9
+ const { observeSettingsSources } = require("./settings-source-observation.cjs");
10
+ const domain = require("./settings-authority-domain.cjs");
11
+ const records = require("./settings-authority-record.cjs");
12
+ const bindings = new WeakMap();
13
+ const SCHEMA = "chainlesschain.settings-permission-launch/v1";
14
+ const loader = () => require("./settings-loader.cjs");
15
+
16
+ function fail(code = "CC_SETTINGS_PERMISSION_BINDING_INVALID") {
17
+ throw Object.assign(
18
+ new Error("Persistent settings permission binding is unavailable"),
19
+ { code },
20
+ );
21
+ }
22
+
23
+ function dataCopy(input, depth = 0) {
24
+ if (input === null || ["string", "boolean", "number"].includes(typeof input))
25
+ return input;
26
+ if (!input || typeof input !== "object" || types.isProxy(input) || depth > 12)
27
+ fail();
28
+ const array = Array.isArray(input);
29
+ if (
30
+ !array &&
31
+ ![Object.prototype, null].includes(Object.getPrototypeOf(input))
32
+ )
33
+ fail();
34
+ const output = array ? [] : {};
35
+ const keys = Reflect.ownKeys(input);
36
+ if (keys.length > 1024) fail();
37
+ for (const key of keys) {
38
+ if (array && key === "length") continue;
39
+ const descriptor = Object.getOwnPropertyDescriptor(input, key);
40
+ if (
41
+ typeof key !== "string" ||
42
+ !descriptor ||
43
+ !Object.hasOwn(descriptor, "value") ||
44
+ key === "__proto__" ||
45
+ (array && !/^(0|[1-9][0-9]*)$/.test(key))
46
+ )
47
+ fail();
48
+ output[key] = dataCopy(descriptor.value, depth + 1);
49
+ }
50
+ if (
51
+ array &&
52
+ (output.length !== input.length ||
53
+ Object.keys(output).length !== input.length)
54
+ )
55
+ fail();
56
+ return Object.freeze(output);
57
+ }
58
+
59
+ function exactKeys(value, keys) {
60
+ if (
61
+ !value ||
62
+ Array.isArray(value) ||
63
+ Object.keys(value).sort().join(",") !== [...keys].sort().join(",")
64
+ )
65
+ fail();
66
+ }
67
+
68
+ function absolute(value) {
69
+ if (
70
+ typeof value !== "string" ||
71
+ !value ||
72
+ !path.isAbsolute(value) ||
73
+ path.resolve(value) !== value
74
+ )
75
+ fail();
76
+ return value;
77
+ }
78
+
79
+ function captureContexts(input, captured = false) {
80
+ const contexts = dataCopy(input);
81
+ if (!Array.isArray(contexts) || !contexts.length || contexts.length > 64)
82
+ fail();
83
+ const ids = new Set();
84
+ return Object.freeze(
85
+ contexts.map((context) => {
86
+ const fields = [
87
+ "contextId",
88
+ "cwd",
89
+ "settingsFile",
90
+ "managedSettingsFile",
91
+ "userSettingsFile",
92
+ "scopedFile",
93
+ ];
94
+ if (captured) exactKeys(context, fields);
95
+ else if (Object.keys(context).some((key) => !fields.includes(key)))
96
+ fail();
97
+ if (
98
+ typeof context.contextId !== "string" ||
99
+ !/^[a-zA-Z0-9._:-]{1,128}$/.test(context.contextId) ||
100
+ ids.has(context.contextId)
101
+ )
102
+ fail();
103
+ ids.add(context.contextId);
104
+ const cwd = captured
105
+ ? absolute(context.cwd)
106
+ : path.resolve(context.cwd || process.cwd());
107
+ const settingsFile =
108
+ context.settingsFile === null || context.settingsFile === undefined
109
+ ? null
110
+ : captured
111
+ ? absolute(context.settingsFile)
112
+ : path.resolve(cwd, context.settingsFile);
113
+ const managedSettingsFile = captured
114
+ ? absolute(context.managedSettingsFile)
115
+ : loader().managedSettingsPath(context);
116
+ const userSettingsFile = captured
117
+ ? absolute(context.userSettingsFile)
118
+ : context.userSettingsFile
119
+ ? path.resolve(context.userSettingsFile)
120
+ : loader().scopeFile(cwd, "user");
121
+ const scopedFile = captured
122
+ ? absolute(context.scopedFile)
123
+ : context.scopedFile
124
+ ? path.resolve(context.scopedFile)
125
+ : require("./scoped-permission-store.js").defaultScopedPermissionStatePath(
126
+ cwd,
127
+ );
128
+ return Object.freeze({
129
+ contextId: context.contextId,
130
+ cwd,
131
+ settingsFile,
132
+ managedSettingsFile: path.resolve(managedSettingsFile),
133
+ userSettingsFile: path.resolve(userSettingsFile),
134
+ scopedFile,
135
+ });
136
+ }),
137
+ );
138
+ }
139
+
140
+ function observe(contexts) {
141
+ const observations = new Map();
142
+ const manifests = contexts.map((context) => {
143
+ const observation = loader().inspectSettingsSources(context);
144
+ const scopedObservation = observeSettingsSources([context.scopedFile])[0];
145
+ observations.set(context.contextId, { observation, scopedObservation });
146
+ return records.createManifest({
147
+ contextId: context.contextId,
148
+ discovery: [
149
+ context.cwd,
150
+ context.userSettingsFile,
151
+ context.managedSettingsFile,
152
+ ...(context.settingsFile ? [context.settingsFile] : []),
153
+ context.scopedFile,
154
+ ],
155
+ sources: [...observation.sources, scopedObservation],
156
+ });
157
+ });
158
+ return { observations, manifests };
159
+ }
160
+
161
+ function observer(contexts, save = () => {}) {
162
+ return (expected) => {
163
+ if (
164
+ expected.length !== contexts.length ||
165
+ expected.some(
166
+ (context, index) => context.contextId !== contexts[index].contextId,
167
+ )
168
+ )
169
+ fail("CC_SETTINGS_AUTHORITY_BINDING_CHANGED");
170
+ // Recompute the complete discovery route, never reuse ledger source paths.
171
+ const current = observe(contexts);
172
+ save(current.observations);
173
+ return current.manifests;
174
+ };
175
+ }
176
+
177
+ /** Explicit administrator/host provisioning. Parent directories must exist. */
178
+ function initializeSettingsPermissionAuthority({
179
+ directory,
180
+ forbiddenRoots,
181
+ contexts,
182
+ }) {
183
+ const captured = captureContexts(contexts);
184
+ const initial = observe(captured);
185
+ const handle = domain.initializeSettingsAuthorityDomain({
186
+ directory,
187
+ forbiddenRoots: [
188
+ ...new Set([
189
+ ...forbiddenRoots,
190
+ ...captured.map((context) => context.cwd),
191
+ ]),
192
+ ],
193
+ contexts: initial.manifests,
194
+ observeContexts: observer(captured),
195
+ });
196
+ try {
197
+ return dataCopy({
198
+ schema: SCHEMA,
199
+ domain: domain.exportSettingsAuthorityDomain(handle),
200
+ contexts: captured,
201
+ });
202
+ } finally {
203
+ domain.closeSettingsAuthorityDomain(handle);
204
+ }
205
+ }
206
+
207
+ /** Reopen a fixed launch descriptor in a process or Worker; never bootstrap. */
208
+ function openSettingsPermissionAuthority({ launch, contextId }) {
209
+ launch = dataCopy(launch);
210
+ exactKeys(launch, ["schema", "domain", "contexts"]);
211
+ if (launch.schema !== SCHEMA) fail();
212
+ const contexts = captureContexts(launch.contexts, true);
213
+ const selected = contexts.find((context) => context.contextId === contextId);
214
+ if (!selected) fail("CC_SETTINGS_AUTHORITY_CONTEXT_UNREGISTERED");
215
+ const handle = domain.reopenSettingsAuthorityDomain({
216
+ descriptor: launch.domain,
217
+ });
218
+ const binding = Object.freeze({});
219
+ const state = { handle, launch, contexts, selected, closed: false };
220
+ bindings.set(binding, state);
221
+ try {
222
+ readSettingsPermissionAuthority(binding);
223
+ return binding;
224
+ } catch (error) {
225
+ closeSettingsPermissionAuthority(binding);
226
+ throw error;
227
+ }
228
+ }
229
+
230
+ function stateFor(binding) {
231
+ const state = bindings.get(binding);
232
+ if (!state || state.closed) fail();
233
+ return state;
234
+ }
235
+
236
+ function settingsPermissionAuthorityOptions(binding) {
237
+ return stateFor(binding).selected;
238
+ }
239
+
240
+ function exportSettingsPermissionAuthority(binding) {
241
+ const state = stateFor(binding);
242
+ domain.exportSettingsAuthorityDomain(state.handle); // Verify namespace first.
243
+ return state.launch;
244
+ }
245
+
246
+ function readSettingsPermissionAuthority(binding, { forUpdate = false } = {}) {
247
+ const state = stateFor(binding);
248
+ let observations;
249
+ const read = forUpdate
250
+ ? domain.readSettingsAuthorityForUpdate
251
+ : domain.readSettingsAuthority;
252
+ const result = read(state.handle, {
253
+ observeContexts: observer(state.contexts, (value) => {
254
+ observations = value;
255
+ }),
256
+ localRevision: () => localRevision(state),
257
+ });
258
+ const observed = observations.get(state.selected.contextId);
259
+ return Object.freeze({
260
+ snapshot: result.snapshot,
261
+ observation: observed.observation,
262
+ scopedObservation: observed.scopedObservation,
263
+ });
264
+ }
265
+
266
+ function localRevision(state) {
267
+ const settings = loader().getSettingsPermissionRevision();
268
+ const scoped =
269
+ require("./scoped-permission-store.js").getScopedPermissionRevision();
270
+ if (
271
+ state.localRevision?.settings !== settings ||
272
+ state.localRevision?.scoped !== scoped
273
+ )
274
+ state.localRevision = Object.freeze({ settings, scoped });
275
+ return state.localRevision;
276
+ }
277
+
278
+ // Keep the observation's minting and projection within one loader instance.
279
+ // Hosts with an ESM transform loader can also load CJS through native require;
280
+ // the native observation must still pass its original private WeakSet brand.
281
+ function projectSettingsPermissionObservation(observation, options) {
282
+ return loader().projectSettingsObservation(observation, options);
283
+ }
284
+
285
+ function assertSettingsPermissionWritableRoots(binding, roots) {
286
+ const state = stateFor(binding);
287
+ const directory = domain.exportSettingsAuthorityDomain(
288
+ state.handle,
289
+ ).directory;
290
+ for (const root of roots) {
291
+ const canonical = fs.realpathSync(absolute(root));
292
+ const overlaps = [
293
+ path.relative(canonical, directory),
294
+ path.relative(directory, canonical),
295
+ ].some(
296
+ (relative) =>
297
+ relative === "" ||
298
+ (!relative.startsWith(".." + path.sep) &&
299
+ relative !== ".." &&
300
+ !path.isAbsolute(relative)),
301
+ );
302
+ if (overlaps) fail("CC_SETTINGS_AUTHORITY_DOMAIN_OVERLAP");
303
+ }
304
+ }
305
+
306
+ // Used only by the official synchronous settings writer. Callbacks remain a
307
+ // trusted host contract; no callback or arbitrary source enters launch data.
308
+ function mutateSettingsPermissionSource(
309
+ binding,
310
+ { logicalPath, prepare, revokeLocal, replace },
311
+ ) {
312
+ const state = stateFor(binding);
313
+ logicalPath = absolute(logicalPath);
314
+ for (let attempt = 0; attempt < 8; attempt++) {
315
+ const current = readSettingsPermissionAuthority(binding, {
316
+ forUpdate: true,
317
+ });
318
+ const source = [
319
+ ...current.observation.sources,
320
+ current.scopedObservation,
321
+ ].find((item) => item.logicalPath === logicalPath);
322
+ if (!source) fail("CC_SETTINGS_AUTHORITY_SOURCE_UNREGISTERED");
323
+ const data = JSON.parse(JSON.stringify(source.settings || {}));
324
+ if (prepare(data) === false)
325
+ return { changed: false, snapshot: current.snapshot };
326
+ const bytes = Buffer.from(`${JSON.stringify(data, null, 2)}\n`);
327
+ if (bytes.length > 1024 * 1024) fail("CC_SETTINGS_SOURCE_TOO_LARGE");
328
+ try {
329
+ return domain.transitionSettingsAuthority(state.handle, {
330
+ intent: {
331
+ kind: "write",
332
+ physicalPath: source.physicalPath,
333
+ after: {
334
+ exists: true,
335
+ byteLength: bytes.length,
336
+ digest: createHash("sha256").update(bytes).digest("hex"),
337
+ },
338
+ },
339
+ expectedSnapshot: current.snapshot,
340
+ localRevision: () => localRevision(state),
341
+ observeContexts: observer(state.contexts),
342
+ revokeLocal,
343
+ replace: () => replace(source.physicalPath, data),
344
+ });
345
+ } catch (error) {
346
+ if (
347
+ error.cause?.code !== "CC_SETTINGS_AUTHORITY_CONFLICT" ||
348
+ error.commitState !== "not-committed" ||
349
+ error.authorityState !== "unchanged"
350
+ )
351
+ throw error;
352
+ }
353
+ }
354
+ fail("CC_SETTINGS_AUTHORITY_CONFLICT");
355
+ }
356
+
357
+ function closeSettingsPermissionAuthority(binding) {
358
+ const state = stateFor(binding);
359
+ domain.closeSettingsAuthorityDomain(state.handle);
360
+ state.closed = true;
361
+ }
362
+
363
+ module.exports = {
364
+ initializeSettingsPermissionAuthority,
365
+ openSettingsPermissionAuthority,
366
+ exportSettingsPermissionAuthority,
367
+ closeSettingsPermissionAuthority,
368
+ settingsPermissionAuthorityOptions,
369
+ readSettingsPermissionAuthority,
370
+ projectSettingsPermissionObservation,
371
+ mutateSettingsPermissionSource,
372
+ assertSettingsPermissionWritableRoots,
373
+ };