chainlesschain 0.166.92 → 0.166.93
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 +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-C74YzqwJ.js → AIOps-oo9rE0gh.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-TFef1hOE.js → ActionButton-CVJVVv4i.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYsWpkkU.js → Analytics-CUXuwmia.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CFf9kjwu.js → AppLayout-iM4PvCuY.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-TQqa94YO.js → Artifacts-DKUIJbf9.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B79ayqfS.js → Audit-C4_SzFN2.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-pjkHfLP9.js → BackgroundAgents-C3427uy-.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CE6A-t_r.js → Backup-BpEQQiog.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CwcgWMBY.js → BaseInput-C_exQomZ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BIkDNesY.js → Chat-DzpkLtWa.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DgaokYts.js → ChatBubbleRenderer-DX4XmTWm.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-MbypIy5V.js → Checkbox-CxAC1CU8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DiFHWDnt.js → Codegen-wDFAGCLp.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BNMlYMso.js → Col-BvwirhMf.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B3HVyHOX.js → Community-BJuA7paY.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C7hlAubb.js → Compact-DzV35_u2.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-PaXZu6sE.js → Compliance-CIDPPvr9.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BGiojbm-.js → Cowork-DyTMxP3N.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bmr-1QAx.js → Cron-PcNLjMFx.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BwUvWCVd.js → Crosschain-B_O7ck6Z.js} +1 -1
- package/src/assets/web-panel/assets/{DID-k_4QZocW.js → DID-CII35Me1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-_ieRo2C5.js → Dashboard-DU56fkNz.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DYHh6T27.js → Dropdown-DHC8HVeJ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BNlQcWQX.js → EmailListRenderer-oUOHFNsD.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DIkZ6U2D.js → EvolutionSettings-D7RCAWNl.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dq7qSr0P.js → FamilyGuardDashboard-CGONPZxC.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C64e3Cbx.js → Federation-BbDlPWcl.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D-GE2vUa.js → FormItemContext-BBJbFQQT.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DO3B2gis.js → GenericCardRenderer-iuxAero4.js} +1 -1
- package/src/assets/web-panel/assets/{Git-0ETirIQH.js → Git-Dw0prdY5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C9fnRygX.js → Governance-DOGqi_uV.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CLJ9RTsK.js → Inference-BY5oUGGj.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D3C_GxrN.js → KnowledgeGraph-CcE2EVYX.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C5ctGbkN.js → Logs-DyfN4R5w.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Bj62Aq0M.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-GF_t6hJ_.js → Marketplace-CuuuAXUh.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BGsGzgQs.js → McpTools-948Fithv.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-CcrY2A0j.js → Memory-D4PINvyy.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Bi4T0RlS.js → MobileBridge-ECKMaLzX.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DvjEGyvf.js → MobileProjects-CB5MAcvD.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DL77Vf-k.js → Mtc-BRzIM3HJ.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CDy_Uswb.js → MtcAudit-CGeAXJGn.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DL0BAO_c.js → Multisig-C_qJ-8K-.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B-woh5IR.js → NLProgramming-DAEyCn7T.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CEFVCxk7.js → Notes-DmD3MEec.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BqPPMuAP.js → NotificationSettings-Cv4Q3VC9.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BNlpaFjH.js +1 -0
- package/src/assets/web-panel/assets/{Organization-B1gX8jlr.js → Organization-DqAFdz6p.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-CeMxuUZy.js → Overflow-8Ye9cIcE.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5aIRWwJ.js → P2P-755SfHoJ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-6rYgejd4.js → PdhVaultBrowser-CgZLiucX.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-CqCp2SIl.js → Permissions-C-vFF_rL.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BsA7DJWW.js → PersonalDataHub-Diz1oXM3.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-CiW6HeZh.js → Pipeline-D4kIzsZG.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DckUOLYq.js → Privacy-QKLkSAUH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CZppOOYR.js → ProjectInit-I0S9o_RT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B9QPzhDU.js → ProjectSettings-DdgV3-Ho.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BErjjGha.js → Projects-BJHHegtj.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DehU6Qiz.js → Providers-uVa1zfbS.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-E1SUvv1m.js → QrScannerModal-YLVpOChR.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-COWFxyH3.js → QuickAsk-535AYH61.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-D26pWKxX.js → Recommend-C_P6eNSw.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DCOIaId3.js → RemoteSession-EXH1SbNj.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DT_AHGAR.js → Reputation-Cxc7d3eU.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B50S-1nl.js → Row-EDqJy-wS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BaBnHg3Q.js → RssFeed-C03Xeg9_.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BVdnLuuS.js → Search-DsIga9DK.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BnacH74J.js → Security-DgArMFc-.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CxM08Zch.js → Services-MooDpHBP.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DE7CIc1N.js → Skeleton-B10P1Dr6.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CGI0SJmf.js → Skills-DHLHEkLl.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DpEzPcqc.js → Sla-D4RT7d4g.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CTmnmMHn.js → SpeechSettings-D8u6F-LV.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dxgrd9hd.js → SyncSettings-4nvNzRq8.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CW4slS0A.js → Tasks-CmCb8zNO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DxvGWDgB.js → Templates-CzESIa21.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-_Q0o2tNK.js → Tenant-Ch_N3p4d.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BTZn8pow.js → Terminal-BZccUf_X.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CauL0KFe.js → TimelineRenderer-FrKcNy_3.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CDoM2qeT.js → Tokens-4xvLpXfD.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B-QYGEU7.js → Trigger-84UjyxXd.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BD6XJHT-.js → Trust-M6UtHnji.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-x4TFwCy0.js → UkeySign-L_xEgtCg.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-t3imBK_0.js → VideoEditing-BLJCX9ru.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BCfkWwNC.js → Wallet-DwL6uJCj.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-WH314Mdm.js → WebAuthn-Bmn9pdzz.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-jUlcjrUg.js → WorkflowEditor-DSsZ5xG1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dg3VASTL.js → chat--FGNUaa8.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BNvmBRKE.js → colors-DeuwNdqX.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BGOfoqf4.js → compact-item-I4XKxRFU.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BNQeqKAs.js → createContext-RoD2p5Ba.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-ctnml4IW.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Bg3AjCrq.js → hasIn-BsvyddUM.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6UqK83L.js → index-0tRU1Sv-.js} +1 -1
- package/src/assets/web-panel/assets/{index-uH2LnAs_.js → index-4xHc2WjT.js} +1 -1
- package/src/assets/web-panel/assets/{index-xzaUx19r.js → index-B8-eGLN9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYn5DnDk.js → index-BS_uqSTa.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO0VlNtc.js → index-BYEVBlCl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DF_FKSVH.js → index-BcBM065G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY8cRKHR.js → index-BnrL4s-3.js} +1 -1
- package/src/assets/web-panel/assets/{index-COol3xfA.js → index-BrZPb0On.js} +1 -1
- package/src/assets/web-panel/assets/index-C7PN8mh1.js +1 -0
- package/src/assets/web-panel/assets/{index-BBCMulQ-.js → index-CBazK4-7.js} +1 -1
- package/src/assets/web-panel/assets/{index-OUFoxUgH.js → index-CPS3zv1c.js} +1 -1
- package/src/assets/web-panel/assets/{index-60AnjUTX.js → index-CSrZiiAs.js} +1 -1
- package/src/assets/web-panel/assets/{index-D072oLjp.js → index-CVwZMt9Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_O2ZjPk.js → index-CdgKZYgm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcCnO0RU.js → index-CesTu01s.js} +1 -1
- package/src/assets/web-panel/assets/{index-7QJUWemf.js → index-CiHlSuMl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DS04wRll.js → index-CsLVac9n.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dkp-okWa.js → index-D1ONyBTW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmTacaQV.js → index-D4IZsKbF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaPvEvB4.js → index-D4P4vpmv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co_LnCWD.js → index-D6J8dz7X.js} +1 -1
- package/src/assets/web-panel/assets/{index--I3UF5t1.js → index-DChy2sHE.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0mgngoB.js → index-DKUCl_Lk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx2EXRfr.js → index-DRluW3_r.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_JmInC0.js → index-DWUmhNO-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLwEXRrb.js → index-DXnpVGG3.js} +1 -1
- package/src/assets/web-panel/assets/{index-fOwii3LP.js → index-DYOpAS6-.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZD5Kd8tx.js → index-DiH-3cR2.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-mSvCQK.js → index-DlEfwgzr.js} +1 -1
- package/src/assets/web-panel/assets/index-KnbBJAO-.js +1 -0
- package/src/assets/web-panel/assets/{index-B--0QM0S.js → index-R4St_zjR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCFZN66A.js → index-ScgoDU9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSNhW95G.js → index-UWdT_lty.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cbp-wp-U.js → index-VAlor744.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bkz1tgFR.js → index-Wco_uvRo.js} +1 -1
- package/src/assets/web-panel/assets/{index-pVdQieac.js → index-ZgFED_Zd.js} +1 -1
- package/src/assets/web-panel/assets/{index-2D04Zltx.js → index-jaHeti4i.js} +3 -3
- package/src/assets/web-panel/assets/{index-hG7jXGEW.js → index-rJDabtw4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Wo0f2iqb.js → index-vRiGKIP0.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B8PN9AxJ.js → initDefaultProps-BHT0PacY.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BHivfw5Q.js → motion-CBYsMtsC.js} +1 -1
- package/src/assets/web-panel/assets/{move-B0QU5nDd.js → move-DnHfFV4K.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DRwRM3PE.js → mtc-parser-DfGkRYrx.js} +1 -1
- package/src/assets/web-panel/assets/{omit-SHt2rV2p.js → omit-SjLcPQA9.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CcmDlEb2.js → pickAttrs-CCZHF4ep.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DYatmXDS.js → placementArrow-DjCGn2sJ.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B7qrsXq5.js → responsiveObserve-BCFCl2on.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BRGhlOWd.js → slide-DsfmuIZu.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CT-7NXsQ.js → statusUtils-hPKuJUia.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-rZdw_Yyp.js → styleChecker-DOXKH7Kf.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D8YNIP4P.js → useFlexGapSupport-B_G7yqio.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B8pt0Gu-.js → useFs-BXOTOm2l.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-VMmYM1tt.js → usePersonalDataHub-CRvie3g7.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-UNDuoPoq.js → vnode-D9_zMmww.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-dN-u667S.js → zoom-C4tW03qI.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +13 -0
- package/src/lib/artifact-store.js +51 -3
- package/src/lib/bounded-artifact-file-read.js +131 -0
- package/src/lib/evolution/evolution-artifact-ports.js +209 -129
- package/src/lib/evolution/rrsi-history-ledger-adapter.js +25 -0
- package/src/lib/evolution/rrsi-installation-route-contracts.js +275 -0
- package/src/lib/evolution/rrsi-installation-route-reader.js +282 -0
- package/src/lib/evolution/rrsi-observed-text-index.js +978 -0
- package/src/lib/evolution/rrsi-registry-runtime-policy.js +648 -0
- package/src/lib/evolution/rrsi-registry-store-policy.js +95 -15
- package/src/lib/evolution/rrsi-tenant-index-anchor-contracts.js +223 -0
- package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +157 -0
- package/src/lib/evolution/skill-release-registry.js +20 -5
- package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +291 -30
- package/src/lib/remote-read-loop-guard.js +227 -24
- package/src/lib/task-progress-tracker.js +6 -1
- package/src/runtime/agent-core.js +71 -23
- package/src/assets/web-panel/assets/MarkdownRenderer-Ce-eWK3j.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-GUKQ1xwp.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +0 -1
- package/src/assets/web-panel/assets/index-B-jSKJK6.js +0 -1
- package/src/assets/web-panel/assets/index-P4FXZJqI.js +0 -1
|
@@ -15,11 +15,43 @@ import { types as utilTypes } from "node:util";
|
|
|
15
15
|
import { ArtifactStore } from "../artifact-store.js";
|
|
16
16
|
import { artifactPhysicalIdentity as physicalIdentity } from "./evolution-artifact-identity.js";
|
|
17
17
|
import { withEvolutionFileIdentity } from "./evolution-file-identity.js";
|
|
18
|
+
import { readBoundedDescriptor } from "./bounded-descriptor-read.js";
|
|
19
|
+
import { readBoundedArtifactFile } from "../bounded-artifact-file-read.js";
|
|
18
20
|
import {
|
|
19
21
|
EVOLUTION_ARTIFACT_REF_SCHEMA,
|
|
20
22
|
EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
|
|
21
23
|
} from "./evolution-ledger.js";
|
|
22
24
|
|
|
25
|
+
const ARTIFACT_STORE_DIRECTORY_BOUNDARIES = new WeakMap();
|
|
26
|
+
// Only the shared identity helper's directory opens use this adapter. A POSIX
|
|
27
|
+
// directory/FIFO swap must fail before reaching a potentially blocking open.
|
|
28
|
+
const INDEX_DIRECTORY_FS = Object.freeze({
|
|
29
|
+
constants: fs.constants,
|
|
30
|
+
realpathSync: fs.realpathSync,
|
|
31
|
+
lstatSync: (...args) => fs.lstatSync(...args),
|
|
32
|
+
fstatSync: (...args) => fs.fstatSync(...args),
|
|
33
|
+
closeSync: (...args) => fs.closeSync(...args),
|
|
34
|
+
openSync: (target, flags) =>
|
|
35
|
+
fs.openSync(
|
|
36
|
+
target,
|
|
37
|
+
flags | (fs.constants.O_NONBLOCK || 0) | (fs.constants.O_DIRECTORY || 0),
|
|
38
|
+
),
|
|
39
|
+
});
|
|
40
|
+
const INDEX_STAT_FIELDS = Object.freeze([
|
|
41
|
+
"dev",
|
|
42
|
+
"ino",
|
|
43
|
+
"mode",
|
|
44
|
+
"uid",
|
|
45
|
+
"gid",
|
|
46
|
+
"nlink",
|
|
47
|
+
"size",
|
|
48
|
+
"mtimeNs",
|
|
49
|
+
"ctimeNs",
|
|
50
|
+
]);
|
|
51
|
+
const INDEX_MUTATION_FIELDS = Object.freeze(
|
|
52
|
+
INDEX_STAT_FIELDS.filter((name) => name !== "dev" && name !== "ino"),
|
|
53
|
+
);
|
|
54
|
+
|
|
23
55
|
export const EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA =
|
|
24
56
|
"chainlesschain.evolution-durable-artifact-record/v1";
|
|
25
57
|
export const EVOLUTION_ARTIFACT_ENVELOPE_CORE_SCHEMA =
|
|
@@ -84,6 +116,10 @@ export const EVOLUTION_ARTIFACT_LEDGER_RETENTION_TYPES = Object.freeze([
|
|
|
84
116
|
"evolution-run-event",
|
|
85
117
|
"rrsi-history-event",
|
|
86
118
|
"skill-registry-store-policy",
|
|
119
|
+
"skill-registry-runtime-policy",
|
|
120
|
+
"rrsi-observed-text-chunk",
|
|
121
|
+
"rrsi-observed-text-manifest",
|
|
122
|
+
"rrsi-content-restriction-event",
|
|
87
123
|
"pm-exploration-recovery-snapshot",
|
|
88
124
|
"pm-exploration-provider-settlement",
|
|
89
125
|
"evolution-eval-child-evidence",
|
|
@@ -144,6 +180,10 @@ export const EVOLUTION_ARTIFACT_TYPES = Object.freeze([
|
|
|
144
180
|
"evolution-run-event",
|
|
145
181
|
"rrsi-history-event",
|
|
146
182
|
"skill-registry-store-policy",
|
|
183
|
+
"skill-registry-runtime-policy",
|
|
184
|
+
"rrsi-observed-text-chunk",
|
|
185
|
+
"rrsi-observed-text-manifest",
|
|
186
|
+
"rrsi-content-restriction-event",
|
|
147
187
|
"pm-exploration-recovery-snapshot",
|
|
148
188
|
"pm-exploration-provider-settlement",
|
|
149
189
|
"evolution-eval-child-evidence",
|
|
@@ -402,6 +442,10 @@ const LEDGER_RETENTION_PURPOSES_BY_TYPE = new Map([
|
|
|
402
442
|
["evolution-run-event", new Set(["evolution-ledger"])],
|
|
403
443
|
["rrsi-history-event", new Set(["evolution-ledger"])],
|
|
404
444
|
["skill-registry-store-policy", new Set(["evolution-ledger"])],
|
|
445
|
+
["skill-registry-runtime-policy", new Set(["evolution-ledger"])],
|
|
446
|
+
["rrsi-observed-text-chunk", new Set(["evolution-ledger"])],
|
|
447
|
+
["rrsi-observed-text-manifest", new Set(["evolution-ledger"])],
|
|
448
|
+
["rrsi-content-restriction-event", new Set(["evolution-ledger"])],
|
|
405
449
|
["pm-exploration-recovery-snapshot", new Set(["evolution-ledger"])],
|
|
406
450
|
["pm-exploration-provider-settlement", new Set(["evolution-ledger"])],
|
|
407
451
|
["evolution-eval-child-evidence", new Set(["evolution-ledger"])],
|
|
@@ -1117,7 +1161,12 @@ function inspectPhysicalDirectory(directory, label) {
|
|
|
1117
1161
|
let stat;
|
|
1118
1162
|
let realPath;
|
|
1119
1163
|
try {
|
|
1120
|
-
stat = fs.lstatSync(directory);
|
|
1164
|
+
stat = fs.lstatSync(directory, { bigint: true });
|
|
1165
|
+
if (typeof stat.dev !== "bigint" || typeof stat.ino !== "bigint")
|
|
1166
|
+
throw artifactError(
|
|
1167
|
+
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
1168
|
+
`${label} requires full-precision directory stat fields`,
|
|
1169
|
+
);
|
|
1121
1170
|
assertDirectory(stat, label);
|
|
1122
1171
|
realPath = physicalRealpath(directory);
|
|
1123
1172
|
} catch (cause) {
|
|
@@ -1141,8 +1190,11 @@ function inspectPhysicalDirectory(directory, label) {
|
|
|
1141
1190
|
}
|
|
1142
1191
|
|
|
1143
1192
|
function inspectPhysicalIndex(indexPath, rootRealPath) {
|
|
1144
|
-
return withEvolutionFileIdentity(
|
|
1145
|
-
|
|
1193
|
+
return withEvolutionFileIdentity(
|
|
1194
|
+
INDEX_DIRECTORY_FS,
|
|
1195
|
+
indexPath,
|
|
1196
|
+
(samePathHandle) =>
|
|
1197
|
+
inspectPhysicalIndexWithIdentity(indexPath, rootRealPath, samePathHandle),
|
|
1146
1198
|
);
|
|
1147
1199
|
}
|
|
1148
1200
|
|
|
@@ -1155,8 +1207,8 @@ function inspectPhysicalIndexWithIdentity(
|
|
|
1155
1207
|
let realPath;
|
|
1156
1208
|
let descriptor = null;
|
|
1157
1209
|
try {
|
|
1158
|
-
pathStat = fs.lstatSync(indexPath);
|
|
1159
|
-
|
|
1210
|
+
pathStat = fs.lstatSync(indexPath, { bigint: true });
|
|
1211
|
+
assertIndexStat(pathStat, "ArtifactStore index");
|
|
1160
1212
|
realPath = physicalRealpath(indexPath);
|
|
1161
1213
|
if (
|
|
1162
1214
|
!samePath(realPath, indexPath) ||
|
|
@@ -1169,16 +1221,36 @@ function inspectPhysicalIndexWithIdentity(
|
|
|
1169
1221
|
}
|
|
1170
1222
|
descriptor = fs.openSync(
|
|
1171
1223
|
indexPath,
|
|
1172
|
-
fs.constants.O_RDONLY |
|
|
1224
|
+
fs.constants.O_RDONLY |
|
|
1225
|
+
Number(fs.constants.O_NOFOLLOW || 0) |
|
|
1226
|
+
Number(fs.constants.O_NONBLOCK || 0),
|
|
1173
1227
|
);
|
|
1174
|
-
const descriptorStat = fs.fstatSync(descriptor);
|
|
1175
|
-
|
|
1176
|
-
if (
|
|
1228
|
+
const descriptorStat = fs.fstatSync(descriptor, { bigint: true });
|
|
1229
|
+
assertIndexStat(descriptorStat, "ArtifactStore index descriptor");
|
|
1230
|
+
if (
|
|
1231
|
+
!samePathHandle(pathStat, descriptorStat) ||
|
|
1232
|
+
!sameIndexMutationMetadata(pathStat, descriptorStat)
|
|
1233
|
+
) {
|
|
1177
1234
|
throw artifactError(
|
|
1178
1235
|
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
1179
1236
|
"ArtifactStore index pathname and descriptor identities differ",
|
|
1180
1237
|
);
|
|
1181
1238
|
}
|
|
1239
|
+
const afterPathStat = fs.lstatSync(indexPath, { bigint: true });
|
|
1240
|
+
const afterDescriptorStat = fs.fstatSync(descriptor, { bigint: true });
|
|
1241
|
+
assertIndexStat(afterPathStat, "ArtifactStore index");
|
|
1242
|
+
assertIndexStat(afterDescriptorStat, "ArtifactStore index descriptor");
|
|
1243
|
+
if (
|
|
1244
|
+
!sameIndexStat(pathStat, afterPathStat) ||
|
|
1245
|
+
!sameIndexStat(descriptorStat, afterDescriptorStat) ||
|
|
1246
|
+
!samePathHandle(afterPathStat, afterDescriptorStat) ||
|
|
1247
|
+
!sameIndexMutationMetadata(afterPathStat, afterDescriptorStat) ||
|
|
1248
|
+
!samePath(physicalRealpath(indexPath), realPath)
|
|
1249
|
+
)
|
|
1250
|
+
throw artifactError(
|
|
1251
|
+
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
1252
|
+
"ArtifactStore index changed while its identity was captured",
|
|
1253
|
+
);
|
|
1182
1254
|
} catch (cause) {
|
|
1183
1255
|
if (isEvolutionArtifactPortError(cause)) throw cause;
|
|
1184
1256
|
throw artifactError(
|
|
@@ -1273,16 +1345,6 @@ function attestCapturedDirectory(directory, realPath, identity, label) {
|
|
|
1273
1345
|
}
|
|
1274
1346
|
}
|
|
1275
1347
|
|
|
1276
|
-
function sameFileIdentity(left, right) {
|
|
1277
|
-
return (
|
|
1278
|
-
left.dev === right.dev &&
|
|
1279
|
-
left.ino === right.ino &&
|
|
1280
|
-
left.size === right.size &&
|
|
1281
|
-
left.mtimeMs === right.mtimeMs &&
|
|
1282
|
-
left.ctimeMs === right.ctimeMs
|
|
1283
|
-
);
|
|
1284
|
-
}
|
|
1285
|
-
|
|
1286
1348
|
function assertRegularSingleLink(stat, label) {
|
|
1287
1349
|
if (
|
|
1288
1350
|
!stat ||
|
|
@@ -1298,6 +1360,35 @@ function assertRegularSingleLink(stat, label) {
|
|
|
1298
1360
|
}
|
|
1299
1361
|
}
|
|
1300
1362
|
|
|
1363
|
+
function assertIndexStat(stat, label) {
|
|
1364
|
+
if (INDEX_STAT_FIELDS.some((name) => typeof stat?.[name] !== "bigint"))
|
|
1365
|
+
throw artifactError(
|
|
1366
|
+
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
1367
|
+
`${label} requires full-precision index stat fields`,
|
|
1368
|
+
);
|
|
1369
|
+
assertRegularSingleLink(stat, label);
|
|
1370
|
+
if (stat.size < 0n || stat.size > BigInt(EVOLUTION_ARTIFACT_MAX_INDEX_BYTES))
|
|
1371
|
+
throw artifactError(
|
|
1372
|
+
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
1373
|
+
`${label} exceeds its bounded snapshot size`,
|
|
1374
|
+
);
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
function sameIndexMutationMetadata(left, right) {
|
|
1378
|
+
return (
|
|
1379
|
+
INDEX_MUTATION_FIELDS.every((name) => left[name] === right[name]) &&
|
|
1380
|
+
physicalIdentity(left).birthtimeMs === physicalIdentity(right).birthtimeMs
|
|
1381
|
+
);
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
function sameIndexStat(left, right) {
|
|
1385
|
+
return (
|
|
1386
|
+
left.dev === right.dev &&
|
|
1387
|
+
left.ino === right.ino &&
|
|
1388
|
+
sameIndexMutationMetadata(left, right)
|
|
1389
|
+
);
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1301
1392
|
function attestStoreDirectories(layout) {
|
|
1302
1393
|
attestCapturedDirectory(
|
|
1303
1394
|
layout.rootDir,
|
|
@@ -1420,8 +1511,11 @@ function parseTrustedIndexBytes(bytes) {
|
|
|
1420
1511
|
}
|
|
1421
1512
|
|
|
1422
1513
|
function readTrustedIndexSnapshot(layout) {
|
|
1423
|
-
return withEvolutionFileIdentity(
|
|
1424
|
-
|
|
1514
|
+
return withEvolutionFileIdentity(
|
|
1515
|
+
INDEX_DIRECTORY_FS,
|
|
1516
|
+
layout.indexPath,
|
|
1517
|
+
(samePathHandle) =>
|
|
1518
|
+
readTrustedIndexSnapshotWithIdentity(layout, samePathHandle),
|
|
1425
1519
|
);
|
|
1426
1520
|
}
|
|
1427
1521
|
|
|
@@ -1434,8 +1528,8 @@ function readTrustedIndexSnapshotWithIdentity(layout, samePathHandle) {
|
|
|
1434
1528
|
let bytes;
|
|
1435
1529
|
let indexRealPath;
|
|
1436
1530
|
try {
|
|
1437
|
-
beforePathStat = fs.lstatSync(layout.indexPath);
|
|
1438
|
-
|
|
1531
|
+
beforePathStat = fs.lstatSync(layout.indexPath, { bigint: true });
|
|
1532
|
+
assertIndexStat(beforePathStat, "ArtifactStore index");
|
|
1439
1533
|
if (!samePhysicalIdentity(beforePathStat, layout.indexIdentity)) {
|
|
1440
1534
|
throw artifactError(
|
|
1441
1535
|
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
@@ -1455,27 +1549,32 @@ function readTrustedIndexSnapshotWithIdentity(layout, samePathHandle) {
|
|
|
1455
1549
|
}
|
|
1456
1550
|
descriptor = fs.openSync(
|
|
1457
1551
|
layout.indexPath,
|
|
1458
|
-
fs.constants.O_RDONLY |
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
assertRegularSingleLink(
|
|
1462
|
-
beforeDescriptorStat,
|
|
1463
|
-
"ArtifactStore index descriptor",
|
|
1552
|
+
fs.constants.O_RDONLY |
|
|
1553
|
+
Number(fs.constants.O_NOFOLLOW || 0) |
|
|
1554
|
+
Number(fs.constants.O_NONBLOCK || 0),
|
|
1464
1555
|
);
|
|
1556
|
+
beforeDescriptorStat = fs.fstatSync(descriptor, { bigint: true });
|
|
1557
|
+
assertIndexStat(beforeDescriptorStat, "ArtifactStore index descriptor");
|
|
1465
1558
|
if (
|
|
1466
1559
|
!samePathHandle(beforePathStat, beforeDescriptorStat) ||
|
|
1467
|
-
beforeDescriptorStat
|
|
1560
|
+
!sameIndexMutationMetadata(beforePathStat, beforeDescriptorStat)
|
|
1468
1561
|
) {
|
|
1469
1562
|
throw artifactError(
|
|
1470
1563
|
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
1471
1564
|
"ArtifactStore index descriptor is replaced or oversized",
|
|
1472
1565
|
);
|
|
1473
1566
|
}
|
|
1474
|
-
bytes =
|
|
1475
|
-
|
|
1567
|
+
bytes = readBoundedDescriptor(
|
|
1568
|
+
fs,
|
|
1569
|
+
descriptor,
|
|
1570
|
+
Number(beforeDescriptorStat.size),
|
|
1571
|
+
EVOLUTION_ARTIFACT_MAX_INDEX_BYTES,
|
|
1572
|
+
);
|
|
1573
|
+
afterDescriptorStat = fs.fstatSync(descriptor, { bigint: true });
|
|
1574
|
+
assertIndexStat(afterDescriptorStat, "ArtifactStore index descriptor");
|
|
1476
1575
|
if (
|
|
1477
|
-
!
|
|
1478
|
-
bytes.length !== beforeDescriptorStat.size
|
|
1576
|
+
!sameIndexStat(beforeDescriptorStat, afterDescriptorStat) ||
|
|
1577
|
+
BigInt(bytes.length) !== beforeDescriptorStat.size
|
|
1479
1578
|
) {
|
|
1480
1579
|
throw artifactError(
|
|
1481
1580
|
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
@@ -1494,10 +1593,10 @@ function readTrustedIndexSnapshotWithIdentity(layout, samePathHandle) {
|
|
|
1494
1593
|
}
|
|
1495
1594
|
let afterPathStat;
|
|
1496
1595
|
try {
|
|
1497
|
-
afterPathStat = fs.lstatSync(layout.indexPath);
|
|
1498
|
-
|
|
1596
|
+
afterPathStat = fs.lstatSync(layout.indexPath, { bigint: true });
|
|
1597
|
+
assertIndexStat(afterPathStat, "ArtifactStore index");
|
|
1499
1598
|
if (
|
|
1500
|
-
!
|
|
1599
|
+
!sameIndexStat(beforePathStat, afterPathStat) ||
|
|
1501
1600
|
!samePhysicalIdentity(afterPathStat, layout.indexIdentity) ||
|
|
1502
1601
|
!samePath(physicalRealpath(layout.indexPath), indexRealPath)
|
|
1503
1602
|
) {
|
|
@@ -2017,6 +2116,42 @@ export class EvolutionArtifactPorts {
|
|
|
2017
2116
|
throw new TypeError("EvolutionArtifactPorts now must be a function");
|
|
2018
2117
|
}
|
|
2019
2118
|
this.#now = Object.freeze((...args) => now(...args));
|
|
2119
|
+
const layout = this.#store.layout;
|
|
2120
|
+
const directoryBoundary = deepFreeze({
|
|
2121
|
+
schema: "chainlesschain.evolution-artifact-store-directory-boundary/v1",
|
|
2122
|
+
artifactTenantId: this.#tenantId,
|
|
2123
|
+
audience: this.#audience,
|
|
2124
|
+
root: { path: layout.rootRealPath, identity: layout.rootIdentity },
|
|
2125
|
+
files: { path: layout.filesRealPath, identity: layout.filesIdentity },
|
|
2126
|
+
scope: "root-and-files-directories",
|
|
2127
|
+
indexLocation: layout.indexRealPath,
|
|
2128
|
+
indexFileIdentityVerified: false,
|
|
2129
|
+
indexContentsVerified: false,
|
|
2130
|
+
artifactInventoryVerified: false,
|
|
2131
|
+
independentVolumeIdentityVerified: false,
|
|
2132
|
+
fullPhysicalStorageGraphVerified: false,
|
|
2133
|
+
rootAuthorityVerified: false,
|
|
2134
|
+
generationProvenanceVerified: false,
|
|
2135
|
+
tenantWideIndexAuthorityVerified: false,
|
|
2136
|
+
grantsMutationOrPromotionAuthority: false,
|
|
2137
|
+
});
|
|
2138
|
+
const recheck = (...args) => {
|
|
2139
|
+
if (args.length)
|
|
2140
|
+
throw artifactError(
|
|
2141
|
+
EVOLUTION_ARTIFACT_INVALID_CODE,
|
|
2142
|
+
"artifact directory boundary takes no replacement context",
|
|
2143
|
+
);
|
|
2144
|
+
attestStoreDirectories(layout);
|
|
2145
|
+
return directoryBoundary;
|
|
2146
|
+
};
|
|
2147
|
+
recheck();
|
|
2148
|
+
ARTIFACT_STORE_DIRECTORY_BOUNDARIES.set(
|
|
2149
|
+
this,
|
|
2150
|
+
Object.freeze({
|
|
2151
|
+
descriptor: directoryBoundary,
|
|
2152
|
+
recheck: Object.freeze(recheck),
|
|
2153
|
+
}),
|
|
2154
|
+
);
|
|
2020
2155
|
Object.freeze(this);
|
|
2021
2156
|
}
|
|
2022
2157
|
|
|
@@ -2362,26 +2497,6 @@ export class EvolutionArtifactPorts {
|
|
|
2362
2497
|
}
|
|
2363
2498
|
|
|
2364
2499
|
#readStoredBytes(entry, normalizedEntry, expectedDigest) {
|
|
2365
|
-
const expectedPath = path.resolve(
|
|
2366
|
-
this.#store.layout.filesDir,
|
|
2367
|
-
normalizedEntry.file,
|
|
2368
|
-
);
|
|
2369
|
-
return withEvolutionFileIdentity(fs, expectedPath, (samePathHandle) =>
|
|
2370
|
-
this.#readStoredBytesWithIdentity(
|
|
2371
|
-
entry,
|
|
2372
|
-
normalizedEntry,
|
|
2373
|
-
expectedDigest,
|
|
2374
|
-
samePathHandle,
|
|
2375
|
-
),
|
|
2376
|
-
);
|
|
2377
|
-
}
|
|
2378
|
-
|
|
2379
|
-
#readStoredBytesWithIdentity(
|
|
2380
|
-
entry,
|
|
2381
|
-
normalizedEntry,
|
|
2382
|
-
expectedDigest,
|
|
2383
|
-
samePathHandle,
|
|
2384
|
-
) {
|
|
2385
2500
|
attestStoreDirectories(this.#store.layout);
|
|
2386
2501
|
const expectedHex = expectedDigest.slice("sha256:".length);
|
|
2387
2502
|
let storedPath;
|
|
@@ -2413,9 +2528,13 @@ export class EvolutionArtifactPorts {
|
|
|
2413
2528
|
);
|
|
2414
2529
|
}
|
|
2415
2530
|
|
|
2531
|
+
const readBounds = Object.freeze({
|
|
2532
|
+
expectedSize: normalizedEntry.size,
|
|
2533
|
+
maximumBytes: EVOLUTION_ARTIFACT_MAX_CANONICAL_BYTES,
|
|
2534
|
+
});
|
|
2416
2535
|
let integrityBefore;
|
|
2417
2536
|
try {
|
|
2418
|
-
integrityBefore = this.#store.verifyIntegrity(entry);
|
|
2537
|
+
integrityBefore = this.#store.verifyIntegrity(entry, readBounds);
|
|
2419
2538
|
} catch (cause) {
|
|
2420
2539
|
throw artifactError(
|
|
2421
2540
|
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
@@ -2425,53 +2544,13 @@ export class EvolutionArtifactPorts {
|
|
|
2425
2544
|
}
|
|
2426
2545
|
validateIntegrityResult(integrityBefore, expectedHex);
|
|
2427
2546
|
|
|
2428
|
-
let rootRealPath;
|
|
2429
|
-
let beforePathStat;
|
|
2430
|
-
let targetRealPath;
|
|
2431
|
-
let descriptor = null;
|
|
2432
|
-
let beforeDescriptorStat;
|
|
2433
|
-
let afterDescriptorStat;
|
|
2434
2547
|
let bytes;
|
|
2435
2548
|
try {
|
|
2436
|
-
|
|
2437
|
-
if (!samePath(rootRealPath, this.#store.layout.filesRealPath)) {
|
|
2438
|
-
throw artifactError(
|
|
2439
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2440
|
-
"ArtifactStore files root physical identity changed before byte read",
|
|
2441
|
-
);
|
|
2442
|
-
}
|
|
2443
|
-
beforePathStat = fs.lstatSync(resolvedStoredPath);
|
|
2444
|
-
assertRegularSingleLink(beforePathStat, "stored artifact path");
|
|
2445
|
-
targetRealPath = physicalRealpath(resolvedStoredPath);
|
|
2446
|
-
if (!isContained(rootRealPath, targetRealPath)) {
|
|
2447
|
-
throw artifactError(
|
|
2448
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2449
|
-
"stored artifact realpath escapes the captured files root",
|
|
2450
|
-
);
|
|
2451
|
-
}
|
|
2452
|
-
descriptor = fs.openSync(
|
|
2549
|
+
bytes = readBoundedArtifactFile(
|
|
2453
2550
|
resolvedStoredPath,
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
beforeDescriptorStat = fs.fstatSync(descriptor);
|
|
2457
|
-
assertRegularSingleLink(
|
|
2458
|
-
beforeDescriptorStat,
|
|
2459
|
-
"stored artifact descriptor",
|
|
2551
|
+
readBounds.expectedSize,
|
|
2552
|
+
readBounds.maximumBytes,
|
|
2460
2553
|
);
|
|
2461
|
-
if (!samePathHandle(beforePathStat, beforeDescriptorStat)) {
|
|
2462
|
-
throw artifactError(
|
|
2463
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2464
|
-
"stored artifact pathname and descriptor identities differ",
|
|
2465
|
-
);
|
|
2466
|
-
}
|
|
2467
|
-
bytes = fs.readFileSync(descriptor);
|
|
2468
|
-
afterDescriptorStat = fs.fstatSync(descriptor);
|
|
2469
|
-
if (!sameFileIdentity(beforeDescriptorStat, afterDescriptorStat)) {
|
|
2470
|
-
throw artifactError(
|
|
2471
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2472
|
-
"stored artifact changed while it was read",
|
|
2473
|
-
);
|
|
2474
|
-
}
|
|
2475
2554
|
} catch (cause) {
|
|
2476
2555
|
if (isEvolutionArtifactPortError(cause)) throw cause;
|
|
2477
2556
|
throw artifactError(
|
|
@@ -2479,33 +2558,6 @@ export class EvolutionArtifactPorts {
|
|
|
2479
2558
|
"stored artifact could not be opened safely",
|
|
2480
2559
|
{ cause },
|
|
2481
2560
|
);
|
|
2482
|
-
} finally {
|
|
2483
|
-
if (descriptor !== null) fs.closeSync(descriptor);
|
|
2484
|
-
}
|
|
2485
|
-
let afterPathStat;
|
|
2486
|
-
try {
|
|
2487
|
-
afterPathStat = fs.lstatSync(resolvedStoredPath);
|
|
2488
|
-
assertRegularSingleLink(afterPathStat, "stored artifact path");
|
|
2489
|
-
if (!sameFileIdentity(beforePathStat, afterPathStat)) {
|
|
2490
|
-
throw artifactError(
|
|
2491
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2492
|
-
"stored artifact pathname changed during readback",
|
|
2493
|
-
);
|
|
2494
|
-
}
|
|
2495
|
-
const afterRealPath = physicalRealpath(resolvedStoredPath);
|
|
2496
|
-
if (!samePath(targetRealPath, afterRealPath)) {
|
|
2497
|
-
throw artifactError(
|
|
2498
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2499
|
-
"stored artifact realpath changed during readback",
|
|
2500
|
-
);
|
|
2501
|
-
}
|
|
2502
|
-
} catch (cause) {
|
|
2503
|
-
if (isEvolutionArtifactPortError(cause)) throw cause;
|
|
2504
|
-
throw artifactError(
|
|
2505
|
-
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
2506
|
-
"stored artifact could not be re-attested",
|
|
2507
|
-
{ cause },
|
|
2508
|
-
);
|
|
2509
2561
|
}
|
|
2510
2562
|
if (
|
|
2511
2563
|
bytes.length !== normalizedEntry.size ||
|
|
@@ -2518,7 +2570,7 @@ export class EvolutionArtifactPorts {
|
|
|
2518
2570
|
}
|
|
2519
2571
|
let integrityAfter;
|
|
2520
2572
|
try {
|
|
2521
|
-
integrityAfter = this.#store.verifyIntegrity(entry);
|
|
2573
|
+
integrityAfter = this.#store.verifyIntegrity(entry, readBounds);
|
|
2522
2574
|
} catch (cause) {
|
|
2523
2575
|
throw artifactError(
|
|
2524
2576
|
EVOLUTION_ARTIFACT_INTEGRITY_FAILED_CODE,
|
|
@@ -3617,4 +3669,32 @@ export function captureEvolutionLedgerArtifactResolverBinding(value) {
|
|
|
3617
3669
|
return binding;
|
|
3618
3670
|
}
|
|
3619
3671
|
|
|
3672
|
+
/** Original root/files directory capture only; never an installer or tenant grant. */
|
|
3673
|
+
export function captureEvolutionArtifactStoreDirectoryBoundary(value) {
|
|
3674
|
+
if (arguments.length !== 1)
|
|
3675
|
+
throw new TypeError(
|
|
3676
|
+
"artifact directory boundary capture takes exactly one original ports object",
|
|
3677
|
+
);
|
|
3678
|
+
rejectProxy(value, "EvolutionArtifactPorts directory boundary");
|
|
3679
|
+
if (
|
|
3680
|
+
!value ||
|
|
3681
|
+
Object.getPrototypeOf(value) !== EvolutionArtifactPorts.prototype ||
|
|
3682
|
+
!hasStablePrototype(
|
|
3683
|
+
value,
|
|
3684
|
+
EvolutionArtifactPorts.prototype,
|
|
3685
|
+
"EvolutionArtifactPorts directory boundary",
|
|
3686
|
+
)
|
|
3687
|
+
)
|
|
3688
|
+
throw new TypeError(
|
|
3689
|
+
"a genuine EvolutionArtifactPorts directory boundary is required",
|
|
3690
|
+
);
|
|
3691
|
+
const boundary = ARTIFACT_STORE_DIRECTORY_BOUNDARIES.get(value);
|
|
3692
|
+
if (!boundary)
|
|
3693
|
+
throw new TypeError(
|
|
3694
|
+
"a genuine EvolutionArtifactPorts directory boundary is required",
|
|
3695
|
+
);
|
|
3696
|
+
boundary.recheck();
|
|
3697
|
+
return boundary;
|
|
3698
|
+
}
|
|
3699
|
+
|
|
3620
3700
|
Object.freeze(EvolutionArtifactPorts.prototype);
|
|
@@ -3230,6 +3230,31 @@ export function createRrsiHistoryLedgerAdapter(input) {
|
|
|
3230
3230
|
artifactPorts: options.artifactPorts,
|
|
3231
3231
|
ledgerArtifactResolver: options.ledgerArtifactResolver,
|
|
3232
3232
|
resolveCampaignRoot: adapter.resolveCampaignRoot,
|
|
3233
|
+
resolvePreparation(executionId) {
|
|
3234
|
+
rrsiId(executionId, "preparation execution ID");
|
|
3235
|
+
return withHistoryLock(() => {
|
|
3236
|
+
const { state } = load();
|
|
3237
|
+
const entry = state.reservations.get(executionId);
|
|
3238
|
+
if (!entry || !isRrsiPreparationReservation(entry.reservation))
|
|
3239
|
+
rrsiFail("preparation execution is not registered");
|
|
3240
|
+
const operation = [...state.operations.values()].find(
|
|
3241
|
+
(value) =>
|
|
3242
|
+
value.record.kind === "reserve-preparation" &&
|
|
3243
|
+
value.record.payload.executionId === executionId,
|
|
3244
|
+
);
|
|
3245
|
+
if (!operation) rrsiFail("preparation registration is missing");
|
|
3246
|
+
return freezeRrsiData({
|
|
3247
|
+
descriptor,
|
|
3248
|
+
identity: state.identity,
|
|
3249
|
+
reservation: entry.reservation,
|
|
3250
|
+
registrationRecord: historyRegistrationRecord(operation),
|
|
3251
|
+
status: entry.status,
|
|
3252
|
+
dispatched: entry.dispatched,
|
|
3253
|
+
historyAuthenticated: true,
|
|
3254
|
+
sourceDerivationVerified: false,
|
|
3255
|
+
});
|
|
3256
|
+
});
|
|
3257
|
+
},
|
|
3233
3258
|
resolveNativeBatch: adapter.resolveNativeBatch,
|
|
3234
3259
|
resolveNativeStatisticsScope: adapter.resolveNativeStatisticsScope,
|
|
3235
3260
|
assertNativeFreshChild(response, expectedBindings) {
|