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
@@ -1,163 +1,12 @@
1
- import {
2
- SchedulerKernelError,
3
- normalizeAuthorityEnvelope,
4
- normalizeIdentifier,
5
- } from "./contract.js";
6
-
7
- export const DEFAULT_SCHEDULER_AUTHORITY_WINDOW_MS = 24 * 60 * 60 * 1_000;
8
- export const DEFAULT_SCHEDULER_AUTHORITY_MAX_RUNS = 100_000;
9
- export const DEFAULT_SCHEDULER_AUTHORITY_MAX_UNITS = 100_000;
10
-
11
- function authorityError(code, message, details = undefined, cause = undefined) {
12
- const error = new SchedulerKernelError(
13
- code,
14
- message,
15
- details,
16
- cause ? { cause } : undefined,
17
- );
18
- error.retryable = false;
19
- return error;
20
- }
21
-
22
- function assertAuthorityStore(store) {
23
- const methods = [
24
- "ensureAuthorityPolicy",
25
- "getAuthorityPolicy",
26
- "reserveAuthority",
27
- ];
28
- if (!store || methods.some((method) => typeof store[method] !== "function")) {
29
- throw authorityError(
30
- "SCHEDULER_AUTHORITY_STORE_REQUIRED",
31
- "Scheduler authority resolver requires a compatible scheduler store",
32
- );
33
- }
34
- return store;
35
- }
36
-
37
- function normalizeUnits(value) {
38
- if (!Number.isSafeInteger(value) || value < 1) {
39
- throw authorityError(
40
- "SCHEDULER_AUTHORITY_UNITS_INVALID",
41
- "Scheduler authority units must be a positive integer",
42
- );
43
- }
44
- return value;
45
- }
46
-
47
- export function schedulerAuthorityPolicyReference(revision) {
48
- if (!Number.isSafeInteger(revision) || revision < 1) {
49
- throw authorityError(
50
- "SCHEDULER_AUTHORITY_POLICY_INVALID",
51
- "Scheduler authority policy revision must be a positive integer",
52
- );
53
- }
54
- return `scheduler-authority:${revision}`;
55
- }
56
-
57
- export function parseSchedulerAuthorityPolicyReference(value) {
58
- const match = /^scheduler-authority:(\d+)$/u.exec(String(value || ""));
59
- const revision = match ? Number(match[1]) : NaN;
60
- return Number.isSafeInteger(revision) && revision > 0 ? revision : null;
61
- }
62
-
63
- export function bindSchedulerAuthorityPolicy(store, authority, defaults = {}) {
64
- const compatibleStore = assertAuthorityStore(store);
65
- const normalized = normalizeAuthorityEnvelope(authority);
66
- const policy = compatibleStore.ensureAuthorityPolicy(normalized, {
67
- windowMs: defaults.windowMs ?? DEFAULT_SCHEDULER_AUTHORITY_WINDOW_MS,
68
- maxRuns: defaults.maxRuns ?? DEFAULT_SCHEDULER_AUTHORITY_MAX_RUNS,
69
- maxUnits: defaults.maxUnits ?? DEFAULT_SCHEDULER_AUTHORITY_MAX_UNITS,
70
- });
71
- return {
72
- ...normalized,
73
- authorizationRefs: {
74
- ...normalized.authorizationRefs,
75
- schedulerPolicyRevision: schedulerAuthorityPolicyReference(
76
- policy.revision,
77
- ),
78
- },
79
- };
80
- }
81
-
82
- export function createSchedulerAuthorityResolver({
83
- store,
84
- validate,
85
- units = () => 1,
86
- } = {}) {
87
- const compatibleStore = assertAuthorityStore(store);
88
- if (typeof validate !== "function") {
89
- throw authorityError(
90
- "SCHEDULER_AUTHORITY_VALIDATOR_REQUIRED",
91
- "Scheduler authority resolver requires a domain validator",
92
- );
93
- }
94
- if (typeof units !== "function") {
95
- throw authorityError(
96
- "SCHEDULER_AUTHORITY_UNITS_REQUIRED",
97
- "Scheduler authority resolver requires a unit estimator",
98
- );
99
- }
100
- return async (context) => {
101
- const domain = await validate(context);
102
- if (!domain || typeof domain !== "object" || domain.allowed !== true) {
103
- return {
104
- allowed: false,
105
- reason:
106
- typeof domain?.reason === "string"
107
- ? domain.reason.slice(0, 256)
108
- : "domain_authority_denied",
109
- };
110
- }
111
- const authority = normalizeAuthorityEnvelope(
112
- context?.occurrence?.authority,
113
- );
114
- const policy = compatibleStore.getAuthorityPolicy(authority.principal);
115
- if (!policy || !policy.enabled) {
116
- return { allowed: false, reason: "scheduler_authority_policy_required" };
117
- }
118
- const reference = parseSchedulerAuthorityPolicyReference(
119
- authority.authorizationRefs.schedulerPolicyRevision,
120
- );
121
- if (reference === null) {
122
- return { allowed: false, reason: "scheduler_authority_policy_unbound" };
123
- }
124
- if (reference !== policy.revision) {
125
- return { allowed: false, reason: "scheduler_authority_policy_stale" };
126
- }
127
- const occurrenceId = normalizeIdentifier(
128
- context?.occurrence?.id,
129
- "occurrenceId",
130
- );
131
- try {
132
- const requestedUnits = normalizeUnits(await units(context));
133
- const reservation = compatibleStore.reserveAuthority({
134
- occurrenceId,
135
- policyRevision: policy.revision,
136
- units: requestedUnits,
137
- });
138
- return {
139
- allowed: true,
140
- reason: "scheduler_authority_reserved",
141
- policyRevision: policy.revision,
142
- reservation,
143
- };
144
- } catch (cause) {
145
- if (
146
- typeof cause?.code === "string" &&
147
- cause.code.startsWith("SCHEDULER_AUTHORITY_")
148
- ) {
149
- return {
150
- allowed: false,
151
- reason: cause.code.toLowerCase(),
152
- details: cause.details,
153
- };
154
- }
155
- throw authorityError(
156
- "SCHEDULER_AUTHORITY_RESOLUTION_FAILED",
157
- "Scheduler permission and budget resolution failed closed",
158
- undefined,
159
- cause,
160
- );
161
- }
162
- };
163
- }
1
+ // Shared policy reservations; the CLI retains its public ESM entry.
2
+ import authority from "@chainlesschain/session-core/scheduler-authority-resolver";
3
+ export const {
4
+ DEFAULT_SCHEDULER_AUTHORITY_WINDOW_MS,
5
+ DEFAULT_SCHEDULER_AUTHORITY_MAX_RUNS,
6
+ DEFAULT_SCHEDULER_AUTHORITY_MAX_UNITS,
7
+ schedulerAuthorityPolicyReference,
8
+ parseSchedulerAuthorityPolicyReference,
9
+ bindSchedulerAuthorityPolicy,
10
+ checkSchedulerAuthorityPolicy,
11
+ createSchedulerAuthorityResolver,
12
+ } = authority;
@@ -1,414 +1,27 @@
1
- import { createHash } from "node:crypto";
2
- import { Buffer } from "node:buffer";
3
-
4
- export const SCHEDULER_SCHEMA_VERSION = 1;
5
- export const AUTHORITY_ENVELOPE_VERSION = 1;
6
- export const RUNTIME_CONTROL_SCHEMA_VERSION = 1;
7
-
8
- export const RUNTIME_PAUSE_RESUME = Object.freeze({
9
- NONE: "none",
10
- CHECKPOINT_V1: "checkpoint_v1",
11
- });
12
-
13
- export const RUNTIME_CONTROL_SAFE_POINTS = Object.freeze({
14
- BEFORE_EXECUTE: "before_execute",
15
- ADAPTER_CHECKPOINT: "adapter_checkpoint",
16
- });
17
-
18
- const RUNTIME_CONTROL_FIELDS = new Set([
19
- "schemaVersion",
20
- "pauseResume",
21
- "safePoints",
22
- ]);
23
- const RUNTIME_CONTROL_SAFE_POINT_SET = new Set(
24
- Object.values(RUNTIME_CONTROL_SAFE_POINTS),
25
- );
26
-
27
- export const OCCURRENCE_STATUS = Object.freeze({
28
- QUEUED: "queued",
29
- RUNNING: "running",
30
- RETRY_WAIT: "retry_wait",
31
- SUCCEEDED: "succeeded",
32
- DEAD_LETTER: "dead_letter",
33
- });
34
-
35
- export const DEFAULT_MAX_ATTEMPTS = 3;
36
- export const MAX_JOB_ATTEMPTS = 32;
37
- export const DEFAULT_HISTORY_LIMIT = 50;
38
- export const MAX_HISTORY_LIMIT = 200;
39
- export const MAX_JSON_BYTES = 1024 * 1024;
40
-
41
- const AUTHORITY_FIELDS = new Set([
42
- "schemaVersion",
43
- "principal",
44
- "tenantId",
45
- "workspaceId",
46
- "requestedCapabilities",
47
- "authorizationRefs",
48
- ]);
49
- const PRINCIPAL_FIELDS = new Set(["type", "id"]);
50
- const AUTHORIZATION_REF_FIELDS = new Set([
51
- "decisionId",
52
- "policyRevision",
53
- "schedulerPolicyRevision",
54
- "grantIds",
55
- "approvalIds",
56
- "delegationIds",
57
- ]);
58
-
59
- export class SchedulerKernelError extends Error {
60
- constructor(code, message, details = undefined, options = undefined) {
61
- super(message, options);
62
- this.name = "SchedulerKernelError";
63
- this.code = code;
64
- if (details !== undefined) this.details = details;
65
- }
66
- }
67
-
68
- export function invalidArgument(message, details = undefined) {
69
- return new SchedulerKernelError(
70
- "SCHEDULER_INVALID_ARGUMENT",
71
- message,
72
- details,
73
- );
74
- }
75
-
76
- function assertPlainObject(value, field) {
77
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
78
- throw invalidArgument(`${field} must be an object`);
79
- }
80
- const prototype = Object.getPrototypeOf(value);
81
- if (prototype !== Object.prototype && prototype !== null) {
82
- throw invalidArgument(`${field} must be a plain object`);
83
- }
84
- return value;
85
- }
86
-
87
- function assertKnownFields(value, fields, field) {
88
- const unknown = Object.keys(value).filter((key) => !fields.has(key));
89
- if (unknown.length > 0) {
90
- throw invalidArgument(`${field} contains unknown fields`, {
91
- fields: unknown.sort(),
92
- });
93
- }
94
- }
95
-
96
- export function normalizeIdentifier(value, field, { maxLength = 256 } = {}) {
97
- if (typeof value !== "string") {
98
- throw invalidArgument(`${field} must be a string`);
99
- }
100
- const normalized = value.trim();
101
- const hasControlCharacter = [...normalized].some((character) => {
102
- const codePoint = character.codePointAt(0);
103
- return codePoint <= 31 || codePoint === 127;
104
- });
105
- if (
106
- normalized.length === 0 ||
107
- normalized.length > maxLength ||
108
- hasControlCharacter
109
- ) {
110
- throw invalidArgument(`${field} is not a valid identifier`);
111
- }
112
- return normalized;
113
- }
114
-
115
- function normalizeOptionalIdentifier(value, field) {
116
- if (value === undefined || value === null) return null;
117
- return normalizeIdentifier(value, field);
118
- }
119
-
120
- function normalizeIdentifierList(value, field) {
121
- if (value === undefined) return [];
122
- if (!Array.isArray(value)) {
123
- throw invalidArgument(`${field} must be an array`);
124
- }
125
- if (value.length > 256) {
126
- throw invalidArgument(`${field} exceeds 256 entries`);
127
- }
128
- return [
129
- ...new Set(
130
- value.map((entry, index) =>
131
- normalizeIdentifier(entry, `${field}[${index}]`),
132
- ),
133
- ),
134
- ].sort();
135
- }
136
-
137
- /**
138
- * Normalize the authority evidence carried by a job and every occurrence.
139
- *
140
- * This envelope is deliberately descriptive. The scheduler stores the actor,
141
- * requested capabilities and immutable decision/grant references. The runtime
142
- * still has to resolve and enforce those references before doing work.
143
- */
144
- export function normalizeAuthorityEnvelope(input) {
145
- const authority = assertPlainObject(input, "authority");
146
- assertKnownFields(authority, AUTHORITY_FIELDS, "authority");
147
- if (
148
- authority.schemaVersion !== undefined &&
149
- authority.schemaVersion !== AUTHORITY_ENVELOPE_VERSION
150
- ) {
151
- throw invalidArgument(
152
- `authority.schemaVersion must be ${AUTHORITY_ENVELOPE_VERSION}`,
153
- );
154
- }
155
-
156
- const principal = assertPlainObject(
157
- authority.principal,
158
- "authority.principal",
159
- );
160
- assertKnownFields(principal, PRINCIPAL_FIELDS, "authority.principal");
161
- const refs = assertPlainObject(
162
- authority.authorizationRefs ?? {},
163
- "authority.authorizationRefs",
164
- );
165
- assertKnownFields(
166
- refs,
167
- AUTHORIZATION_REF_FIELDS,
168
- "authority.authorizationRefs",
169
- );
170
-
171
- return {
172
- schemaVersion: AUTHORITY_ENVELOPE_VERSION,
173
- principal: {
174
- type: normalizeIdentifier(principal.type, "authority.principal.type", {
175
- maxLength: 64,
176
- }),
177
- id: normalizeIdentifier(principal.id, "authority.principal.id"),
178
- },
179
- tenantId: normalizeOptionalIdentifier(
180
- authority.tenantId,
181
- "authority.tenantId",
182
- ),
183
- workspaceId: normalizeOptionalIdentifier(
184
- authority.workspaceId,
185
- "authority.workspaceId",
186
- ),
187
- requestedCapabilities: normalizeIdentifierList(
188
- authority.requestedCapabilities,
189
- "authority.requestedCapabilities",
190
- ),
191
- authorizationRefs: {
192
- decisionId: normalizeOptionalIdentifier(
193
- refs.decisionId,
194
- "authority.authorizationRefs.decisionId",
195
- ),
196
- policyRevision: normalizeOptionalIdentifier(
197
- refs.policyRevision,
198
- "authority.authorizationRefs.policyRevision",
199
- ),
200
- ...(refs.schedulerPolicyRevision === undefined
201
- ? {}
202
- : {
203
- schedulerPolicyRevision: normalizeOptionalIdentifier(
204
- refs.schedulerPolicyRevision,
205
- "authority.authorizationRefs.schedulerPolicyRevision",
206
- ),
207
- }),
208
- grantIds: normalizeIdentifierList(
209
- refs.grantIds,
210
- "authority.authorizationRefs.grantIds",
211
- ),
212
- approvalIds: normalizeIdentifierList(
213
- refs.approvalIds,
214
- "authority.authorizationRefs.approvalIds",
215
- ),
216
- delegationIds: normalizeIdentifierList(
217
- refs.delegationIds,
218
- "authority.authorizationRefs.delegationIds",
219
- ),
220
- },
221
- };
222
- }
223
-
224
- function normalizeJsonValue(value, field, state, depth) {
225
- if (depth > 64) throw invalidArgument(`${field} exceeds maximum JSON depth`);
226
- if (
227
- value === null ||
228
- typeof value === "string" ||
229
- typeof value === "boolean"
230
- ) {
231
- return value;
232
- }
233
- if (typeof value === "number") {
234
- if (!Number.isFinite(value)) {
235
- throw invalidArgument(`${field} contains a non-finite number`);
236
- }
237
- return Object.is(value, -0) ? 0 : value;
238
- }
239
- if (typeof value !== "object") {
240
- throw invalidArgument(`${field} contains a non-JSON value`);
241
- }
242
- if (state.seen.has(value)) {
243
- throw invalidArgument(`${field} contains a cycle`);
244
- }
245
- state.seen.add(value);
246
- try {
247
- if (Array.isArray(value)) {
248
- return value.map((entry, index) =>
249
- normalizeJsonValue(entry, `${field}[${index}]`, state, depth + 1),
250
- );
251
- }
252
- assertPlainObject(value, field);
253
- // A JSON object may legitimately contain an own `__proto__` key. A normal
254
- // object assignment would interpret that key as a prototype mutation and
255
- // silently drop it from the canonical bytes.
256
- const normalized = Object.create(null);
257
- for (const key of Object.keys(value).sort()) {
258
- normalized[key] = normalizeJsonValue(
259
- value[key],
260
- `${field}.${key}`,
261
- state,
262
- depth + 1,
263
- );
264
- }
265
- return normalized;
266
- } finally {
267
- state.seen.delete(value);
268
- }
269
- }
270
-
271
- export function normalizeJson(value, field = "value") {
272
- const normalized = normalizeJsonValue(value, field, { seen: new Set() }, 0);
273
- const encoded = JSON.stringify(normalized);
274
- if (Buffer.byteLength(encoded, "utf8") > MAX_JSON_BYTES) {
275
- throw invalidArgument(`${field} exceeds ${MAX_JSON_BYTES} encoded bytes`);
276
- }
277
- return normalized;
278
- }
279
-
280
- export function canonicalJson(value, field = "value") {
281
- return JSON.stringify(normalizeJson(value, field));
282
- }
283
-
284
- export function normalizeEpochMs(value, field) {
285
- if (!Number.isSafeInteger(value) || value < 0) {
286
- throw invalidArgument(
287
- `${field} must be a non-negative safe-integer epoch ms`,
288
- );
289
- }
290
- return value;
291
- }
292
-
293
- export function normalizeMaxAttempts(value = DEFAULT_MAX_ATTEMPTS) {
294
- if (!Number.isSafeInteger(value) || value < 1 || value > MAX_JOB_ATTEMPTS) {
295
- throw invalidArgument(
296
- `maxAttempts must be an integer between 1 and ${MAX_JOB_ATTEMPTS}`,
297
- );
298
- }
299
- return value;
300
- }
301
-
302
- export function normalizeHistoryLimit(value = DEFAULT_HISTORY_LIMIT) {
303
- if (!Number.isSafeInteger(value) || value < 1) {
304
- throw invalidArgument("history limit must be a positive integer");
305
- }
306
- return Math.min(value, MAX_HISTORY_LIMIT);
307
- }
308
-
309
- /**
310
- * Normalize the durable runtime-control capability advertised by an adapter.
311
- *
312
- * Missing declarations are deliberately treated as unsupported. A checkpoint
313
- * declaration is evidence, not a hint: only the two kernel-owned safe points
314
- * are accepted and every persisted pause request is bound to these canonical
315
- * bytes.
316
- */
317
- export function normalizeRuntimeControlCapability(input) {
318
- if (input === undefined || input === null) {
319
- return Object.freeze({
320
- schemaVersion: RUNTIME_CONTROL_SCHEMA_VERSION,
321
- pauseResume: RUNTIME_PAUSE_RESUME.NONE,
322
- safePoints: Object.freeze([]),
323
- });
324
- }
325
- const capability = assertPlainObject(input, "runtimeControl");
326
- assertKnownFields(capability, RUNTIME_CONTROL_FIELDS, "runtimeControl");
327
- if (
328
- capability.schemaVersion !== undefined &&
329
- capability.schemaVersion !== RUNTIME_CONTROL_SCHEMA_VERSION
330
- ) {
331
- throw invalidArgument(
332
- `runtimeControl.schemaVersion must be ${RUNTIME_CONTROL_SCHEMA_VERSION}`,
333
- );
334
- }
335
- const pauseResume = capability.pauseResume ?? RUNTIME_PAUSE_RESUME.NONE;
336
- if (!Object.values(RUNTIME_PAUSE_RESUME).includes(pauseResume)) {
337
- throw invalidArgument(
338
- "runtimeControl.pauseResume must be none or checkpoint_v1",
339
- );
340
- }
341
- const inputSafePoints = capability.safePoints ?? [];
342
- if (!Array.isArray(inputSafePoints)) {
343
- throw invalidArgument("runtimeControl.safePoints must be an array");
344
- }
345
- const safePoints = [
346
- ...new Set(
347
- inputSafePoints.map((safePoint, index) =>
348
- normalizeIdentifier(safePoint, `runtimeControl.safePoints[${index}]`, {
349
- maxLength: 64,
350
- }),
351
- ),
352
- ),
353
- ].sort();
354
- const unknownSafePoints = safePoints.filter(
355
- (safePoint) => !RUNTIME_CONTROL_SAFE_POINT_SET.has(safePoint),
356
- );
357
- if (unknownSafePoints.length > 0) {
358
- throw invalidArgument("runtimeControl.safePoints contains unknown values", {
359
- safePoints: unknownSafePoints,
360
- });
361
- }
362
- if (
363
- (pauseResume === RUNTIME_PAUSE_RESUME.NONE && safePoints.length !== 0) ||
364
- (pauseResume === RUNTIME_PAUSE_RESUME.CHECKPOINT_V1 &&
365
- safePoints.length === 0)
366
- ) {
367
- throw invalidArgument(
368
- pauseResume === RUNTIME_PAUSE_RESUME.NONE
369
- ? "runtimeControl.safePoints must be empty when pauseResume is none"
370
- : "runtimeControl.safePoints must declare at least one checkpoint",
371
- );
372
- }
373
- return Object.freeze({
374
- schemaVersion: RUNTIME_CONTROL_SCHEMA_VERSION,
375
- pauseResume,
376
- safePoints: Object.freeze(safePoints),
377
- });
378
- }
379
-
380
- /**
381
- * Stable identity for one logical firing. All adapters must supply the same
382
- * triggerKey for the same logical schedule. Including jobRevision prevents an
383
- * edited job from silently inheriting the old definition's idempotency slot.
384
- */
385
- export function deriveOccurrenceIdentity({
386
- jobId,
387
- jobRevision,
388
- scheduledFor,
389
- triggerKey,
390
- }) {
391
- const material = canonicalJson(
392
- {
393
- contractVersion: SCHEDULER_SCHEMA_VERSION,
394
- jobId: normalizeIdentifier(jobId, "jobId"),
395
- jobRevision:
396
- Number.isSafeInteger(jobRevision) && jobRevision >= 1
397
- ? jobRevision
398
- : (() => {
399
- throw invalidArgument("jobRevision must be a positive integer");
400
- })(),
401
- scheduledFor: normalizeEpochMs(scheduledFor, "scheduledFor"),
402
- triggerKey: normalizeIdentifier(triggerKey, "triggerKey"),
403
- },
404
- "occurrenceIdentity",
405
- );
406
- const digest = createHash("sha256")
407
- .update("chainlesschain.scheduler.occurrence.v1\0", "utf8")
408
- .update(material, "utf8")
409
- .digest("hex");
410
- return Object.freeze({
411
- occurrenceId: `occ_${digest}`,
412
- idempotencyKey: `scheduler:v1:${digest}`,
413
- });
414
- }
1
+ // Compatibility entry: both hosts share the same implementation and error type.
2
+ import schedulerContract from "@chainlesschain/session-core/scheduler-contract";
3
+
4
+ export const {
5
+ SCHEDULER_SCHEMA_VERSION,
6
+ AUTHORITY_ENVELOPE_VERSION,
7
+ RUNTIME_CONTROL_SCHEMA_VERSION,
8
+ RUNTIME_PAUSE_RESUME,
9
+ RUNTIME_CONTROL_SAFE_POINTS,
10
+ OCCURRENCE_STATUS,
11
+ DEFAULT_MAX_ATTEMPTS,
12
+ MAX_JOB_ATTEMPTS,
13
+ DEFAULT_HISTORY_LIMIT,
14
+ MAX_HISTORY_LIMIT,
15
+ MAX_JSON_BYTES,
16
+ SchedulerKernelError,
17
+ invalidArgument,
18
+ normalizeIdentifier,
19
+ normalizeAuthorityEnvelope,
20
+ normalizeJson,
21
+ canonicalJson,
22
+ normalizeEpochMs,
23
+ normalizeMaxAttempts,
24
+ normalizeHistoryLimit,
25
+ normalizeRuntimeControlCapability,
26
+ deriveOccurrenceIdentity,
27
+ } = schedulerContract;