chainlesschain 0.166.117 → 0.166.118
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 +26 -4
- 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/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C9tSCImB.js → AIOps-BGySwMIP.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CXKExmT_.js → ActionButton-Chn7fBLr.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DE8WBWHo.js → Analytics-ORH7UkGa.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BdpwNM08.js → AppLayout-8xV4jWjP.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-94TQpe38.js → Artifacts-26SBK-x-.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DdDEv5Ej.js → Audit-CtXpqbXg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-TU9nlV7j.js → BackgroundAgents-C5zLvQis.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-C0GPoUUq.js → Backup-C93xY4vO.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-iyrVn2I6.js → BaseInput-DpVCHfAn.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dqo8spwp.js → Chat-DM0LblR2.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CDqHSzc4.js → ChatBubbleRenderer-unlQUF1T.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BF_XJvQi.js → Checkbox-BsAt3cKR.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-5tUWoOa9.js → Codegen-E_kp4KFd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BQxSeRvG.js → Col-6msR3T6I.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B2Ra7w-J.js → Community-PyX9c5D-.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-GjxJwlr0.js → Compact-7G1bVDSH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BTUP6RTA.js → Compliance-DcHN7GlD.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DiwfL16s.js → Cowork-WUIHJYDx.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-1ceOo5ux.js → Cron-CWgCbptg.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-aHYxLu0u.js → Crosschain-BzKZ6roD.js} +1 -1
- package/src/assets/web-panel/assets/{DID-eeTjzOLV.js → DID-r7zxeItn.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CT3fpkvX.js → Dashboard-D3pBiN2H.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-B3UpOy-N.js → Dropdown-C4otRJlZ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Ba2Rvoru.js → EmailListRenderer-CzDTC8lm.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-CGtn93on.js → EvolutionSettings-DGkXiIs-.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C0IUdHQt.js → FamilyGuardDashboard-BKdEyuiR.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-1QIDwemn.js → Federation-dsI-xcpf.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-NGbSsdje.js → FormItemContext-CEEb1fMR.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DzVZc2Ba.js → GenericCardRenderer-D_mfO3Ts.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B_1TDbSr.js → Git-CBwr2ZI3.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BDl_ySyI.js → Governance-D-Wy2Jjr.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CAp-wcCK.js → Inference-B4Yk_IRx.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DRjRcxul.js → KnowledgeGraph-DoI7bi6m.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-qSuwMwk7.js → Logs-Ce1IiKAj.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-GND_8y0V.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DfiXL6UO.js → Marketplace-CsIEByzK.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D9rIvFjN.js → McpTools-_DRzjcIn.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-D-p7yDzj.js → Memory-zvLpyi__.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-D0XT5B6m.js → MobileBridge-DXd1ik2Z.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CL9cHVIk.js → MobileProjects-DKh2q-Y9.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CME4kDmC.js → Mtc-Ct-fhtIx.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BjGOXFnn.js → MtcAudit-J4zY3Oqk.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CSzc53e0.js → Multisig-B2HJMCKe.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BYjZnaH8.js → NLProgramming-CwcSmU4q.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BUPOYE0C.js → Notes-Da53L6wb.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BK8YADru.js → NotificationSettings-BxhufdrA.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-B5F8bnWt.js → OrderTableRenderer-BoFwohAi.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B0WNlhMd.js → Organization-MIsMrUes.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CED6ZO87.js → Overflow-Dy2P4v3q.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CBdc8fkP.js → P2P-CD9Sxn2y.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DuauYi03.js → PdhVaultBrowser-BvBWgfG0.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-kfgY0ukN.js → Permissions-CwOlDRis.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CDY3I1Do.js → PersonalDataHub-CZYaxEpv.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-B9x0wKSK.js → Pipeline-kLU7PUbB.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Cqhcr_Qv.js → Privacy-BVRycSiI.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CFhoyo57.js → ProjectInit-DP3pr7uJ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DCBjV2Hm.js → ProjectSettings-CACaDYjs.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-C51w0LnM.js → Projects-CB1k4zTC.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BuCIWZY1.js → Providers-D7Y9WHRE.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CEXNL5CB.js → QrScannerModal-CeP8xzs1.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DgK8aLAU.js → QuickAsk-iJVFrhZ2.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BxEYQRAs.js → Recommend-DmTpnagw.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-PRsxNsYU.js → RemoteSession-C6ek8Uni.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-S-tQH70r.js → Reputation-CPfwc9de.js} +1 -1
- package/src/assets/web-panel/assets/{Row-U1Ws3CJl.js → Row-C1wwtSMJ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BftCyeii.js → RssFeed-BiDJsqaH.js} +3 -3
- package/src/assets/web-panel/assets/{Search-o4gK0cPy.js → Search-BF6Aon95.js} +1 -1
- package/src/assets/web-panel/assets/{Security-U2ZRpsbA.js → Security-Bps0XnV4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D0tRjWl_.js → Services-uf92smGR.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DzZ8TFsB.js → Skeleton-DQd4eVWW.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-B1cC7rju.js → Skills-DgamiYa5.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CtIHOR0J.js → Sla-CF1IVIrm.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CD8ZlQpW.js → SpeechSettings-Bzxmjbpc.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BilFQWQk.js → SyncSettings-B8zKauiq.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Bmg2qLXl.js → Tasks-DPKV_xSt.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D6yofyC1.js → Templates-BikeSZIF.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BzttD-Gp.js → Tenant-CEaUaDkJ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DyRXeYuH.js → Terminal-ZPgOSQ_q.js} +3 -3
- package/src/assets/web-panel/assets/{TimelineRenderer-Bdmkx-Tr.js → TimelineRenderer-DmyB4Udk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-10RcVAVJ.js → Tokens-g85Pm5TO.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CKV-9DdV.js → Trigger-D202hx9a.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BEc-sW1q.js → Trust-DzvQYVFy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BSql8piX.js → UkeySign-KRzwddVg.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C4OH2f4s.js → VideoEditing-IRBXLO2z.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BSSvWKmv.js → Wallet-DSf5KPgQ.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-LxIzXo9d.js → WebAuthn-DNPxLTCc.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DWwdfcte.js → WorkflowEditor-C3wAtVcK.js} +1 -1
- package/src/assets/web-panel/assets/{addon-fit-CK6X9sAG.js → addon-fit-CbkjSUJl.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DWxYYLD5.js → chat-q3XXUtv2.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BxEcQqtg.js → colors-CF54SNei.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DNbezFOJ.js → compact-item-BaRkvZuT.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DaJXc5nx.js → createContext-CDR9hsfs.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-1LO-NplX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BMrw3sg3.js → hasIn-DlC--S8R.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpSp97J8.js → index-B0Ptc7yu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzZHBzCb.js → index-B0V9rgdu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DEvdSKT4.js → index-BEiUlFKb.js} +1 -1
- package/src/assets/web-panel/assets/{index-pzYLf5qu.js → index-BJO0n1LQ.js} +1 -1
- package/src/assets/web-panel/assets/index-BLaJsev4.js +1 -0
- package/src/assets/web-panel/assets/index-BLmviChG.js +1 -0
- package/src/assets/web-panel/assets/{index-2c0bL3SE.js → index-BU5DJqk7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dr18agDl.js → index-BY-Tf3OM.js} +1 -1
- package/src/assets/web-panel/assets/{index-T4T84G6X.js → index-BZrE0Go8.js} +1 -1
- package/src/assets/web-panel/assets/{index-LRb0QX6S.js → index-BizdX2X5.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9b6UaZl.js → index-C87Yr3h1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAV07GDK.js → index-C9Wypz9e.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_b9_6wQ.js → index-CAoG_E-q.js} +1 -1
- package/src/assets/web-panel/assets/{index-NEW5EN2w.js → index-CAxSyMrF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dwg38xTG.js → index-CC5HjNM6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bs2QyMPQ.js → index-CNZQEZ9g.js} +1 -1
- package/src/assets/web-panel/assets/{index-BR4nWOmR.js → index-CPvIhha6.js} +1 -1
- package/src/assets/web-panel/assets/{index-hPy_f08G.js → index-CR_wqMGy.js} +1 -1
- package/src/assets/web-panel/assets/{index-IX0g0s2t.js → index-CSClXoB3.js} +1 -1
- package/src/assets/web-panel/assets/{index-cCqCEa9X.js → index-CZ8azVgB.js} +3 -3
- package/src/assets/web-panel/assets/{index-C25ig6EV.js → index-Ccc5z8eJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-7zzLqfvI.js → index-CeiKbM3a.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpwgF7vh.js → index-Cl6av3X7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNZDGV2q.js → index-CtGfeD7E.js} +1 -1
- package/src/assets/web-panel/assets/{index-6W0V5G2t.js → index-Ctid12Gq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaByEdBj.js → index-D0H-N0uG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCCd8Rj6.js → index-D0vIgprF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CL-36X3A.js → index-D4wUDFRg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DL0k35f0.js → index-DJFipyK7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcuytRTa.js → index-DX2REKNp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cm9DYzhC.js → index-Dc3gD0cw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bum_aSyd.js → index-DiQzer2R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaxzeSIM.js → index-DntKLOs9.js} +1 -1
- package/src/assets/web-panel/assets/{index-cKBpcInt.js → index-Dplhl6gh.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ca2hwPMo.js → index-Dq8q_PWB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DarVV5yG.js → index-IVQdOBNN.js} +1 -1
- package/src/assets/web-panel/assets/{index-rFaCnjXi.js → index-Kerduyao.js} +1 -1
- package/src/assets/web-panel/assets/{index-VD-dTYQE.js → index-W6cLGjpW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiEdfbB9.js → index-qZDNFll9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BWVLgWhF.js → initDefaultProps-Ccz7v71u.js} +1 -1
- package/src/assets/web-panel/assets/{markdown-Yo_c6Krv.js → markdown-Bq2x0XsR.js} +1 -1
- package/src/assets/web-panel/assets/markdown-DUKxbhE4.js +51 -0
- package/src/assets/web-panel/assets/{motion-KJZ1xfDE.js → motion-BlCLpVDp.js} +1 -1
- package/src/assets/web-panel/assets/{move-DGqU6H7M.js → move-B80G7fLU.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Dg0xkI5J.js → mtc-parser-Djw08NJh.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B6RnMJAQ.js → omit-Bg_G1eUr.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Ctw2i3jb.js → pickAttrs-Df9zYUg2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-D3F3x8Jm.js → placementArrow-DjCDLhJ4.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-W6eHE0nM.js → responsiveObserve--Naz7NgY.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BlFf8sY5.js → slide-CHn3ald-.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Cd6LMwmy.js → statusUtils-BiGwoIK_.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bg5-U4Y1.js → styleChecker-Zf2dQx1j.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DTkLS3tn.js → useFlexGapSupport-sLES8nyD.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CwYGzoBt.js → useFs-DV1Hl4qu.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-PCgFQXZP.js → usePersonalDataHub-CZXr2Qxg.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CJM7MkrB.js → vnode-e8Eo3Oyl.js} +1 -1
- package/src/assets/web-panel/assets/{xterm-BZcWGsqw.js → xterm-zbskxxGA.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CP0mgaFi.js → zoom-B8A6xKMF.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +15 -2
- package/src/harness/jsonl-session-store.js +2 -1
- package/src/lib/artifact-store.js +129 -20
- package/src/lib/bounded-artifact-file-read.js +128 -46
- package/src/lib/evolution/agent-evolution-ingress.js +41 -7
- package/src/lib/evolution/agent-evolution-runtime-composition.js +65 -27
- package/src/lib/evolution/evidence-json-text.js +65 -3
- package/src/lib/evolution/evolution-artifact-ports.js +1005 -83
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +59 -15
- package/src/lib/evolution/evolution-evidence-projector.js +35 -3
- package/src/lib/evolution/evolution-evidence-storage-layout.js +115 -0
- package/src/lib/evolution/evolution-file-witness.js +7 -3
- package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +6 -2
- package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +6 -2
- package/src/lib/evolution/evolution-ledger.js +226 -55
- package/src/lib/evolution/evolution-private-storage.js +20 -0
- package/src/lib/evolution/evolution-run-ledger-adapter.js +298 -11
- package/src/lib/evolution/evolution-windows-directory-durability.js +215 -32
- package/src/lib/evolution/local-ui-evolution-runtime.js +3 -38
- package/src/lib/evolution/local-ui-signing-authority.js +69 -0
- package/src/lib/ollama-provider-fetch.js +33 -0
- package/src/lib/provider-stream.js +14 -13
- package/src/lib/session-history-origins.js +71 -32
- package/src/lib/session-message-provenance.js +26 -2
- package/src/lib/session-runtime-retention.js +10 -1
- package/src/lib/session-transcript-migration.js +67 -12
- package/src/lib/storage-failure-cause-codes.js +449 -0
- package/src/runtime/agent-core.js +54 -33
- package/src/runtime/headless-stream.js +89 -10
- package/src/assets/web-panel/assets/MarkdownRenderer-BgnYTegK.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CRyXoGo9.js +0 -1
- package/src/assets/web-panel/assets/index-C-W0Ntk_.js +0 -1
- package/src/assets/web-panel/assets/index-CCk_qhBx.js +0 -1
- package/src/assets/web-panel/assets/markdown-CsiA8-E5.js +0 -50
|
@@ -15,7 +15,9 @@ import {
|
|
|
15
15
|
EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
|
|
16
16
|
EVOLUTION_ARTIFACT_DEFAULT_TTL_MS,
|
|
17
17
|
EVOLUTION_ARTIFACT_MAX_TTL_MS,
|
|
18
|
+
captureEvolutionArtifactStoreDirectoryBoundary,
|
|
18
19
|
} from "./evolution-artifact-ports.js";
|
|
20
|
+
import { EVOLUTION_EVIDENCE_STORAGE_TYPES } from "./evolution-evidence-storage-layout.js";
|
|
19
21
|
import { EVOLUTION_ARTIFACT_REF_SCHEMA } from "./evolution-ledger.js";
|
|
20
22
|
import {
|
|
21
23
|
EVOLUTION_RAW_STORAGE_RECEIPT_SCHEMA,
|
|
@@ -353,6 +355,7 @@ export class EvolutionEvidenceArtifactAdapter {
|
|
|
353
355
|
projector,
|
|
354
356
|
bundleVerifier,
|
|
355
357
|
artifactPorts,
|
|
358
|
+
typedArtifactPorts,
|
|
356
359
|
} = {}) {
|
|
357
360
|
this.#tenantId = normalizeId(tenantId, "evidence adapter tenantId");
|
|
358
361
|
this.#audience = normalizeId(audience, "evidence adapter audience");
|
|
@@ -374,11 +377,50 @@ export class EvolutionEvidenceArtifactAdapter {
|
|
|
374
377
|
EvolutionEvidenceBundleVerifier.prototype,
|
|
375
378
|
"bundleVerifier",
|
|
376
379
|
);
|
|
377
|
-
|
|
378
|
-
artifactPorts
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
380
|
+
if (typedArtifactPorts !== undefined) {
|
|
381
|
+
if (artifactPorts !== undefined)
|
|
382
|
+
throw new TypeError(
|
|
383
|
+
"Evidence adapter requires exactly one storage layout",
|
|
384
|
+
);
|
|
385
|
+
assertPlainExact(
|
|
386
|
+
typedArtifactPorts,
|
|
387
|
+
new Set(EVOLUTION_EVIDENCE_STORAGE_TYPES),
|
|
388
|
+
"typedArtifactPorts",
|
|
389
|
+
);
|
|
390
|
+
const captured = {};
|
|
391
|
+
const identities = new Set();
|
|
392
|
+
for (const type of EVOLUTION_EVIDENCE_STORAGE_TYPES) {
|
|
393
|
+
const port = typedArtifactPorts[type];
|
|
394
|
+
const boundary =
|
|
395
|
+
captureEvolutionArtifactStoreDirectoryBoundary(port).descriptor;
|
|
396
|
+
if (
|
|
397
|
+
boundary.artifactTenantId !== this.#tenantId ||
|
|
398
|
+
boundary.audience !== this.#audience
|
|
399
|
+
)
|
|
400
|
+
throw new TypeError(
|
|
401
|
+
"Typed Evidence store scope does not match its adapter",
|
|
402
|
+
);
|
|
403
|
+
for (const directory of [boundary.root, boundary.files]) {
|
|
404
|
+
const identity = `${directory.identity.dev}:${directory.identity.ino}`;
|
|
405
|
+
if (identities.has(identity))
|
|
406
|
+
throw new TypeError("Typed Evidence stores must be distinct");
|
|
407
|
+
identities.add(identity);
|
|
408
|
+
}
|
|
409
|
+
captured[type] = port;
|
|
410
|
+
}
|
|
411
|
+
this.#ports = Object.freeze(captured);
|
|
412
|
+
} else {
|
|
413
|
+
assertInstance(
|
|
414
|
+
artifactPorts,
|
|
415
|
+
EvolutionArtifactPorts.prototype,
|
|
416
|
+
"artifactPorts",
|
|
417
|
+
);
|
|
418
|
+
this.#ports = Object.freeze(
|
|
419
|
+
Object.fromEntries(
|
|
420
|
+
EVOLUTION_EVIDENCE_STORAGE_TYPES.map((type) => [type, artifactPorts]),
|
|
421
|
+
),
|
|
422
|
+
);
|
|
423
|
+
}
|
|
382
424
|
this.#ttlMs = ttlMs;
|
|
383
425
|
this.#project = captureMethod(projector, "project", "projector");
|
|
384
426
|
this.#projectAgentModel = captureMethod(
|
|
@@ -392,16 +434,15 @@ export class EvolutionEvidenceArtifactAdapter {
|
|
|
392
434
|
"projector",
|
|
393
435
|
);
|
|
394
436
|
this.#verify = captureMethod(bundleVerifier, "verify", "bundleVerifier");
|
|
395
|
-
this.#ports = artifactPorts;
|
|
396
437
|
this.#resolveManifestRef =
|
|
397
|
-
|
|
438
|
+
this.#ports.evidence.createEvolutionLedgerArtifactResolver({
|
|
398
439
|
purpose: this.#purpose,
|
|
399
440
|
});
|
|
400
441
|
Object.freeze(this);
|
|
401
442
|
}
|
|
402
443
|
|
|
403
444
|
#put(type, value) {
|
|
404
|
-
return this.#ports.putCanonical(type, value, {
|
|
445
|
+
return this.#ports[type].putCanonical(type, value, {
|
|
405
446
|
audience: this.#audience,
|
|
406
447
|
purpose: this.#purpose,
|
|
407
448
|
retention: "ttl",
|
|
@@ -479,12 +520,15 @@ export class EvolutionEvidenceArtifactAdapter {
|
|
|
479
520
|
if (result.manifest.type !== "evidence") {
|
|
480
521
|
throw new TypeError("evidence manifest descriptor type is invalid");
|
|
481
522
|
}
|
|
482
|
-
const manifestResolved = this.#ports.resolve(
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
523
|
+
const manifestResolved = this.#ports.evidence.resolve(
|
|
524
|
+
result.manifest.envelope,
|
|
525
|
+
{
|
|
526
|
+
expectedDigest: result.manifest.digest,
|
|
527
|
+
expectedType: "evidence",
|
|
528
|
+
purpose: this.#purpose,
|
|
529
|
+
tenantId: this.#tenantId,
|
|
530
|
+
},
|
|
531
|
+
);
|
|
488
532
|
return this.#resolveManifest(manifestResolved.value, result.evidenceId);
|
|
489
533
|
}
|
|
490
534
|
|
|
@@ -553,7 +597,7 @@ export class EvolutionEvidenceArtifactAdapter {
|
|
|
553
597
|
if (!descriptor || descriptor.type !== type) {
|
|
554
598
|
throw new Error("evidence derivation component type is invalid");
|
|
555
599
|
}
|
|
556
|
-
bundle[field] = this.#ports.resolve(descriptor.envelope, {
|
|
600
|
+
bundle[field] = this.#ports[type].resolve(descriptor.envelope, {
|
|
557
601
|
expectedDigest: descriptor.digest,
|
|
558
602
|
expectedType: type,
|
|
559
603
|
purpose: this.#purpose,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
import { snapshotSkillDecisionPayload } from "./skill-decision-projection.js";
|
|
20
20
|
import {
|
|
21
21
|
createEvidenceJsonTextBoundary,
|
|
22
|
+
AGENT_FENCED_CODE_LANGUAGES,
|
|
22
23
|
AGENT_CODE_TEXT_RESULT_TOOLS,
|
|
23
24
|
EVIDENCE_JSON_POLICY,
|
|
24
25
|
isAgentToolArgumentsPath,
|
|
@@ -533,7 +534,7 @@ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V3_DIGEST = `sha256:${crea
|
|
|
533
534
|
"utf8",
|
|
534
535
|
)
|
|
535
536
|
.digest("hex")}`;
|
|
536
|
-
const
|
|
537
|
+
const AGENT_MODEL_RULESET_V4 = Object.freeze({
|
|
537
538
|
...AGENT_MODEL_RULESET_V3,
|
|
538
539
|
schema: "chainlesschain.evolution-agent-model-projection-rules/v4",
|
|
539
540
|
version: 4,
|
|
@@ -553,6 +554,21 @@ const AGENT_MODEL_RULESET = Object.freeze({
|
|
|
553
554
|
maxNodes: AGENT_MODEL_REQUEST_LIMITS.maxNodes,
|
|
554
555
|
}),
|
|
555
556
|
});
|
|
557
|
+
export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V4_DIGEST = `sha256:${createHash(
|
|
558
|
+
"sha256",
|
|
559
|
+
)
|
|
560
|
+
.update(
|
|
561
|
+
`${AGENT_MODEL_RULESET_V4.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V4)}`,
|
|
562
|
+
"utf8",
|
|
563
|
+
)
|
|
564
|
+
.digest("hex")}`;
|
|
565
|
+
const AGENT_MODEL_RULESET = Object.freeze({
|
|
566
|
+
...AGENT_MODEL_RULESET_V4,
|
|
567
|
+
schema: "chainlesschain.evolution-agent-model-projection-rules/v5",
|
|
568
|
+
version: 5,
|
|
569
|
+
fencedCodePolicy: "closed-message-code-fence-literal-scan-v1",
|
|
570
|
+
fencedCodeLanguages: AGENT_FENCED_CODE_LANGUAGES,
|
|
571
|
+
});
|
|
556
572
|
export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST = `sha256:${createHash(
|
|
557
573
|
"sha256",
|
|
558
574
|
)
|
|
@@ -584,6 +600,7 @@ const SUPPORTED_RULESETS = new Map([
|
|
|
584
600
|
[AGENT_MODEL_RULESET_V1_DIGEST, AGENT_MODEL_RULESET_V1],
|
|
585
601
|
[EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V2_DIGEST, AGENT_MODEL_RULESET_V2],
|
|
586
602
|
[EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V3_DIGEST, AGENT_MODEL_RULESET_V3],
|
|
603
|
+
[EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V4_DIGEST, AGENT_MODEL_RULESET_V4],
|
|
587
604
|
[EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST, AGENT_MODEL_RULESET],
|
|
588
605
|
]);
|
|
589
606
|
|
|
@@ -659,6 +676,7 @@ const AGENT_VALUE_PATTERNS = Object.freeze([
|
|
|
659
676
|
function valuePatterns(ruleset) {
|
|
660
677
|
return ruleset === SKILL_DECISION_RULESET ||
|
|
661
678
|
ruleset === AGENT_MODEL_RULESET ||
|
|
679
|
+
ruleset === AGENT_MODEL_RULESET_V4 ||
|
|
662
680
|
ruleset === AGENT_MODEL_RULESET_V3 ||
|
|
663
681
|
ruleset === AGENT_MODEL_RULESET_V2 ||
|
|
664
682
|
ruleset === AGENT_MODEL_RULESET_V1
|
|
@@ -1409,7 +1427,9 @@ function sanitizePayload(
|
|
|
1409
1427
|
}
|
|
1410
1428
|
const toolArguments = jsonText && isAgentToolArgumentsPath(path);
|
|
1411
1429
|
const opaqueTransportBlock =
|
|
1412
|
-
ruleset === AGENT_MODEL_RULESET ||
|
|
1430
|
+
ruleset === AGENT_MODEL_RULESET ||
|
|
1431
|
+
ruleset === AGENT_MODEL_RULESET_V4 ||
|
|
1432
|
+
ruleset === AGENT_MODEL_RULESET_V3
|
|
1413
1433
|
? projectAgentOpaqueTransportBlock(value, path.join("."))
|
|
1414
1434
|
: null;
|
|
1415
1435
|
if (opaqueTransportBlock !== null) return opaqueTransportBlock;
|
|
@@ -1431,6 +1451,15 @@ function sanitizePayload(
|
|
|
1431
1451
|
layer,
|
|
1432
1452
|
objectOnly: toolArguments,
|
|
1433
1453
|
codeText,
|
|
1454
|
+
// Only direct message text can contain Markdown code examples. Tool
|
|
1455
|
+
// arguments and recursively decoded strings keep their existing rules.
|
|
1456
|
+
fencedCodeLanguages:
|
|
1457
|
+
path[0] === "messages" &&
|
|
1458
|
+
/^\d+$/u.test(path[1] ?? "") &&
|
|
1459
|
+
path[2] === "content" &&
|
|
1460
|
+
(path.length === 3 || (path.length === 5 && path[4] === "text"))
|
|
1461
|
+
? ruleset.fencedCodeLanguages
|
|
1462
|
+
: null,
|
|
1434
1463
|
visit: (decoded, nextLayer) =>
|
|
1435
1464
|
visit(
|
|
1436
1465
|
decoded,
|
|
@@ -3287,6 +3316,7 @@ function validateBundleIntegrity(bundle) {
|
|
|
3287
3316
|
}
|
|
3288
3317
|
if (
|
|
3289
3318
|
ruleset === AGENT_MODEL_RULESET ||
|
|
3319
|
+
ruleset === AGENT_MODEL_RULESET_V4 ||
|
|
3290
3320
|
ruleset === AGENT_MODEL_RULESET_V3 ||
|
|
3291
3321
|
ruleset === AGENT_MODEL_RULESET_V2 ||
|
|
3292
3322
|
ruleset === AGENT_MODEL_RULESET_V1
|
|
@@ -3294,7 +3324,9 @@ function validateBundleIntegrity(bundle) {
|
|
|
3294
3324
|
snapshotAgentModelRequest(model.content, {
|
|
3295
3325
|
allowStructuredArgumentText: ruleset !== AGENT_MODEL_RULESET_V1,
|
|
3296
3326
|
allowOpaqueTransportBlocks:
|
|
3297
|
-
ruleset === AGENT_MODEL_RULESET ||
|
|
3327
|
+
ruleset === AGENT_MODEL_RULESET ||
|
|
3328
|
+
ruleset === AGENT_MODEL_RULESET_V4 ||
|
|
3329
|
+
ruleset === AGENT_MODEL_RULESET_V3,
|
|
3298
3330
|
});
|
|
3299
3331
|
if (
|
|
3300
3332
|
model.truncated ||
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import { ArtifactStore } from "../artifact-store.js";
|
|
5
|
+
import {
|
|
6
|
+
EvolutionArtifactPorts,
|
|
7
|
+
captureEvolutionArtifactStoreDirectoryBoundary,
|
|
8
|
+
captureEvolutionLedgerBatchReadWindow,
|
|
9
|
+
} from "./evolution-artifact-ports.js";
|
|
10
|
+
|
|
11
|
+
export const EVOLUTION_TYPED_EVIDENCE_LAYOUT = "typed-evidence-v1";
|
|
12
|
+
export const EVOLUTION_EVIDENCE_STORAGE_TYPES = Object.freeze([
|
|
13
|
+
"source-evidence",
|
|
14
|
+
"model-projection",
|
|
15
|
+
"trusted-projection",
|
|
16
|
+
"receipt",
|
|
17
|
+
"evidence",
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
export function validateEvidenceStorageLayout(value) {
|
|
21
|
+
if (value !== "legacy" && value !== EVOLUTION_TYPED_EVIDENCE_LAYOUT)
|
|
22
|
+
throw new TypeError("Unsupported Evidence storage layout");
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Callers must supply events freshly authenticated by the genuine Run adapter.
|
|
27
|
+
// A later event, projection, or sidecar is never a layout authority.
|
|
28
|
+
export function evidenceStorageLayoutForRun(events, emptyLayout = "legacy") {
|
|
29
|
+
validateEvidenceStorageLayout(emptyLayout);
|
|
30
|
+
if (events.length === 0) return emptyLayout;
|
|
31
|
+
const data = events[0].data;
|
|
32
|
+
if (!data || !Object.hasOwn(data, "evidenceStorageLayout")) return "legacy";
|
|
33
|
+
if (data.evidenceStorageLayout !== EVOLUTION_TYPED_EVIDENCE_LAYOUT)
|
|
34
|
+
throw new TypeError("Unsupported authenticated Evidence storage layout");
|
|
35
|
+
return EVOLUTION_TYPED_EVIDENCE_LAYOUT;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function physicalStore(directory) {
|
|
39
|
+
return [
|
|
40
|
+
directory,
|
|
41
|
+
path.join(directory, "files"),
|
|
42
|
+
path.join(directory, "index.jsonl"),
|
|
43
|
+
].map((location, index) => {
|
|
44
|
+
const stat = fs.lstatSync(location, { bigint: true });
|
|
45
|
+
if (
|
|
46
|
+
stat.isSymbolicLink() ||
|
|
47
|
+
(index < 2 ? !stat.isDirectory() : !stat.isFile() || stat.nlink !== 1n)
|
|
48
|
+
)
|
|
49
|
+
throw new Error(
|
|
50
|
+
"Typed Evidence store must retain physical directories and a single-link index",
|
|
51
|
+
);
|
|
52
|
+
return {
|
|
53
|
+
location,
|
|
54
|
+
dev: stat.dev,
|
|
55
|
+
ino: stat.ino,
|
|
56
|
+
birthtimeNs: stat.birthtimeNs,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Separate genuine stores; no change to artifact locators or ledger authority. */
|
|
62
|
+
export function createTypedEvidenceArtifactPorts({
|
|
63
|
+
rootDir,
|
|
64
|
+
tenantId,
|
|
65
|
+
audience,
|
|
66
|
+
artifactAuthority,
|
|
67
|
+
now,
|
|
68
|
+
existingRun,
|
|
69
|
+
}) {
|
|
70
|
+
const directories = EVOLUTION_EVIDENCE_STORAGE_TYPES.map((type) =>
|
|
71
|
+
path.join(rootDir, type),
|
|
72
|
+
);
|
|
73
|
+
// Preflight every shard before any constructor can recreate a missing one.
|
|
74
|
+
const before = existingRun ? directories.map(physicalStore) : null;
|
|
75
|
+
const result = {};
|
|
76
|
+
const identities = new Set();
|
|
77
|
+
for (const [index, type] of EVOLUTION_EVIDENCE_STORAGE_TYPES.entries()) {
|
|
78
|
+
const port = new EvolutionArtifactPorts({
|
|
79
|
+
tenantId,
|
|
80
|
+
audience,
|
|
81
|
+
artifactStore: new ArtifactStore({ dir: directories[index], now }),
|
|
82
|
+
allowedTypes: [type],
|
|
83
|
+
envelopeSigner: artifactAuthority.envelopeSigner,
|
|
84
|
+
envelopeVerifier: artifactAuthority.envelopeVerifier,
|
|
85
|
+
currentAuthorityResolver: artifactAuthority.currentAuthorityResolver,
|
|
86
|
+
now,
|
|
87
|
+
});
|
|
88
|
+
const boundary = captureEvolutionArtifactStoreDirectoryBoundary(port);
|
|
89
|
+
const after = physicalStore(directories[index]);
|
|
90
|
+
for (const [entryIndex, entry] of after.entries()) {
|
|
91
|
+
const previous = before?.[index][entryIndex];
|
|
92
|
+
if (
|
|
93
|
+
previous &&
|
|
94
|
+
["dev", "ino", "birthtimeNs"].some(
|
|
95
|
+
(key) => previous[key] !== entry[key],
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
throw new Error("Typed Evidence store identity changed during reopen");
|
|
99
|
+
const identity = `${entry.dev}:${entry.ino}`;
|
|
100
|
+
if (identities.has(identity))
|
|
101
|
+
throw new Error("Typed Evidence stores must be distinct");
|
|
102
|
+
identities.add(identity);
|
|
103
|
+
}
|
|
104
|
+
boundary.recheck();
|
|
105
|
+
// Authenticate bounded index structure through the original port reader.
|
|
106
|
+
// Payloads and current authority remain freshly checked on actual reads.
|
|
107
|
+
captureEvolutionLedgerBatchReadWindow(
|
|
108
|
+
port.createEvolutionLedgerArtifactResolver({
|
|
109
|
+
purpose: "evidence-projection",
|
|
110
|
+
}),
|
|
111
|
+
)(() => undefined);
|
|
112
|
+
result[type] = port;
|
|
113
|
+
}
|
|
114
|
+
return Object.freeze(result);
|
|
115
|
+
}
|
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { types } from "node:util";
|
|
5
5
|
import { ensurePrivateDirectory, ensurePrivateFile } from "../secure-fs.js";
|
|
6
6
|
import { withFileLock } from "../with-file-lock.js";
|
|
7
|
+
import { evolutionPrivateStorageOptions } from "./evolution-private-storage.js";
|
|
7
8
|
import { createEvolutionPhysicalStateReader } from "./evolution-physical-state-reader.js";
|
|
8
9
|
import {
|
|
9
10
|
createEvolutionWitnessSegments,
|
|
@@ -246,7 +247,10 @@ export function createEvolutionFileWitness({
|
|
|
246
247
|
"maximumHistoryBytes must be a safe integer of at least 4096",
|
|
247
248
|
);
|
|
248
249
|
}
|
|
249
|
-
const secureOptions =
|
|
250
|
+
const secureOptions = evolutionPrivateStorageOptions(fsImpl);
|
|
251
|
+
const secureFileOptions = evolutionPrivateStorageOptions(fsImpl, {
|
|
252
|
+
file: true,
|
|
253
|
+
});
|
|
250
254
|
ensurePrivateDirectory(directory, secureOptions);
|
|
251
255
|
const readerOptions = {
|
|
252
256
|
fsImpl,
|
|
@@ -651,7 +655,7 @@ export function createEvolutionFileWitness({
|
|
|
651
655
|
const bytes = reader.read(file, {
|
|
652
656
|
maximumBytes: byteLimit,
|
|
653
657
|
allowAbsent,
|
|
654
|
-
prepareFile: (name) => ensurePrivateFile(name,
|
|
658
|
+
prepareFile: (name) => ensurePrivateFile(name, secureFileOptions),
|
|
655
659
|
});
|
|
656
660
|
recheckStorage();
|
|
657
661
|
return bytes;
|
|
@@ -723,7 +727,7 @@ export function createEvolutionFileWitness({
|
|
|
723
727
|
fsImpl.closeSync(descriptor);
|
|
724
728
|
descriptor = undefined;
|
|
725
729
|
fsImpl.renameSync(temporary, file);
|
|
726
|
-
ensurePrivateFile(file,
|
|
730
|
+
ensurePrivateFile(file, secureFileOptions);
|
|
727
731
|
descriptor = fsImpl.openSync(file, "r+");
|
|
728
732
|
fsImpl.fsyncSync(descriptor);
|
|
729
733
|
fsImpl.closeSync(descriptor);
|
|
@@ -5,6 +5,7 @@ import { types as utilTypes } from "node:util";
|
|
|
5
5
|
|
|
6
6
|
import { ensurePrivateDirectory, ensurePrivateFile } from "../secure-fs.js";
|
|
7
7
|
import { withFileLock } from "../with-file-lock.js";
|
|
8
|
+
import { evolutionPrivateStorageOptions } from "./evolution-private-storage.js";
|
|
8
9
|
import {
|
|
9
10
|
createEvolutionManifestStateReader,
|
|
10
11
|
captureEvolutionManifestStateReaderDirectoryBoundary,
|
|
@@ -76,7 +77,10 @@ export function createEvolutionLedgerFileManifestCatalogBackend({
|
|
|
76
77
|
}
|
|
77
78
|
const directory = path.resolve(directoryPath);
|
|
78
79
|
const file = path.join(directory, "manifest-catalog.json");
|
|
79
|
-
const secureOptions =
|
|
80
|
+
const secureOptions = evolutionPrivateStorageOptions(fsImpl);
|
|
81
|
+
const secureFileOptions = evolutionPrivateStorageOptions(fsImpl, {
|
|
82
|
+
file: true,
|
|
83
|
+
});
|
|
80
84
|
ensurePrivateDirectory(directory, secureOptions);
|
|
81
85
|
|
|
82
86
|
const stateReader = createEvolutionManifestStateReader({
|
|
@@ -131,7 +135,7 @@ export function createEvolutionLedgerFileManifestCatalogBackend({
|
|
|
131
135
|
fsImpl.closeSync(descriptor);
|
|
132
136
|
descriptor = undefined;
|
|
133
137
|
fsImpl.renameSync(temporary, file);
|
|
134
|
-
ensurePrivateFile(file,
|
|
138
|
+
ensurePrivateFile(file, secureFileOptions);
|
|
135
139
|
descriptor = fsImpl.openSync(file, "r+");
|
|
136
140
|
fsImpl.fsyncSync(descriptor);
|
|
137
141
|
fsImpl.closeSync(descriptor);
|
|
@@ -5,6 +5,7 @@ import { types as utilTypes } from "node:util";
|
|
|
5
5
|
|
|
6
6
|
import { ensurePrivateDirectory, ensurePrivateFile } from "../secure-fs.js";
|
|
7
7
|
import { withFileLock } from "../with-file-lock.js";
|
|
8
|
+
import { evolutionPrivateStorageOptions } from "./evolution-private-storage.js";
|
|
8
9
|
import {
|
|
9
10
|
createEvolutionManifestStateReader,
|
|
10
11
|
captureEvolutionManifestStateReaderDirectoryBoundary,
|
|
@@ -96,7 +97,10 @@ export function createEvolutionLedgerFileManifestHeadBackend({
|
|
|
96
97
|
throw new TypeError("manifest head maximumBytes must be at least 4096");
|
|
97
98
|
}
|
|
98
99
|
const file = path.join(directory, "manifest-head.json");
|
|
99
|
-
const secureOptions =
|
|
100
|
+
const secureOptions = evolutionPrivateStorageOptions(fsImpl);
|
|
101
|
+
const secureFileOptions = evolutionPrivateStorageOptions(fsImpl, {
|
|
102
|
+
file: true,
|
|
103
|
+
});
|
|
100
104
|
ensurePrivateDirectory(directory, secureOptions);
|
|
101
105
|
|
|
102
106
|
const invokeCrashHook = (phase, details) => {
|
|
@@ -158,7 +162,7 @@ export function createEvolutionLedgerFileManifestHeadBackend({
|
|
|
158
162
|
descriptor = undefined;
|
|
159
163
|
invokeCrashHook("after-stage", { file, temporary });
|
|
160
164
|
fsImpl.renameSync(temporary, file);
|
|
161
|
-
ensurePrivateFile(file,
|
|
165
|
+
ensurePrivateFile(file, secureFileOptions);
|
|
162
166
|
descriptor = fsImpl.openSync(file, "r+");
|
|
163
167
|
fsImpl.fsyncSync(descriptor);
|
|
164
168
|
fsImpl.closeSync(descriptor);
|