chainlesschain 0.166.7 → 0.166.9
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 +3 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BlrmQxa2.js → AIOps-DJvpifGx.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-zyRyLITg.js → ActionButton-D2UhuF_A.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DwGz7OGN.js → Analytics-C9ho9obu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Dc-nj7Zd.js → AppLayout-BvRCpFK3.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-7Hu3O73p.js → Artifacts-jxrySvpk.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bnoe3-fR.js → Audit-ovEw0ZYl.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BqYFrDKZ.js → BackgroundAgents-D7H5z6zS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B3hwW1nz.js → Backup-BuXob8za.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-XFVxLA4w.js → BaseInput-CtnszuQ2.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CWRDNw7e.js → Chat-B_mYE8fJ.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Bf30VM8G.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-kFeeBgac.js → Checkbox-ierdtcJD.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CCxp8xoI.js → Codegen-3VKPJD_B.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BLKZalle.js → Col-1EdMyf5P.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DD0eWCez.js → Community-D6H7UA8K.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CHqHWdy0.js → Compact-BBAZvYIm.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Bw54uPiK.js → Compliance-CgsTrAoj.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DZ13zKNJ.js → Cowork-tnZgLoTE.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Dlj5Jevg.js → Cron-CPpZw2Nh.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Nvz0aR0j.js → Crosschain-BymBcp5z.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Ct89eUyY.js → DID-DKPxS_K1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BHUH5IAe.js → Dashboard-DvJhEmH9.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BhZG-PO7.js → Dropdown-b8iQyQIZ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ae4RVwwJ.js → EmailListRenderer--0-A-zKb.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-AOcxLfLr.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BK2PJQOF.js → Federation-BRhaE2Z8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C2n3xO2_.js → FormItemContext-C4dnq7yf.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DcyUVFZq.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
- package/src/assets/web-panel/assets/{Git-tBae9Lt8.js → Git-4eA2fYzL.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DmNR3AP4.js → Governance-BJuY9Y-9.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CoseEigi.js → Inference-DZ5Dy4up.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bdjd1sxr.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CtlkKIcn.js → Logs-BKEeQEfJ.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BTYb7nEx.js → Marketplace-Dhho4fEg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D0iUdW3P.js → McpTools-BW6xxSlU.js} +2 -2
- package/src/assets/web-panel/assets/{Memory--gwI7w4Y.js → Memory-mPqlpSkq.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-JmFBi24T.js → MobileBridge-Cb9N_DQI.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BK01cQRx.js → MobileProjects-BNs8tah_.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-u7avzyoO.js → Mtc-CaxBt8tn.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-gT3z5fo_.js → MtcAudit-DRPQbp3t.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BIqZTz5n.js → Multisig-CRm-d8bK.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DdhVfXYq.js → NLProgramming-BCCk3LPs.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CBlyUmY3.js → Notes-Cv8SN8gN.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DSyI26N3.js → NotificationSettings-CggIvTh5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-B7IEuNz4.js → OrderTableRenderer-BW3_bV12.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-ozhi4kGS.js → Organization-BuRE-VCO.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CBy57RVM.js → Overflow-DBrm1gju.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CA-ZRv77.js → P2P-CWVnDYgS.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DOHc9zm8.js → PdhVaultBrowser-8RKUIpte.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DiP632GP.js → Permissions-tDUAxogW.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-AnU8O-SS.js → PersonalDataHub-Dv2-CFis.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DDibOUaP.js → Pipeline-DM6kvFni.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D421t36T.js → Privacy-DzK-yL0d.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DR879ZPJ.js → ProjectInit-B5UrNpkj.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ded8o6aY.js → ProjectSettings-CxJD43oW.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Boivuu-E.js → Providers-CYl4jRYK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-xKD_ntKp.js → QrScannerModal-DeH2T0fH.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D3y_A6FV.js → QuickAsk-Bw9k_kTk.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BjKM-YC2.js → Recommend-Bl_jGwoi.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-Ci2GjH5p.js → Reputation-Ds_Dfr-k.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B0-T2BSh.js → Row-BpQUQTNj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Bet-ur-r.js → RssFeed-BatpZBGt.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DWtRAS2R.js → Search-D7hOObzi.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BDfu2Qn6.js → Security-dXQ4FKNt.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CvJmvSMM.js → Services-D8wInGPa.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CEbrKpdC.js → Skeleton-DXQCoYpM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CjVeiETf.js → Skills-D3oLRIVn.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Dibypxum.js → Sla-BmP4-LnJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-XflYXp7a.js → SpeechSettings-DLj-xzro.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-ro1Ivx1E.js → SyncSettings-8KKaaRMr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CHq1qFbo.js → Tasks-GyK42I7C.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CRnUZxtZ.js → Templates-n1y_8UBG.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-jUX72JCA.js → Tenant-B39nBph8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BBhAs7pt.js → Terminal-DCQoOKXe.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CD5M3RGp.js → TimelineRenderer-BkhbDfXk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-sah3v0gu.js → Tokens-BeHIIU8D.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BNT3Uz3s.js → Trigger-BHvWXVOb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BytMGPMo.js → Trust-y2WaOSto.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BkYVMRQs.js → UkeySign-DBFeJBzt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-psvb5Q7Y.js → VideoEditing-BEOWitC-.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-PFQTW0MH.js → Wallet-BITedTe6.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DgO-OwRT.js → WebAuthn-DMwlJVin.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DL2l9VNl.js → WorkflowEditor-CKfGFEu1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C84akEzN.js → chat-DR6gnBGF.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DzTWuQKP.js → colors-C_Hw5NCn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CR9LJQFv.js → compact-item-B8IPwsEu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CTTov5Kn.js → createContext-D-u4JVnJ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DALj523o.js → hasIn-CZubdS4D.js} +1 -1
- package/src/assets/web-panel/assets/{index-Be6Os5S8.js → index-11ASqx-A.js} +1 -1
- package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
- package/src/assets/web-panel/assets/{index-CXaCRXN4.js → index-BXS6wYJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-7ux_XohH.js → index-Bi21Etg4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXTEpfGe.js → index-Bizm87cX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DH6OG-ci.js → index-Bv2132PO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZhhFQi9.js → index-BzoFanEQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6QOJbSn.js → index-C25rOz7O.js} +1 -1
- package/src/assets/web-panel/assets/{index-CunGDV0g.js → index-C2VmtNaQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmELknPe.js → index-Cbm8F0M2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZER6Lj3.js → index-CfniPP5p.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2qpjU-D.js → index-Cg2bCeol.js} +1 -1
- package/src/assets/web-panel/assets/{index-QW0EXx14.js → index-CiXkhOkY.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5eeMl_2.js → index-Cl5RpreD.js} +1 -1
- package/src/assets/web-panel/assets/{index-s4CFyn-n.js → index-CqmLw8cs.js} +1 -1
- package/src/assets/web-panel/assets/{index-eJcFleIV.js → index-Ctje8Vl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-3-XJoYgX.js → index-D1w96gg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-_8vetPbU.js → index-D47jt8ET.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cef0n4k_.js → index-DJ6pG79m.js} +1 -1
- package/src/assets/web-panel/assets/{index-AXnERsyV.js → index-DTosx2Wu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtW6Zr_i.js → index-DY6MHo9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNmTDXmf.js → index-DcFjRT-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dah8M4l2.js → index-DfnzrUxU.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0MqUnKO.js → index-DjRrqooR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqUgXYIQ.js → index-DmRcgiYT.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9ScRFxz.js → index-DpjHpRoq.js} +3 -3
- package/src/assets/web-panel/assets/{index-DjE_ew7U.js → index-Dt-w3xQ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-W9axN_Ce.js → index-DuOU5apg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDyt57zL.js → index-LvjAKDSl.js} +1 -1
- package/src/assets/web-panel/assets/{index-hzzTITR9.js → index-_nL79NT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNaQt49r.js → index-auyNYjLo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBIPnoTj.js → index-cVqbas5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnxjXIsK.js → index-ffe7bvqP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHRXKiU1.js → index-idZKyADQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_Bg0LdK.js → index-k1Xa5iw1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKNIzw0U.js → index-mYZJxGH6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxdzSljS.js → index-rYBHSDcJ.js} +1 -1
- package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
- package/src/assets/web-panel/assets/{index-CjkPDSX4.js → index-xoNssgz_.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-JuW8mFj7.js → initDefaultProps-lcU_dT2r.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cwb0HBve.js → motion-Dc7UNXZ1.js} +1 -1
- package/src/assets/web-panel/assets/{move-DHokzMgu.js → move-Cll8ZXaL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DX31y6QS.js → mtc-parser-CAb_yLIM.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCIUYDA6.js → omit-DurYMyTe.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DMCj4EoZ.js → pickAttrs-BITQyOlw.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dy5K-u1s.js → placementArrow-Dg1rH91i.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DkGeZu54.js → responsiveObserve-D_EWIeac.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dc5dyJdg.js → slide-lK4d3zsh.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIUBjOaC.js → statusUtils-Bflq-Git.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DmyEOxm5.js → styleChecker-Ccp0I-wt.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-FRhakk1e.js → useFlexGapSupport-CYZbByYA.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-clXyV1WQ.js → useFs-B_x0nxFD.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-UF6DG41z.js → usePersonalDataHub-DW55rL85.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CoCt95G7.js → vnode-Ca6MH3W8.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-yVWt-ENm.js → zoom-NdHelOog.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 +34 -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/retirement-evidence.js +567 -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/MarkdownRenderer-CZsTBEQE.js +0 -1
- package/src/assets/web-panel/assets/Projects-BHPxiucB.js +0 -1
- 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(
|