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.
Files changed (187) hide show
  1. package/README.md +21 -0
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BlrmQxa2.js → AIOps-DJvpifGx.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-zyRyLITg.js → ActionButton-D2UhuF_A.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DwGz7OGN.js → Analytics-C9ho9obu.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-Dc-nj7Zd.js → AppLayout-BvRCpFK3.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-7Hu3O73p.js → Artifacts-jxrySvpk.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-Bnoe3-fR.js → Audit-ovEw0ZYl.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BqYFrDKZ.js → BackgroundAgents-D7H5z6zS.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-B3hwW1nz.js → Backup-BuXob8za.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-XFVxLA4w.js → BaseInput-CtnszuQ2.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-CWRDNw7e.js → Chat-B_mYE8fJ.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Bf30VM8G.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-kFeeBgac.js → Checkbox-ierdtcJD.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-CCxp8xoI.js → Codegen-3VKPJD_B.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-BLKZalle.js → Col-1EdMyf5P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DD0eWCez.js → Community-D6H7UA8K.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-CHqHWdy0.js → Compact-BBAZvYIm.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-Bw54uPiK.js → Compliance-CgsTrAoj.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DZ13zKNJ.js → Cowork-tnZgLoTE.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-Dlj5Jevg.js → Cron-CPpZw2Nh.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-Nvz0aR0j.js → Crosschain-BymBcp5z.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-Ct89eUyY.js → DID-DKPxS_K1.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BHUH5IAe.js → Dashboard-DvJhEmH9.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BhZG-PO7.js → Dropdown-b8iQyQIZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-ae4RVwwJ.js → EmailListRenderer--0-A-zKb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-AOcxLfLr.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BK2PJQOF.js → Federation-BRhaE2Z8.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-C2n3xO2_.js → FormItemContext-C4dnq7yf.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DcyUVFZq.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-tBae9Lt8.js → Git-4eA2fYzL.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-DmNR3AP4.js → Governance-BJuY9Y-9.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-CoseEigi.js → Inference-DZ5Dy4up.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Bdjd1sxr.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-CtlkKIcn.js → Logs-BKEeQEfJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-BTYb7nEx.js → Marketplace-Dhho4fEg.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-D0iUdW3P.js → McpTools-BW6xxSlU.js} +2 -2
  40. package/src/assets/web-panel/assets/{Memory--gwI7w4Y.js → Memory-mPqlpSkq.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-JmFBi24T.js → MobileBridge-Cb9N_DQI.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-BK01cQRx.js → MobileProjects-BNs8tah_.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-u7avzyoO.js → Mtc-CaxBt8tn.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-gT3z5fo_.js → MtcAudit-DRPQbp3t.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BIqZTz5n.js → Multisig-CRm-d8bK.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-DdhVfXYq.js → NLProgramming-BCCk3LPs.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CBlyUmY3.js → Notes-Cv8SN8gN.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DSyI26N3.js → NotificationSettings-CggIvTh5.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-B7IEuNz4.js → OrderTableRenderer-BW3_bV12.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-ozhi4kGS.js → Organization-BuRE-VCO.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CBy57RVM.js → Overflow-DBrm1gju.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CA-ZRv77.js → P2P-CWVnDYgS.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-DOHc9zm8.js → PdhVaultBrowser-8RKUIpte.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-DiP632GP.js → Permissions-tDUAxogW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-AnU8O-SS.js → PersonalDataHub-Dv2-CFis.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-DDibOUaP.js → Pipeline-DM6kvFni.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-D421t36T.js → Privacy-DzK-yL0d.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-DR879ZPJ.js → ProjectInit-B5UrNpkj.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-Ded8o6aY.js → ProjectSettings-CxJD43oW.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-Boivuu-E.js → Providers-CYl4jRYK.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-xKD_ntKp.js → QrScannerModal-DeH2T0fH.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-D3y_A6FV.js → QuickAsk-Bw9k_kTk.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-BjKM-YC2.js → Recommend-Bl_jGwoi.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
  66. package/src/assets/web-panel/assets/{Reputation-Ci2GjH5p.js → Reputation-Ds_Dfr-k.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-B0-T2BSh.js → Row-BpQUQTNj.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-Bet-ur-r.js → RssFeed-BatpZBGt.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-DWtRAS2R.js → Search-D7hOObzi.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-BDfu2Qn6.js → Security-dXQ4FKNt.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-CvJmvSMM.js → Services-D8wInGPa.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CEbrKpdC.js → Skeleton-DXQCoYpM.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CjVeiETf.js → Skills-D3oLRIVn.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-Dibypxum.js → Sla-BmP4-LnJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-XflYXp7a.js → SpeechSettings-DLj-xzro.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-ro1Ivx1E.js → SyncSettings-8KKaaRMr.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-CHq1qFbo.js → Tasks-GyK42I7C.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-CRnUZxtZ.js → Templates-n1y_8UBG.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-jUX72JCA.js → Tenant-B39nBph8.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BBhAs7pt.js → Terminal-DCQoOKXe.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-CD5M3RGp.js → TimelineRenderer-BkhbDfXk.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-sah3v0gu.js → Tokens-BeHIIU8D.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BNT3Uz3s.js → Trigger-BHvWXVOb.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BytMGPMo.js → Trust-y2WaOSto.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-BkYVMRQs.js → UkeySign-DBFeJBzt.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-psvb5Q7Y.js → VideoEditing-BEOWitC-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-PFQTW0MH.js → Wallet-BITedTe6.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DgO-OwRT.js → WebAuthn-DMwlJVin.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-DL2l9VNl.js → WorkflowEditor-CKfGFEu1.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-C84akEzN.js → chat-DR6gnBGF.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-DzTWuQKP.js → colors-C_Hw5NCn.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-CR9LJQFv.js → compact-item-B8IPwsEu.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-CTTov5Kn.js → createContext-D-u4JVnJ.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DALj523o.js → hasIn-CZubdS4D.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Be6Os5S8.js → index-11ASqx-A.js} +1 -1
  97. package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
  98. package/src/assets/web-panel/assets/{index-CXaCRXN4.js → index-BXS6wYJZ.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-7ux_XohH.js → index-Bi21Etg4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CXTEpfGe.js → index-Bizm87cX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DH6OG-ci.js → index-Bv2132PO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CZhhFQi9.js → index-BzoFanEQ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B6QOJbSn.js → index-C25rOz7O.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CunGDV0g.js → index-C2VmtNaQ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CmELknPe.js → index-Cbm8F0M2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DZER6Lj3.js → index-CfniPP5p.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B2qpjU-D.js → index-Cg2bCeol.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-QW0EXx14.js → index-CiXkhOkY.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C5eeMl_2.js → index-Cl5RpreD.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-s4CFyn-n.js → index-CqmLw8cs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-eJcFleIV.js → index-Ctje8Vl3.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-3-XJoYgX.js → index-D1w96gg9.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-_8vetPbU.js → index-D47jt8ET.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cef0n4k_.js → index-DJ6pG79m.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AXnERsyV.js → index-DTosx2Wu.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DtW6Zr_i.js → index-DY6MHo9D.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CNmTDXmf.js → index-DcFjRT-K.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dah8M4l2.js → index-DfnzrUxU.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-D0MqUnKO.js → index-DjRrqooR.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CqUgXYIQ.js → index-DmRcgiYT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D9ScRFxz.js → index-DpjHpRoq.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-DjE_ew7U.js → index-Dt-w3xQ7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-W9axN_Ce.js → index-DuOU5apg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BDyt57zL.js → index-LvjAKDSl.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-hzzTITR9.js → index-_nL79NT8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BNaQt49r.js → index-auyNYjLo.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DBIPnoTj.js → index-cVqbas5C.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CnxjXIsK.js → index-ffe7bvqP.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BHRXKiU1.js → index-idZKyADQ.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-D_Bg0LdK.js → index-k1Xa5iw1.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BKNIzw0U.js → index-mYZJxGH6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DxdzSljS.js → index-rYBHSDcJ.js} +1 -1
  133. package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
  134. package/src/assets/web-panel/assets/{index-CjkPDSX4.js → index-xoNssgz_.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-JuW8mFj7.js → initDefaultProps-lcU_dT2r.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Cwb0HBve.js → motion-Dc7UNXZ1.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DHokzMgu.js → move-Cll8ZXaL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DX31y6QS.js → mtc-parser-CAb_yLIM.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-BCIUYDA6.js → omit-DurYMyTe.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DMCj4EoZ.js → pickAttrs-BITQyOlw.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-Dy5K-u1s.js → placementArrow-Dg1rH91i.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DkGeZu54.js → responsiveObserve-D_EWIeac.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-Dc5dyJdg.js → slide-lK4d3zsh.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DIUBjOaC.js → statusUtils-Bflq-Git.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DmyEOxm5.js → styleChecker-Ccp0I-wt.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-FRhakk1e.js → useFlexGapSupport-CYZbByYA.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-clXyV1WQ.js → useFs-B_x0nxFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-UF6DG41z.js → usePersonalDataHub-DW55rL85.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CoCt95G7.js → vnode-Ca6MH3W8.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-yVWt-ENm.js → zoom-NdHelOog.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/orchestrate.js +61 -9
  154. package/src/data/changelog.json +34 -1
  155. package/src/gateways/ws/message-dispatcher.js +4 -0
  156. package/src/gateways/ws/session-protocol.js +89 -11
  157. package/src/gateways/ws/ws-agent-handler.js +65 -9
  158. package/src/gateways/ws/ws-approval-gate.js +181 -16
  159. package/src/gateways/ws/ws-server.js +16 -6
  160. package/src/generated/cc-agent-protocol.schema.json +148 -2
  161. package/src/lib/agent-team/task-lease.js +172 -3
  162. package/src/lib/agent-team/team-runner.js +60 -1
  163. package/src/lib/app-server/graph-runtime.js +326 -2
  164. package/src/lib/app-server/server.js +60 -0
  165. package/src/lib/approval-grant-ledger.js +69 -0
  166. package/src/lib/codex-app-server-adapter.js +11 -20
  167. package/src/lib/graph-kernel/compiler.js +66 -13
  168. package/src/lib/graph-kernel/cutover-authority-resolver.js +26 -0
  169. package/src/lib/graph-kernel/cutover-ledger.js +53 -11
  170. package/src/lib/graph-kernel/retirement-evidence.js +567 -0
  171. package/src/lib/graph-kernel/runtime.js +76 -14
  172. package/src/lib/interaction-adapter.js +61 -9
  173. package/src/lib/policy-decision-event.js +149 -0
  174. package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
  175. package/src/lib/record-replay/index.js +1 -0
  176. package/src/lib/record-replay/playwright-ui-driver.js +327 -0
  177. package/src/lib/webhook-security.js +484 -36
  178. package/src/runtime/coding-agent-events.cjs +13 -11
  179. package/src/runtime/headless-runner.js +17 -1
  180. package/src/runtime/headless-stream.js +66 -3
  181. package/src/runtime/session-slash-commands.js +57 -6
  182. package/src/assets/web-panel/assets/MarkdownRenderer-CZsTBEQE.js +0 -1
  183. package/src/assets/web-panel/assets/Projects-BHPxiucB.js +0 -1
  184. package/src/assets/web-panel/assets/RemoteSession-CgqKMXG4.js +0 -5
  185. package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +0 -1
  186. package/src/assets/web-panel/assets/index-DDyMJexx.js +0 -1
  187. 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 { definition, migratedFrom } = migrateDefinition(input, options);
1373
- const compiled = compileGraphDefinition(definition, options);
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: migratedFrom ?? definition.schemaVersion,
1395
+ fromVersion: migration?.fromVersion ?? compiled.schemaVersion,
1379
1396
  toVersion: compiled.schemaVersion,
1380
1397
  definition: compiled.definition,
1381
1398
  revisionDigest: compiled.revisionDigest,
1382
- backupRequired: migratedFrom != null,
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
- retirementProbeDigest: digest(
333
- input.retirementProbeDigest,
334
- "retirementProbeDigest",
335
- ),
336
- activeLegacyRunCount: zero(
337
- input.activeLegacyRunCount,
338
- "activeLegacyRunCount",
339
- ),
340
- legacyMutationSuccessCount: zero(
341
- input.legacyMutationSuccessCount,
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(