chainlesschain 0.166.5 → 0.166.7
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 -1
- package/src/assets/web-panel/assets/{AIOps-DhCWWRmS.js → AIOps-BlrmQxa2.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BGbZcxSE.js → ActionButton-zyRyLITg.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CUJNYrmU.js → Analytics-DwGz7OGN.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-ParuJRmc.js → AppLayout-Dc-nj7Zd.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BMESCkte.js → Artifacts-7Hu3O73p.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B614pUXR.js → Audit-Bnoe3-fR.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BKkkvkQl.js → BackgroundAgents-BqYFrDKZ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CoFiC_kv.js → Backup-B3hwW1nz.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Cu4OHz1W.js → BaseInput-XFVxLA4w.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-mxb_SR22.js → Chat-CWRDNw7e.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CsqO-fiV.js → ChatBubbleRenderer-Bf30VM8G.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BJpZz-5L.js → Checkbox-kFeeBgac.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-ng7fYMi8.js → Codegen-CCxp8xoI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D751NOsU.js → Col-BLKZalle.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BPVTHvTC.js → Community-DD0eWCez.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CY42ARxJ.js → Compact-CHqHWdy0.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Ec3zabvu.js → Compliance-Bw54uPiK.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Do0oOlj8.js → Cowork-DZ13zKNJ.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BXu6LGra.js → Cron-Dlj5Jevg.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dg1CsWLA.js → Crosschain-Nvz0aR0j.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D1B8O6C9.js → DID-Ct89eUyY.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DJFnfIVk.js → Dashboard-BHUH5IAe.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Be6KCHb7.js → Dropdown-BhZG-PO7.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-ae4RVwwJ.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CWt6WUoP.js → FamilyGuardDashboard-AOcxLfLr.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Ba7bRkZh.js → Federation-BK2PJQOF.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CNa8GTAM.js → FormItemContext-C2n3xO2_.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DGHg2fio.js → GenericCardRenderer-DcyUVFZq.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DJAgN16e.js → Git-tBae9Lt8.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DqIapin6.js → Governance-DmNR3AP4.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-B00_KwDW.js → Inference-CoseEigi.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D1_ZCehX.js → KnowledgeGraph-Bdjd1sxr.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-22jGgUmw.js → Logs-CtlkKIcn.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DOIQQUTp.js → MarkdownRenderer-CZsTBEQE.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-ClIyNRL6.js → Marketplace-BTYb7nEx.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BhPsaaJr.js → McpTools-D0iUdW3P.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-BXNDHgEH.js → Memory--gwI7w4Y.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BeSEujLm.js → MobileBridge-JmFBi24T.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DKJjWZ6t.js → MobileProjects-BK01cQRx.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CsX4lo0h.js → Mtc-u7avzyoO.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-CdGiWPEN.js → MtcAudit-gT3z5fo_.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C1aJmYGd.js → Multisig-BIqZTz5n.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-ClOwZKGW.js → NLProgramming-DdhVfXYq.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-xqZJkp5X.js → Notes-CBlyUmY3.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-D_8hg6E5.js → NotificationSettings-DSyI26N3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BNMgCFHY.js → OrderTableRenderer-B7IEuNz4.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DQjjPQ9u.js → Organization-ozhi4kGS.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-D0g51CZb.js → Overflow-CBy57RVM.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BqDCDnon.js → P2P-CA-ZRv77.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DOHc9zm8.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D9Mk4hzw.js → Permissions-DiP632GP.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Cksd0Ft-.js → PersonalDataHub-AnU8O-SS.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-ALaa1U0w.js → Pipeline-DDibOUaP.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-M-mmVDtr.js → Privacy-D421t36T.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bn39Z5S7.js → ProjectInit-DR879ZPJ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-6Xmsc-zo.js → ProjectSettings-Ded8o6aY.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BHPxiucB.js +1 -0
- package/src/assets/web-panel/assets/{Providers-FLNmdOWT.js → Providers-Boivuu-E.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C5PNS5N7.js → QrScannerModal-xKD_ntKp.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CHSVdvQA.js → QuickAsk-D3y_A6FV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BRwvF4m9.js → Recommend-BjKM-YC2.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DeAfmrU2.js → RemoteSession-CgqKMXG4.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Be_YQzm9.js → Reputation-Ci2GjH5p.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bv3cbL2A.js → Row-B0-T2BSh.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DsTYAdrh.js → RssFeed-Bet-ur-r.js} +2 -2
- package/src/assets/web-panel/assets/{Search-2gch6_kT.js → Search-DWtRAS2R.js} +1 -1
- package/src/assets/web-panel/assets/{Security-pkS2eKdn.js → Security-BDfu2Qn6.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D1ns1NlD.js → Services-CvJmvSMM.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-B-9nVmze.js → Skeleton-CEbrKpdC.js} +1 -1
- package/src/assets/web-panel/assets/Skills-CjVeiETf.js +1 -0
- package/src/assets/web-panel/assets/{Sla-CI9DZg-s.js → Sla-Dibypxum.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CH0mQsl3.js → SpeechSettings-XflYXp7a.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BHeEVZyN.js → SyncSettings-ro1Ivx1E.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-CHq1qFbo.js +1 -0
- package/src/assets/web-panel/assets/{Templates--GvWvJEB.js → Templates-CRnUZxtZ.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-L-FgZD-r.js → Tenant-jUX72JCA.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DMNfs5hK.js → Terminal-BBhAs7pt.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DFzInCAj.js → TimelineRenderer-CD5M3RGp.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bnh73Gam.js → Tokens-sah3v0gu.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BO-fMwq8.js → Trigger-BNT3Uz3s.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CX-HXcRl.js → Trust-BytMGPMo.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C8AOFGVL.js → UkeySign-BkYVMRQs.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B_bJ6BO2.js → VideoEditing-psvb5Q7Y.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Ccd3u1t4.js → Wallet-PFQTW0MH.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DVSL5e6o.js → WebAuthn-DgO-OwRT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DqFq6xGO.js → WorkflowEditor-DL2l9VNl.js} +1 -1
- package/src/assets/web-panel/assets/{chat-s5SEbhS8.js → chat-C84akEzN.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CRFmX1eW.js → colors-DzTWuQKP.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DCofr-Ii.js → compact-item-CR9LJQFv.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-duu0_qGr.js → createContext-CTTov5Kn.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-B0KKSHGi.js → hasIn-DALj523o.js} +1 -1
- package/src/assets/web-panel/assets/{index-PR4YRMxw.js → index-3-XJoYgX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY6ZHvJw.js → index-7ux_XohH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFzJlpwu.js → index-AXnERsyV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaDLq49Y.js → index-B2qpjU-D.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpnGJDxL.js → index-B6QOJbSn.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6sAHm_C.js → index-BDyt57zL.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_8atrbf.js → index-BHRXKiU1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQWeRqsN.js → index-BKNIzw0U.js} +1 -1
- package/src/assets/web-panel/assets/{index-NiXCoVfh.js → index-BNaQt49r.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5chs_dS.js → index-Be6Os5S8.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3PtUFgB.js → index-C5eeMl_2.js} +1 -1
- package/src/assets/web-panel/assets/{index-4aqbfxrp.js → index-CNmTDXmf.js} +1 -1
- package/src/assets/web-panel/assets/{index-SbxDTh6S.js → index-CXTEpfGe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWWfogVi.js → index-CXaCRXN4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIiqGHl0.js → index-CZhhFQi9.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8sxQTSI.js → index-Cef0n4k_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM48QU3P.js → index-CjkPDSX4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjZvE3_P.js → index-CmELknPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMaM-Yex.js → index-CnxjXIsK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BugberH-.js → index-CqUgXYIQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeJMQynL.js → index-CunGDV0g.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHHrnUkx.js → index-D0MqUnKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ch8O1mrO.js → index-D9ScRFxz.js} +3 -3
- package/src/assets/web-panel/assets/{index-DJrRZ5um.js → index-DBIPnoTj.js} +1 -1
- package/src/assets/web-panel/assets/index-DDyMJexx.js +1 -0
- package/src/assets/web-panel/assets/{index-BDGNTPr6.js → index-DH6OG-ci.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDLVcra4.js → index-DZER6Lj3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B24nGxlB.js → index-D_Bg0LdK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRjnopxx.js → index-Dah8M4l2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRpzktuV.js → index-DjE_ew7U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BERyKHMq.js → index-DtW6Zr_i.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCnLafAV.js → index-DxdzSljS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxvnkXVj.js → index-QW0EXx14.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUFMz21M.js → index-W9axN_Ce.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDCDbWnv.js → index-_8vetPbU.js} +1 -1
- package/src/assets/web-panel/assets/index-btiojFYn.js +1 -0
- package/src/assets/web-panel/assets/{index-oxcFCNJ4.js → index-eJcFleIV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtPSAUza.js → index-hzzTITR9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUT3dpdB.js → index-s4CFyn-n.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Ncgc0S0H.js → initDefaultProps-JuW8mFj7.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BBobPHz-.js → motion-Cwb0HBve.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dgeb9hea.js → move-DHokzMgu.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-onxX64FZ.js → mtc-parser-DX31y6QS.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D2OZXzri.js → omit-BCIUYDA6.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-J5iBCavx.js → pickAttrs-DMCj4EoZ.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CE4U8sO6.js → placementArrow-Dy5K-u1s.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Dl64-wdo.js → responsiveObserve-DkGeZu54.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DRFC8TgC.js → slide-Dc5dyJdg.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bh1xb87a.js → statusUtils-DIUBjOaC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DlG_dRlk.js → styleChecker-DmyEOxm5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-5qmSh3pc.js → useFlexGapSupport-FRhakk1e.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C_fMqkQA.js → useFs-clXyV1WQ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D0Aih7lk.js → usePersonalDataHub-UF6DG41z.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cv17kLab.js → vnode-CoCt95G7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B8Mzvavx.js → zoom-yVWt-ENm.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/graph.js +215 -5
- package/src/commands/team-distributed.js +342 -2
- package/src/commands/team.js +169 -7
- package/src/data/changelog.json +26 -0
- package/src/generated/cc-agent-protocol.schema.json +6 -1
- package/src/lib/agent-ipc-bus.js +453 -91
- package/src/lib/agent-ipc-flow-control.js +200 -0
- package/src/lib/agent-team/task-lease.js +315 -0
- package/src/lib/agent-team/team-agent-stream.js +16 -0
- package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
- package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
- package/src/lib/agent-team/team-distributed-queue.js +251 -0
- package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
- package/src/lib/agent-team/team-runner.js +225 -2
- package/src/lib/app-server/graph-runtime.js +754 -0
- package/src/lib/app-server/rollout-store.js +32 -0
- package/src/lib/app-server/server.js +140 -0
- package/src/lib/autonomous-agent.js +11 -0
- package/src/lib/cowork-graph-authority-adapter.js +455 -0
- package/src/lib/dynamic-workflow-facade.js +83 -16
- package/src/lib/graph-kernel/adapters.js +93 -20
- package/src/lib/graph-kernel/authority.js +324 -0
- package/src/lib/graph-kernel/compiler.js +1 -8
- package/src/lib/graph-kernel/cutover-authority-resolver.js +219 -0
- package/src/lib/graph-kernel/cutover-ledger.js +650 -0
- package/src/lib/graph-kernel/event-store.js +15 -1
- package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
- package/src/lib/graph-kernel/index.js +4 -0
- package/src/lib/graph-kernel/migration-saga.js +309 -0
- package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
- package/src/lib/graph-kernel/runtime.js +661 -24
- package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
- package/src/lib/graph-kernel/trace-reducer.js +6 -0
- package/src/lib/graph-kernel/trigger-adapter.js +60 -3
- package/src/lib/legacy-runtime-authority.js +160 -0
- package/src/lib/orchestrator.js +28 -0
- package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
- package/src/lib/scheduler-kernel/runtime.js +75 -2
- package/src/assets/web-panel/assets/EmailListRenderer-9L4EdmcR.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BDMyV-DM.js +0 -7
- package/src/assets/web-panel/assets/Projects-C2KI2sH1.js +0 -1
- package/src/assets/web-panel/assets/Skills-V7TqlXWR.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DOld05sg.js +0 -1
- package/src/assets/web-panel/assets/devWarning-0bFBr86K.js +0 -1
- package/src/assets/web-panel/assets/index-BJCitHZ6.js +0 -1
- package/src/assets/web-panel/assets/index-WmqZ5PwS.js +0 -1
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import {
|
|
5
|
+
GRAPH_AUTHORITY_MODES,
|
|
6
|
+
GRAPH_CUTOVER_STAGES,
|
|
7
|
+
GRAPH_PROJECTION_VERSION,
|
|
8
|
+
} from "./authority.js";
|
|
9
|
+
import {
|
|
10
|
+
GRAPH_CUTOVER_LEDGER_SCHEMA,
|
|
11
|
+
GRAPH_CUTOVER_REQUIRED_PLATFORMS,
|
|
12
|
+
} from "./cutover-ledger.js";
|
|
13
|
+
import { graphDigest } from "./compiler.js";
|
|
14
|
+
|
|
15
|
+
export const GRAPH_RUNTIME_SURFACE_MANIFEST_SCHEMA =
|
|
16
|
+
"chainlesschain.graph-runtime-surfaces/v1";
|
|
17
|
+
export const GRAPH_RUNTIME_DURABILITY = Object.freeze([
|
|
18
|
+
"durable",
|
|
19
|
+
"process_local",
|
|
20
|
+
"non_durable",
|
|
21
|
+
]);
|
|
22
|
+
export const GRAPH_CUTOVER_STRATEGIES = Object.freeze([
|
|
23
|
+
"migrate",
|
|
24
|
+
"retire",
|
|
25
|
+
"disabled",
|
|
26
|
+
]);
|
|
27
|
+
export const GRAPH_RUNTIME_CANDIDATE_CLASSIFICATIONS = Object.freeze([
|
|
28
|
+
"canonical_agent_kernel_adapter",
|
|
29
|
+
"tool_free_advisor",
|
|
30
|
+
"durable_event_transport",
|
|
31
|
+
]);
|
|
32
|
+
export const GRAPH_RUNTIME_SURFACE_MANIFEST_PATH = fileURLToPath(
|
|
33
|
+
new URL("./graph-runtime-surfaces.json", import.meta.url),
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
function clone(value) {
|
|
37
|
+
return value == null ? value : JSON.parse(JSON.stringify(value));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function escapeRegExp(value) {
|
|
41
|
+
return String(value).replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function walkJavaScriptFiles(directory, output = []) {
|
|
45
|
+
if (!fs.existsSync(directory)) return output;
|
|
46
|
+
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
|
|
47
|
+
if (entry.name === "node_modules" || entry.name === "__tests__") continue;
|
|
48
|
+
const target = path.join(directory, entry.name);
|
|
49
|
+
if (entry.isDirectory()) walkJavaScriptFiles(target, output);
|
|
50
|
+
else if (/\.(?:cjs|mjs|js)$/u.test(entry.name)) output.push(target);
|
|
51
|
+
}
|
|
52
|
+
return output;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function loadGraphRuntimeSurfaceManifest(
|
|
56
|
+
manifestPath = GRAPH_RUNTIME_SURFACE_MANIFEST_PATH,
|
|
57
|
+
) {
|
|
58
|
+
return Object.freeze(
|
|
59
|
+
JSON.parse(fs.readFileSync(path.resolve(manifestPath), "utf8")),
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function graphRuntimeSurfaceEntry(manifest, surfaceName, entryId) {
|
|
64
|
+
const surface = (manifest?.surfaces || []).find(
|
|
65
|
+
(candidate) => candidate.originSurface === surfaceName,
|
|
66
|
+
);
|
|
67
|
+
const entry = (surface?.entries || []).find(
|
|
68
|
+
(candidate) => candidate.id === entryId,
|
|
69
|
+
);
|
|
70
|
+
if (!surface || !entry) {
|
|
71
|
+
const error = new Error(
|
|
72
|
+
`Graph runtime entry is not declared: ${surfaceName}/${entryId}`,
|
|
73
|
+
);
|
|
74
|
+
error.name = "GraphRuntimeSurfaceManifestError";
|
|
75
|
+
error.code = "CC_GRAPH_RUNTIME_ENTRY_NOT_DECLARED";
|
|
76
|
+
error.surface = String(surfaceName || "");
|
|
77
|
+
error.entryId = String(entryId || "");
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
return Object.freeze({
|
|
81
|
+
surface: Object.freeze(clone(surface)),
|
|
82
|
+
entry: Object.freeze(clone(entry)),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function graphRuntimeEntryManifestDigest(
|
|
87
|
+
manifest,
|
|
88
|
+
surfaceName,
|
|
89
|
+
entryId,
|
|
90
|
+
) {
|
|
91
|
+
const { surface, entry } = graphRuntimeSurfaceEntry(
|
|
92
|
+
manifest,
|
|
93
|
+
surfaceName,
|
|
94
|
+
entryId,
|
|
95
|
+
);
|
|
96
|
+
return graphDigest(
|
|
97
|
+
{
|
|
98
|
+
manifestSchema: manifest.schema,
|
|
99
|
+
manifestVersion: manifest.version,
|
|
100
|
+
projectionVersion: manifest.projectionVersion,
|
|
101
|
+
cutoverPolicy: manifest.cutoverPolicy,
|
|
102
|
+
surface: {
|
|
103
|
+
originSurface: surface.originSurface,
|
|
104
|
+
durability: surface.durability,
|
|
105
|
+
targetAuthoritySource: surface.targetAuthoritySource,
|
|
106
|
+
featureFlag: surface.featureFlag,
|
|
107
|
+
},
|
|
108
|
+
entry,
|
|
109
|
+
},
|
|
110
|
+
"cc.graph.runtime-surface-entry/v1",
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function manifestFiles(manifest) {
|
|
115
|
+
return new Set([
|
|
116
|
+
...manifest.surfaces.flatMap((surface) =>
|
|
117
|
+
surface.entries.flatMap((entry) => [
|
|
118
|
+
...entry.entrypoints,
|
|
119
|
+
...entry.writerFiles,
|
|
120
|
+
]),
|
|
121
|
+
),
|
|
122
|
+
...(manifest.discovery?.classifiedNonWriters || []).flatMap(
|
|
123
|
+
(candidate) => candidate.files || [],
|
|
124
|
+
),
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function discoverUnclassifiedRuntimeWriters(
|
|
129
|
+
manifest,
|
|
130
|
+
{
|
|
131
|
+
repositoryRoot = fileURLToPath(new URL("../../../../../", import.meta.url)),
|
|
132
|
+
} = {},
|
|
133
|
+
) {
|
|
134
|
+
const classified = manifestFiles(manifest);
|
|
135
|
+
const patterns = (manifest.discovery?.writerPatterns || []).map(
|
|
136
|
+
(pattern) => new RegExp(pattern, "u"),
|
|
137
|
+
);
|
|
138
|
+
const discovered = new Set();
|
|
139
|
+
for (const root of manifest.discovery?.roots || []) {
|
|
140
|
+
for (const file of walkJavaScriptFiles(
|
|
141
|
+
path.resolve(repositoryRoot, root),
|
|
142
|
+
)) {
|
|
143
|
+
const source = fs.readFileSync(file, "utf8");
|
|
144
|
+
if (!patterns.some((pattern) => pattern.test(source))) continue;
|
|
145
|
+
discovered.add(path.relative(repositoryRoot, file).replaceAll("\\", "/"));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return Object.freeze(
|
|
149
|
+
[...discovered].filter((file) => !classified.has(file)).sort(),
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function validateGraphRuntimeSurfaceManifest(
|
|
154
|
+
manifest,
|
|
155
|
+
{
|
|
156
|
+
repositoryRoot = fileURLToPath(new URL("../../../../../", import.meta.url)),
|
|
157
|
+
requireFiles = true,
|
|
158
|
+
discoverWriters = true,
|
|
159
|
+
} = {},
|
|
160
|
+
) {
|
|
161
|
+
const errors = [];
|
|
162
|
+
if (manifest?.schema !== GRAPH_RUNTIME_SURFACE_MANIFEST_SCHEMA) {
|
|
163
|
+
errors.push("manifest schema is unsupported");
|
|
164
|
+
}
|
|
165
|
+
if (manifest?.version !== 1) errors.push("manifest version must be 1");
|
|
166
|
+
if (manifest?.projectionVersion !== GRAPH_PROJECTION_VERSION) {
|
|
167
|
+
errors.push("manifest projectionVersion does not match Graph Kernel");
|
|
168
|
+
}
|
|
169
|
+
const cutoverPolicy = manifest?.cutoverPolicy;
|
|
170
|
+
if (
|
|
171
|
+
cutoverPolicy?.ledgerSchema !== GRAPH_CUTOVER_LEDGER_SCHEMA ||
|
|
172
|
+
cutoverPolicy?.scope !== "entry" ||
|
|
173
|
+
cutoverPolicy?.existingCanonicalRunRollback !== "retain_authority"
|
|
174
|
+
) {
|
|
175
|
+
errors.push(
|
|
176
|
+
"manifest cutoverPolicy does not match the Graph cutover ledger",
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
const requiredPlatforms = Array.isArray(cutoverPolicy?.requiredPlatforms)
|
|
180
|
+
? [...cutoverPolicy.requiredPlatforms].sort()
|
|
181
|
+
: [];
|
|
182
|
+
if (
|
|
183
|
+
JSON.stringify(requiredPlatforms) !==
|
|
184
|
+
JSON.stringify([...GRAPH_CUTOVER_REQUIRED_PLATFORMS].sort())
|
|
185
|
+
) {
|
|
186
|
+
errors.push(
|
|
187
|
+
"manifest cutoverPolicy must require Linux, Windows, and macOS",
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
const surfaces = Array.isArray(manifest?.surfaces) ? manifest.surfaces : [];
|
|
191
|
+
const names = surfaces.map((surface) => surface.originSurface);
|
|
192
|
+
for (const required of [
|
|
193
|
+
"cli_team",
|
|
194
|
+
"cowork",
|
|
195
|
+
"scheduler",
|
|
196
|
+
"desktop",
|
|
197
|
+
"browser",
|
|
198
|
+
]) {
|
|
199
|
+
if (names.filter((name) => name === required).length !== 1) {
|
|
200
|
+
errors.push(`surface ${required} must appear exactly once`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const entryIds = new Set();
|
|
204
|
+
const entriesById = new Map();
|
|
205
|
+
const rolloutKeys = new Set();
|
|
206
|
+
const strategyCounts = { migrate: 0, retire: 0, disabled: 0 };
|
|
207
|
+
for (const surface of surfaces) {
|
|
208
|
+
if (!GRAPH_CUTOVER_STAGES.includes(surface.currentCutoverStage)) {
|
|
209
|
+
errors.push(`${surface.originSurface}: invalid currentCutoverStage`);
|
|
210
|
+
}
|
|
211
|
+
if (!surface.featureFlag?.name || !surface.featureFlag?.default) {
|
|
212
|
+
errors.push(`${surface.originSurface}: featureFlag must be explicit`);
|
|
213
|
+
}
|
|
214
|
+
if (surface.originSurface === "browser") {
|
|
215
|
+
if (
|
|
216
|
+
surface.durability !== "non_durable" ||
|
|
217
|
+
surface.featureFlag.default !== "disabled" ||
|
|
218
|
+
surface.targetAuthoritySource !== "legacy_runtime"
|
|
219
|
+
) {
|
|
220
|
+
errors.push(
|
|
221
|
+
"browser must remain non-durable, disabled by default, and non-canonical",
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
for (const entry of surface.entries || []) {
|
|
226
|
+
if (!entry.id || entryIds.has(entry.id)) {
|
|
227
|
+
errors.push(
|
|
228
|
+
`${surface.originSurface}: entry id is missing or duplicated`,
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
entryIds.add(entry.id);
|
|
232
|
+
if (entry.id) entriesById.set(entry.id, entry);
|
|
233
|
+
const expectedRolloutKey = `${surface.originSurface}/${entry.id}`;
|
|
234
|
+
if (
|
|
235
|
+
entry.rolloutKey !== expectedRolloutKey ||
|
|
236
|
+
rolloutKeys.has(entry.rolloutKey)
|
|
237
|
+
) {
|
|
238
|
+
errors.push(`${entry.id}: rolloutKey must be unique and entry-scoped`);
|
|
239
|
+
}
|
|
240
|
+
rolloutKeys.add(entry.rolloutKey);
|
|
241
|
+
if (!GRAPH_RUNTIME_DURABILITY.includes(entry.runtimeDurability)) {
|
|
242
|
+
errors.push(`${entry.id}: runtimeDurability is invalid`);
|
|
243
|
+
}
|
|
244
|
+
if (!GRAPH_CUTOVER_STRATEGIES.includes(entry.cutoverStrategy)) {
|
|
245
|
+
errors.push(`${entry.id}: cutoverStrategy is invalid`);
|
|
246
|
+
} else {
|
|
247
|
+
strategyCounts[entry.cutoverStrategy] += 1;
|
|
248
|
+
}
|
|
249
|
+
for (const field of [
|
|
250
|
+
"entrypoints",
|
|
251
|
+
"writerFiles",
|
|
252
|
+
"mutationFunctions",
|
|
253
|
+
"stores",
|
|
254
|
+
"recoveryEntrypoints",
|
|
255
|
+
]) {
|
|
256
|
+
if (!Array.isArray(entry[field])) {
|
|
257
|
+
errors.push(`${entry.id}: ${field} must be an array`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (!entry.entrypoints?.length)
|
|
261
|
+
errors.push(`${entry.id}: entrypoints are empty`);
|
|
262
|
+
if (!entry.writerFiles?.length)
|
|
263
|
+
errors.push(`${entry.id}: writerFiles are empty`);
|
|
264
|
+
if (!entry.mutationFunctions?.length) {
|
|
265
|
+
errors.push(`${entry.id}: mutationFunctions are empty`);
|
|
266
|
+
}
|
|
267
|
+
const dispositions = entry.storeDispositions;
|
|
268
|
+
const dispositionLists = ["migrate", "retire", "rebuild", "disabled"].map(
|
|
269
|
+
(disposition) =>
|
|
270
|
+
Array.isArray(dispositions?.[disposition])
|
|
271
|
+
? dispositions[disposition]
|
|
272
|
+
: null,
|
|
273
|
+
);
|
|
274
|
+
if (dispositionLists.some((stores) => stores === null)) {
|
|
275
|
+
errors.push(
|
|
276
|
+
`${entry.id}: storeDispositions must declare migrate, retire, rebuild, and disabled arrays`,
|
|
277
|
+
);
|
|
278
|
+
} else {
|
|
279
|
+
const classifiedStores = dispositionLists.flat();
|
|
280
|
+
const declaredStores = [...(entry.stores || [])].sort();
|
|
281
|
+
if (
|
|
282
|
+
new Set(classifiedStores).size !== classifiedStores.length ||
|
|
283
|
+
JSON.stringify([...classifiedStores].sort()) !==
|
|
284
|
+
JSON.stringify(declaredStores)
|
|
285
|
+
) {
|
|
286
|
+
errors.push(
|
|
287
|
+
`${entry.id}: storeDispositions must classify every store exactly once`,
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (
|
|
292
|
+
entry.cutoverStrategy === "migrate" &&
|
|
293
|
+
(entry.runtimeDurability !== "durable" ||
|
|
294
|
+
!dispositions?.migrate?.length ||
|
|
295
|
+
!entry.recoveryEntrypoints?.length)
|
|
296
|
+
) {
|
|
297
|
+
errors.push(
|
|
298
|
+
`${entry.id}: migrate requires durable stores and a recovery entrypoint`,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
if (
|
|
302
|
+
entry.cutoverStrategy === "retire" &&
|
|
303
|
+
(entry.runtimeDurability === "non_durable" ||
|
|
304
|
+
!dispositions?.retire?.length ||
|
|
305
|
+
dispositions?.migrate?.length !== 0 ||
|
|
306
|
+
dispositions?.rebuild?.length !== 0 ||
|
|
307
|
+
dispositions?.disabled?.length !== 0 ||
|
|
308
|
+
entry.recoveryEntrypoints?.length !== 0)
|
|
309
|
+
) {
|
|
310
|
+
errors.push(
|
|
311
|
+
`${entry.id}: retire requires only historical read-only stores without a recovery entrypoint`,
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
if (
|
|
315
|
+
entry.cutoverStrategy === "retire" &&
|
|
316
|
+
(!entry.replacementEntrypoint ||
|
|
317
|
+
entry.replacementAuthoritySource !== "graph_kernel" ||
|
|
318
|
+
entry.retiredStoreAccess !== "historical_read_only" ||
|
|
319
|
+
!Array.isArray(entry.replacementEntryIds) ||
|
|
320
|
+
entry.replacementEntryIds.length === 0 ||
|
|
321
|
+
!Array.isArray(entry.historicalReadFunctions) ||
|
|
322
|
+
entry.historicalReadFunctions.length === 0)
|
|
323
|
+
) {
|
|
324
|
+
errors.push(
|
|
325
|
+
`${entry.id}: retire requires Graph Kernel replacement entry ids and historical read functions`,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
if (
|
|
329
|
+
entry.cutoverStrategy === "disabled" &&
|
|
330
|
+
(entry.runtimeDurability !== "non_durable" ||
|
|
331
|
+
dispositions?.migrate?.length !== 0 ||
|
|
332
|
+
dispositions?.retire?.length !== 0 ||
|
|
333
|
+
dispositions?.rebuild?.length !== 0 ||
|
|
334
|
+
surface.durability !== "non_durable")
|
|
335
|
+
) {
|
|
336
|
+
errors.push(
|
|
337
|
+
`${entry.id}: disabled requires a non-durable entry on a non-durable surface`,
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
if (requireFiles) {
|
|
341
|
+
for (const file of [
|
|
342
|
+
...(entry.entrypoints || []),
|
|
343
|
+
...(entry.writerFiles || []),
|
|
344
|
+
]) {
|
|
345
|
+
if (!fs.existsSync(path.resolve(repositoryRoot, file))) {
|
|
346
|
+
errors.push(`${entry.id}: classified file does not exist: ${file}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
let replacementEdgeCount = 0;
|
|
353
|
+
let historicalReadFunctionCount = 0;
|
|
354
|
+
let retiredMutationFunctionCount = 0;
|
|
355
|
+
const replacementTargetEntryIds = new Set();
|
|
356
|
+
for (const surface of surfaces) {
|
|
357
|
+
for (const entry of surface.entries || []) {
|
|
358
|
+
if (entry.cutoverStrategy !== "retire") continue;
|
|
359
|
+
retiredMutationFunctionCount += Array.isArray(entry.mutationFunctions)
|
|
360
|
+
? entry.mutationFunctions.length
|
|
361
|
+
: 0;
|
|
362
|
+
const replacementEntryIds = Array.isArray(entry.replacementEntryIds)
|
|
363
|
+
? entry.replacementEntryIds
|
|
364
|
+
: [];
|
|
365
|
+
if (new Set(replacementEntryIds).size !== replacementEntryIds.length) {
|
|
366
|
+
errors.push(`${entry.id}: replacementEntryIds must be unique`);
|
|
367
|
+
}
|
|
368
|
+
for (const replacementEntryId of replacementEntryIds) {
|
|
369
|
+
replacementEdgeCount += 1;
|
|
370
|
+
replacementTargetEntryIds.add(replacementEntryId);
|
|
371
|
+
const replacement = entriesById.get(replacementEntryId);
|
|
372
|
+
if (!replacement || replacement.cutoverStrategy !== "migrate") {
|
|
373
|
+
errors.push(
|
|
374
|
+
`${entry.id}: replacement entry must exist and migrate: ${replacementEntryId}`,
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const historicalReadFunctions = Array.isArray(
|
|
380
|
+
entry.historicalReadFunctions,
|
|
381
|
+
)
|
|
382
|
+
? entry.historicalReadFunctions
|
|
383
|
+
: [];
|
|
384
|
+
if (
|
|
385
|
+
new Set(historicalReadFunctions).size !== historicalReadFunctions.length
|
|
386
|
+
) {
|
|
387
|
+
errors.push(`${entry.id}: historicalReadFunctions must be unique`);
|
|
388
|
+
}
|
|
389
|
+
historicalReadFunctionCount += historicalReadFunctions.length;
|
|
390
|
+
if (requireFiles && historicalReadFunctions.length > 0) {
|
|
391
|
+
const writerSource = (entry.writerFiles || [])
|
|
392
|
+
.map((file) => path.resolve(repositoryRoot, file))
|
|
393
|
+
.filter((file) => fs.existsSync(file))
|
|
394
|
+
.map((file) => fs.readFileSync(file, "utf8"))
|
|
395
|
+
.join("\n");
|
|
396
|
+
for (const qualifiedFunction of historicalReadFunctions) {
|
|
397
|
+
const match = /^([A-Za-z_$][\w$]*)\.([A-Za-z_$][\w$]*)$/u.exec(
|
|
398
|
+
qualifiedFunction,
|
|
399
|
+
);
|
|
400
|
+
if (!match) {
|
|
401
|
+
errors.push(
|
|
402
|
+
`${entry.id}: historical read function is not class-qualified: ${qualifiedFunction}`,
|
|
403
|
+
);
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
const [, className, methodName] = match;
|
|
407
|
+
const classPattern = new RegExp(
|
|
408
|
+
`\\bclass\\s+${escapeRegExp(className)}\\b`,
|
|
409
|
+
"u",
|
|
410
|
+
);
|
|
411
|
+
const methodPattern = new RegExp(
|
|
412
|
+
`\\b(?:async\\s+)?${escapeRegExp(methodName)}\\s*\\(`,
|
|
413
|
+
"u",
|
|
414
|
+
);
|
|
415
|
+
if (
|
|
416
|
+
!classPattern.test(writerSource) ||
|
|
417
|
+
!methodPattern.test(writerSource)
|
|
418
|
+
) {
|
|
419
|
+
errors.push(
|
|
420
|
+
`${entry.id}: historical read function is not implemented: ${qualifiedFunction}`,
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
const classifiedNonWriters = Array.isArray(
|
|
428
|
+
manifest?.discovery?.classifiedNonWriters,
|
|
429
|
+
)
|
|
430
|
+
? manifest.discovery.classifiedNonWriters
|
|
431
|
+
: [];
|
|
432
|
+
const classifiedNonWriterFiles = new Set();
|
|
433
|
+
for (const candidate of classifiedNonWriters) {
|
|
434
|
+
if (
|
|
435
|
+
!GRAPH_RUNTIME_CANDIDATE_CLASSIFICATIONS.includes(
|
|
436
|
+
candidate?.classification,
|
|
437
|
+
) ||
|
|
438
|
+
!candidate?.reason ||
|
|
439
|
+
!Array.isArray(candidate?.files) ||
|
|
440
|
+
candidate.files.length === 0
|
|
441
|
+
) {
|
|
442
|
+
errors.push(
|
|
443
|
+
"classified non-writer candidates require files, a supported classification, and a reason",
|
|
444
|
+
);
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
for (const file of candidate.files) {
|
|
448
|
+
if (classifiedNonWriterFiles.has(file)) {
|
|
449
|
+
errors.push(`classified non-writer file is duplicated: ${file}`);
|
|
450
|
+
}
|
|
451
|
+
classifiedNonWriterFiles.add(file);
|
|
452
|
+
if (requireFiles && !fs.existsSync(path.resolve(repositoryRoot, file))) {
|
|
453
|
+
errors.push(`classified non-writer file does not exist: ${file}`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (discoverWriters) {
|
|
458
|
+
for (const file of discoverUnclassifiedRuntimeWriters(manifest, {
|
|
459
|
+
repositoryRoot,
|
|
460
|
+
})) {
|
|
461
|
+
errors.push(`unclassified runtime writer: ${file}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (GRAPH_AUTHORITY_MODES.length !== 3) {
|
|
465
|
+
errors.push("Graph authority mode contract is incomplete");
|
|
466
|
+
}
|
|
467
|
+
return Object.freeze({
|
|
468
|
+
valid: errors.length === 0,
|
|
469
|
+
errors: Object.freeze(errors),
|
|
470
|
+
surfaceCount: surfaces.length,
|
|
471
|
+
entryCount: entryIds.size,
|
|
472
|
+
migratableEntryCount: strategyCounts.migrate,
|
|
473
|
+
retirementEntryCount: strategyCounts.retire,
|
|
474
|
+
disabledEntryCount: strategyCounts.disabled,
|
|
475
|
+
replacementEdgeCount,
|
|
476
|
+
replacementTargetEntryCount: replacementTargetEntryIds.size,
|
|
477
|
+
historicalReadFunctionCount,
|
|
478
|
+
retiredMutationFunctionCount,
|
|
479
|
+
manifest: Object.freeze(clone(manifest)),
|
|
480
|
+
});
|
|
481
|
+
}
|