chainlesschain 0.163.7 → 0.163.8

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 (181) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/assets/{AIOps-axqQfwv8.js → AIOps-CavM7W3k.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DV-Ro0By.js → ActionButton-CUvZGabQ.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-Bt72WEVu.js → Analytics-DeBnWnbe.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BtepG55E.js → AppLayout-DbI5kxvd.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-B7KaJ7S_.js → Artifacts-D93bigKm.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-FNFaUg7A.js → Audit-CBNvfUZa.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DFb6J2wQ.js → BackgroundAgents-CJLyh_YU.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-CC7YBhyj.js → Backup-D_0yoehD.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-RkgTNVtj.js → BaseInput-TJxmbObW.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-hHEmGZy-.js → Chat-CE0dto1q.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CAP9YhHv.js → ChatBubbleRenderer-CZ5-yYiD.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-z5wXOQP1.js → Checkbox-Ck1RVIVo.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DVaDJnxy.js → Codegen-qpoyf6DK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CJmaRDR5.js → Col-DUyPWjIE.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DF29_2bI.js → Community-D_S1BemS.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DtkQkBzn.js → Compact-BjxeK-Gc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-xoHDxp7I.js → Compliance-Dd3CEJsu.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BUm-R7ht.js → Cowork-B4QG7-ad.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-Cgl14ZkB.js → Cron-BtZnids5.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BNcbmoqh.js → Crosschain-CHPfCBFD.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-Bwja0Zo9.js → DID-DT8DCEOK.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-Bk5XjEdJ.js → Dashboard-COQab5_U.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-Ci36Oitq.js → Dropdown-BY1PsQuU.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer--U04ZN4q.js → EmailListRenderer-CsuAuaq3.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2gNPR2s.js → FamilyGuardDashboard-BqpinD-j.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-C4KghYn7.js → Federation-D0gkfQFv.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-QL7x_Q_0.js → FormItemContext-BqgE-axK.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-F3Ryltwm.js → GenericCardRenderer-D0hJ2KvC.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-2HassK5k.js → Git-CmMB0uPY.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DoBIp7oe.js → Governance-BnVEI0Dk.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference--W01QhZ-.js → Inference-YTAMihRP.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DmvwqGpT.js → KnowledgeGraph-0ax7VHop.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BBJ4yAel.js → Logs-B9TRcokL.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-D5lNngSI.js → Marketplace-B6CSuD_H.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-CkEVOMKH.js → McpTools-CjMXvOVU.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-B1Ow1xVE.js → Memory-CXRF71U3.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-SgYbUfb6.js → MobileBridge-DQgNp_oS.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-BWdOvQAj.js → MobileProjects-DlPwcCbq.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-DcTXSSma.js → Mtc-6hDTRPe1.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-Dt3WG4oj.js → MtcAudit-BlVHU1DS.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-B9B38UZx.js → Multisig-DP9pzEbV.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-B0S4GGvG.js → NLProgramming-Djorh8EV.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-DZ5U58Ng.js → Notes-oLZ-JkUg.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-PjL5ZW34.js → NotificationSettings-Cg288VH3.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-DrAX2ESt.js → OrderTableRenderer-Bb1O3Ofr.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Cv1GYs-c.js → Organization-CBdo-bHs.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-Bbkp_PL3.js → Overflow-qZdnVumx.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BD8QUgoZ.js → P2P-D4kNfGNQ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-BO-2PeaB.js → PdhVaultBrowser-DnlMemM7.js} +5 -5
  52. package/src/assets/web-panel/assets/{Permissions-D_OPVa02.js → Permissions-DHucHFBJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-mh-pEmaB.js → PersonalDataHub-BovlOIPR.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-6JC2EDdb.js → Pipeline-Deru3CQY.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CUshzUAG.js → Privacy-Bq5oTTbU.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Cs2Aalri.js → ProjectInit-BfzxVWAz.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-1ak49tcj.js → ProjectSettings-CKC6XBtH.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-BV4oApsm.js → Projects-CMolGhae.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-CXXxvafH.js → Providers-C_jx4TWX.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-PTcDsF58.js → QrScannerModal-BdIHeVGC.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CDwucrJw.js → QuickAsk-BwZwAcPD.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CJlLVRXR.js → Recommend-BNTt0L-m.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DlN-ETsO.js → RemoteSession-Biyn2-Ro.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DI23LR6m.js → Reputation-D6VpG32B.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-Cl7UQMrM.js → Row-D_74OvQQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-CexHNfh8.js → RssFeed-BTr0a-BQ.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-BneBWvRN.js → Search-C3MCFoNU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-DX7Phgrp.js → Security-CqW9aJ6s.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-BWXO8Mte.js → Services-Cw5GNaHF.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DCyOjKPJ.js → Skeleton-DZps5qeY.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CXqERsTB.js → Skills-C6NQ1znT.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-bhbrbz8E.js → Sla-DFP8G2Sh.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-3IPU0HBZ.js → SpeechSettings-ESt6MB6v.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DBNTQLbM.js → SyncSettings-BHnN98aM.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-quP0bkN-.js → Tasks-NiSCaOf-.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-BouWmgho.js → Templates-DsKFhW2C.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-qv0D9s7z.js → Tenant-CQ0E0ze5.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BxvbE8BB.js → Terminal-D_rBu_by.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-D-IeLnJ2.js → TimelineRenderer-D3Vm4Po4.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CFMKKyVG.js → Tokens-DNTxRH6q.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-L8as3UuJ.js → Trigger-Dgprz1ms.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-MxmA4VZG.js → Trust-B2rUnVBD.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-C0VvJYRi.js → UkeySign-DEGQNc6_.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Bf5QZj8N.js → VideoEditing-jlsAx3Eh.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-BIJ9riRz.js → Wallet-8jQih1ij.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-B8p9Mhkw.js → WebAuthn-XLeO6xIB.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BVsuaPen.js → WorkflowEditor-De_dgDAG.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BfkjoKpV.js → chat-CI19R_Sk.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DeAlsWK8.js → colors-DsYTOYN3.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-Cs97bz5j.js → compact-item-CM3-t_Qr.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-BqbG60LH.js → createContext-BjxlBRZv.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-i_RY0b1X.js → hasIn-RDaWX_4i.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-U4f5izHz.js → index-9R6BxAr0.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-0-agYlWL.js → index-B-Z8eFUJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B1CbOH1i.js → index-B0PMlbMs.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DqBgBpgp.js → index-B5REnKt8.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BcUXAB2s.js → index-B7WBt_4T.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CIG8fQ2_.js → index-B9O9YyWE.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-gyFpvL7l.js → index-BCnZyIMA.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-yObj1O4n.js → index-BGqqJfL0.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DiSkx4UB.js → index-BHNYPO0b.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-Bm7lLR4c.js → index-BKJr-TZp.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BOVkf1K3.js → index-BN6UPD2E.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BESLFt4q.js → index-Bi46Xu4u.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CE2VtTlp.js → index-BlT2VAEK.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DmbfhJUP.js → index-C0yx-jtQ.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BYUVuwKt.js → index-C4gkzxkw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CeWoNHau.js → index-CVQMeiwH.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-PT_5sBMA.js → index-Cd3euP_4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CgsqdnRV.js → index-Cd9OJhHG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-B-3tEpTc.js → index-CiECJi-Q.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BkBi5TmC.js → index-CjTrRt13.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-D2B4VPyP.js → index-CnHH7bnD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-dIHr4B_u.js → index-Cpqm1qfU.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B5UkyA3c.js → index-CyOGN6a5.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Dk7-v4hP.js → index-D0zcy54x.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-ZxO_-E8a.js → index-D6sm5-Xq.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B-JVTrpr.js → index-DIUnNOjG.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dk2qouAz.js → index-DX7tuWVJ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BuLQobzW.js → index-DXXtGMUJ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DUUrv141.js → index-DcPFB8qJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D9evtvg2.js → index-DoQA0-52.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-COdGA-8n.js → index-Drlnwr8F.js} +1 -1
  125. package/src/assets/web-panel/assets/index-Drz6yq0m.js +1 -0
  126. package/src/assets/web-panel/assets/{index-CED2PL_y.js → index-Dsij_KsN.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-79V_zv1s.js → index-Dxge-xWl.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CG3PRyAL.js → index-DyIWssPC.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-YXgLng0K.js → index-IeiL9RKc.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-s1opAL-M.js → index-nAH87mQP.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cf3WCLmy.js → index-pPL66J85.js} +1 -1
  132. package/src/assets/web-panel/assets/index-uWiUs7S_.js +1 -0
  133. package/src/assets/web-panel/assets/{initDefaultProps-C9h9yKL3.js → initDefaultProps-BTL88of4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BvmLsPdu.js → motion-BUB2pXwB.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CoL4ekU1.js → move-egCkkOMm.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-C4pMy6xV.js → mtc-parser-DAWhZC8c.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-DPuJfNxx.js → omit-CvOxe_6d.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-D0KEeaK2.js → pickAttrs-DZUSLZ5Z.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BpkyINxt.js → placementArrow-BERxGNMY.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DQI_wOq8.js → responsiveObserve-DZuDfZ9n.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DYfdDiRg.js → slide-DO756sgI.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-B5dtvb0D.js → statusUtils-BRQlIz28.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-CF310mSj.js → styleChecker-DCSfdybl.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-D1Qp4BLp.js → useFlexGapSupport-LD8dWVve.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-C7_iyvJK.js → useFs-BX9uW2LK.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DZUt_fIm.js → usePersonalDataHub-BPSlPuHU.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D3dsi0lZ.js → vnode-BmOILC9V.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-WdbOlvdQ.js → zoom-1iKowKGg.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/automation.js +103 -1
  152. package/src/commands/team-merge-review.js +937 -0
  153. package/src/commands/team.js +2 -0
  154. package/src/data/changelog.json +14 -1
  155. package/src/lib/agent-schedule-store.js +139 -28
  156. package/src/lib/agent-team/team-merge-review-store.js +765 -0
  157. package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
  158. package/src/lib/agent-team/team-merge-review.js +1847 -0
  159. package/src/lib/automation-center-incidents.js +314 -0
  160. package/src/lib/automation-center-runtime.js +448 -0
  161. package/src/lib/automation-center.js +182 -38
  162. package/src/lib/automation-engine.js +41 -0
  163. package/src/lib/automation-execution-authority.js +241 -12
  164. package/src/lib/automation-execution-incident.js +737 -0
  165. package/src/lib/cowork-cron.js +85 -14
  166. package/src/lib/scheduler-kernel/agenda-adapter.js +17 -7
  167. package/src/lib/scheduler-kernel/automation-adapter.js +105 -11
  168. package/src/lib/scheduler-kernel/automation-event-adapter.js +87 -11
  169. package/src/lib/scheduler-kernel/contract.js +91 -0
  170. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +12 -1
  171. package/src/lib/scheduler-kernel/loop-adapter.js +7 -1
  172. package/src/lib/scheduler-kernel/routine-adapter.js +7 -1
  173. package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
  174. package/src/lib/scheduler-kernel/runtime.js +176 -3
  175. package/src/lib/scheduler-kernel/store.js +1253 -45
  176. package/src/runtime/agent-core.js +10 -0
  177. package/src/runtime/mcp-config.js +81 -10
  178. package/src/assets/web-panel/assets/MarkdownRenderer-BLCZMzhJ.js +0 -1
  179. package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +0 -1
  180. package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +0 -1
  181. package/src/assets/web-panel/assets/index-ChVT0p9u.js +0 -1
@@ -0,0 +1,314 @@
1
+ import { createHash } from "node:crypto";
2
+ import {
3
+ AUTOMATION_EXECUTION_INCIDENT_STATUS,
4
+ cancelAutomationExecutionIncident,
5
+ getAutomationExecutionIncident,
6
+ } from "./automation-execution-incident.js";
7
+ import {
8
+ automationSchedulerExecutionId,
9
+ automationSchedulerJobId,
10
+ } from "./scheduler-kernel/automation-adapter.js";
11
+ import {
12
+ automationEventExecutionId,
13
+ automationEventJobId,
14
+ } from "./scheduler-kernel/automation-event-adapter.js";
15
+ import {
16
+ SchedulerKernelError,
17
+ normalizeIdentifier,
18
+ } from "./scheduler-kernel/contract.js";
19
+
20
+ export const AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA =
21
+ "chainlesschain.automation-center-incident-action/v1";
22
+ export const AUTOMATION_CENTER_INCIDENT_ACTION_ERROR_SCHEMA =
23
+ "chainlesschain.automation-center-incident-action-error/v1";
24
+ export const AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA_VERSION = 1;
25
+
26
+ const INCIDENT_ACTIONS = new Set(["retry", "cancel"]);
27
+ const SCHEDULER_TRIGGER_TYPES = new Set(["schedule", "event"]);
28
+ const INCIDENT_ID_PATTERN = /^[0-9a-f]{64}$/u;
29
+ const SAFE_INCIDENT_ERROR_CODES = new Set([
30
+ "AUTOMATION_CENTER_INCIDENT_REVISION_INVALID",
31
+ "AUTOMATION_CENTER_INCIDENT_ACTION_INVALID",
32
+ "AUTOMATION_CENTER_INCIDENT_NOT_FOUND",
33
+ "AUTOMATION_CENTER_INCIDENT_STALE",
34
+ "AUTOMATION_CENTER_INCIDENT_CLOSED",
35
+ "AUTOMATION_CENTER_INCIDENT_RETRY_UNSUPPORTED",
36
+ "AUTOMATION_CENTER_INCIDENT_SCHEDULER_REQUIRED",
37
+ "AUTOMATION_CENTER_INCIDENT_EVIDENCE_CONFLICT",
38
+ ]);
39
+
40
+ function incidentActionError(code, message) {
41
+ const error = new SchedulerKernelError(code, message);
42
+ error.retryable = false;
43
+ return error;
44
+ }
45
+
46
+ function positiveRevision(value) {
47
+ const revision = Number(value);
48
+ if (!Number.isSafeInteger(revision) || revision < 1) {
49
+ throw incidentActionError(
50
+ "AUTOMATION_CENTER_INCIDENT_REVISION_INVALID",
51
+ "expectedRevision must be a positive safe integer",
52
+ );
53
+ }
54
+ return revision;
55
+ }
56
+
57
+ function actionPreview(incidentId, action, revision) {
58
+ return {
59
+ executor: "cli",
60
+ argv: [
61
+ "automation",
62
+ "center-incident-action",
63
+ incidentId,
64
+ action,
65
+ "--expected-revision",
66
+ String(revision),
67
+ "--json",
68
+ ],
69
+ mutates: true,
70
+ };
71
+ }
72
+
73
+ function projectedAction(incident, action, available, reason) {
74
+ return {
75
+ id: action,
76
+ available,
77
+ reason: available ? null : reason,
78
+ preview: available
79
+ ? actionPreview(incident.incidentId, action, incident.revision)
80
+ : null,
81
+ };
82
+ }
83
+
84
+ /**
85
+ * Project only identifiers and lifecycle metadata intended for an IDE boundary.
86
+ * In particular, authority, boundary, and details evidence never cross it.
87
+ */
88
+ export function projectAutomationCenterIncident(incident) {
89
+ const open = incident.status === AUTOMATION_EXECUTION_INCIDENT_STATUS.OPEN;
90
+ const schedulerBacked =
91
+ Boolean(incident.occurrenceId) &&
92
+ SCHEDULER_TRIGGER_TYPES.has(incident.triggerType);
93
+ return {
94
+ incidentId: incident.incidentId,
95
+ runId: incident.runId,
96
+ occurrenceId: incident.occurrenceId || null,
97
+ triggerType: incident.triggerType,
98
+ category: incident.category,
99
+ code: incident.code,
100
+ status: incident.status,
101
+ revision: incident.revision,
102
+ createdAtMs: incident.createdAtMs,
103
+ updatedAtMs: incident.updatedAtMs,
104
+ actions: [
105
+ projectedAction(
106
+ incident,
107
+ "retry",
108
+ open && schedulerBacked,
109
+ !open
110
+ ? "incident is already closed"
111
+ : "manual incidents cannot be retried safely",
112
+ ),
113
+ projectedAction(incident, "cancel", open, "incident is already closed"),
114
+ ],
115
+ };
116
+ }
117
+
118
+ function retryRequestId(incident, occurrence) {
119
+ const digest = createHash("sha256")
120
+ .update("chainlesschain.automation-center.incident-retry.v1\0", "utf8")
121
+ .update(incident.incidentId, "utf8")
122
+ .update("\0", "utf8")
123
+ .update(String(incident.revision), "utf8")
124
+ .update("\0", "utf8")
125
+ // A dead-letter fence identifies one exact failed scheduler attempt. This
126
+ // keeps repeated clicks idempotent while that attempt is being requeued,
127
+ // but permits a fresh operator retry after the requeued attempt advances
128
+ // its fence and fails again.
129
+ .update(String(occurrence.fence), "utf8")
130
+ .digest("hex");
131
+ return `center-incident-retry-${digest}`;
132
+ }
133
+
134
+ function expectedSchedulerIdentity(incident) {
135
+ if (incident.triggerType === "schedule") {
136
+ return {
137
+ jobId: automationSchedulerJobId(incident.flowId),
138
+ runId: automationSchedulerExecutionId(incident.occurrenceId),
139
+ triggerId: null,
140
+ };
141
+ }
142
+ if (incident.triggerType === "event" && incident.triggerId) {
143
+ return {
144
+ jobId: automationEventJobId(incident.triggerId),
145
+ runId: automationEventExecutionId(incident.occurrenceId),
146
+ triggerId: incident.triggerId,
147
+ };
148
+ }
149
+ throw incidentActionError(
150
+ "AUTOMATION_CENTER_INCIDENT_RETRY_UNSUPPORTED",
151
+ "incident is not bound to a supported scheduler occurrence",
152
+ );
153
+ }
154
+
155
+ function assertExactSchedulerEvidence(incident, occurrence) {
156
+ const expected = expectedSchedulerIdentity(incident);
157
+ const payloadFlowId = occurrence?.payload?.flow?.id;
158
+ const payloadTriggerId = occurrence?.payload?.trigger?.id ?? null;
159
+ const statusCanBeInitialOrDeduplicated =
160
+ occurrence?.status === "dead_letter" || occurrence?.status === "retry_wait";
161
+ if (
162
+ !occurrence ||
163
+ occurrence.id !== incident.occurrenceId ||
164
+ occurrence.jobId !== expected.jobId ||
165
+ incident.runId !== expected.runId ||
166
+ payloadFlowId !== incident.flowId ||
167
+ payloadTriggerId !== expected.triggerId ||
168
+ !statusCanBeInitialOrDeduplicated ||
169
+ !Number.isSafeInteger(occurrence.fence) ||
170
+ occurrence.fence < 1 ||
171
+ occurrence.lastError?.code !== incident.code
172
+ ) {
173
+ throw incidentActionError(
174
+ "AUTOMATION_CENTER_INCIDENT_EVIDENCE_CONFLICT",
175
+ "scheduler dead-letter evidence no longer matches the incident",
176
+ );
177
+ }
178
+ return expected;
179
+ }
180
+
181
+ function safeOccurrence(result) {
182
+ return {
183
+ occurrenceId: result.occurrence.id,
184
+ status: result.occurrence.status,
185
+ fence: result.occurrence.fence,
186
+ attempt: result.occurrence.attempt,
187
+ };
188
+ }
189
+
190
+ export function runAutomationCenterIncidentAction(
191
+ db,
192
+ schedulerStore,
193
+ { incidentId, action, expectedRevision, now = Date.now } = {},
194
+ ) {
195
+ const id = normalizeIdentifier(incidentId, "incidentId");
196
+ if (!INCIDENT_ACTIONS.has(action)) {
197
+ throw incidentActionError(
198
+ "AUTOMATION_CENTER_INCIDENT_ACTION_INVALID",
199
+ `unsupported Automation Center incident action: ${action}`,
200
+ );
201
+ }
202
+ const revision = positiveRevision(expectedRevision);
203
+ const incident = getAutomationExecutionIncident(db, id);
204
+ if (!incident) {
205
+ throw incidentActionError(
206
+ "AUTOMATION_CENTER_INCIDENT_NOT_FOUND",
207
+ `automation execution incident was not found: ${id}`,
208
+ );
209
+ }
210
+ if (incident.revision !== revision) {
211
+ throw incidentActionError(
212
+ "AUTOMATION_CENTER_INCIDENT_STALE",
213
+ `automation execution incident changed before ${action}: ${id}`,
214
+ );
215
+ }
216
+ if (incident.status !== AUTOMATION_EXECUTION_INCIDENT_STATUS.OPEN) {
217
+ throw incidentActionError(
218
+ "AUTOMATION_CENTER_INCIDENT_CLOSED",
219
+ `automation execution incident is already closed: ${id}`,
220
+ );
221
+ }
222
+
223
+ if (action === "cancel") {
224
+ const cancelled = cancelAutomationExecutionIncident(db, id, {
225
+ expectedRevision: revision,
226
+ resolutionCode: "OPERATOR_CANCELLED",
227
+ now,
228
+ });
229
+ return {
230
+ schema: AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA,
231
+ schemaVersion: AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA_VERSION,
232
+ authority: "cli",
233
+ ok: true,
234
+ incidentId: id,
235
+ action,
236
+ previousRevision: revision,
237
+ incident: projectAutomationCenterIncident(cancelled),
238
+ result: { status: cancelled.status },
239
+ };
240
+ }
241
+
242
+ if (!SCHEDULER_TRIGGER_TYPES.has(incident.triggerType)) {
243
+ throw incidentActionError(
244
+ "AUTOMATION_CENTER_INCIDENT_RETRY_UNSUPPORTED",
245
+ "manual incidents cannot be retried without risking duplicate authority or effects",
246
+ );
247
+ }
248
+ if (
249
+ !schedulerStore ||
250
+ typeof schedulerStore.getOccurrence !== "function" ||
251
+ typeof schedulerStore.requeueDeadLetter !== "function"
252
+ ) {
253
+ throw incidentActionError(
254
+ "AUTOMATION_CENTER_INCIDENT_SCHEDULER_REQUIRED",
255
+ "retry requires the scheduler store",
256
+ );
257
+ }
258
+ const occurrence = schedulerStore.getOccurrence(incident.occurrenceId);
259
+ assertExactSchedulerEvidence(incident, occurrence);
260
+ const requeued = schedulerStore.requeueDeadLetter({
261
+ occurrenceId: incident.occurrenceId,
262
+ expectedFence: occurrence.fence,
263
+ expectedErrorCode: incident.code,
264
+ requestId: retryRequestId(incident, occurrence),
265
+ });
266
+ return {
267
+ schema: AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA,
268
+ schemaVersion: AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA_VERSION,
269
+ authority: "cli",
270
+ ok: true,
271
+ incidentId: id,
272
+ action,
273
+ previousRevision: revision,
274
+ // A retry request is not a resolution. The original incident remains open
275
+ // until the scheduler-backed run produces authoritative success evidence.
276
+ incident: projectAutomationCenterIncident(incident),
277
+ result: {
278
+ requestId: requeued.requestId,
279
+ deduplicated: requeued.deduplicated === true,
280
+ occurrence: safeOccurrence(requeued),
281
+ },
282
+ };
283
+ }
284
+
285
+ export function automationCenterIncidentActionErrorEnvelope(
286
+ error,
287
+ { incidentId = null, action = null } = {},
288
+ ) {
289
+ const candidateCode =
290
+ typeof error?.code === "string"
291
+ ? error.code.slice(0, 128)
292
+ : "AUTOMATION_CENTER_INCIDENT_ACTION_FAILED";
293
+ const code = SAFE_INCIDENT_ERROR_CODES.has(candidateCode)
294
+ ? candidateCode
295
+ : "AUTOMATION_CENTER_INCIDENT_ACTION_FAILED";
296
+ return {
297
+ schema: AUTOMATION_CENTER_INCIDENT_ACTION_ERROR_SCHEMA,
298
+ schemaVersion: AUTOMATION_CENTER_INCIDENT_ACTION_SCHEMA_VERSION,
299
+ authority: "cli",
300
+ ok: false,
301
+ incidentId:
302
+ typeof incidentId === "string" && INCIDENT_ID_PATTERN.test(incidentId)
303
+ ? incidentId
304
+ : null,
305
+ action: INCIDENT_ACTIONS.has(action) ? action : null,
306
+ error: {
307
+ code,
308
+ // Do not serialize error.details: scheduler and incident evidence is an
309
+ // internal trust-boundary object and can include sensitive material.
310
+ message: "Automation Center incident action failed",
311
+ retryable: error?.retryable === true,
312
+ },
313
+ };
314
+ }