chainlesschain 0.166.37 → 0.166.39
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/package.json +7 -2
- package/scripts/governed-learning-local-attestor-service.mjs +222 -0
- package/scripts/governed-learning-local-attestor-trust-approval-service.mjs +338 -0
- package/scripts/governed-learning-local-attestor-trust-operations-service.mjs +575 -0
- package/scripts/governed-learning-windows-secure-pipe-broker.ps1 +375 -0
- package/src/assets/web-panel/assets/{AIOps-B_Nt1Qe4.js → AIOps-qWUdiFr5.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CHQbie4X.js → ActionButton-B_f7go3E.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bm9364Lw.js → Analytics-hSGFlSkB.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DTwlIh2v.js → AppLayout-CCYGgj71.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-OibP0qB4.js → Artifacts-BdS1H9gq.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B8Fwavkg.js → Audit-Cck9IebC.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-p1Vb2K2B.js → BackgroundAgents-DZzoM_QS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BI3QT-wI.js → Backup-D8H_QtGu.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BW_VRWWu.js → BaseInput-CTsNF_pu.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CUEhDQfq.js → Chat-CcEiTYY8.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-C5UVXdVE.js → ChatBubbleRenderer-9BY1DPuc.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-URYsaaxv.js → Checkbox-BPB9NNJx.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DJAwC80a.js → Codegen-CKKMf7jD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DfRKFzc9.js → Col-DpSSB4Uu.js} +1 -1
- package/src/assets/web-panel/assets/{Community-GOkGHuly.js → Community-CfR6ikoH.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CIMs13NC.js → Compact-CqnkGGjK.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BE-TQIxV.js → Compliance-9IzhdVQb.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CYmbJiWw.js → Cowork-eXsgH33N.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Be3OIWyM.js → Cron-DvkzHFRi.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-2xB2HS2D.js → Crosschain--az9d9f7.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B_lJO2yF.js → DID-_Eb4kpnJ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DnVWqUER.js → Dashboard-aDVisdXj.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-C7ZJvHVa.js → Dropdown-oQ54XzS9.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DLevT-0F.js → EmailListRenderer-BUPdMau1.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BwhQ5BRU.js → FamilyGuardDashboard-DtQTOCQI.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BkGI-Xkq.js → Federation-Cpnb3Moe.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BgIIbMd7.js → FormItemContext-DmsrJkeU.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-qL-qN8Nb.js → GenericCardRenderer-CpFDYnh3.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BTzgrC4U.js → Git-HFG17p7Q.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-p28vdCN4.js → Governance-D5Z5c7N8.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Cqephrur.js → Inference-DH159h74.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C3v5Q4Zp.js → KnowledgeGraph-DuL1pcJD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-T6f0w32w.js → Logs-Gqn8hFsM.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Dj5XPm3S.js → MarkdownRenderer-NHJaejHI.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-ClDsvHDH.js → Marketplace-BArcWifg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C4P-_snx.js → McpTools-Q1BfBSnd.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-BZZfG6y6.js → Memory-Cz8nRL7N.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DpIv_BLs.js → MobileBridge-CRuxLRJw.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Buz3NIQg.js → MobileProjects-B1CQIAGp.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-HS2PJB79.js → Mtc-CFhXZbPk.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-UmBrcU27.js → MtcAudit-C69LqcZ5.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-C00sXiZf.js → Multisig-y7yZeTTG.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dj1ng_ph.js → NLProgramming-DgjhoWea.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C4LEVKlk.js → Notes-DRc2WTDh.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BWXwnekv.js → NotificationSettings-CLPx24yn.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CZHfK8Nn.js → OrderTableRenderer-CMSNA4CO.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CFEtFPrV.js → Organization-Dm6LIyhZ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DSz4MJK1.js → Overflow-DP4DOYd-.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DyTEytwG.js → P2P-HFwvtFI1.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B5QNGLVx.js → PdhVaultBrowser-D9gPfKRM.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-wEC_X7x4.js → Permissions-Bdtxniwh.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-If5GZlGZ.js → PersonalDataHub-Dgl2AbES.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-LB4gqqmX.js → Pipeline-DpZrzYwK.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-QVLhoxcN.js → Privacy-EQ551c0t.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-FaAbTYTo.js → ProjectInit-xUSeczsM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DhMeNA21.js → ProjectSettings-B66Sr_t8.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-5L4lkWAZ.js → Projects-B4zikj95.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DhZFp8fO.js → Providers-DjLbqQPh.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BZuJ7_xi.js → QrScannerModal-KVsAQCd_.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-TXddPYYb.js → QuickAsk-C4noJXu8.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DDuXIKYt.js → Recommend-Cn15clqY.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CDrTXImv.js → RemoteSession-DdonMFwH.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-B2xKaKzt.js → Reputation-Bqe3NwWN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DzAjWAOX.js → Row-CnxBgjkD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CKH38BLF.js → RssFeed-CSRrgZyK.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CuPqJYoQ.js → Search-DTUYUfFx.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DmAd2hxz.js → Security-BHExHVIm.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Bt3nljnY.js → Services-B_IWqPes.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CP7RH093.js → Skeleton-C_oAtzmX.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DKNeMBTx.js → Skills-maJNokSL.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CbpM8Nrd.js → Sla-CMM_ZsLH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DTk-vTzF.js → SpeechSettings-D7w_oNwK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DKiplwmc.js → SyncSettings-D0Zl3NIr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-z-lOm8fx.js → Tasks-Bs0H0ctR.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Rb-Q0DGX.js → Templates-C6T6oCpR.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-C2sqDUnR.js → Tenant-ByL-kAYO.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DcyzskEE.js → Terminal-6JXNhc3b.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-lg0Eam7N.js → TimelineRenderer-KiuUtCsl.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D9USIMIA.js → Tokens-C0TWTIER.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BQpaQJ5k.js → Trigger-DpC5aaJu.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-C-Mik04s.js → Trust-lqqflCwv.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DrnZ_o56.js → UkeySign-BYSlVfBc.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BDOsoZi0.js → VideoEditing-DX08oo_R.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Ct_bleI7.js → Wallet-CcIFPvzL.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-B6b6FDao.js → WebAuthn-D8DfxfVT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-ZUJMaIHr.js → WorkflowEditor-Csadpaln.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BII20OJy.js → chat-CewHWc_T.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DEsJRV3n.js → colors-B8at89r3.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DoDYAzN9.js → compact-item-v_gxtF5-.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-o_nofnVW.js → createContext-BOwFpJqA.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DenB_kSS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CAsABTHC.js → hasIn-DjHUzt7E.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeJSTcXw.js → index-1Tfwr_GA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVQSl1uY.js → index-5qmLo1us.js} +1 -1
- package/src/assets/web-panel/assets/index-B8bNwM9U.js +1 -0
- package/src/assets/web-panel/assets/{index-CQE-WMEU.js → index-BC20EQ7h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DciLb_Ww.js → index-BGrmPk8T.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqyg3PME.js → index-BPJ7uL2Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DU2Rpx1m.js → index-BRNyE3Kb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWJqXNX.js → index-BVPsegMN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWZNYecl.js → index-B_egGFcR.js} +3 -3
- package/src/assets/web-panel/assets/{index-TSwbtCYG.js → index-BdZLA7k9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrIIJ2s-.js → index-Bk_Te9OR.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5Fd4tdL.js → index-Bz8C8VXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4SfcwZA.js → index-C7MHbmwn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bn2ZPUXO.js → index-CFL1Hewx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsoFTdA2.js → index-CV1SgaBd.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9hYHPhs.js → index-CXIPAeAB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dgt1mKby.js → index-Ca8YZU2B.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRAA2McB.js → index-Caf9UjhG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcYbQoY7.js → index-Cb1uNDOv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bycj011d.js → index-CquUCUzS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzMA6Ra3.js → index-CwHoF-TP.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbb34cAr.js → index-Cxk0mCoQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxT8yTwS.js → index-D3o-pacB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrsAF-Ar.js → index-DA3n0Y28.js} +1 -1
- package/src/assets/web-panel/assets/index-DC0cpgIP.js +1 -0
- package/src/assets/web-panel/assets/{index-B9Z75LfA.js → index-DRRK_8Eg.js} +1 -1
- package/src/assets/web-panel/assets/{index-kIyLNyoF.js → index-DUMvVGyf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQmX_-hk.js → index-DdHdbXpy.js} +1 -1
- package/src/assets/web-panel/assets/{index-tCeNfxv4.js → index-Ddw05Myq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDRh3v44.js → index-Dfrb3Prv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bmwo5wQG.js → index-DiKaYIdo.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1YDdyQ1.js → index-DmZLZsyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dhnau6uw.js → index-FgUrhq_H.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf3sFEoE.js → index-Khw7wzVk.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0ApxOMw.js → index-San3zacc.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_CMB_wC.js → index-coOi37of.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnbnmRqg.js → index-hyeBuocp.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDQzBK3l.js → index-uk59xr0W.js} +1 -1
- package/src/assets/web-panel/assets/{index-CE2J04dA.js → index-wjvn8-9F.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CNjeeoKE.js → initDefaultProps-Id2dFdjh.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CBT8IZDm.js → motion-DRxtwxng.js} +1 -1
- package/src/assets/web-panel/assets/{move-h1MOxjqv.js → move-BDYvdTb6.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C_3pqNmn.js → mtc-parser-cz8LGI8Z.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CMUnPFDk.js → omit-DHJeh6tH.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-p8_c1xq0.js → pickAttrs-XJEQIp7e.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-D6O67r23.js → placementArrow-AFcf8lEn.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DquhepAK.js → responsiveObserve-CDEeBxs1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CZ-m6gmS.js → slide-CvbVfi6T.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-k9ejZFtd.js → statusUtils-DtCyuEnq.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-NX6_137R.js → styleChecker--UgmTsGY.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-bCqR70lP.js → useFlexGapSupport-D9i1as-Y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-2l0vSqyY.js → useFs-CJx3zw01.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-1yccm4O7.js → usePersonalDataHub-ZsIKYdZv.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CxQzajDo.js → vnode-B2RGEQG4.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CrTKwFyb.js → zoom-ob-0px2z.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/evolution-attestor-trust.js +113 -0
- package/src/commands/evolution.js +2 -0
- package/src/commands/learning.js +34 -5
- package/src/data/changelog.json +26 -0
- package/src/lib/evolution/evolution-artifact-ports.js +21 -0
- package/src/lib/evolution/evolution-deployment-loader.js +56 -0
- package/src/lib/evolution/evolution-immutable-ledger-segment-store.js +812 -0
- package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +218 -0
- package/src/lib/evolution/evolution-ledger-manifest-catalog.js +472 -0
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +997 -0
- package/src/lib/evolution/evolution-ledger-manifest-head-store.js +408 -0
- package/src/lib/evolution/evolution-ledger-manifest-witness-adapter.js +554 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +460 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-ipc-endpoint.js +94 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-approval-client.js +485 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ipc-capability.js +200 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ledger.js +1222 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-cli-host.js +802 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-client.js +445 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations.js +1082 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operator-registry.js +1453 -0
- package/src/lib/evolution/governed-skill-synthesis-candidate-evaluator.js +147 -0
- package/src/lib/evolution/governed-skill-synthesis-cli-host.js +115 -0
- package/src/lib/evolution/governed-skill-synthesis-evaluation-ledger-adapter.js +715 -0
- package/src/lib/evolution/governed-skill-synthesis-external-attestor.js +499 -0
- package/src/lib/evolution/governed-skill-synthesis-model-evaluator.js +514 -0
- package/src/lib/evolution/governed-skill-synthesis-process-attestor-worker.mjs +208 -0
- package/src/lib/evolution/governed-skill-synthesis-process-attestor.js +557 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader-worker.mjs +143 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader.js +444 -0
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +220 -0
- package/src/lib/evolution/governed-skill-synthesis-windows-secure-pipe-host.js +236 -0
- package/src/lib/hook-audit-store.js +68 -2
- package/src/lib/hooks-v2-runtime.js +52 -26
- package/src/lib/learning/skill-synthesizer.js +66 -5
- package/src/lib/remote-read-loop-guard.js +30 -3
- package/src/assets/web-panel/assets/devWarning-0tgDCszN.js +0 -1
- package/src/assets/web-panel/assets/index-CFF8XEFE.js +0 -1
- package/src/assets/web-panel/assets/index-DVUEISry.js +0 -1
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
import { types as utilTypes } from "node:util";
|
|
2
|
+
|
|
3
|
+
import { captureImmutableLedgerSegmentStorePort } from "./evolution-immutable-ledger-segment-store.js";
|
|
4
|
+
import {
|
|
5
|
+
captureEvolutionLedgerManifestAuthority,
|
|
6
|
+
sealEvolutionLedgerManifestSegment,
|
|
7
|
+
verifyEvolutionLedgerManifestChain,
|
|
8
|
+
} from "./evolution-ledger-manifest-chain.js";
|
|
9
|
+
import { captureEvolutionLedgerManifestHeadStore } from "./evolution-ledger-manifest-head-store.js";
|
|
10
|
+
import { captureEvolutionLedgerManifestCatalog } from "./evolution-ledger-manifest-catalog.js";
|
|
11
|
+
import { captureEvolutionLedgerManifestWitnessAdapter } from "./evolution-ledger-manifest-witness-adapter.js";
|
|
12
|
+
|
|
13
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_BACKEND_SCHEMA =
|
|
14
|
+
"chainlesschain.evolution-ledger-v2-manifest-backend/v2";
|
|
15
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_APPEND_RECEIPT_SCHEMA =
|
|
16
|
+
"chainlesschain.evolution-ledger-v2-manifest-append-receipt/v2";
|
|
17
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_CONFLICT_SCHEMA =
|
|
18
|
+
"chainlesschain.evolution-ledger-v2-manifest-conflict/v2";
|
|
19
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE =
|
|
20
|
+
"CC_EVOLUTION_LEDGER_V2_MANIFEST_INVALID";
|
|
21
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE =
|
|
22
|
+
"CC_EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT";
|
|
23
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_UNAVAILABLE_CODE =
|
|
24
|
+
"CC_EVOLUTION_LEDGER_V2_MANIFEST_UNAVAILABLE";
|
|
25
|
+
export const EVOLUTION_LEDGER_V2_MANIFEST_COMMIT_UNKNOWN_CODE =
|
|
26
|
+
"CC_EVOLUTION_LEDGER_V2_MANIFEST_COMMIT_UNKNOWN";
|
|
27
|
+
|
|
28
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
29
|
+
const CONFIG_KEYS = new Set([
|
|
30
|
+
"descriptor",
|
|
31
|
+
"catalog",
|
|
32
|
+
"headStore",
|
|
33
|
+
"manifestAuthority",
|
|
34
|
+
"now",
|
|
35
|
+
"segmentStore",
|
|
36
|
+
"witnessAdapter",
|
|
37
|
+
]);
|
|
38
|
+
const DESCRIPTOR_KEYS = new Set([
|
|
39
|
+
"epoch",
|
|
40
|
+
"ledgerId",
|
|
41
|
+
"maximumEventsPerSegment",
|
|
42
|
+
"tenantId",
|
|
43
|
+
]);
|
|
44
|
+
const APPEND_KEYS = new Set([
|
|
45
|
+
"eventDigests",
|
|
46
|
+
"expectedHeadDigest",
|
|
47
|
+
"expectedWitnessDigest",
|
|
48
|
+
"minimumRetainedUntil",
|
|
49
|
+
]);
|
|
50
|
+
const VERIFY_KEYS = new Set();
|
|
51
|
+
const BACKENDS = new WeakSet();
|
|
52
|
+
|
|
53
|
+
export class EvolutionLedgerV2ManifestBackendError extends Error {
|
|
54
|
+
constructor(code, message, options = undefined) {
|
|
55
|
+
super(message, options);
|
|
56
|
+
this.name = "EvolutionLedgerV2ManifestBackendError";
|
|
57
|
+
this.code = code;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function failure(code, message, options = undefined) {
|
|
62
|
+
return new EvolutionLedgerV2ManifestBackendError(code, message, options);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function rejectProxy(
|
|
66
|
+
value,
|
|
67
|
+
label,
|
|
68
|
+
code = EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
69
|
+
) {
|
|
70
|
+
if (
|
|
71
|
+
(typeof value === "object" && value !== null) ||
|
|
72
|
+
typeof value === "function"
|
|
73
|
+
) {
|
|
74
|
+
if (utilTypes.isProxy(value))
|
|
75
|
+
throw failure(code, `${label} must not be a Proxy`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function exactRecord(
|
|
80
|
+
value,
|
|
81
|
+
keys,
|
|
82
|
+
label,
|
|
83
|
+
code = EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
84
|
+
) {
|
|
85
|
+
rejectProxy(value, label, code);
|
|
86
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
87
|
+
throw failure(code, `${label} must be a record`);
|
|
88
|
+
}
|
|
89
|
+
const prototype = Object.getPrototypeOf(value);
|
|
90
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
91
|
+
throw failure(code, `${label} must use a plain prototype`);
|
|
92
|
+
}
|
|
93
|
+
const fields = Object.getOwnPropertyDescriptors(value);
|
|
94
|
+
const names = Object.keys(fields);
|
|
95
|
+
if (names.length !== keys.size || names.some((name) => !keys.has(name))) {
|
|
96
|
+
throw failure(code, `${label} fields are invalid`);
|
|
97
|
+
}
|
|
98
|
+
for (const name of names) {
|
|
99
|
+
if (!("value" in fields[name])) {
|
|
100
|
+
throw failure(code, `${label}.${name} must be an own data property`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return fields;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function data(fields, name) {
|
|
107
|
+
return fields[name].value;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function identifier(
|
|
111
|
+
value,
|
|
112
|
+
label,
|
|
113
|
+
code = EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
114
|
+
) {
|
|
115
|
+
if (
|
|
116
|
+
typeof value !== "string" ||
|
|
117
|
+
value.trim() !== value ||
|
|
118
|
+
value.length < 1 ||
|
|
119
|
+
value.length > 512 ||
|
|
120
|
+
value.includes("\0")
|
|
121
|
+
) {
|
|
122
|
+
throw failure(code, `${label} is invalid`);
|
|
123
|
+
}
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function positive(
|
|
128
|
+
value,
|
|
129
|
+
label,
|
|
130
|
+
code = EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
131
|
+
) {
|
|
132
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > 1024) {
|
|
133
|
+
throw failure(code, `${label} is invalid`);
|
|
134
|
+
}
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function digest(
|
|
139
|
+
value,
|
|
140
|
+
label,
|
|
141
|
+
code = EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
142
|
+
) {
|
|
143
|
+
if (!DIGEST.test(value || ""))
|
|
144
|
+
throw failure(code, `${label} must be sha256-bound`);
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function nullableDigest(
|
|
149
|
+
value,
|
|
150
|
+
label,
|
|
151
|
+
code = EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
152
|
+
) {
|
|
153
|
+
return value === null ? null : digest(value, label, code);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function descriptor(value) {
|
|
157
|
+
const fields = exactRecord(
|
|
158
|
+
value,
|
|
159
|
+
DESCRIPTOR_KEYS,
|
|
160
|
+
"v2 manifest backend descriptor",
|
|
161
|
+
);
|
|
162
|
+
return Object.freeze({
|
|
163
|
+
epoch: identifier(data(fields, "epoch"), "descriptor.epoch"),
|
|
164
|
+
ledgerId: identifier(data(fields, "ledgerId"), "descriptor.ledgerId"),
|
|
165
|
+
maximumEventsPerSegment: positive(
|
|
166
|
+
data(fields, "maximumEventsPerSegment"),
|
|
167
|
+
"descriptor.maximumEventsPerSegment",
|
|
168
|
+
),
|
|
169
|
+
tenantId: identifier(data(fields, "tenantId"), "descriptor.tenantId"),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function own(record, name, code = EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE) {
|
|
174
|
+
rejectProxy(record, "witness record", code);
|
|
175
|
+
if (!record || typeof record !== "object" || Array.isArray(record)) {
|
|
176
|
+
throw failure(code, "witness record is invalid");
|
|
177
|
+
}
|
|
178
|
+
const field = Object.getOwnPropertyDescriptor(record, name);
|
|
179
|
+
if (!field || !("value" in field)) {
|
|
180
|
+
throw failure(code, `witness record.${name} must be own data`);
|
|
181
|
+
}
|
|
182
|
+
return field.value;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function coherentSnapshot(catalog, headStore, witnessAdapter) {
|
|
186
|
+
let head;
|
|
187
|
+
let manifest;
|
|
188
|
+
let witness;
|
|
189
|
+
try {
|
|
190
|
+
manifest = catalog.readLatest();
|
|
191
|
+
head = headStore.read();
|
|
192
|
+
witness = witnessAdapter.read();
|
|
193
|
+
} catch (cause) {
|
|
194
|
+
if (cause instanceof EvolutionLedgerV2ManifestBackendError) throw cause;
|
|
195
|
+
throw failure(
|
|
196
|
+
EVOLUTION_LEDGER_V2_MANIFEST_UNAVAILABLE_CODE,
|
|
197
|
+
"v2 manifest checkpoint cannot be read",
|
|
198
|
+
{ cause },
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
if (head === null) {
|
|
202
|
+
if (manifest !== null || witness.status !== "absent") {
|
|
203
|
+
throw failure(
|
|
204
|
+
EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
|
|
205
|
+
"v2 manifest catalog or witness exists without a manifest head",
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
return Object.freeze({ head: null, manifest: null, witness });
|
|
209
|
+
}
|
|
210
|
+
if (witness.status !== "committed") {
|
|
211
|
+
throw failure(
|
|
212
|
+
EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
|
|
213
|
+
"v2 manifest head has no committed witness",
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
if (manifest?.manifestDigest !== head.manifestDigest) {
|
|
217
|
+
throw failure(
|
|
218
|
+
EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
|
|
219
|
+
"v2 manifest catalog latest does not bind the manifest head",
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
const bindings = {
|
|
223
|
+
anchorDigest: head.manifestDigest,
|
|
224
|
+
headDigest: head.headDigest,
|
|
225
|
+
sequence: head.sequence,
|
|
226
|
+
};
|
|
227
|
+
for (const [field, expected] of Object.entries(bindings)) {
|
|
228
|
+
if (own(witness.record, field) !== expected) {
|
|
229
|
+
throw failure(
|
|
230
|
+
EVOLUTION_LEDGER_V2_MANIFEST_CORRUPT_CODE,
|
|
231
|
+
`v2 manifest witness ${field} binding differs`,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return Object.freeze({ head, manifest, witness });
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function conflict(snapshot) {
|
|
239
|
+
return Object.freeze({
|
|
240
|
+
conflict: true,
|
|
241
|
+
currentHeadDigest: snapshot.head?.headDigest ?? null,
|
|
242
|
+
currentWitnessDigest: snapshot.witness.witnessDigest,
|
|
243
|
+
schema: EVOLUTION_LEDGER_V2_MANIFEST_CONFLICT_SCHEMA,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function unknown(message, cause = undefined) {
|
|
248
|
+
return failure(
|
|
249
|
+
EVOLUTION_LEDGER_V2_MANIFEST_COMMIT_UNKNOWN_CODE,
|
|
250
|
+
message,
|
|
251
|
+
cause ? { cause } : undefined,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function createEvolutionLedgerV2ManifestBackend(options = undefined) {
|
|
256
|
+
const fields = exactRecord(
|
|
257
|
+
options,
|
|
258
|
+
CONFIG_KEYS,
|
|
259
|
+
"v2 manifest backend configuration",
|
|
260
|
+
);
|
|
261
|
+
const normalizedDescriptor = descriptor(data(fields, "descriptor"));
|
|
262
|
+
const scope = Object.freeze({
|
|
263
|
+
epoch: normalizedDescriptor.epoch,
|
|
264
|
+
ledgerId: normalizedDescriptor.ledgerId,
|
|
265
|
+
tenantId: normalizedDescriptor.tenantId,
|
|
266
|
+
});
|
|
267
|
+
const manifestAuthority = captureEvolutionLedgerManifestAuthority(
|
|
268
|
+
data(fields, "manifestAuthority"),
|
|
269
|
+
);
|
|
270
|
+
const catalog = captureEvolutionLedgerManifestCatalog(
|
|
271
|
+
data(fields, "catalog"),
|
|
272
|
+
scope,
|
|
273
|
+
);
|
|
274
|
+
const segmentStore = captureImmutableLedgerSegmentStorePort(
|
|
275
|
+
data(fields, "segmentStore"),
|
|
276
|
+
scope,
|
|
277
|
+
);
|
|
278
|
+
const headStore = captureEvolutionLedgerManifestHeadStore(
|
|
279
|
+
data(fields, "headStore"),
|
|
280
|
+
scope,
|
|
281
|
+
);
|
|
282
|
+
const witnessAdapter = captureEvolutionLedgerManifestWitnessAdapter(
|
|
283
|
+
data(fields, "witnessAdapter"),
|
|
284
|
+
scope,
|
|
285
|
+
);
|
|
286
|
+
if (
|
|
287
|
+
witnessAdapter.descriptor.maximumEventsPerSegment !==
|
|
288
|
+
normalizedDescriptor.maximumEventsPerSegment
|
|
289
|
+
) {
|
|
290
|
+
throw failure(
|
|
291
|
+
EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
292
|
+
"v2 manifest witness segment bound differs",
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
const now = data(fields, "now");
|
|
296
|
+
rejectProxy(now, "v2 manifest backend clock");
|
|
297
|
+
if (typeof now !== "function") {
|
|
298
|
+
throw failure(
|
|
299
|
+
EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
300
|
+
"v2 manifest backend clock is required",
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const backend = Object.freeze({
|
|
305
|
+
descriptor: Object.freeze({
|
|
306
|
+
...normalizedDescriptor,
|
|
307
|
+
schema: EVOLUTION_LEDGER_V2_MANIFEST_BACKEND_SCHEMA,
|
|
308
|
+
}),
|
|
309
|
+
read() {
|
|
310
|
+
return coherentSnapshot(catalog, headStore, witnessAdapter);
|
|
311
|
+
},
|
|
312
|
+
appendSegment(input) {
|
|
313
|
+
const request = exactRecord(
|
|
314
|
+
input,
|
|
315
|
+
APPEND_KEYS,
|
|
316
|
+
"v2 manifest append request",
|
|
317
|
+
);
|
|
318
|
+
const expectedHeadDigest = nullableDigest(
|
|
319
|
+
data(request, "expectedHeadDigest"),
|
|
320
|
+
"expectedHeadDigest",
|
|
321
|
+
);
|
|
322
|
+
const expectedWitnessDigest = digest(
|
|
323
|
+
data(request, "expectedWitnessDigest"),
|
|
324
|
+
"expectedWitnessDigest",
|
|
325
|
+
);
|
|
326
|
+
const current = coherentSnapshot(catalog, headStore, witnessAdapter);
|
|
327
|
+
if (
|
|
328
|
+
(current.head?.headDigest ?? null) !== expectedHeadDigest ||
|
|
329
|
+
current.witness.witnessDigest !== expectedWitnessDigest
|
|
330
|
+
) {
|
|
331
|
+
return conflict(current);
|
|
332
|
+
}
|
|
333
|
+
const sealed = sealEvolutionLedgerManifestSegment({
|
|
334
|
+
authority: manifestAuthority,
|
|
335
|
+
descriptor: normalizedDescriptor,
|
|
336
|
+
eventDigests: data(request, "eventDigests"),
|
|
337
|
+
minimumRetainedUntil: data(request, "minimumRetainedUntil"),
|
|
338
|
+
now,
|
|
339
|
+
previousHead: current.head,
|
|
340
|
+
segmentStore,
|
|
341
|
+
});
|
|
342
|
+
let catalogResult;
|
|
343
|
+
try {
|
|
344
|
+
catalogResult = catalog.append({
|
|
345
|
+
expectedManifestDigest: current.manifest?.manifestDigest ?? null,
|
|
346
|
+
manifest: sealed.manifest,
|
|
347
|
+
});
|
|
348
|
+
} catch (cause) {
|
|
349
|
+
throw unknown(
|
|
350
|
+
"v2 manifest catalog may be committed; reopen before retrying",
|
|
351
|
+
cause,
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
if (catalogResult.appended !== true) {
|
|
355
|
+
throw unknown(
|
|
356
|
+
"v2 manifest catalog conflicted after segment retention; reopen before retrying",
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
let headResult;
|
|
360
|
+
try {
|
|
361
|
+
headResult = headStore.commit({
|
|
362
|
+
expectedHeadDigest,
|
|
363
|
+
nextHead: sealed.head,
|
|
364
|
+
});
|
|
365
|
+
} catch (cause) {
|
|
366
|
+
throw unknown(
|
|
367
|
+
"v2 manifest head may be committed; reopen before retrying",
|
|
368
|
+
cause,
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
if (headResult.committed !== true) {
|
|
372
|
+
throw unknown(
|
|
373
|
+
"v2 manifest catalog is committed but head CAS conflicted; reopen before retrying",
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
let witnessResult;
|
|
377
|
+
try {
|
|
378
|
+
witnessResult = witnessAdapter.checkpoint({
|
|
379
|
+
expectedWitnessDigest,
|
|
380
|
+
head: sealed.head,
|
|
381
|
+
manifest: sealed.manifest,
|
|
382
|
+
});
|
|
383
|
+
} catch (cause) {
|
|
384
|
+
throw unknown(
|
|
385
|
+
"v2 manifest witness may be checkpointed; reopen before retrying",
|
|
386
|
+
cause,
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
if (witnessResult.checkpointed !== true) {
|
|
390
|
+
throw unknown(
|
|
391
|
+
"v2 manifest head is committed but witness checkpoint conflicted; reopen before retrying",
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
let final;
|
|
395
|
+
try {
|
|
396
|
+
final = coherentSnapshot(catalog, headStore, witnessAdapter);
|
|
397
|
+
} catch (cause) {
|
|
398
|
+
throw unknown(
|
|
399
|
+
"v2 manifest commit readback is unavailable; reopen before retrying",
|
|
400
|
+
cause,
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
if (
|
|
404
|
+
final.head?.headDigest !== sealed.head.headDigest ||
|
|
405
|
+
final.witness.witnessDigest !== witnessResult.witnessDigest
|
|
406
|
+
) {
|
|
407
|
+
throw unknown(
|
|
408
|
+
"v2 manifest commit readback differs; reopen before retrying",
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
return Object.freeze({
|
|
412
|
+
authenticated: true,
|
|
413
|
+
durable: true,
|
|
414
|
+
headDigest: sealed.head.headDigest,
|
|
415
|
+
immutable: true,
|
|
416
|
+
manifestDigest: sealed.manifest.manifestDigest,
|
|
417
|
+
manifestSequence: sealed.manifest.manifestSequence,
|
|
418
|
+
readbackVerified: true,
|
|
419
|
+
schema: EVOLUTION_LEDGER_V2_MANIFEST_APPEND_RECEIPT_SCHEMA,
|
|
420
|
+
segmentReceipt: sealed.segmentReceipt,
|
|
421
|
+
sequenceEnd: sealed.manifest.sequenceEnd,
|
|
422
|
+
sequenceStart: sealed.manifest.sequenceStart,
|
|
423
|
+
witnessed: true,
|
|
424
|
+
witnessDigest: final.witness.witnessDigest,
|
|
425
|
+
});
|
|
426
|
+
},
|
|
427
|
+
verify(input = {}) {
|
|
428
|
+
exactRecord(input, VERIFY_KEYS, "v2 manifest verification request");
|
|
429
|
+
const snapshot = coherentSnapshot(catalog, headStore, witnessAdapter);
|
|
430
|
+
if (snapshot.head === null) {
|
|
431
|
+
throw failure(
|
|
432
|
+
EVOLUTION_LEDGER_V2_MANIFEST_INVALID_CODE,
|
|
433
|
+
"an empty v2 manifest backend has no chain to verify",
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
return verifyEvolutionLedgerManifestChain({
|
|
437
|
+
authority: manifestAuthority,
|
|
438
|
+
descriptor: normalizedDescriptor,
|
|
439
|
+
head: snapshot.head,
|
|
440
|
+
manifests: catalog.list(),
|
|
441
|
+
segmentStore,
|
|
442
|
+
});
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
BACKENDS.add(backend);
|
|
446
|
+
return backend;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
export function captureEvolutionLedgerV2ManifestBackend(value) {
|
|
450
|
+
if (!BACKENDS.has(value)) {
|
|
451
|
+
throw new TypeError(
|
|
452
|
+
"a branded Evolution Ledger v2 manifest backend is required",
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
return value;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
export function isEvolutionLedgerV2ManifestBackend(value) {
|
|
459
|
+
return BACKENDS.has(value);
|
|
460
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
const ENDPOINT_ID = /^[a-f0-9]{16,64}$/u;
|
|
5
|
+
const UNIX_SOCKET_MAX_BYTES = 100;
|
|
6
|
+
const UNIX_FALLBACK_DIRECTORY = "/tmp";
|
|
7
|
+
|
|
8
|
+
const DEFINITIONS = Object.freeze({
|
|
9
|
+
external: Object.freeze({
|
|
10
|
+
windowsPrefix: "cc-evolution-attestor-",
|
|
11
|
+
unixPrefix: "cc-att-",
|
|
12
|
+
}),
|
|
13
|
+
"trust-operations": Object.freeze({
|
|
14
|
+
windowsPrefix: "cc-evolution-attestor-trust-ops-",
|
|
15
|
+
unixPrefix: "cc-ato-",
|
|
16
|
+
}),
|
|
17
|
+
"trust-approval": Object.freeze({
|
|
18
|
+
windowsPrefix: "cc-evolution-attestor-trust-approval-",
|
|
19
|
+
unixPrefix: "cc-atp-",
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
function definition(kind) {
|
|
24
|
+
const selected = DEFINITIONS[kind];
|
|
25
|
+
if (!selected) throw new TypeError("attestor IPC endpoint kind is invalid");
|
|
26
|
+
return selected;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function validId(id) {
|
|
30
|
+
if (!ENDPOINT_ID.test(id ?? "")) {
|
|
31
|
+
throw new TypeError("attestor IPC endpoint id is invalid");
|
|
32
|
+
}
|
|
33
|
+
return id;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function unixSocketName(selected, id) {
|
|
37
|
+
return `${selected.unixPrefix}${id}.sock`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function createGovernedSkillSynthesisAttestorIpcEndpoint({
|
|
41
|
+
kind,
|
|
42
|
+
id,
|
|
43
|
+
platform = process.platform,
|
|
44
|
+
temporaryDirectory = os.tmpdir(),
|
|
45
|
+
}) {
|
|
46
|
+
const selected = definition(kind);
|
|
47
|
+
const normalizedId = validId(id);
|
|
48
|
+
if (platform === "win32") {
|
|
49
|
+
return `\\\\.\\pipe\\${selected.windowsPrefix}${normalizedId}`;
|
|
50
|
+
}
|
|
51
|
+
const pathApi = path.posix;
|
|
52
|
+
if (
|
|
53
|
+
typeof temporaryDirectory !== "string" ||
|
|
54
|
+
!pathApi.isAbsolute(temporaryDirectory) ||
|
|
55
|
+
temporaryDirectory.includes("\0")
|
|
56
|
+
) {
|
|
57
|
+
throw new TypeError("attestor IPC temporary directory is invalid");
|
|
58
|
+
}
|
|
59
|
+
const name = unixSocketName(selected, normalizedId);
|
|
60
|
+
const preferred = pathApi.join(temporaryDirectory, name);
|
|
61
|
+
if (Buffer.byteLength(preferred, "utf8") <= UNIX_SOCKET_MAX_BYTES) {
|
|
62
|
+
return preferred;
|
|
63
|
+
}
|
|
64
|
+
const fallback = pathApi.join(UNIX_FALLBACK_DIRECTORY, name);
|
|
65
|
+
if (Buffer.byteLength(fallback, "utf8") > UNIX_SOCKET_MAX_BYTES) {
|
|
66
|
+
throw new TypeError("attestor IPC endpoint exceeds the Unix socket limit");
|
|
67
|
+
}
|
|
68
|
+
return fallback;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function isGovernedSkillSynthesisAttestorIpcEndpoint(
|
|
72
|
+
endpoint,
|
|
73
|
+
{ kind, platform = process.platform },
|
|
74
|
+
) {
|
|
75
|
+
if (typeof endpoint !== "string" || endpoint.includes("\0")) return false;
|
|
76
|
+
const selected = definition(kind);
|
|
77
|
+
if (platform === "win32") {
|
|
78
|
+
const prefix = `\\\\.\\pipe\\${selected.windowsPrefix}`;
|
|
79
|
+
return (
|
|
80
|
+
endpoint.startsWith(prefix) &&
|
|
81
|
+
ENDPOINT_ID.test(endpoint.slice(prefix.length))
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return (
|
|
85
|
+
path.posix.isAbsolute(endpoint) &&
|
|
86
|
+
Buffer.byteLength(endpoint, "utf8") <= UNIX_SOCKET_MAX_BYTES &&
|
|
87
|
+
new RegExp(`^${selected.unixPrefix}[a-f0-9]{16,64}\\.sock$`, "u").test(
|
|
88
|
+
path.posix.basename(endpoint),
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export const GOVERNED_SKILL_SYNTHESIS_ATTESTOR_UNIX_SOCKET_MAX_BYTES =
|
|
94
|
+
UNIX_SOCKET_MAX_BYTES;
|