chainlesschain 0.166.7 → 0.166.10
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 +21 -0
- package/package.json +4 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BlrmQxa2.js → AIOps-CLYBDAGv.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-zyRyLITg.js → ActionButton-CpeSttcu.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DwGz7OGN.js → Analytics-Ba1TNLG0.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Dc-nj7Zd.js → AppLayout-xBy8EOeg.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-7Hu3O73p.js → Artifacts-CJ_3TFb8.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bnoe3-fR.js → Audit-DUATFCG3.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BqYFrDKZ.js → BackgroundAgents-BRXYPIGp.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B3hwW1nz.js → Backup-D8auLx7y.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-XFVxLA4w.js → BaseInput-CBgdslQ3.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CWRDNw7e.js → Chat-B32LvAiE.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CVfvAy-n.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-kFeeBgac.js → Checkbox-BwzBxOpC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CCxp8xoI.js → Codegen-0U5vrg1H.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BLKZalle.js → Col-dZ2i4aAj.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DD0eWCez.js → Community-UVvpLr8c.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CHqHWdy0.js → Compact-BDNEb1Bd.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Bw54uPiK.js → Compliance-BrzQPxyS.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DZ13zKNJ.js → Cowork-BbgGsu-9.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dlj5Jevg.js → Cron-G321XPhp.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Nvz0aR0j.js → Crosschain-CgLNUyMn.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Ct89eUyY.js → DID-BAfRj18q.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BHUH5IAe.js → Dashboard-BNIxA4TK.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BhZG-PO7.js → Dropdown-BLAUmCAN.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ae4RVwwJ.js → EmailListRenderer-CsnhTW22.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-AOcxLfLr.js → FamilyGuardDashboard-zcQ7Ip1n.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BK2PJQOF.js → Federation-KFwxodNU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C2n3xO2_.js → FormItemContext-3CYRLEHG.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DcyUVFZq.js → GenericCardRenderer-D3d9D8L9.js} +1 -1
- package/src/assets/web-panel/assets/{Git-tBae9Lt8.js → Git-BJ202nJY.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DmNR3AP4.js → Governance-ClnnXVQ-.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CoseEigi.js → Inference-DNU-PTkc.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bdjd1sxr.js → KnowledgeGraph-DJuinbuY.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CtlkKIcn.js → Logs-D4No-46s.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BTYb7nEx.js → Marketplace-Ba-KqRN3.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D0iUdW3P.js → McpTools-DVoxnPgE.js} +2 -2
- package/src/assets/web-panel/assets/{Memory--gwI7w4Y.js → Memory-D_C8gzAZ.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-JmFBi24T.js → MobileBridge-DnzTPcDH.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-u7avzyoO.js → Mtc-CvEHmHId.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-gT3z5fo_.js → MtcAudit-VNJmWqmv.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BIqZTz5n.js → Multisig-BO0x_Vsa.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DdhVfXYq.js → NLProgramming-CM2gI1UY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CBlyUmY3.js → Notes-CMc1HsML.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DSyI26N3.js → NotificationSettings-DGNmSKGM.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-B7IEuNz4.js → OrderTableRenderer-Du-Kct3p.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-ozhi4kGS.js → Organization-DRtRZjas.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CBy57RVM.js → Overflow-Dp4OeWsn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CA-ZRv77.js → P2P-DXMJVls8.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DiP632GP.js → Permissions-D1Hbb51o.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-AnU8O-SS.js → PersonalDataHub-BridiDhr.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DDibOUaP.js → Pipeline-B4bUNCm1.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D421t36T.js → Privacy-BTu_HEqK.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DR879ZPJ.js → ProjectInit-SVtL2hnt.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ded8o6aY.js → ProjectSettings-B2Sh7JZ2.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BHPxiucB.js → Projects-BwU1xalW.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Boivuu-E.js → Providers-BWdWQSDw.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-xKD_ntKp.js → QrScannerModal-Brzc-Sxb.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D3y_A6FV.js → QuickAsk-DIBz7FCe.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BjKM-YC2.js → Recommend-CZ8RriIJ.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-CM0KJQ3t.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-Ci2GjH5p.js → Reputation-D_wo8H0O.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B0-T2BSh.js → Row-D1G1fD7N.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Bet-ur-r.js → RssFeed-dKCVtA0K.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DWtRAS2R.js → Search-Be1D61xo.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BDfu2Qn6.js → Security-IbNiR6OC.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CvJmvSMM.js → Services-nuHK8y8p.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CEbrKpdC.js → Skeleton-DnM5jdnC.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CjVeiETf.js → Skills-DCTdoq_q.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Dibypxum.js → Sla-DlWun-Ui.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-XflYXp7a.js → SpeechSettings-C19kv2sd.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-ro1Ivx1E.js → SyncSettings-CkQIR_Hu.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CHq1qFbo.js → Tasks-DdbqOEbs.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CRnUZxtZ.js → Templates-B7GpIXeo.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-jUX72JCA.js → Tenant-ByEstFhY.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BBhAs7pt.js → Terminal-BKRVID1a.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CD5M3RGp.js → TimelineRenderer-CNS3dHNv.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-sah3v0gu.js → Tokens-BykqylCL.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BNT3Uz3s.js → Trigger-ByNxq51W.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BytMGPMo.js → Trust-BlrFsdaS.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BkYVMRQs.js → UkeySign-Dg26A-sd.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-psvb5Q7Y.js → VideoEditing-C1wUxNn0.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-PFQTW0MH.js → Wallet-OphEUzI4.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DgO-OwRT.js → WebAuthn-_8lL08hF.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DL2l9VNl.js → WorkflowEditor-BnTuIvnP.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C84akEzN.js → chat-3N3VLQYr.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DzTWuQKP.js → colors-Bo_G96gg.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CR9LJQFv.js → compact-item-DjubfjI_.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CTTov5Kn.js → createContext-Cx_HSLCk.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BX944k9E.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DALj523o.js → hasIn-D5OjAOlA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9ScRFxz.js → index-3_CEBEEf.js} +3 -3
- package/src/assets/web-panel/assets/{index-BKNIzw0U.js → index-B905-Mcs.js} +1 -1
- package/src/assets/web-panel/assets/{index-eJcFleIV.js → index-BScGr1BY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXaCRXN4.js → index-BgPb37tI.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6QOJbSn.js → index-Bj7S5IJw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNmTDXmf.js → index-BvYo09C0.js} +1 -1
- package/src/assets/web-panel/assets/{index-7ux_XohH.js → index-BxgIE4PD.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_Bg0LdK.js → index-C-4sfa0l.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZER6Lj3.js → index-C-_Cy0k_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmELknPe.js → index-C4MAnkl5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXTEpfGe.js → index-C5IwN9q3.js} +1 -1
- package/src/assets/web-panel/assets/{index-W9axN_Ce.js → index-C8dPFFhy.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2qpjU-D.js → index-CC7RnaPP.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0MqUnKO.js → index-CCjq3g32.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtW6Zr_i.js → index-CNmsP0Xf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqUgXYIQ.js → index-CRKk1JPX.js} +1 -1
- package/src/assets/web-panel/assets/{index-_8vetPbU.js → index-CVPDhmVH.js} +1 -1
- package/src/assets/web-panel/assets/index-C_9Jt_SR.js +1 -0
- package/src/assets/web-panel/assets/{index-Cef0n4k_.js → index-Ce8EWU6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnxjXIsK.js → index-CmLwI-Y8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CunGDV0g.js → index-CqZq3zWr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjE_ew7U.js → index-Cz5tQ5PY.js} +1 -1
- package/src/assets/web-panel/assets/{index-QW0EXx14.js → index-DBvZhdCb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dah8M4l2.js → index-DD1zSPZH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBIPnoTj.js → index-DE4XtzMl.js} +1 -1
- package/src/assets/web-panel/assets/index-DL2EFx7m.js +1 -0
- package/src/assets/web-panel/assets/{index-3-XJoYgX.js → index-DXJqa1-I.js} +1 -1
- package/src/assets/web-panel/assets/{index-Be6Os5S8.js → index-DaU60K3A.js} +1 -1
- package/src/assets/web-panel/assets/{index-AXnERsyV.js → index-Dbdr8tVi.js} +1 -1
- package/src/assets/web-panel/assets/{index-hzzTITR9.js → index-DlcbE0sX.js} +1 -1
- package/src/assets/web-panel/assets/{index-s4CFyn-n.js → index-DrVjatPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZhhFQi9.js → index-EZr3bvz2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDyt57zL.js → index-HioDjvUF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DH6OG-ci.js → index-Q_vn0t8d.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNaQt49r.js → index-UnpsQ6A0.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5eeMl_2.js → index-Y-H7j25u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjkPDSX4.js → index-uAcJUJkx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxdzSljS.js → index-x7o-2T3S.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHRXKiU1.js → index-ydnEPOzZ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-JuW8mFj7.js → initDefaultProps-DurpENJY.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cwb0HBve.js → motion-CIh-z-gR.js} +1 -1
- package/src/assets/web-panel/assets/{move-DHokzMgu.js → move-Uc_yI2NA.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DX31y6QS.js → mtc-parser-DUevj5wz.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCIUYDA6.js → omit-85eMYyur.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DMCj4EoZ.js → pickAttrs-AuxDD20F.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dy5K-u1s.js → placementArrow-DOWn8dd1.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DkGeZu54.js → responsiveObserve-CPxTWodH.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dc5dyJdg.js → slide-BqvbGPjx.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIUBjOaC.js → statusUtils-BzXKkV8d.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DmyEOxm5.js → styleChecker-B2O7yRk3.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-FRhakk1e.js → useFlexGapSupport-DRWp7px1.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-clXyV1WQ.js → useFs-Dp0V7sjM.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-UF6DG41z.js → usePersonalDataHub-CyCrG3ql.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CoCt95G7.js → vnode-CXhoFpFo.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-yVWt-ENm.js → zoom-0z3mtwEg.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/orchestrate.js +61 -9
- package/src/data/changelog.json +47 -1
- package/src/gateways/ws/message-dispatcher.js +4 -0
- package/src/gateways/ws/session-protocol.js +89 -11
- package/src/gateways/ws/ws-agent-handler.js +65 -9
- package/src/gateways/ws/ws-approval-gate.js +181 -16
- package/src/gateways/ws/ws-server.js +16 -6
- package/src/generated/cc-agent-protocol.schema.json +148 -2
- package/src/lib/agent-team/task-lease.js +172 -3
- package/src/lib/agent-team/team-runner.js +60 -1
- package/src/lib/app-server/graph-runtime.js +326 -2
- package/src/lib/app-server/server.js +60 -0
- package/src/lib/approval-grant-ledger.js +69 -0
- package/src/lib/codex-app-server-adapter.js +11 -20
- package/src/lib/graph-kernel/compiler.js +66 -13
- package/src/lib/graph-kernel/cutover-authority-resolver.js +26 -0
- package/src/lib/graph-kernel/cutover-ledger.js +53 -11
- package/src/lib/graph-kernel/index.js +2 -0
- package/src/lib/graph-kernel/production-cutover-evidence.js +969 -0
- package/src/lib/graph-kernel/retirement-evidence.js +575 -0
- package/src/lib/graph-kernel/runtime.js +76 -14
- package/src/lib/interaction-adapter.js +61 -9
- package/src/lib/policy-decision-event.js +149 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
- package/src/lib/record-replay/index.js +1 -0
- package/src/lib/record-replay/playwright-ui-driver.js +327 -0
- package/src/lib/webhook-security.js +484 -36
- package/src/runtime/coding-agent-events.cjs +13 -11
- package/src/runtime/headless-runner.js +17 -1
- package/src/runtime/headless-stream.js +66 -3
- package/src/runtime/session-slash-commands.js +57 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bf30VM8G.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-CZsTBEQE.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BK01cQRx.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DOHc9zm8.js +0 -7
- package/src/assets/web-panel/assets/RemoteSession-CgqKMXG4.js +0 -5
- package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +0 -1
- package/src/assets/web-panel/assets/index-DDyMJexx.js +0 -1
- package/src/assets/web-panel/assets/index-btiojFYn.js +0 -1
|
@@ -7,6 +7,8 @@ export const GRAPH_DEFINITION_MIN_VERSION = Math.max(
|
|
|
7
7
|
0,
|
|
8
8
|
GRAPH_DEFINITION_VERSION - 1,
|
|
9
9
|
);
|
|
10
|
+
export const GRAPH_DEFINITION_MIGRATION_EVIDENCE_SCHEMA =
|
|
11
|
+
"chainlesschain.graph-definition-migration/v1";
|
|
10
12
|
export const GRAPH_COMPILE_ERROR = "CC_GRAPH_COMPILE_FAILED";
|
|
11
13
|
|
|
12
14
|
const compiledGraphs = new WeakSet();
|
|
@@ -1285,6 +1287,22 @@ export function compileGraphDefinition(input, options = {}) {
|
|
|
1285
1287
|
definition,
|
|
1286
1288
|
`cc.graph.definition/${definition.schemaVersion}`,
|
|
1287
1289
|
);
|
|
1290
|
+
const migrationBackup =
|
|
1291
|
+
migrated.migratedFrom == null ? null : deepFreeze(stableValue(input));
|
|
1292
|
+
const definitionMigration =
|
|
1293
|
+
migrationBackup == null
|
|
1294
|
+
? null
|
|
1295
|
+
: deepFreeze({
|
|
1296
|
+
schema: GRAPH_DEFINITION_MIGRATION_EVIDENCE_SCHEMA,
|
|
1297
|
+
fromVersion: migrated.migratedFrom,
|
|
1298
|
+
toVersion: definition.schemaVersion,
|
|
1299
|
+
revisionDigest,
|
|
1300
|
+
backupDefinition: migrationBackup,
|
|
1301
|
+
rollbackDigest: graphDigest(
|
|
1302
|
+
migrationBackup,
|
|
1303
|
+
`cc.graph.definition-backup/${migrated.migratedFrom}`,
|
|
1304
|
+
),
|
|
1305
|
+
});
|
|
1288
1306
|
const compiled = {
|
|
1289
1307
|
schema: "chainlesschain.compiled-graph/v1",
|
|
1290
1308
|
schemaVersion: definition.schemaVersion,
|
|
@@ -1293,6 +1311,7 @@ export function compileGraphDefinition(input, options = {}) {
|
|
|
1293
1311
|
revision: definition.revision,
|
|
1294
1312
|
revisionDigest,
|
|
1295
1313
|
migratedFrom: migrated.migratedFrom,
|
|
1314
|
+
definitionMigration,
|
|
1296
1315
|
nodes: deepFreeze(
|
|
1297
1316
|
Object.fromEntries([...nodes].map(([id, value]) => [id, value])),
|
|
1298
1317
|
),
|
|
@@ -1369,25 +1388,59 @@ export function assertCompiledGraph(value) {
|
|
|
1369
1388
|
}
|
|
1370
1389
|
|
|
1371
1390
|
export function migrateGraphDefinition(input, options = {}) {
|
|
1372
|
-
const
|
|
1373
|
-
const
|
|
1374
|
-
const backupDefinition =
|
|
1375
|
-
migratedFrom == null ? null : deepFreeze(stableValue(input));
|
|
1391
|
+
const compiled = compileGraphDefinition(input, options);
|
|
1392
|
+
const migration = compiled.definitionMigration;
|
|
1376
1393
|
return Object.freeze({
|
|
1377
1394
|
dryRun: options.dryRun !== false,
|
|
1378
|
-
fromVersion:
|
|
1395
|
+
fromVersion: migration?.fromVersion ?? compiled.schemaVersion,
|
|
1379
1396
|
toVersion: compiled.schemaVersion,
|
|
1380
1397
|
definition: compiled.definition,
|
|
1381
1398
|
revisionDigest: compiled.revisionDigest,
|
|
1382
|
-
backupRequired:
|
|
1399
|
+
backupRequired: migration != null,
|
|
1400
|
+
backupDefinition: migration?.backupDefinition || null,
|
|
1401
|
+
rollbackDigest: migration?.rollbackDigest || null,
|
|
1402
|
+
});
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
export function validateGraphDefinitionMigrationEvidence(value) {
|
|
1406
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
1407
|
+
const error = new TypeError(
|
|
1408
|
+
"graph definition migration evidence is required",
|
|
1409
|
+
);
|
|
1410
|
+
error.code = "CC_GRAPH_MIGRATION_EVIDENCE_INVALID";
|
|
1411
|
+
throw error;
|
|
1412
|
+
}
|
|
1413
|
+
if (
|
|
1414
|
+
value.schema !== GRAPH_DEFINITION_MIGRATION_EVIDENCE_SCHEMA ||
|
|
1415
|
+
Number(value.fromVersion) !== GRAPH_DEFINITION_VERSION - 1 ||
|
|
1416
|
+
Number(value.toVersion) !== GRAPH_DEFINITION_VERSION ||
|
|
1417
|
+
!/^sha256:[a-f0-9]{64}$/u.test(String(value.revisionDigest || ""))
|
|
1418
|
+
) {
|
|
1419
|
+
const error = new TypeError(
|
|
1420
|
+
"graph definition migration evidence has an invalid schema or version",
|
|
1421
|
+
);
|
|
1422
|
+
error.code = "CC_GRAPH_MIGRATION_EVIDENCE_INVALID";
|
|
1423
|
+
throw error;
|
|
1424
|
+
}
|
|
1425
|
+
const backupDefinition = restoreGraphDefinitionBackup(
|
|
1426
|
+
value.backupDefinition,
|
|
1427
|
+
value.rollbackDigest,
|
|
1428
|
+
);
|
|
1429
|
+
const replay = compileGraphDefinition(backupDefinition);
|
|
1430
|
+
if (replay.revisionDigest !== value.revisionDigest) {
|
|
1431
|
+
const error = new TypeError(
|
|
1432
|
+
"graph definition migration replay does not match its canonical revision",
|
|
1433
|
+
);
|
|
1434
|
+
error.code = "CC_GRAPH_MIGRATION_REPLAY_MISMATCH";
|
|
1435
|
+
throw error;
|
|
1436
|
+
}
|
|
1437
|
+
return deepFreeze({
|
|
1438
|
+
schema: GRAPH_DEFINITION_MIGRATION_EVIDENCE_SCHEMA,
|
|
1439
|
+
fromVersion: GRAPH_DEFINITION_VERSION - 1,
|
|
1440
|
+
toVersion: GRAPH_DEFINITION_VERSION,
|
|
1441
|
+
revisionDigest: value.revisionDigest,
|
|
1383
1442
|
backupDefinition,
|
|
1384
|
-
rollbackDigest:
|
|
1385
|
-
backupDefinition == null
|
|
1386
|
-
? null
|
|
1387
|
-
: graphDigest(
|
|
1388
|
-
backupDefinition,
|
|
1389
|
-
`cc.graph.definition-backup/${migratedFrom}`,
|
|
1390
|
-
),
|
|
1443
|
+
rollbackDigest: value.rollbackDigest,
|
|
1391
1444
|
});
|
|
1392
1445
|
}
|
|
1393
1446
|
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
graphRuntimeSurfaceEntry,
|
|
10
10
|
loadGraphRuntimeSurfaceManifest,
|
|
11
11
|
} from "./runtime-surface-manifest.js";
|
|
12
|
+
import { normalizeGraphRetirementContract } from "./retirement-evidence.js";
|
|
12
13
|
|
|
13
14
|
const AUTHORITY_MODES = new Set(["legacy", "shadow", "canonical"]);
|
|
14
15
|
|
|
@@ -68,6 +69,17 @@ export class GraphCutoverAuthorityResolver {
|
|
|
68
69
|
this.retirementStores = [...declared.entry.storeDispositions.retire].sort();
|
|
69
70
|
this.rebuildStores = [...declared.entry.storeDispositions.rebuild].sort();
|
|
70
71
|
this.disabledStores = [...declared.entry.storeDispositions.disabled].sort();
|
|
72
|
+
this.retirementContract =
|
|
73
|
+
this.cutoverStrategy === "retire"
|
|
74
|
+
? normalizeGraphRetirementContract({
|
|
75
|
+
rolloutKey: declared.entry.rolloutKey,
|
|
76
|
+
replacementEntrypoint: declared.entry.replacementEntrypoint,
|
|
77
|
+
replacementEntryIds: declared.entry.replacementEntryIds,
|
|
78
|
+
historicalReadFunctions: declared.entry.historicalReadFunctions,
|
|
79
|
+
mutationFunctions: declared.entry.mutationFunctions,
|
|
80
|
+
writerFiles: declared.entry.writerFiles,
|
|
81
|
+
})
|
|
82
|
+
: null;
|
|
71
83
|
this.ledger = ledger;
|
|
72
84
|
this.fallbackMode =
|
|
73
85
|
fallbackMode === undefined
|
|
@@ -112,6 +124,19 @@ export class GraphCutoverAuthorityResolver {
|
|
|
112
124
|
},
|
|
113
125
|
);
|
|
114
126
|
}
|
|
127
|
+
const stateRetirementContract =
|
|
128
|
+
this.cutoverStrategy === "retire"
|
|
129
|
+
? normalizeGraphRetirementContract(state.retirementContract)
|
|
130
|
+
: null;
|
|
131
|
+
if (
|
|
132
|
+
JSON.stringify(stateRetirementContract) !==
|
|
133
|
+
JSON.stringify(this.retirementContract)
|
|
134
|
+
) {
|
|
135
|
+
throw resolverError(
|
|
136
|
+
"CC_GRAPH_CUTOVER_RETIREMENT_CONTRACT_CONFLICT",
|
|
137
|
+
"cutover authority is bound to a stale retirement contract",
|
|
138
|
+
);
|
|
139
|
+
}
|
|
115
140
|
return state;
|
|
116
141
|
}
|
|
117
142
|
|
|
@@ -122,6 +147,7 @@ export class GraphCutoverAuthorityResolver {
|
|
|
122
147
|
manifestDigest: this.manifestDigest,
|
|
123
148
|
stores: this.stores,
|
|
124
149
|
cutoverStrategy: this.cutoverStrategy,
|
|
150
|
+
retirementContract: this.retirementContract,
|
|
125
151
|
});
|
|
126
152
|
}
|
|
127
153
|
|
|
@@ -2,6 +2,11 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { JsonlRolloutStore } from "../app-server/rollout-store.js";
|
|
3
3
|
import { assertGraphCutoverTransition } from "./authority.js";
|
|
4
4
|
import { graphDigest } from "./compiler.js";
|
|
5
|
+
import {
|
|
6
|
+
normalizeGraphLegacyWriterObservation,
|
|
7
|
+
normalizeGraphRetirementContract,
|
|
8
|
+
normalizeGraphRetirementEvidence,
|
|
9
|
+
} from "./retirement-evidence.js";
|
|
5
10
|
import { graphStoreEvidenceDigest } from "./store-cutover-evidence.js";
|
|
6
11
|
|
|
7
12
|
export const GRAPH_CUTOVER_LEDGER_SCHEMA =
|
|
@@ -329,17 +334,16 @@ function forwardEvidence(from, to, input, state) {
|
|
|
329
334
|
if (state.cutoverStrategy === "retire") {
|
|
330
335
|
return {
|
|
331
336
|
...canonicalEvidence,
|
|
332
|
-
|
|
333
|
-
input.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
"legacyMutationSuccessCount",
|
|
337
|
+
retirementEvidence: normalizeGraphRetirementEvidence(
|
|
338
|
+
input.retirementEvidence,
|
|
339
|
+
{
|
|
340
|
+
surface: state.surface,
|
|
341
|
+
entryId: state.entryId,
|
|
342
|
+
manifestDigest: state.manifestDigest,
|
|
343
|
+
commitSha: platforms[0].commitSha,
|
|
344
|
+
contract: state.retirementContract,
|
|
345
|
+
requiredPlatforms: GRAPH_CUTOVER_REQUIRED_PLATFORMS,
|
|
346
|
+
},
|
|
343
347
|
),
|
|
344
348
|
};
|
|
345
349
|
}
|
|
@@ -357,6 +361,21 @@ function forwardEvidence(from, to, input, state) {
|
|
|
357
361
|
};
|
|
358
362
|
}
|
|
359
363
|
if (from === "canonical" && to === "legacy_read_only") {
|
|
364
|
+
if (state.cutoverStrategy === "retire") {
|
|
365
|
+
return {
|
|
366
|
+
legacyWriterObservation: normalizeGraphLegacyWriterObservation(
|
|
367
|
+
input.legacyWriterObservation,
|
|
368
|
+
{
|
|
369
|
+
surface: state.surface,
|
|
370
|
+
entryId: state.entryId,
|
|
371
|
+
manifestDigest: state.manifestDigest,
|
|
372
|
+
commitSha: state.canonicalCommitSha,
|
|
373
|
+
contract: state.retirementContract,
|
|
374
|
+
notBefore: state.updatedAt,
|
|
375
|
+
},
|
|
376
|
+
),
|
|
377
|
+
};
|
|
378
|
+
}
|
|
360
379
|
return {
|
|
361
380
|
writerInventoryDigest: digest(
|
|
362
381
|
input.writerInventoryDigest,
|
|
@@ -477,6 +496,7 @@ export class GraphCutoverLedger {
|
|
|
477
496
|
manifestDigest,
|
|
478
497
|
stores,
|
|
479
498
|
cutoverStrategy: strategyInput = "migrate",
|
|
499
|
+
retirementContract = undefined,
|
|
480
500
|
}) {
|
|
481
501
|
const safeSurface = identifier(surface, "surface");
|
|
482
502
|
const safeEntryId = identifier(entryId, "entryId");
|
|
@@ -485,6 +505,10 @@ export class GraphCutoverLedger {
|
|
|
485
505
|
const safeStores = storeInventory(stores, {
|
|
486
506
|
allowEmpty: safeCutoverStrategy !== "migrate",
|
|
487
507
|
});
|
|
508
|
+
const safeRetirementContract =
|
|
509
|
+
safeCutoverStrategy === "retire"
|
|
510
|
+
? normalizeGraphRetirementContract(retirementContract)
|
|
511
|
+
: null;
|
|
488
512
|
const threadId = this._thread(safeSurface, safeEntryId);
|
|
489
513
|
this.store.start({
|
|
490
514
|
threadId,
|
|
@@ -516,6 +540,19 @@ export class GraphCutoverLedger {
|
|
|
516
540
|
"cutover entry is already bound to a different strategy",
|
|
517
541
|
);
|
|
518
542
|
}
|
|
543
|
+
const existingRetirementContract =
|
|
544
|
+
safeCutoverStrategy === "retire"
|
|
545
|
+
? normalizeGraphRetirementContract(existing.retirementContract)
|
|
546
|
+
: null;
|
|
547
|
+
if (
|
|
548
|
+
JSON.stringify(existingRetirementContract) !==
|
|
549
|
+
JSON.stringify(safeRetirementContract)
|
|
550
|
+
) {
|
|
551
|
+
throw cutoverError(
|
|
552
|
+
"CC_GRAPH_CUTOVER_RETIREMENT_CONTRACT_CONFLICT",
|
|
553
|
+
"cutover entry is already bound to a different retirement contract",
|
|
554
|
+
);
|
|
555
|
+
}
|
|
519
556
|
return projection(existing, events);
|
|
520
557
|
}
|
|
521
558
|
const timestamp = new Date(this.now()).toISOString();
|
|
@@ -525,6 +562,7 @@ export class GraphCutoverLedger {
|
|
|
525
562
|
entryId: safeEntryId,
|
|
526
563
|
manifestDigest: safeManifestDigest,
|
|
527
564
|
cutoverStrategy: safeCutoverStrategy,
|
|
565
|
+
retirementContract: safeRetirementContract,
|
|
528
566
|
stores: safeStores,
|
|
529
567
|
stage: "legacy",
|
|
530
568
|
canaryPercent: 0,
|
|
@@ -596,6 +634,10 @@ export class GraphCutoverLedger {
|
|
|
596
634
|
? 100
|
|
597
635
|
: 0,
|
|
598
636
|
optInOnly: to === "canary" ? normalized.optInOnly === true : false,
|
|
637
|
+
canonicalCommitSha:
|
|
638
|
+
to === "canonical"
|
|
639
|
+
? normalized.platformEvidence[0].commitSha
|
|
640
|
+
: current.canonicalCommitSha || null,
|
|
599
641
|
transitionCount: current.transitionCount + 1,
|
|
600
642
|
rollbackCount: current.rollbackCount + (rollback ? 1 : 0),
|
|
601
643
|
lastEvidenceDigest: graphDigest(
|