chainlesschain 0.166.90 → 0.166.92

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 (222) hide show
  1. package/README.md +15 -13
  2. package/package.json +4 -4
  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-CZzXRe1-.js → AIOps-C74YzqwJ.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-_AZfbW1Q.js → ActionButton-TFef1hOE.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-CzaUx_wv.js → Analytics-CYsWpkkU.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-xHEeeD-m.js → AppLayout-CFf9kjwu.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-DmTbtudE.js → Artifacts-TQqa94YO.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-Cn4ng4fo.js → Audit-B79ayqfS.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-DLUY1VD2.js → BackgroundAgents-pjkHfLP9.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-B2v--wB6.js → Backup-CE6A-t_r.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-Bgih7yAv.js → BaseInput-CwcgWMBY.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-1MiiA3yA.js → Chat-BIkDNesY.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CPLynmbb.js → ChatBubbleRenderer-DgaokYts.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-DsyBa_NO.js → Checkbox-MbypIy5V.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-B7WCFx9H.js → Codegen-DiFHWDnt.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-D2x4GBGm.js → Col-BNMlYMso.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-Rnwg9nea.js → Community-B3HVyHOX.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-BPczlrRh.js → Compact-C7hlAubb.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-Br1L_wGU.js → Compliance-PaXZu6sE.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-DlsWB_oS.js → Cowork-BGiojbm-.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-BWo_KGpG.js → Cron-Bmr-1QAx.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-Cug7N8ge.js → Crosschain-BwUvWCVd.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CMbyOZJN.js → DID-k_4QZocW.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-C4dl_UaE.js → Dashboard-_ieRo2C5.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CBrC7M-9.js → Dropdown-DYHh6T27.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DTq7tU4b.js → EmailListRenderer-BNlQcWQX.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DWP3csxS.js → EvolutionSettings-DIkZ6U2D.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DZl7zuv_.js → FamilyGuardDashboard-Dq7qSr0P.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-W-GSlVK5.js → Federation-C64e3Cbx.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DMB7xYFV.js → FormItemContext-D-GE2vUa.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DNv8GEoq.js → GenericCardRenderer-DO3B2gis.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BZ0Bbzw6.js → Git-0ETirIQH.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BNEdcOM5.js → Governance-C9fnRygX.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-C8249gIz.js → Inference-CLJ9RTsK.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-ngzebU3e.js → KnowledgeGraph-D3C_GxrN.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-CP15th-f.js → Logs-C5ctGbkN.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-Ce-eWK3j.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-CaH59OsY.js → Marketplace-GF_t6hJ_.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-C07vnJev.js → McpTools-BGsGzgQs.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-CqAOkVAS.js → Memory-CcrY2A0j.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-qp7mZimq.js → MobileBridge-Bi4T0RlS.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DKhbqvTw.js → MobileProjects-DvjEGyvf.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-CRYCnWXv.js → Mtc-DL77Vf-k.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-Z08IrKws.js → MtcAudit-CDy_Uswb.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-BWdatUnH.js → Multisig-DL0BAO_c.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-BKWiCZ_m.js → NLProgramming-B-woh5IR.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-Bgpzk3sm.js → Notes-CEFVCxk7.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DvtZEktR.js → NotificationSettings-BqPPMuAP.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-CBcy0szc.js → OrderTableRenderer-GUKQ1xwp.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DRRL6vW1.js → Organization-B1gX8jlr.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-COmfB8Ns.js → Overflow-CeMxuUZy.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-BqMq_DSa.js → P2P-B5aIRWwJ.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-BX7iNvle.js → PdhVaultBrowser-6rYgejd4.js} +4 -4
  56. package/src/assets/web-panel/assets/{Permissions-DzYkjmV_.js → Permissions-CqCp2SIl.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BBTcxBbN.js → PersonalDataHub-BsA7DJWW.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-eRkYFSbO.js → Pipeline-CiW6HeZh.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Ch7IFKBh.js → Privacy-DckUOLYq.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-Ci8EcBYg.js → ProjectInit-CZppOOYR.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-B4lYHFbI.js → ProjectSettings-B9QPzhDU.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-zkE5cCo_.js → Projects-BErjjGha.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BKDVD3_e.js → Providers-DehU6Qiz.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-BromrHlf.js → QrScannerModal-E1SUvv1m.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-CCgoY1gR.js → QuickAsk-COWFxyH3.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DCPZvpq7.js → Recommend-D26pWKxX.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DPnFP8HU.js → RemoteSession-DCOIaId3.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-l6r8ytAs.js → Reputation-DT_AHGAR.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-ke9Mk1cx.js → Row-B50S-1nl.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-DQOEzUEn.js → RssFeed-BaBnHg3Q.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-BqgA0aUz.js → Search-BVdnLuuS.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-FeGD_jqV.js → Security-BnacH74J.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-4kiYYAjZ.js → Services-CxM08Zch.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-BbU8Xegs.js → Skeleton-DE7CIc1N.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-Dl2bUMUL.js → Skills-CGI0SJmf.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-xRGALeaZ.js → Sla-DpEzPcqc.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-DZfd4RDm.js → SpeechSettings-CTmnmMHn.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BRtCV9Ga.js → SyncSettings-Dxgrd9hd.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-DVRQklfG.js → Tasks-CW4slS0A.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BbhE5jt5.js → Templates-DxvGWDgB.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-qXPDNKbK.js → Tenant-_Q0o2tNK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CV48Ks7E.js → Terminal-BTZn8pow.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-BLGfJIDr.js → TimelineRenderer-CauL0KFe.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-7G9H6Hrt.js → Tokens-CDoM2qeT.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger--F64N11F.js → Trigger-B-QYGEU7.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Cq1r-D_y.js → Trust-BD6XJHT-.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-Dqyu4RVh.js → UkeySign-x4TFwCy0.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-DuFmWH_B.js → VideoEditing-t3imBK_0.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-C3mg7EWP.js → Wallet-BCfkWwNC.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-CDK-Aj_X.js → WebAuthn-WH314Mdm.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor--K7K-T1F.js → WorkflowEditor-jUlcjrUg.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BQDcS6VP.js → chat-Dg3VASTL.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BKxJL2-T.js → colors-BNvmBRKE.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-CFjQAMbY.js → compact-item-BGOfoqf4.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DbgCsdQd.js → createContext-BNQeqKAs.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BhkaOBNv.js → hasIn-Bg3AjCrq.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DvWWFJHJ.js → index--I3UF5t1.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DJ2OiRvh.js → index-2D04Zltx.js} +3 -3
  100. package/src/assets/web-panel/assets/{index-BuWPqSGT.js → index-60AnjUTX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-D2Zb-Kd1.js → index-7QJUWemf.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C0DzhUOX.js → index-B--0QM0S.js} +1 -1
  103. package/src/assets/web-panel/assets/index-B-jSKJK6.js +1 -0
  104. package/src/assets/web-panel/assets/{index-COGy6wXn.js → index-B0mgngoB.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-bMX8BBLE.js → index-BBCMulQ-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CE506mgj.js → index-BSNhW95G.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CoOu7sdP.js → index-B_JmInC0.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B4LlAJqc.js → index-BaPvEvB4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CRtUDiXx.js → index-Bkz1tgFR.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Du_SxxBY.js → index-BmTacaQV.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CSUDlsIr.js → index-CCFZN66A.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-3uR0ThJO.js → index-COol3xfA.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DmYK9Tqt.js → index-CY8cRKHR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-T9ka3Xj3.js → index-Cbp-wp-U.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CB4oHynY.js → index-Co_LnCWD.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DEwHywz9.js → index-Cx2EXRfr.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CUs7XpUO.js → index-D-mSvCQK.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BRqlCTrz.js → index-D072oLjp.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-sKfUUldY.js → index-D6UqK83L.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dhfa_BIl.js → index-DF_FKSVH.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D9sVcw6v.js → index-DLwEXRrb.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-3djsY75k.js → index-DO0VlNtc.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BfGGsAU7.js → index-DS04wRll.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dn2QSsuI.js → index-DYn5DnDk.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D-Yh3-1z.js → index-D_O2ZjPk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BNjYPJNU.js → index-DcCnO0RU.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DP1NrM9J.js → index-Dkp-okWa.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DdcrixaQ.js → index-OUFoxUgH.js} +1 -1
  129. package/src/assets/web-panel/assets/index-P4FXZJqI.js +1 -0
  130. package/src/assets/web-panel/assets/{index-7BY44UEv.js → index-Wo0f2iqb.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DjmVlpap.js → index-ZD5Kd8tx.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-3YutaXnp.js → index-fOwii3LP.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-aPdVzagA.js → index-hG7jXGEW.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-De7daEnc.js → index-pVdQieac.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CJoXgJ2N.js → index-uH2LnAs_.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DFt48Z-x.js → index-xzaUx19r.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-wrqabmui.js → initDefaultProps-B8PN9AxJ.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BoyB3ilP.js → motion-BHivfw5Q.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Cq31cSFE.js → move-B0QU5nDd.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BkxNt-8H.js → mtc-parser-DRwRM3PE.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DofGni53.js → omit-SHt2rV2p.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-BnluLL16.js → pickAttrs-CcmDlEb2.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-C-yegJSP.js → placementArrow-DYatmXDS.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-CD3ziNhu.js → responsiveObserve-B7qrsXq5.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-ToZO4gQ1.js → slide-BRGhlOWd.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-DFVmDmVl.js → statusUtils-CT-7NXsQ.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-De0Y8g1O.js → styleChecker-rZdw_Yyp.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-wBKIYFKX.js → useFlexGapSupport-D8YNIP4P.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-CP9nmUMJ.js → useFs-B8pt0Gu-.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-vFGrVDyp.js → usePersonalDataHub-VMmYM1tt.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-BcBIjvjH.js → vnode-UNDuoPoq.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-DnXDAQxA.js → zoom-dN-u667S.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/agent-process-ownership.js +121 -0
  156. package/src/commands/agent.js +2 -0
  157. package/src/commands/hub.js +86 -9
  158. package/src/data/changelog.json +54 -2
  159. package/src/lib/audit-logger.js +46 -20
  160. package/src/lib/checkpoint-restore-saga.js +11 -1
  161. package/src/lib/eval/verify01-host-evidence.js +36 -3
  162. package/src/lib/evolution/evolution-artifact-ports.js +26 -0
  163. package/src/lib/evolution/evolution-eval-cohort-enrollment.js +713 -47
  164. package/src/lib/evolution/evolution-eval-gate.js +146 -0
  165. package/src/lib/evolution/evolution-eval-launch-admission.js +168 -90
  166. package/src/lib/evolution/evolution-eval-ledger-capture.js +50 -0
  167. package/src/lib/evolution/evolution-eval-readonly-audit.js +106 -0
  168. package/src/lib/evolution/evolution-ledger-file-backend.js +20 -0
  169. package/src/lib/evolution/evolution-ledger-ports.js +59 -27
  170. package/src/lib/evolution/evolution-ledger-v2-journal.js +55 -18
  171. package/src/lib/evolution/evolution-workbench-file-resources.js +19 -1
  172. package/src/lib/evolution/rrsi-cohort-registration.js +275 -0
  173. package/src/lib/evolution/rrsi-contracts.js +742 -0
  174. package/src/lib/evolution/rrsi-data.js +196 -0
  175. package/src/lib/evolution/rrsi-evaluation-adapter.js +275 -0
  176. package/src/lib/evolution/rrsi-evaluation-variants.js +267 -0
  177. package/src/lib/evolution/rrsi-group-statistics.js +553 -0
  178. package/src/lib/evolution/rrsi-history-ledger-adapter.js +3261 -0
  179. package/src/lib/evolution/rrsi-native-batch-evidence.js +520 -0
  180. package/src/lib/evolution/rrsi-native-eval-row-collector.js +538 -0
  181. package/src/lib/evolution/rrsi-native-evaluation-batch.js +547 -0
  182. package/src/lib/evolution/rrsi-native-evaluation-plan.js +431 -0
  183. package/src/lib/evolution/rrsi-native-group-statistics-plan.js +121 -0
  184. package/src/lib/evolution/rrsi-native-group-statistics.js +482 -0
  185. package/src/lib/evolution/rrsi-native-quality-receipt-contracts.js +321 -0
  186. package/src/lib/evolution/rrsi-native-quality-receipt.js +256 -0
  187. package/src/lib/evolution/rrsi-native-statistics-protocol.js +330 -0
  188. package/src/lib/evolution/rrsi-parent-binding.js +290 -0
  189. package/src/lib/evolution/rrsi-pm-execution-bridge.js +500 -0
  190. package/src/lib/evolution/rrsi-pm-training-mapping.js +134 -0
  191. package/src/lib/evolution/rrsi-preparation-contracts.js +213 -0
  192. package/src/lib/evolution/rrsi-registry-history-binding.js +193 -0
  193. package/src/lib/evolution/rrsi-registry-store-policy.js +1191 -0
  194. package/src/lib/evolution/rrsi-runtime-composition.js +79 -0
  195. package/src/lib/evolution/rrsi-selector.js +434 -0
  196. package/src/lib/evolution/rrsi-statistics-simulation.js +354 -0
  197. package/src/lib/evolution/skill-candidate-registry.js +216 -29
  198. package/src/lib/evolution/skill-registry-maintenance.js +80 -0
  199. package/src/lib/evolution/skill-registry-writer-control.js +138 -0
  200. package/src/lib/evolution/skill-release-registry.js +399 -169
  201. package/src/lib/formal-quality-eval-runtime.js +2 -14
  202. package/src/lib/goal-store.js +225 -16
  203. package/src/lib/process-execution-broker/index.js +91 -1
  204. package/src/lib/process-execution-broker/platform-sandbox.js +42 -0
  205. package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +757 -0
  206. package/src/lib/process-execution-broker/windows-native-evaluator.js +316 -0
  207. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  208. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  209. package/src/lib/process-execution-broker/windows-sandbox.cs +383 -11
  210. package/src/lib/record-replay/skill-recorder.js +38 -3
  211. package/src/lib/scheduler-kernel/authority-resolver.js +12 -163
  212. package/src/lib/scheduler-kernel/contract.js +27 -414
  213. package/src/lib/scheduler-kernel/runtime.js +21 -823
  214. package/src/lib/scheduler-kernel/service.js +11 -328
  215. package/src/lib/scheduler-kernel/source-locator-path.js +7 -142
  216. package/src/lib/scheduler-kernel/store.js +67 -5931
  217. package/src/lib/secure-fs.js +16 -1314
  218. package/src/lib/with-file-lock.js +122 -20
  219. package/src/assets/web-panel/assets/MarkdownRenderer-CW3B3JDq.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DlIv9Mbc.js +0 -1
  221. package/src/assets/web-panel/assets/index-BC972Grv.js +0 -1
  222. package/src/assets/web-panel/assets/index-CVifyQqL.js +0 -1
@@ -0,0 +1,316 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { createHash } from "node:crypto";
5
+
6
+ const issued = new WeakMap();
7
+ const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
8
+ const MAX_FILE_BYTES = 1024 * 1024;
9
+ const MAX_TOTAL_BYTES = 8 * MAX_FILE_BYTES;
10
+ const MAX_FILES = 64;
11
+ function requireCondition(condition, message) {
12
+ if (!condition) throw new Error(`Windows native evaluator: ${message}`);
13
+ }
14
+ function identity(file, directory = false, maxBytes = MAX_FILE_BYTES) {
15
+ const stat = fs.lstatSync(file, { bigint: true });
16
+ requireCondition(
17
+ !stat.isSymbolicLink() && (directory ? stat.isDirectory() : stat.isFile()),
18
+ "plain paths required",
19
+ );
20
+ if (!directory)
21
+ requireCondition(stat.nlink === 1n, "hard-linked files are forbidden");
22
+ if (!directory)
23
+ requireCondition(stat.size <= BigInt(maxBytes), "file exceeds byte limit");
24
+ requireCondition(
25
+ fs.realpathSync.native(file).toLowerCase() ===
26
+ path.resolve(file).toLowerCase(),
27
+ "path alias forbidden",
28
+ );
29
+ return {
30
+ path: file,
31
+ dev: String(stat.dev),
32
+ ino: String(stat.ino),
33
+ ...(directory
34
+ ? {}
35
+ : { bytes: Number(stat.size), sha256: hash(fs.readFileSync(file)) }),
36
+ };
37
+ }
38
+ function relativeFile(value) {
39
+ requireCondition(
40
+ typeof value === "string" && value.length <= 180,
41
+ "invalid relative file",
42
+ );
43
+ const parts = value.split("/");
44
+ requireCondition(
45
+ parts.length <= 8 &&
46
+ parts.every(
47
+ (part) =>
48
+ /^[A-Za-z0-9_-][A-Za-z0-9_.-]*$/u.test(part) &&
49
+ !part.endsWith(".") &&
50
+ !/^(?:con|prn|aux|nul|com[0-9]|lpt[0-9])(?:\.|$)/iu.test(part),
51
+ ),
52
+ "invalid relative file",
53
+ );
54
+ return parts;
55
+ }
56
+ function snapshotFile(root, relative) {
57
+ const parts = relativeFile(relative);
58
+ let current = root;
59
+ for (const [index, part] of parts.entries()) {
60
+ current = path.join(current, part);
61
+ identity(current, index < parts.length - 1);
62
+ }
63
+ const before = identity(current);
64
+ requireCondition(before.bytes <= MAX_FILE_BYTES, "source file exceeds 1 MiB");
65
+ const bytes = fs.readFileSync(current);
66
+ const after = identity(current);
67
+ requireCondition(
68
+ JSON.stringify(before) === JSON.stringify(after) &&
69
+ hash(bytes) === before.sha256,
70
+ "source changed during capture",
71
+ );
72
+ return bytes;
73
+ }
74
+
75
+ /** Narrow first-stage native evaluator, not a general workspace sandbox.
76
+ * No existing directory can be nominated as its staging or ACL target.
77
+ * Source bytes and the trusted evaluator are copied before any policy exists.
78
+ */
79
+ export function createWindowsNativeEvaluator(options) {
80
+ requireCondition(process.platform === "win32", "Windows host required");
81
+ requireCondition(
82
+ options &&
83
+ Object.keys(options).every((key) =>
84
+ ["sourceRoot", "files", "checkSource", "wallTimeMs"].includes(key),
85
+ ),
86
+ "unknown factory option",
87
+ );
88
+ const { sourceRoot, files, checkSource, wallTimeMs = 10000 } = options;
89
+ requireCondition(
90
+ Number.isSafeInteger(wallTimeMs) &&
91
+ wallTimeMs >= 1 &&
92
+ wallTimeMs <= 3600000,
93
+ "invalid wall-time limit",
94
+ );
95
+ requireCondition(
96
+ Array.isArray(files) && files.length > 0 && files.length <= MAX_FILES,
97
+ "expected 1..64 source files",
98
+ );
99
+ requireCondition(
100
+ new Set(files.map((file) => String(file).toLowerCase())).size ===
101
+ files.length,
102
+ "duplicate source file",
103
+ );
104
+ requireCondition(
105
+ typeof checkSource === "string" &&
106
+ Buffer.byteLength(checkSource) > 0 &&
107
+ Buffer.byteLength(checkSource) <= MAX_FILE_BYTES,
108
+ "check must be bounded source bytes",
109
+ );
110
+ const source = path.resolve(sourceRoot);
111
+ identity(source, true);
112
+ const captures = files.map((relative) => ({
113
+ relative,
114
+ bytes: snapshotFile(source, relative),
115
+ }));
116
+ const directoryNames = new Set(["", "workspace", "control", "scratch"]);
117
+ for (const file of files) {
118
+ const parts = relativeFile(file);
119
+ for (let depth = 1; depth < parts.length; depth++)
120
+ directoryNames.add(`workspace/${parts.slice(0, depth).join("/")}`);
121
+ }
122
+ requireCondition(directoryNames.size <= 128, "too many stage directories");
123
+ requireCondition(
124
+ captures.reduce(
125
+ (total, file) => total + file.bytes.length,
126
+ Buffer.byteLength(checkSource),
127
+ ) <= MAX_TOTAL_BYTES,
128
+ "stage exceeds 8 MiB",
129
+ );
130
+ const sourceRuntime = identity(
131
+ fs.realpathSync.native(process.execPath),
132
+ false,
133
+ 128 * MAX_FILE_BYTES,
134
+ );
135
+ const root = fs.mkdtempSync(
136
+ path.join(fs.realpathSync.native(os.tmpdir()), "cc-native-evaluator-"),
137
+ );
138
+ const directories = new Set([root]);
139
+ const ensure = (directory) => {
140
+ if (directories.has(directory)) return;
141
+ ensure(path.dirname(directory));
142
+ fs.mkdirSync(directory, { mode: 0o700 });
143
+ directories.add(directory);
144
+ };
145
+ const workspace = path.join(root, "workspace");
146
+ const control = path.join(root, "control");
147
+ const scratch = path.join(root, "scratch");
148
+ for (const directory of [workspace, control, scratch]) ensure(directory);
149
+ // Copy the runtime too: granting access to a caller-owned installation would
150
+ // widen the ACL change beyond this factory's private stage.
151
+ const runtimePath = path.join(control, "node.exe");
152
+ fs.copyFileSync(sourceRuntime.path, runtimePath, fs.constants.COPYFILE_EXCL);
153
+ const runtime = identity(runtimePath, false, 128 * MAX_FILE_BYTES);
154
+ requireCondition(
155
+ runtime.bytes === sourceRuntime.bytes &&
156
+ runtime.sha256 === sourceRuntime.sha256,
157
+ "runtime changed during capture",
158
+ );
159
+ const stagedFiles = [];
160
+ for (const capture of captures) {
161
+ const target = path.join(workspace, ...relativeFile(capture.relative));
162
+ ensure(path.dirname(target));
163
+ fs.writeFileSync(target, capture.bytes, { flag: "wx", mode: 0o600 });
164
+ stagedFiles.push(identity(target));
165
+ }
166
+ const check = path.join(control, "check.cjs");
167
+ fs.writeFileSync(check, checkSource, { flag: "wx", mode: 0o600 });
168
+ stagedFiles.push(identity(check));
169
+ requireCondition(directories.size <= 128, "too many stage directories");
170
+ const manifest = Object.freeze({
171
+ version: 1,
172
+ root,
173
+ workspace,
174
+ control,
175
+ scratch,
176
+ check,
177
+ wallTimeMs,
178
+ runtime: Object.freeze(runtime),
179
+ directories: Object.freeze(
180
+ [...directories]
181
+ .sort((a, b) => a.length - b.length || a.localeCompare(b))
182
+ .map((directory) => Object.freeze(identity(directory, true))),
183
+ ),
184
+ files: Object.freeze(stagedFiles.map(Object.freeze)),
185
+ });
186
+ const manifestDigest = hash(JSON.stringify(manifest));
187
+ const token = Object.freeze({
188
+ kind: "windows-native-evaluator-v1",
189
+ manifestDigest,
190
+ });
191
+ issued.set(token, { manifest, manifestDigest });
192
+ let attempted = false;
193
+ let settled = false;
194
+ const rootIdentity = identity(root, true);
195
+ return Object.freeze({
196
+ root,
197
+ manifest,
198
+ policy: token,
199
+ manifestDigest,
200
+ async execute() {
201
+ requireCondition(!attempted, "evaluator policy already consumed");
202
+ attempted = true;
203
+ const receiptPath = path.join(root, "settlement.json");
204
+ requireCondition(
205
+ !fs.existsSync(receiptPath),
206
+ "pre-existing settlement forbidden",
207
+ );
208
+ const { executionBroker } = await import("./index.js");
209
+ const result = executionBroker.spawnSync(
210
+ runtime.path,
211
+ [
212
+ "--preserve-symlinks",
213
+ "--preserve-symlinks-main",
214
+ check,
215
+ workspace,
216
+ scratch,
217
+ ],
218
+ {
219
+ cwd: scratch,
220
+ shell: false,
221
+ windowsHide: true,
222
+ encoding: "utf8",
223
+ timeout: wallTimeMs + 180000,
224
+ maxBuffer: 8 * 1024 * 1024,
225
+ env: {
226
+ SystemRoot: process.env.SystemRoot,
227
+ WINDIR: process.env.WINDIR,
228
+ PATH: path.dirname(runtime.path),
229
+ },
230
+ origin: "native-evaluator:check",
231
+ scope: "private-staged-evaluator",
232
+ policy: "allow",
233
+ sandboxPolicy: {
234
+ profile: "default",
235
+ requiredBoundaries: [
236
+ "filesystem",
237
+ "network",
238
+ "process-tree",
239
+ "resource-limits",
240
+ ],
241
+ limits: { wallTimeMs },
242
+ windowsNativeEvaluator: token,
243
+ },
244
+ },
245
+ );
246
+ let receiptIdentity;
247
+ try {
248
+ receiptIdentity = identity(receiptPath);
249
+ } catch (cause) {
250
+ const error = new Error(
251
+ `Windows native evaluator: native settlement unavailable; stage retained (${cause.message}); supervisor status=${result.status}, signal=${result.signal}, error=${result.error?.message || "none"}, stderr=${String(result.stderr || "").trim()}`,
252
+ { cause },
253
+ );
254
+ error.nativeEvaluator = { result, manifestDigest, stage: root };
255
+ throw error;
256
+ }
257
+ requireCondition(
258
+ receiptIdentity.bytes <= 16384,
259
+ "invalid settlement size",
260
+ );
261
+ const receipt = JSON.parse(fs.readFileSync(receiptPath, "utf8"));
262
+ requireCondition(
263
+ receipt.manifestDigest === manifestDigest &&
264
+ receipt.cleanupConfirmed === true &&
265
+ receipt.capabilityCount === 0 &&
266
+ receipt.loopbackExemptionAbsent === true &&
267
+ /^[a-f0-9]{64}$/u.test(receipt.supervisorUserSidSha256),
268
+ "native settlement unconfirmed; stage retained",
269
+ );
270
+ settled = true;
271
+ return { result, receipt, manifestDigest };
272
+ },
273
+ dispose() {
274
+ requireCondition(
275
+ !attempted || settled,
276
+ "unconfirmed native cleanup; stage retained",
277
+ );
278
+ issued.delete(token);
279
+ requireCondition(
280
+ JSON.stringify(identity(root, true)) === JSON.stringify(rootIdentity),
281
+ "stage root identity changed",
282
+ );
283
+ // The only recursive target is this factory-created, identity-checked root.
284
+ // After execution it is removed only after the native empty-Job fence.
285
+ fs.rmSync(root, { recursive: true });
286
+ },
287
+ });
288
+ }
289
+
290
+ export function consumeWindowsNativeEvaluatorPolicy(token, launch, options) {
291
+ const issuedPolicy = issued.get(token);
292
+ requireCondition(issuedPolicy, "unissued or consumed evaluator policy");
293
+ issued.delete(token);
294
+ const { manifest } = issuedPolicy;
295
+ requireCondition(
296
+ launch.sync === true &&
297
+ launch.command === manifest.runtime.path &&
298
+ JSON.stringify(launch.args) ===
299
+ JSON.stringify([
300
+ "--preserve-symlinks",
301
+ "--preserve-symlinks-main",
302
+ manifest.check,
303
+ manifest.workspace,
304
+ manifest.scratch,
305
+ ]) &&
306
+ path.resolve(options.cwd) === manifest.scratch &&
307
+ options.shell === false &&
308
+ options.detached !== true &&
309
+ options.sandboxPolicy.limits.wallTimeMs === manifest.wallTimeMs,
310
+ "evaluator launch binding mismatch",
311
+ );
312
+ return Object.freeze({
313
+ ...manifest,
314
+ manifestDigest: issuedPolicy.manifestDigest,
315
+ });
316
+ }