chainlesschain 0.166.92 → 0.166.94

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 (182) hide show
  1. package/README.md +16 -7
  2. package/package.json +3 -3
  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-C74YzqwJ.js → AIOps-CzxfrB7_.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-TFef1hOE.js → ActionButton-6a4WFIb0.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-CYsWpkkU.js → Analytics-O3Hv5QVR.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-CFf9kjwu.js → AppLayout-D96Jtyrz.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-TQqa94YO.js → Artifacts-BxbCrGsv.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-B79ayqfS.js → Audit-Dvhj3ev4.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-pjkHfLP9.js → BackgroundAgents-zgrU13eK.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-CE6A-t_r.js → Backup-B3ePsQ8z.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-CwcgWMBY.js → BaseInput-CemgxVZi.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-BIkDNesY.js → Chat-BNxuigZo.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DgaokYts.js → ChatBubbleRenderer-DE73IMLf.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-MbypIy5V.js → Checkbox-BvHaZkOM.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-DiFHWDnt.js → Codegen--DNXNLnq.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-BNMlYMso.js → Col-C8xvHu-3.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-B3HVyHOX.js → Community-v19Cxqtl.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-C7hlAubb.js → Compact-BdQ659sW.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-PaXZu6sE.js → Compliance-CE0-97Ph.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BGiojbm-.js → Cowork-YCuhzIZE.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-Bmr-1QAx.js → Cron-C5xa6iEB.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BwUvWCVd.js → Crosschain-CmsyQp8f.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-k_4QZocW.js → DID-FY-oN652.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-_ieRo2C5.js → Dashboard-CFJD_yB7.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DYHh6T27.js → Dropdown-QM5qyalT.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-BNlQcWQX.js → EmailListRenderer-BbA-SPX0.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DIkZ6U2D.js → EvolutionSettings-BGH3oR71.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dq7qSr0P.js → FamilyGuardDashboard-C4s2LeR4.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-C64e3Cbx.js → Federation-Cfb8190f.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-D-GE2vUa.js → FormItemContext-DFVYcD2A.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DO3B2gis.js → GenericCardRenderer-CU-yqT1M.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-0ETirIQH.js → Git-tYiQuWYO.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-C9fnRygX.js → Governance-DRH8tKKy.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-CLJ9RTsK.js → Inference-v2GbRYb4.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-D3C_GxrN.js → KnowledgeGraph-B5Ff0wSA.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-C5ctGbkN.js → Logs-mcHQsQZC.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-Ce-eWK3j.js → MarkdownRenderer-rk-aXvLV.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-GF_t6hJ_.js → Marketplace-LUstH49t.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-BGsGzgQs.js → McpTools-kFFP54H9.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-CcrY2A0j.js → Memory--KBUL4b_.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Bi4T0RlS.js → MobileBridge-CQL_xVyD.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-DoIR8HA0.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-DL77Vf-k.js → Mtc-BrUPLX-C.js} +6 -6
  46. package/src/assets/web-panel/assets/{MtcAudit-CDy_Uswb.js → MtcAudit-46jjW0Ne.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-DL0BAO_c.js → Multisig-3XX8crha.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-B-woh5IR.js → NLProgramming-C53SRk52.js} +1 -1
  49. package/src/assets/web-panel/assets/Notes-RxpNEOb6.js +7 -0
  50. package/src/assets/web-panel/assets/{NotificationSettings-BqPPMuAP.js → NotificationSettings-C2R6A0rD.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-Bhhp4H-K.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-B1gX8jlr.js → Organization-B48YmG99.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CeMxuUZy.js → Overflow-BYPoJ7Qo.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-B5aIRWwJ.js → P2P-CI9F_5Xz.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-6rYgejd4.js → PdhVaultBrowser-C50vLFTe.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-CqCp2SIl.js → Permissions-CKMhcV4D.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BsA7DJWW.js → PersonalDataHub-CFwVht-l.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-CiW6HeZh.js → Pipeline-BQliRCrn.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-DckUOLYq.js → Privacy-z-9F-MIF.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CZppOOYR.js → ProjectInit-DAuaSe48.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-B9QPzhDU.js → ProjectSettings-BpCCZLAx.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-BErjjGha.js → Projects-CguDJz4k.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DehU6Qiz.js → Providers-DOXv8vOy.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-E1SUvv1m.js → QrScannerModal-BiMsPToH.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-COWFxyH3.js → QuickAsk-Dxjfq39w.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-D26pWKxX.js → Recommend-Y5kQ_a2f.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DCOIaId3.js → RemoteSession-BSIDk0es.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-DT_AHGAR.js → Reputation-BLjwaybi.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-B50S-1nl.js → Row-7geSc2GW.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-BaBnHg3Q.js → RssFeed-BophPGWk.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-BVdnLuuS.js → Search-iBXsRvIQ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BnacH74J.js → Security-sM5aX0dn.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-CxM08Zch.js → Services-8n708_pG.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DE7CIc1N.js → Skeleton-D2rl_ikr.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-CGI0SJmf.js → Skills-DJpknGnz.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-DpEzPcqc.js → Sla-mA8eEXRj.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-CTmnmMHn.js → SpeechSettings-BVrmiTgd.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-Dxgrd9hd.js → SyncSettings-Cd-KRX72.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-CW4slS0A.js → Tasks-DYAvmen_.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-DxvGWDgB.js → Templates-DPdlYX7S.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-_Q0o2tNK.js → Tenant-wfSNgGDT.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BTZn8pow.js → Terminal-BqJDIQEC.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CauL0KFe.js → TimelineRenderer-eeuMKufC.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-CDoM2qeT.js → Tokens-DW9xE5CY.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-B-QYGEU7.js → Trigger-BBniBnCp.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-BD6XJHT-.js → Trust-C7fZAxYI.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-x4TFwCy0.js → UkeySign-X_cT1LN_.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-t3imBK_0.js → VideoEditing-C95qSEAg.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BCfkWwNC.js → Wallet-_Y76V1eI.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-WH314Mdm.js → WebAuthn-CUpi7QWI.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-jUlcjrUg.js → WorkflowEditor-CdTwu4JZ.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-Dg3VASTL.js → chat-D2hW7s3x.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BNvmBRKE.js → colors-Cxes7tn4.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BGOfoqf4.js → compact-item-BuLnefA8.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BNQeqKAs.js → createContext-DSJr7jrZ.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BHLx7Ctv.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-Bg3AjCrq.js → hasIn-CPtCYTi-.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-2D04Zltx.js → index--J0mLXrw.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-COol3xfA.js → index--gm5GIKK.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DcCnO0RU.js → index-5Vtfy09g.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-fOwii3LP.js → index-B5GXCqB0.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-OUFoxUgH.js → index-BC-FDx0Y.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Bkz1tgFR.js → index-BDaNLJss.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DLwEXRrb.js → index-BOKMxs4C.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BBCMulQ-.js → index-BOXgWdJY.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-B_JmInC0.js → index-BSHkOFqM.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-pVdQieac.js → index-B_mChW9O.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BmTacaQV.js → index-Bq-CMI2h.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Wo0f2iqb.js → index-BudaM8zA.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B--0QM0S.js → index-C2qdbxEw.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BaPvEvB4.js → index-C6jDeixf.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dkp-okWa.js → index-C88mhge1.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BSNhW95G.js → index-C8xMmdFz.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-7QJUWemf.js → index-CCI2rS5G.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-xzaUx19r.js → index-CFTO4avR.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Cbp-wp-U.js → index-CVgzXcvk.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Co_LnCWD.js → index-C_RLdbKl.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CY8cRKHR.js → index-CighFQgt.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B0mgngoB.js → index-CmV_i-tY.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-ZD5Kd8tx.js → index-Ct9hZUrk.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-uH2LnAs_.js → index-D4YILZTK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CCFZN66A.js → index-DDSmCL8t.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DYn5DnDk.js → index-DFSJeXBu.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Cx2EXRfr.js → index-DGIumCxN.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D6UqK83L.js → index-DIkV-pwg.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DO0VlNtc.js → index-DTtVX2yD.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D_O2ZjPk.js → index-Dz6h62uC.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D-mSvCQK.js → index-PyLgXmQZ.js} +1 -1
  129. package/src/assets/web-panel/assets/index-V4IYxvvE.js +1 -0
  130. package/src/assets/web-panel/assets/{index--I3UF5t1.js → index-_AYMw6sF.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-hG7jXGEW.js → index-ePTIQg1n.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-60AnjUTX.js → index-f1fHG0MC.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DS04wRll.js → index-lOl7QbP4.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DF_FKSVH.js → index-vsUYvuDU.js} +1 -1
  135. package/src/assets/web-panel/assets/index-y4vqXg0S.js +1 -0
  136. package/src/assets/web-panel/assets/{index-D072oLjp.js → index-ystQEkV4.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-B8PN9AxJ.js → initDefaultProps-CAxtYUKo.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BHivfw5Q.js → motion-CgPmr4vy.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-B0QU5nDd.js → move-XGK3_B35.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-DRwRM3PE.js → mtc-parser-C6Vfqz8e.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-SHt2rV2p.js → omit-DquSN-3H.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CcmDlEb2.js → pickAttrs-BH-ir5eD.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DYatmXDS.js → placementArrow-Drf-QXk8.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-B7qrsXq5.js → responsiveObserve-BUBMbJsH.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-BRGhlOWd.js → slide-BCqinMKC.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-CT-7NXsQ.js → statusUtils-CAp3-0Ss.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-rZdw_Yyp.js → styleChecker-DIuQh0dB.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-D8YNIP4P.js → useFlexGapSupport-CWXPAfZR.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-B8pt0Gu-.js → useFs-905ulWWY.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-VMmYM1tt.js → usePersonalDataHub-DajnovG6.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-UNDuoPoq.js → vnode-BE_Yg3pz.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-dN-u667S.js → zoom-BLndEna7.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/data/changelog.json +26 -0
  155. package/src/lib/artifact-store.js +51 -3
  156. package/src/lib/bounded-artifact-file-read.js +131 -0
  157. package/src/lib/evolution/evolution-artifact-ports.js +209 -129
  158. package/src/lib/evolution/rrsi-history-ledger-adapter.js +25 -0
  159. package/src/lib/evolution/rrsi-installation-route-contracts.js +275 -0
  160. package/src/lib/evolution/rrsi-installation-route-reader.js +282 -0
  161. package/src/lib/evolution/rrsi-observed-text-index.js +978 -0
  162. package/src/lib/evolution/rrsi-registry-runtime-policy.js +648 -0
  163. package/src/lib/evolution/rrsi-registry-store-policy.js +95 -15
  164. package/src/lib/evolution/rrsi-tenant-index-anchor-contracts.js +223 -0
  165. package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +157 -0
  166. package/src/lib/evolution/skill-release-registry.js +20 -5
  167. package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +291 -30
  168. package/src/lib/process-execution-broker/windows-native-evaluator.js +247 -28
  169. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  170. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  171. package/src/lib/process-execution-broker/windows-sandbox.cs +140 -6
  172. package/src/lib/remote-read-loop-guard.js +227 -24
  173. package/src/lib/settings-loader.cjs +10 -1
  174. package/src/lib/task-progress-tracker.js +6 -1
  175. package/src/lib/with-file-lock.js +86 -16
  176. package/src/runtime/agent-core.js +71 -23
  177. package/src/assets/web-panel/assets/MobileProjects-DvjEGyvf.js +0 -1
  178. package/src/assets/web-panel/assets/Notes-CEFVCxk7.js +0 -7
  179. package/src/assets/web-panel/assets/OrderTableRenderer-GUKQ1xwp.js +0 -1
  180. package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +0 -1
  181. package/src/assets/web-panel/assets/index-B-jSKJK6.js +0 -1
  182. package/src/assets/web-panel/assets/index-P4FXZJqI.js +0 -1
@@ -5,6 +5,10 @@ import { createHash } from "node:crypto";
5
5
  import { createWindowsNativeEvaluator } from "./windows-native-evaluator.js";
6
6
 
7
7
  const SCHEMA = "chainlesschain.windows-native-evaluator-capabilities/v1";
8
+ const ISOLATED_SCHEMA =
9
+ "chainlesschain.windows-native-evaluator-capabilities/v2";
10
+ const PROBE_SCHEMA =
11
+ "chainlesschain.windows-native-evaluator-capability-probe/v2";
8
12
  const PREFIX = "CC_NATIVE_CAPABILITIES:";
9
13
  const HASH = /^sha256:[a-f0-9]{64}$/u;
10
14
  const JOURNAL_FILE = "capability-journal.jsonl";
@@ -18,6 +22,15 @@ const PROBES = [
18
22
  "child-pipe-stdio",
19
23
  "child-fork-ipc",
20
24
  ];
25
+ const BROKER_FILES = [
26
+ "windows-native-evaluator-capabilities.js",
27
+ "windows-native-evaluator.js",
28
+ "index.js",
29
+ "platform-sandbox.js",
30
+ "windows-sandbox.cs",
31
+ "windows-sandbox-helper.exe",
32
+ "windows-sandbox-helper.dll",
33
+ ];
21
34
  const sha256 = (value) =>
22
35
  `sha256:${createHash("sha256").update(value).digest("hex")}`;
23
36
  const requireCondition = (condition, message) => {
@@ -36,7 +49,7 @@ const FIXTURES = Object.freeze({
36
49
  "anchor.txt": "private-native-capability-input\n",
37
50
  });
38
51
 
39
- function checkSource(probeTimeoutMs) {
52
+ function checkSource(probeTimeoutMs, probeId) {
40
53
  return `
41
54
  const fs=require('node:fs');
42
55
  const journalFd=fs.openSync(process.argv[3]+'/'+${JSON.stringify(JOURNAL_FILE)},'wx',0o600);
@@ -53,11 +66,18 @@ const path=require('node:path'),os=require('node:os');
53
66
  const crypto=require('node:crypto'),cp=require('node:child_process');
54
67
  const {pathToFileURL}=require('node:url'),{Worker}=require('node:worker_threads');
55
68
  const workspace=process.argv[2],scratch=process.argv[3],timeout=${probeTimeoutMs};
69
+ const probeId=${JSON.stringify(probeId)};
70
+ const inheritedKeys=Object.keys(process.env).sort();
71
+ const credentialKeys=inheritedKeys.filter(key=>/TOKEN|SECRET|PASSWORD|CREDENTIAL|API_KEY|AUTHORIZATION/i.test(key));
72
+ const derived={TMP:path.join(scratch,'tmp'),TEMP:path.join(scratch,'tmp'),HOME:path.join(scratch,'home'),USERPROFILE:path.join(scratch,'home'),APPDATA:path.join(scratch,'home','AppData','Roaming'),LOCALAPPDATA:path.join(scratch,'home','AppData','Local')};
73
+ for(const directory of new Set(Object.values(derived)))fs.mkdirSync(directory,{recursive:true});
74
+ for(const [key,value]of Object.entries(derived))process.env[key]=value;
56
75
  const observations=[];
57
76
  const hash=value=>'sha256:'+crypto.createHash('sha256').update(value).digest('hex');
58
77
  journal('initialization-settled');
59
78
  function settled(value){journal('settled',{id:value.id,observation:value});observations.push(value);}
60
79
  function observe(id,operation){
80
+ if(id!==probeId)return Promise.resolve();
61
81
  const start=Date.now();
62
82
  journal('started',{id});
63
83
  return Promise.resolve().then(operation).then(value=>{
@@ -82,11 +102,6 @@ function asyncProbe(create,valid){
82
102
  }
83
103
  (async()=>{
84
104
  await observe('scratch-environment',()=>{
85
- const inheritedKeys=Object.keys(process.env).sort();
86
- const credentialKeys=inheritedKeys.filter(key=>/TOKEN|SECRET|PASSWORD|CREDENTIAL|API_KEY|AUTHORIZATION/i.test(key));
87
- const derived={TMP:path.join(scratch,'tmp'),TEMP:path.join(scratch,'tmp'),HOME:path.join(scratch,'home'),USERPROFILE:path.join(scratch,'home'),APPDATA:path.join(scratch,'home','AppData','Roaming'),LOCALAPPDATA:path.join(scratch,'home','AppData','Local')};
88
- for(const directory of new Set(Object.values(derived)))fs.mkdirSync(directory,{recursive:true});
89
- for(const [key,value]of Object.entries(derived))process.env[key]=value;
90
105
  const proofs=[];
91
106
  for(const [key,value]of Object.entries(derived)){const file=path.join(value,key+'.txt');fs.writeFileSync(file,key,{flag:'wx'});proofs.push({key,path:value,value:fs.readFileSync(file,'utf8')});}
92
107
  const details={credentialKeys,inheritedKeys,derived,proofs,tmpdir:os.tmpdir(),homedir:os.homedir(),credentialsAbsent:credentialKeys.length===0,nodeOptionsAbsent:!Object.hasOwn(process.env,'NODE_OPTIONS')};
@@ -117,12 +132,12 @@ function asyncProbe(create,valid){
117
132
  });
118
133
  await observe('child-fork-ipc',()=>asyncProbe(()=>cp.fork(path.join(workspace,'fork-probe.cjs'),[],{execArgv:['--preserve-symlinks','--preserve-symlinks-main'],windowsHide:true,stdio:['inherit','inherit','inherit','ipc']}),value=>value?.marker==='native-fork-ok'&&Number.isSafeInteger(value.pid)&&value.pid!==process.pid));
119
134
  journal('completed');
120
- process.stdout.write(${JSON.stringify(PREFIX)}+JSON.stringify({version:1,pid:process.pid,workspace,scratch,observations})+'\\n');
135
+ process.stdout.write(${JSON.stringify(PREFIX)}+JSON.stringify({version:2,probeId,pid:process.pid,workspace,scratch,observations})+'\\n');
121
136
  })().catch(error=>{console.error(error.stack||error);process.exitCode=74;}).finally(()=>fs.closeSync(journalFd));
122
137
  `;
123
138
  }
124
139
 
125
- function validateJournal(report, complete) {
140
+ function validateJournal(report, complete, probes = PROBES) {
126
141
  const artifact = report.journal;
127
142
  if (!artifact) {
128
143
  requireCondition(!complete, "completed target omitted its journal");
@@ -141,7 +156,7 @@ function validateJournal(report, complete) {
141
156
  const expected = [
142
157
  { event: "initialization-started" },
143
158
  { event: "initialization-settled" },
144
- ...PROBES.flatMap((id) => [
159
+ ...probes.flatMap((id) => [
145
160
  { event: "started", id },
146
161
  { event: "settled", id },
147
162
  ]),
@@ -317,7 +332,37 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
317
332
  report,
318
333
  { allowPartial = false } = {},
319
334
  ) {
335
+ if (report?.schema === ISOLATED_SCHEMA) {
336
+ const validation = validateIsolatedReport(report, { allowPartial });
337
+ requireCondition(
338
+ report.diagnosticCompleted === validation.diagnosticCompleted,
339
+ "aggregate completion summary changed",
340
+ );
341
+ return validation;
342
+ }
320
343
  requireCondition(report?.schema === SCHEMA, "unknown report schema");
344
+ return validateProbeReport(report, { allowPartial });
345
+ }
346
+
347
+ function validateProbeReport(report, { allowPartial = false } = {}) {
348
+ const isolated = report.schema === PROBE_SCHEMA;
349
+ const probes = isolated ? [report.probeId] : PROBES;
350
+ if (isolated) {
351
+ requireCondition(PROBES.includes(report.probeId), "unknown isolated probe");
352
+ requireCondition(
353
+ report.checkSourceSha256 ===
354
+ sha256(checkSource(report.probeTimeoutMs, report.probeId)),
355
+ "isolated probe source binding mismatch",
356
+ );
357
+ requireCondition(
358
+ report.stage?.root === report.manifest?.root &&
359
+ report.stage?.workspace === report.manifest?.workspace &&
360
+ report.stage?.scratch === report.manifest?.scratch &&
361
+ Number.isSafeInteger(report.settlement?.targetPid) &&
362
+ report.settlement.targetPid > 0,
363
+ "isolated stage or target identity mismatch",
364
+ );
365
+ }
321
366
  requireCondition(
322
367
  report.formalSample === false &&
323
368
  report.providerAssessed === false &&
@@ -369,7 +414,7 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
369
414
  ? "target execution timed out; native cleanup confirmed"
370
415
  : "target execution incomplete; native cleanup confirmed",
371
416
  );
372
- const journal = validateJournal(report, false);
417
+ const journal = validateJournal(report, false, probes);
373
418
  return {
374
419
  diagnosticCompleted: false,
375
420
  allCapabilitiesSupported: false,
@@ -389,7 +434,8 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
389
434
  );
390
435
  const target = JSON.parse(lines[0].slice(PREFIX.length));
391
436
  requireCondition(
392
- target.version === 1 &&
437
+ target.version === (isolated ? 2 : 1) &&
438
+ (!isolated || target.probeId === report.probeId) &&
393
439
  Number.isSafeInteger(target.pid) &&
394
440
  target.pid > 0 &&
395
441
  target.pid === report.settlement.targetPid &&
@@ -399,7 +445,7 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
399
445
  target.scratch === report.stage.scratch &&
400
446
  Array.isArray(target.observations) &&
401
447
  JSON.stringify(target.observations.map((item) => item.id)) ===
402
- JSON.stringify(PROBES),
448
+ JSON.stringify(probes),
403
449
  "target identity or probe sequence mismatch",
404
450
  );
405
451
  for (const observation of target.observations) {
@@ -540,10 +586,11 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
540
586
  "report observations differ from raw output",
541
587
  );
542
588
  requireCondition(
543
- target.observations[0].status === "supported",
589
+ !probes.includes("scratch-environment") ||
590
+ target.observations[0].status === "supported",
544
591
  "scratch environment or credential isolation failed",
545
592
  );
546
- const journal = validateJournal(report, true);
593
+ const journal = validateJournal(report, true, probes);
547
594
  requireCondition(
548
595
  JSON.stringify(
549
596
  journal.records
@@ -568,10 +615,13 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
568
615
  * evidenceDirectory, when supplied, must be a new directory. A failed native
569
616
  * settlement retains its stage; there is no unsandboxed fallback or provider.
570
617
  */
571
- export async function runWindowsNativeEvaluatorCapabilities({
618
+ async function runIsolatedProbe({
572
619
  wallTimeMs = 15000,
573
620
  probeTimeoutMs = 1200,
574
621
  evidenceDirectory,
622
+ probeId,
623
+ usedStages,
624
+ expectedBrokerFiles,
575
625
  } = {}) {
576
626
  requireCondition(process.platform === "win32", "Windows host required");
577
627
  requireCondition(
@@ -599,7 +649,8 @@ export async function runWindowsNativeEvaluatorCapabilities({
599
649
  const sourceIdentity = fs.lstatSync(sourceRoot, { bigint: true });
600
650
  let evaluator;
601
651
  const report = {
602
- schema: SCHEMA,
652
+ schema: PROBE_SCHEMA,
653
+ probeId,
603
654
  startedAt: new Date().toISOString(),
604
655
  platform: process.platform,
605
656
  osRelease: os.release(),
@@ -621,21 +672,19 @@ export async function runWindowsNativeEvaluatorCapabilities({
621
672
  brokerFiles: [],
622
673
  };
623
674
  try {
624
- report.brokerFiles = [
625
- "windows-native-evaluator-capabilities.js",
626
- "windows-native-evaluator.js",
627
- "index.js",
628
- "platform-sandbox.js",
629
- "windows-sandbox.cs",
630
- "windows-sandbox-helper.exe",
631
- "windows-sandbox-helper.dll",
632
- ].map((name) => ({
675
+ report.brokerFiles = BROKER_FILES.map((name) => ({
633
676
  name,
634
677
  sha256: sha256(fs.readFileSync(new URL(name, import.meta.url))),
635
678
  }));
679
+ requireCondition(
680
+ !expectedBrokerFiles ||
681
+ JSON.stringify(report.brokerFiles) ===
682
+ JSON.stringify(expectedBrokerFiles),
683
+ "broker source or binary changed before isolated probe issuance",
684
+ );
636
685
  for (const [name, bytes] of Object.entries(FIXTURES))
637
686
  fs.writeFileSync(path.join(sourceRoot, name), bytes, { flag: "wx" });
638
- const source = checkSource(probeTimeoutMs);
687
+ const source = checkSource(probeTimeoutMs, probeId);
639
688
  report.checkSourceSha256 = sha256(source);
640
689
  evaluator = createWindowsNativeEvaluator({
641
690
  sourceRoot,
@@ -650,6 +699,12 @@ export async function runWindowsNativeEvaluatorCapabilities({
650
699
  scratch: evaluator.manifest.scratch,
651
700
  };
652
701
  report.manifest = evaluator.manifest;
702
+ const stageKey = path.win32.normalize(evaluator.root).toLowerCase();
703
+ requireCondition(
704
+ !usedStages.has(stageKey),
705
+ "isolated probe stage was reused",
706
+ );
707
+ usedStages.add(stageKey);
653
708
  const outcome = await evaluator.execute();
654
709
  report.settlement = outcome.receipt;
655
710
  const { result } = outcome;
@@ -671,10 +726,7 @@ export async function runWindowsNativeEvaluatorCapabilities({
671
726
  .find((value) => value.startsWith(PREFIX));
672
727
  if (line)
673
728
  report.observations = JSON.parse(line.slice(PREFIX.length)).observations;
674
- report.validation = validateWindowsNativeEvaluatorCapabilitiesReport(
675
- report,
676
- { allowPartial: true },
677
- );
729
+ report.validation = validateProbeReport(report, { allowPartial: true });
678
730
  requireCondition(
679
731
  report.brokerFiles.every(
680
732
  ({ name, sha256: expected }) =>
@@ -682,6 +734,7 @@ export async function runWindowsNativeEvaluatorCapabilities({
682
734
  ),
683
735
  "broker source or binary changed during probe execution",
684
736
  );
737
+ report.integrityConfirmed = true;
685
738
  report.diagnosticCompleted = report.validation.diagnosticCompleted;
686
739
  if (!report.diagnosticCompleted) {
687
740
  report.failureKind = report.validation.failureKind;
@@ -755,3 +808,211 @@ export async function runWindowsNativeEvaluatorCapabilities({
755
808
  }
756
809
  return report;
757
810
  }
811
+
812
+ function validateIsolatedReport(report, { allowPartial }) {
813
+ const hostFields = ["platform", "architecture", "nodeVersion", "osRelease"];
814
+ requireCondition(
815
+ report.platform === "win32" &&
816
+ hostFields.every(
817
+ (key) => typeof report[key] === "string" && report[key].length > 0,
818
+ ),
819
+ "isolated host/runtime identity missing",
820
+ );
821
+ requireCondition(
822
+ report.formalSample === false &&
823
+ report.providerAssessed === false &&
824
+ report.fullReviewPackAssessed === false,
825
+ "diagnostic scope changed",
826
+ );
827
+ requireCondition(
828
+ Array.isArray(report.runs) &&
829
+ report.runs.length === PROBES.length &&
830
+ JSON.stringify(report.runs.map((run) => run.probeId)) ===
831
+ JSON.stringify(PROBES),
832
+ "isolated probe sequence incomplete or changed",
833
+ );
834
+ const stages = new Set(),
835
+ manifests = new Set();
836
+ const expectedRuntime = report.runs[0].manifest?.runtime;
837
+ const probeResults = report.runs.map((run) => {
838
+ requireCondition(
839
+ run.schema === PROBE_SCHEMA,
840
+ "unknown isolated probe schema",
841
+ );
842
+ requireCondition(
843
+ hostFields.every((key) => run[key] === report[key]),
844
+ "isolated host/runtime identity changed",
845
+ );
846
+ const runtime = run.manifest?.runtime;
847
+ requireCondition(
848
+ runtime &&
849
+ /^[a-f0-9]{64}$/u.test(runtime.sha256) &&
850
+ Number.isSafeInteger(runtime.bytes) &&
851
+ runtime.bytes > 0 &&
852
+ runtime.sha256 === expectedRuntime?.sha256 &&
853
+ runtime.bytes === expectedRuntime?.bytes,
854
+ "isolated runtime bytes or digest changed",
855
+ );
856
+ requireCondition(
857
+ run.wallTimeMs === report.wallTimeMs &&
858
+ run.probeTimeoutMs === report.probeTimeoutMs &&
859
+ run.manifest.wallTimeMs === report.wallTimeMs &&
860
+ run.integrityConfirmed === true &&
861
+ !run.cleanupError &&
862
+ !run.sourceRetained &&
863
+ JSON.stringify(run.brokerFiles) ===
864
+ JSON.stringify(report.runs[0].brokerFiles),
865
+ "isolated probe integrity or limits changed",
866
+ );
867
+ requireCondition(
868
+ JSON.stringify(run.brokerFiles.map((file) => file.name)) ===
869
+ JSON.stringify(BROKER_FILES) &&
870
+ run.brokerFiles.every((file) => HASH.test(file.sha256)) &&
871
+ JSON.stringify(run.sourceFiles) ===
872
+ JSON.stringify(
873
+ Object.entries(FIXTURES).map(([name, bytes]) => ({
874
+ name,
875
+ bytes: Buffer.byteLength(bytes),
876
+ sha256: sha256(bytes),
877
+ })),
878
+ ),
879
+ "isolated broker or fixture hashes missing or changed",
880
+ );
881
+ const key = path.win32.normalize(run.stage.root).toLowerCase();
882
+ requireCondition(
883
+ !stages.has(key) && !manifests.has(run.manifestDigest),
884
+ "isolated probe stage or manifest was reused",
885
+ );
886
+ stages.add(key);
887
+ manifests.add(run.manifestDigest);
888
+ const validation = validateProbeReport(run, { allowPartial });
889
+ requireCondition(
890
+ run.diagnosticCompleted === validation.diagnosticCompleted,
891
+ "isolated completion summary changed",
892
+ );
893
+ return {
894
+ id: run.probeId,
895
+ diagnosticCompleted: validation.diagnosticCompleted,
896
+ status: validation.diagnosticCompleted
897
+ ? validation.capabilities[run.probeId]
898
+ : validation.failureKind === "execution-timeout"
899
+ ? "timed-out"
900
+ : "failed",
901
+ cleanupConfirmed: true,
902
+ lastPhase: validation.journal.lastPhase,
903
+ };
904
+ });
905
+ const diagnosticCompleted = probeResults.every(
906
+ (probe) => probe.diagnosticCompleted,
907
+ );
908
+ return {
909
+ diagnosticCompleted,
910
+ allCapabilitiesSupported:
911
+ diagnosticCompleted &&
912
+ probeResults.every((probe) => probe.status === "supported"),
913
+ capabilities: diagnosticCompleted
914
+ ? Object.fromEntries(
915
+ probeResults.map((probe) => [probe.id, probe.status]),
916
+ )
917
+ : {},
918
+ probeResults,
919
+ cleanupConfirmed: true,
920
+ ...(diagnosticCompleted
921
+ ? {}
922
+ : { failureKind: "isolated-probe-incomplete" }),
923
+ };
924
+ }
925
+
926
+ /** Each probe consumes a fresh AppContainer policy and Job. A native timeout can
927
+ * continue only after the per-Job settlement and bounded evidence validate.
928
+ * An integrity/cleanup failure stops the sequence before another policy issues.
929
+ */
930
+ export async function runWindowsNativeEvaluatorCapabilities({
931
+ wallTimeMs = 15000,
932
+ probeTimeoutMs = 1200,
933
+ evidenceDirectory,
934
+ } = {}) {
935
+ requireCondition(process.platform === "win32", "Windows host required");
936
+ requireCondition(
937
+ Number.isSafeInteger(probeTimeoutMs) &&
938
+ probeTimeoutMs >= 100 &&
939
+ probeTimeoutMs <= 5000 &&
940
+ Number.isSafeInteger(wallTimeMs) &&
941
+ wallTimeMs >= probeTimeoutMs * 5 + 3000 &&
942
+ wallTimeMs <= 60000,
943
+ "invalid bounded diagnostic deadlines",
944
+ );
945
+ if (evidenceDirectory) {
946
+ requireCondition(
947
+ path.isAbsolute(evidenceDirectory),
948
+ "absolute evidence path required",
949
+ );
950
+ fs.mkdirSync(evidenceDirectory, { mode: 0o700 });
951
+ }
952
+ const report = {
953
+ schema: ISOLATED_SCHEMA,
954
+ startedAt: new Date().toISOString(),
955
+ platform: process.platform,
956
+ osRelease: os.release(),
957
+ nodeVersion: process.version,
958
+ architecture: process.arch,
959
+ formalSample: false,
960
+ providerAssessed: false,
961
+ fullReviewPackAssessed: false,
962
+ wallTimeMs,
963
+ probeTimeoutMs,
964
+ diagnosticCompleted: false,
965
+ stageRetained: false,
966
+ runs: [],
967
+ };
968
+ const usedStages = new Set();
969
+ try {
970
+ for (const probeId of PROBES) {
971
+ const run = await runIsolatedProbe({
972
+ wallTimeMs,
973
+ probeTimeoutMs,
974
+ probeId,
975
+ usedStages,
976
+ expectedBrokerFiles: report.runs[0]?.brokerFiles,
977
+ evidenceDirectory: evidenceDirectory
978
+ ? path.join(evidenceDirectory, probeId)
979
+ : undefined,
980
+ });
981
+ report.runs.push(run);
982
+ report.stageRetained ||= run.stageRetained;
983
+ if (!run.integrityConfirmed || run.cleanupError || run.sourceRetained) {
984
+ report.failureKind = run.failureKind || "diagnostic-incomplete";
985
+ report.retentionReason = run.retentionReason;
986
+ report.error = run.error || run.cleanupError || run.sourceCleanupError;
987
+ report.stoppedAfter = probeId;
988
+ break;
989
+ }
990
+ requireCondition(
991
+ JSON.stringify(run.brokerFiles) ===
992
+ JSON.stringify(report.runs[0].brokerFiles),
993
+ "broker source or binary changed between isolated probes",
994
+ );
995
+ }
996
+ if (report.runs.length === PROBES.length && !report.stoppedAfter) {
997
+ report.validation = validateIsolatedReport(report, {
998
+ allowPartial: true,
999
+ });
1000
+ report.diagnosticCompleted = report.validation.diagnosticCompleted;
1001
+ if (!report.diagnosticCompleted) {
1002
+ report.failureKind = report.validation.failureKind;
1003
+ report.retentionReason = "diagnostic-incomplete";
1004
+ }
1005
+ }
1006
+ } catch (error) {
1007
+ report.error = String(error.stack || error);
1008
+ report.failureKind ||= "diagnostic-incomplete";
1009
+ }
1010
+ report.finishedAt = new Date().toISOString();
1011
+ if (evidenceDirectory)
1012
+ fs.writeFileSync(
1013
+ path.join(evidenceDirectory, "report.json"),
1014
+ `${JSON.stringify(report, null, 2)}\n`,
1015
+ { flag: "wx" },
1016
+ );
1017
+ return report;
1018
+ }