chainlesschain 0.166.91 → 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.
- package/README.md +17 -17
- package/package.json +3 -3
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DgV7xb8F.js → AIOps-C74YzqwJ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CgANpkKu.js → ActionButton-TFef1hOE.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DnvpX7RB.js → Analytics-CYsWpkkU.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-C2bHccBM.js → AppLayout-CFf9kjwu.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-BIhijC9g.js → Artifacts-TQqa94YO.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CKRjWGdp.js → Audit-B79ayqfS.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CblYtgBE.js → BackgroundAgents-pjkHfLP9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cq35b78a.js → Backup-CE6A-t_r.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DcB7NoRz.js → BaseInput-CwcgWMBY.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-tc3b-s7i.js → Chat-BIkDNesY.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DgaokYts.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BLD5bH5u.js → Checkbox-MbypIy5V.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BLOsoazN.js → Codegen-DiFHWDnt.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Bdr7JwIx.js → Col-BNMlYMso.js} +1 -1
- package/src/assets/web-panel/assets/{Community-C84BsWE0.js → Community-B3HVyHOX.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dzdwd04z.js → Compact-C7hlAubb.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CCG-R0EV.js → Compliance-PaXZu6sE.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BYj72SK0.js → Cowork-BGiojbm-.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-B6iKAwOf.js → Cron-Bmr-1QAx.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BJ-oDC6u.js → Crosschain-BwUvWCVd.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BnMckGLr.js → DID-k_4QZocW.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Cyje-gCO.js → Dashboard-_ieRo2C5.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BpNlenjK.js → Dropdown-DYHh6T27.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BhonO7Nv.js → EmailListRenderer-BNlQcWQX.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DVoNU-Id.js → EvolutionSettings-DIkZ6U2D.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-tdn-KC67.js → FamilyGuardDashboard-Dq7qSr0P.js} +1 -1
- package/src/assets/web-panel/assets/{Federation--EEVrHhz.js → Federation-C64e3Cbx.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cy8zr0-4.js → FormItemContext-D-GE2vUa.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BuUhpgFi.js → GenericCardRenderer-DO3B2gis.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Ctd3E5Pe.js → Git-0ETirIQH.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Ce7dV6aU.js → Governance-C9fnRygX.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CD1vExIH.js → Inference-CLJ9RTsK.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Dn64OdQ7.js → KnowledgeGraph-D3C_GxrN.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-PmElVRrT.js → Logs-C5ctGbkN.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Ce-eWK3j.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-OW4jTXwx.js → Marketplace-GF_t6hJ_.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BEq2Ib4x.js → McpTools-BGsGzgQs.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Can_P2oK.js → Memory-CcrY2A0j.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DJ8R-dn3.js → MobileBridge-Bi4T0RlS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-B7kV9GOt.js → MobileProjects-DvjEGyvf.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BfxamolS.js → Mtc-DL77Vf-k.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DHtuv7av.js → MtcAudit-CDy_Uswb.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DLkLpvxc.js → Multisig-DL0BAO_c.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-u4XtJTIt.js → NLProgramming-B-woh5IR.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BwuuPJLS.js → Notes-CEFVCxk7.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-HEeu-E9v.js → NotificationSettings-BqPPMuAP.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BtvN-Qwh.js → OrderTableRenderer-GUKQ1xwp.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Yh-czs3b.js → Organization-B1gX8jlr.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DmE8mYVM.js → Overflow-CeMxuUZy.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CWVck8WN.js → P2P-B5aIRWwJ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DgFqekod.js → PdhVaultBrowser-6rYgejd4.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BtJBVOHV.js → Permissions-CqCp2SIl.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-6VBObXzd.js → PersonalDataHub-BsA7DJWW.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-D222FmqY.js → Pipeline-CiW6HeZh.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bi9FMikp.js → Privacy-DckUOLYq.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bo52H47H.js → ProjectInit-CZppOOYR.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BPkesfOc.js → ProjectSettings-B9QPzhDU.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-GynohSFX.js → Projects-BErjjGha.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DVdMg04n.js → Providers-DehU6Qiz.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DqJCb595.js → QrScannerModal-E1SUvv1m.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-J7loQbXi.js → QuickAsk-COWFxyH3.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BI5aURVc.js → Recommend-D26pWKxX.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BN2sqGvz.js → RemoteSession-DCOIaId3.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BGOND-Fi.js → Reputation-DT_AHGAR.js} +1 -1
- package/src/assets/web-panel/assets/{Row-77dfwaUk.js → Row-B50S-1nl.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-FtBAxS3g.js → RssFeed-BaBnHg3Q.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BaYVLFb7.js → Search-BVdnLuuS.js} +1 -1
- package/src/assets/web-panel/assets/{Security-LE3Vv6ab.js → Security-BnacH74J.js} +3 -3
- package/src/assets/web-panel/assets/{Services-C5pP-Whz.js → Services-CxM08Zch.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CLqKUVsF.js → Skeleton-DE7CIc1N.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BPjN0SX5.js → Skills-CGI0SJmf.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-14jD70kg.js → Sla-DpEzPcqc.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Dr9ij42W.js → SpeechSettings-CTmnmMHn.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BzLHP7B8.js → SyncSettings-Dxgrd9hd.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-YqV9b0rV.js → Tasks-CW4slS0A.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CxxAE4PK.js → Templates-DxvGWDgB.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CRb3PcKJ.js → Tenant-_Q0o2tNK.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CTzPpBaP.js → Terminal-BTZn8pow.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DjFUj_hy.js → TimelineRenderer-CauL0KFe.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bbb8tPvx.js → Tokens-CDoM2qeT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CSeWGM0W.js → Trigger-B-QYGEU7.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-JgESMBo3.js → Trust-BD6XJHT-.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CiObLk0T.js → UkeySign-x4TFwCy0.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CFEZaQ2x.js → VideoEditing-t3imBK_0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DR8ZGDNn.js → Wallet-BCfkWwNC.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DxZukvu7.js → WebAuthn-WH314Mdm.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CKgSZQwn.js → WorkflowEditor-jUlcjrUg.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CTxEQE66.js → chat-Dg3VASTL.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CAjKMUu3.js → colors-BNvmBRKE.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BXuz49at.js → compact-item-BGOfoqf4.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CFN_Hwr9.js → createContext-BNQeqKAs.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BwoSBSfP.js → hasIn-Bg3AjCrq.js} +1 -1
- package/src/assets/web-panel/assets/{index-u9_DM3ZC.js → index--I3UF5t1.js} +1 -1
- package/src/assets/web-panel/assets/{index-IahILygB.js → index-2D04Zltx.js} +3 -3
- package/src/assets/web-panel/assets/{index-Bqv_Cray.js → index-60AnjUTX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSmFby3Q.js → index-7QJUWemf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTX9CJPx.js → index-B--0QM0S.js} +1 -1
- package/src/assets/web-panel/assets/index-B-jSKJK6.js +1 -0
- package/src/assets/web-panel/assets/{index-C8er4W9u.js → index-B0mgngoB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DViK2bkv.js → index-BBCMulQ-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmkbAADP.js → index-BSNhW95G.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2tEnBPx.js → index-B_JmInC0.js} +1 -1
- package/src/assets/web-panel/assets/{index-_ZtCyUdz.js → index-BaPvEvB4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CN53dE_u.js → index-Bkz1tgFR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bj4hIiLW.js → index-BmTacaQV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Tz5dheZa.js → index-CCFZN66A.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dv7V2kg6.js → index-COol3xfA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu2P6u8m.js → index-CY8cRKHR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw9s2d3c.js → index-Cbp-wp-U.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9yR7zqr.js → index-Co_LnCWD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK4ftQ4d.js → index-Cx2EXRfr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxunxaTw.js → index-D-mSvCQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7kp-zRE.js → index-D072oLjp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CB3kVd9c.js → index-D6UqK83L.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF9lWi1o.js → index-DF_FKSVH.js} +1 -1
- package/src/assets/web-panel/assets/{index-IY9bd5az.js → index-DLwEXRrb.js} +1 -1
- package/src/assets/web-panel/assets/{index-F2E5RCwz.js → index-DO0VlNtc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2o_BBjg.js → index-DS04wRll.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY-gBSm8.js → index-DYn5DnDk.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0QbLlWn.js → index-D_O2ZjPk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjF5BOZx.js → index-DcCnO0RU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CehdwJ_Q.js → index-Dkp-okWa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmXpdcHI.js → index-OUFoxUgH.js} +1 -1
- package/src/assets/web-panel/assets/index-P4FXZJqI.js +1 -0
- package/src/assets/web-panel/assets/{index-t2Ch_JKn.js → index-Wo0f2iqb.js} +1 -1
- package/src/assets/web-panel/assets/{index-T3MTE6jB.js → index-ZD5Kd8tx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cp5y7lX_.js → index-fOwii3LP.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cgk0YEiq.js → index-hG7jXGEW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpdDnZX_.js → index-pVdQieac.js} +1 -1
- package/src/assets/web-panel/assets/{index-o9DpkZKf.js → index-uH2LnAs_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmQITjMU.js → index-xzaUx19r.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BoiGJDoO.js → initDefaultProps-B8PN9AxJ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-5eL4E0pA.js → motion-BHivfw5Q.js} +1 -1
- package/src/assets/web-panel/assets/{move-DjggDi_1.js → move-B0QU5nDd.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Ce8Vo2T3.js → mtc-parser-DRwRM3PE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D1yOBaO2.js → omit-SHt2rV2p.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-8NLceQe8.js → pickAttrs-CcmDlEb2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CsIdBRmQ.js → placementArrow-DYatmXDS.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-GM5NE8En.js → responsiveObserve-B7qrsXq5.js} +1 -1
- package/src/assets/web-panel/assets/{slide-44yj3u49.js → slide-BRGhlOWd.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B8tqtWcX.js → statusUtils-CT-7NXsQ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-NhDPBbyB.js → styleChecker-rZdw_Yyp.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C8Qz1GtN.js → useFlexGapSupport-D8YNIP4P.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-ClUv4kih.js → useFs-B8pt0Gu-.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BwkOVEh6.js → usePersonalDataHub-VMmYM1tt.js} +1 -1
- package/src/assets/web-panel/assets/{vnode--gMF33R0.js → vnode-UNDuoPoq.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DXg3TqOP.js → zoom-dN-u667S.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +39 -0
- package/src/lib/evolution/evolution-artifact-ports.js +26 -0
- package/src/lib/evolution/evolution-eval-cohort-enrollment.js +713 -47
- package/src/lib/evolution/evolution-eval-gate.js +146 -0
- package/src/lib/evolution/evolution-eval-launch-admission.js +168 -90
- package/src/lib/evolution/evolution-eval-ledger-capture.js +50 -0
- package/src/lib/evolution/evolution-eval-readonly-audit.js +106 -0
- package/src/lib/evolution/evolution-ledger-file-backend.js +20 -0
- package/src/lib/evolution/evolution-ledger-ports.js +59 -27
- package/src/lib/evolution/evolution-ledger-v2-journal.js +55 -18
- package/src/lib/evolution/evolution-workbench-file-resources.js +19 -1
- package/src/lib/evolution/rrsi-cohort-registration.js +275 -0
- package/src/lib/evolution/rrsi-contracts.js +742 -0
- package/src/lib/evolution/rrsi-data.js +196 -0
- package/src/lib/evolution/rrsi-evaluation-adapter.js +275 -0
- package/src/lib/evolution/rrsi-evaluation-variants.js +267 -0
- package/src/lib/evolution/rrsi-group-statistics.js +553 -0
- package/src/lib/evolution/rrsi-history-ledger-adapter.js +3261 -0
- package/src/lib/evolution/rrsi-native-batch-evidence.js +520 -0
- package/src/lib/evolution/rrsi-native-eval-row-collector.js +538 -0
- package/src/lib/evolution/rrsi-native-evaluation-batch.js +547 -0
- package/src/lib/evolution/rrsi-native-evaluation-plan.js +431 -0
- package/src/lib/evolution/rrsi-native-group-statistics-plan.js +121 -0
- package/src/lib/evolution/rrsi-native-group-statistics.js +482 -0
- package/src/lib/evolution/rrsi-native-quality-receipt-contracts.js +321 -0
- package/src/lib/evolution/rrsi-native-quality-receipt.js +256 -0
- package/src/lib/evolution/rrsi-native-statistics-protocol.js +330 -0
- package/src/lib/evolution/rrsi-parent-binding.js +290 -0
- package/src/lib/evolution/rrsi-pm-execution-bridge.js +500 -0
- package/src/lib/evolution/rrsi-pm-training-mapping.js +134 -0
- package/src/lib/evolution/rrsi-preparation-contracts.js +213 -0
- package/src/lib/evolution/rrsi-registry-history-binding.js +193 -0
- package/src/lib/evolution/rrsi-registry-store-policy.js +1191 -0
- package/src/lib/evolution/rrsi-runtime-composition.js +79 -0
- package/src/lib/evolution/rrsi-selector.js +434 -0
- package/src/lib/evolution/rrsi-statistics-simulation.js +354 -0
- package/src/lib/evolution/skill-candidate-registry.js +216 -29
- package/src/lib/evolution/skill-registry-maintenance.js +80 -0
- package/src/lib/evolution/skill-registry-writer-control.js +138 -0
- package/src/lib/evolution/skill-release-registry.js +399 -169
- package/src/lib/formal-quality-eval-runtime.js +2 -14
- package/src/lib/goal-store.js +225 -16
- package/src/lib/record-replay/skill-recorder.js +38 -3
- package/src/lib/scheduler-kernel/authority-resolver.js +12 -163
- package/src/lib/scheduler-kernel/contract.js +27 -414
- package/src/lib/scheduler-kernel/runtime.js +21 -823
- package/src/lib/scheduler-kernel/service.js +11 -328
- package/src/lib/scheduler-kernel/source-locator-path.js +7 -142
- package/src/lib/scheduler-kernel/store.js +67 -5931
- package/src/lib/secure-fs.js +16 -1314
- package/src/lib/with-file-lock.js +122 -20
- package/src/assets/web-panel/assets/ChatBubbleRenderer-fcc_Tvqu.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BFiVKf5t.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CfB8DxT2.js +0 -1
- package/src/assets/web-panel/assets/index-CCsRfd0k.js +0 -1
- package/src/assets/web-panel/assets/index-CsmiZIQ4.js +0 -1
|
@@ -1,414 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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;
|