@straiffi/archon 1.7.2 → 1.7.3

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 (164) hide show
  1. package/dist/client/assets/ActivityView-DTEenQas.js +1 -0
  2. package/dist/client/assets/GitHubActionsDialog-BKWHonUS.js +1 -0
  3. package/dist/client/assets/TestsDialog-cBaoffCs.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-Do9nbC8v.js → architectureDiagram-3BPJPVTR-BzzGotac.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-DGGOLHF8.js → blockDiagram-GPEHLZMM-DIcqLHKg.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-Bz7tQybs.js → c4Diagram-AAUBKEIU-Hc1Sqmhs.js} +1 -1
  7. package/dist/client/assets/channel-Cym17waa.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-CJO-GmWJ.js → chunk-2J33WTMH-CWSwjsgk.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-DPAVagpC.js → chunk-3OPIFGDE-BnX3DljN.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-Cof75Mu7.js → chunk-5ZQYHXKU-EyyJlI-d.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-COuPqQ8_.js → chunk-727SXJPM-Ci6CfxWj.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-CFj5KabW.js → chunk-AQP2D5EJ-RKZNsJTm.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-C4M6w5cT.js → chunk-CSCIHK7Q-DBf0Euoj.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-ByaiwVue.js → chunk-KSCS5N6A-BmLQI_2S.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-Cx5jeot9.js → chunk-L5ZTLDWV-DKwVAb8G.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-DmGtztud.js → chunk-LZXEDZCA-axotKkbz.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-i3yuspqL.js → chunk-ND2GUHAM-BBlJ4nXC.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-CQ4E_jP4.js → chunk-NZK2D7GU-BKJGoZZt.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-D2g4VDCd.js → chunk-O5CBEL6O-C-Ghigo1.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-exIu-zQ2.js → chunk-WU5MYG2G-CCzVWYcd.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-BcigvvIC.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-3AdSuE0N.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-DvF75yLZ.js → dagre-BM42HDAG-rwIdPcjI.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-DFv0HxLL.js → diagram-2AECGRRQ-DJWxOQsg.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-C_LRir0-.js → diagram-5GNKFQAL-C-mQeFtd.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-DGZxRDRy.js → diagram-KO2AKTUF-BAu6u4sR.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-UXt0uti4.js → diagram-LMA3HP47-U6CbvBn0.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-CFbZS4n5.js → diagram-OG6HWLK6-DNTwFcs1.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-CfAwZDdf.js → erDiagram-TEJ5UH35-DaHX6Xw5.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-Cdgi5z3n.js → flowDiagram-I6XJVG4X-B9hKqL2l.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DOrkFkhu.js → ganttDiagram-6RSMTGT7-BQ1HPHVO.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-cEox0peD.js → gitGraphDiagram-PVQCEYII-BBRcsmMK.js} +1 -1
  33. package/dist/client/assets/index-CEMaJCPS.js +273 -0
  34. package/dist/client/assets/index-lWftq65U.css +2 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-gm51u2Nn.js → infoDiagram-5YYISTIA-DUoNiSGC.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CjnoOIja.js → ishikawaDiagram-YF4QCWOH-DJN1y2w8.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-Dlg4DsiO.js → journeyDiagram-JHISSGLW-BxLLMT70.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-BU0XZaSd.js → kanban-definition-UN3LZRKU-BdCPistJ.js} +1 -1
  39. package/dist/client/assets/{line-Bert22-_.js → line-4mIgXsZd.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-BvQSGDmL.js → mermaid-parser.core-Pu1QGWJ-.js} +1 -1
  41. package/dist/client/assets/{mermaid.core--qSAHJRj.js → mermaid.core-DnH9DrgZ.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-BgFIvWWD.js → mindmap-definition-RKZ34NQL-DqE4ba3C.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-DGcbXD0M.js → pieDiagram-4H26LBE5-Crjy9ejf.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-ClkBUeia.js → quadrantDiagram-W4KKPZXB-BUSZ2VB7.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-B8CwGToU.js → requirementDiagram-4Y6WPE33-CBhFKEoV.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DTk3jL6B.js → sankeyDiagram-5OEKKPKP-CgdbY41v.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BQVrcnKf.js → sequenceDiagram-3UESZ5HK-hkp_H7AE.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-DD4yMZPB.js → stateDiagram-AJRCARHV-C6x45RWp.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DVzPjRPN.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-BnCBVqcd.js → timeline-definition-PNZ67QCA-CjnZWttQ.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-BDmLMNXS.js → vennDiagram-CIIHVFJN-DU5ZyYju.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DSLuQiEv.js → wardleyDiagram-YWT4CUSO-CaCEnCB0.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DAq_LA4r.js → xychartDiagram-2RQKCTM6-Ce3xa37U.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +471 -39
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +1256 -214
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/agent.js +228 -71
  60. package/dist/server/lib/agent.js.map +1 -1
  61. package/dist/server/lib/agentRuns.js +205 -38
  62. package/dist/server/lib/agentRuns.js.map +1 -1
  63. package/dist/server/lib/automationProgression.js +464 -0
  64. package/dist/server/lib/automationProgression.js.map +1 -0
  65. package/dist/server/lib/automationReconciliation.js +498 -0
  66. package/dist/server/lib/automationReconciliation.js.map +1 -0
  67. package/dist/server/lib/automationStageDetails.js +232 -0
  68. package/dist/server/lib/automationStageDetails.js.map +1 -0
  69. package/dist/server/lib/buildOpenQuestionOperations.js +223 -0
  70. package/dist/server/lib/buildOpenQuestionOperations.js.map +1 -0
  71. package/dist/server/lib/buildOpenQuestions.js +44 -0
  72. package/dist/server/lib/buildOpenQuestions.js.map +1 -1
  73. package/dist/server/lib/buildSequences.js +130 -46
  74. package/dist/server/lib/buildSequences.js.map +1 -1
  75. package/dist/server/lib/bundleReviewOperations.js +82 -9
  76. package/dist/server/lib/bundleReviewOperations.js.map +1 -1
  77. package/dist/server/lib/chatOperations.js +31 -0
  78. package/dist/server/lib/chatOperations.js.map +1 -1
  79. package/dist/server/lib/executionReconciliation.js +518 -0
  80. package/dist/server/lib/executionReconciliation.js.map +1 -0
  81. package/dist/server/lib/executionRunRetention.js +141 -0
  82. package/dist/server/lib/executionRunRetention.js.map +1 -0
  83. package/dist/server/lib/executionRuns.js +1264 -0
  84. package/dist/server/lib/executionRuns.js.map +1 -0
  85. package/dist/server/lib/git.js +385 -6
  86. package/dist/server/lib/git.js.map +1 -1
  87. package/dist/server/lib/integrations/github.js +43 -0
  88. package/dist/server/lib/integrations/github.js.map +1 -1
  89. package/dist/server/lib/integrations/githubActions.js +1 -0
  90. package/dist/server/lib/integrations/githubActions.js.map +1 -1
  91. package/dist/server/lib/integrations/githubActionsSessions.js +337 -114
  92. package/dist/server/lib/integrations/githubActionsSessions.js.map +1 -1
  93. package/dist/server/lib/projectMemorySelections.js +7 -3
  94. package/dist/server/lib/projectMemorySelections.js.map +1 -1
  95. package/dist/server/lib/shutdown.js +2 -2
  96. package/dist/server/lib/shutdown.js.map +1 -1
  97. package/dist/server/lib/specArtifact.js +3 -0
  98. package/dist/server/lib/specArtifact.js.map +1 -1
  99. package/dist/server/lib/specFormatting.js +1 -1
  100. package/dist/server/lib/specFormatting.js.map +1 -1
  101. package/dist/server/lib/specOperations.js +31 -0
  102. package/dist/server/lib/specOperations.js.map +1 -1
  103. package/dist/server/lib/specReviewContext.js +44 -14
  104. package/dist/server/lib/specReviewContext.js.map +1 -1
  105. package/dist/server/lib/specReviewDraft.js +3 -2
  106. package/dist/server/lib/specReviewDraft.js.map +1 -1
  107. package/dist/server/lib/specReviewOperations.js +44 -7
  108. package/dist/server/lib/specReviewOperations.js.map +1 -1
  109. package/dist/server/lib/specReviewValidation.js +217 -0
  110. package/dist/server/lib/specReviewValidation.js.map +1 -0
  111. package/dist/server/lib/specReviews.js +30 -2
  112. package/dist/server/lib/specReviews.js.map +1 -1
  113. package/dist/server/lib/specs.js +18 -1
  114. package/dist/server/lib/specs.js.map +1 -1
  115. package/dist/server/lib/stageSnapshots.js +197 -0
  116. package/dist/server/lib/stageSnapshots.js.map +1 -0
  117. package/dist/server/lib/testSessions.js +164 -19
  118. package/dist/server/lib/testSessions.js.map +1 -1
  119. package/dist/server/lib/ticketAutomation.js +80 -4
  120. package/dist/server/lib/ticketAutomation.js.map +1 -1
  121. package/dist/server/lib/ticketAutomationCommit.js +466 -91
  122. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  123. package/dist/server/lib/ticketFollowUpOperations.js +214 -20
  124. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  125. package/dist/server/lib/ticketRunOperations.js +51 -6
  126. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  127. package/dist/server/lib/ticketUndo.js +77 -168
  128. package/dist/server/lib/ticketUndo.js.map +1 -1
  129. package/dist/server/lib/ticketWorkflowOperations.js +132 -28
  130. package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
  131. package/dist/server/lib/tickets.js +41 -27
  132. package/dist/server/lib/tickets.js.map +1 -1
  133. package/dist/server/lib/transcriptRuns.js +3 -3
  134. package/dist/server/lib/transcriptRuns.js.map +1 -1
  135. package/dist/server/lib/turnExecutionErrors.js +12 -0
  136. package/dist/server/lib/turnExecutionErrors.js.map +1 -0
  137. package/dist/server/lib/types.js +57 -1
  138. package/dist/server/lib/types.js.map +1 -1
  139. package/dist/server/workers/build.js +596 -184
  140. package/dist/server/workers/build.js.map +1 -1
  141. package/dist/server/workers/chat.js +261 -130
  142. package/dist/server/workers/chat.js.map +1 -1
  143. package/dist/server/workers/followUp.js +716 -203
  144. package/dist/server/workers/followUp.js.map +1 -1
  145. package/dist/server/workers/plan.js +527 -188
  146. package/dist/server/workers/plan.js.map +1 -1
  147. package/dist/server/workers/planFollowUp.js +231 -69
  148. package/dist/server/workers/planFollowUp.js.map +1 -1
  149. package/dist/server/workers/review.js +790 -297
  150. package/dist/server/workers/review.js.map +1 -1
  151. package/dist/server/workers/specReview.js +211 -45
  152. package/dist/server/workers/specReview.js.map +1 -1
  153. package/dist/server/workers/specSession.js +425 -252
  154. package/dist/server/workers/specSession.js.map +1 -1
  155. package/package.json +1 -1
  156. package/dist/client/assets/GitHubActionsDialog-DAD5REmY.js +0 -1
  157. package/dist/client/assets/TestsDialog-B5NVrroq.js +0 -4
  158. package/dist/client/assets/TicketChangesModal-By-_gTGd.js +0 -1
  159. package/dist/client/assets/channel-Dd5Len0X.js +0 -1
  160. package/dist/client/assets/classDiagram-4FO5ZUOK-B7KUg6r8.js +0 -1
  161. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CQm-z5c4.js +0 -1
  162. package/dist/client/assets/index-BHq6-Eir.js +0 -270
  163. package/dist/client/assets/index-BxTc5qQT.css +0 -2
  164. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C8yO6POT.js +0 -1
@@ -0,0 +1,518 @@
1
+ import db from '../db.js';
2
+ import { terminalizeAgentRunsForExecutionRun, terminalizeLegacyAgentRuns } from './agentRuns.js';
3
+ import { recoverInterruptedBuildOpenQuestionBatch } from './buildOpenQuestions.js';
4
+ import { reconcileActiveBuildSequences } from './buildSequences.js';
5
+ import { reconcileInterruptedTestRuns, withExecutionRunTransaction } from './executionRuns.js';
6
+ import { reconcileGitHubActionsRuns } from './integrations/githubActionsSessions.js';
7
+ import { reconcileInterruptedSpecReviewRuns } from './specReviews.js';
8
+ import { getWaitingOpenQuestionProgression, resolveProgressionForChild, waitAutomationProgression, } from './automationProgression.js';
9
+ import { getBundleAutomationState } from './ticketAutomation.js';
10
+ import { reconcileAutomationExecutions } from './automationReconciliation.js';
11
+ const ACTIVE_EXECUTION_STATUSES = "('queued', 'running', 'waiting')";
12
+ const RESTART_FAILURE_MESSAGE = 'Interrupted by server restart';
13
+ const directWorkflowPolicies = [
14
+ {
15
+ kind: 'build',
16
+ eventType: 'build_interrupted',
17
+ failureMessage: 'The server restarted while this Build run was active.',
18
+ domainParent: { sourceKind: 'ticket', table: 'tickets' },
19
+ },
20
+ {
21
+ kind: 'review',
22
+ eventType: 'review_interrupted',
23
+ failureMessage: 'The server restarted while this Review run was active.',
24
+ domainParent: { sourceKind: 'ticket', table: 'tickets' },
25
+ },
26
+ {
27
+ kind: 'build_follow_up',
28
+ eventType: 'build_follow_up_interrupted',
29
+ failureMessage: 'The server restarted while this Build follow-up was active.',
30
+ domainParent: { sourceKind: 'ticket', table: 'tickets' },
31
+ },
32
+ {
33
+ kind: 'plan',
34
+ eventType: 'plan_interrupted',
35
+ failureMessage: 'The server restarted while this Plan run was active.',
36
+ domainParent: { sourceKind: 'ticket', table: 'tickets' },
37
+ },
38
+ {
39
+ kind: 'plan_follow_up',
40
+ eventType: 'plan_follow_up_interrupted',
41
+ failureMessage: 'The server restarted while this Plan follow-up was active.',
42
+ domainParent: { sourceKind: 'ticket', table: 'tickets' },
43
+ },
44
+ {
45
+ kind: 'planning_agent',
46
+ eventType: 'planning_agent_interrupted',
47
+ failureMessage: 'The server restarted while this planning-agent run was active.',
48
+ },
49
+ {
50
+ kind: 'chat_turn',
51
+ eventType: 'chat_turn_interrupted',
52
+ failureMessage: 'The server restarted while this Chat turn was active.',
53
+ domainParent: { sourceKind: 'chat_session', table: 'chat_sessions' },
54
+ },
55
+ {
56
+ kind: 'spec_turn',
57
+ eventType: 'spec_turn_interrupted',
58
+ failureMessage: 'The server restarted while this Spec turn was active.',
59
+ domainParent: { sourceKind: 'spec_session', table: 'spec_sessions' },
60
+ },
61
+ ];
62
+ const getBuildOpenQuestionBatchId = (metadataJson) => {
63
+ if (!metadataJson) {
64
+ return null;
65
+ }
66
+ try {
67
+ const metadata = JSON.parse(metadataJson);
68
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
69
+ return null;
70
+ }
71
+ const batchId = metadata.build_open_question_batch_id;
72
+ return typeof batchId === 'string' && batchId.length > 0 ? batchId : null;
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ };
78
+ const ownsBuildOpenQuestionBatch = (run, batch) => {
79
+ if (run.project_id !== batch.project_id || run.source_kind !== 'ticket' || !run.source_id || run.initiated_by !== 'user') {
80
+ return false;
81
+ }
82
+ const ownership = db.prepare(`
83
+ SELECT 1
84
+ FROM tickets
85
+ WHERE tickets.id = ?
86
+ AND tickets.project_id = ?
87
+ AND tickets.worktree_bundle_id = ?
88
+ AND EXISTS (
89
+ SELECT 1 FROM execution_run_links
90
+ WHERE execution_run_id = ? AND project_id = ?
91
+ AND entity_type = 'ticket' AND entity_id = tickets.id AND relationship = 'primary'
92
+ )
93
+ AND EXISTS (
94
+ SELECT 1 FROM execution_run_links
95
+ WHERE execution_run_id = ? AND project_id = ?
96
+ AND entity_type = 'bundle' AND entity_id = ? AND relationship = 'context'
97
+ )
98
+ AND EXISTS (
99
+ SELECT 1
100
+ FROM execution_run_links trigger_link
101
+ JOIN ticket_messages trigger_message ON trigger_message.id = trigger_link.entity_id
102
+ WHERE trigger_link.execution_run_id = ? AND trigger_link.project_id = ?
103
+ AND trigger_link.entity_type = 'ticket_message' AND trigger_link.relationship = 'trigger'
104
+ AND trigger_message.ticket_id = tickets.id
105
+ )
106
+ `).get(run.source_id, batch.project_id, batch.worktree_bundle_id, run.id, batch.project_id, run.id, batch.project_id, batch.worktree_bundle_id, run.id, batch.project_id);
107
+ return Boolean(ownership);
108
+ };
109
+ const interruptBuildOpenQuestionRun = (transaction, run) => {
110
+ transaction.transitionExecutionRun({
111
+ projectId: run.project_id,
112
+ runId: run.id,
113
+ status: 'interrupted',
114
+ domainStatus: 'interrupted',
115
+ failure: {
116
+ code: 'server_restarted',
117
+ message: 'The server restarted while this Build open question follow-up was active.',
118
+ },
119
+ eventType: 'build_follow_up_interrupted',
120
+ eventMessage: 'The server restarted while this Build open question follow-up was active.',
121
+ });
122
+ const terminalized = terminalizeAgentRunsForExecutionRun(run.id, 'error', RESTART_FAILURE_MESSAGE);
123
+ const errored = run.source_kind === 'ticket' && run.source_id
124
+ ? db.prepare(`
125
+ UPDATE tickets SET agent_status = 'error'
126
+ WHERE id = ? AND project_id = ? AND agent_status = 'running'
127
+ `).run(run.source_id, run.project_id).changes
128
+ : 0;
129
+ return { terminalized, errored };
130
+ };
131
+ const reconcileBuildOpenQuestionBatches = () => {
132
+ const batches = db.prepare(`
133
+ SELECT id, project_id, worktree_bundle_id
134
+ FROM build_open_question_batches
135
+ WHERE status IN ('pending', 'running')
136
+ ORDER BY created_at ASC, id ASC
137
+ `).all();
138
+ const runs = db.prepare(`
139
+ SELECT id, project_id, source_kind, source_id, metadata_json, initiated_by
140
+ FROM execution_runs
141
+ WHERE kind = 'build_follow_up' AND status IN ${ACTIVE_EXECUTION_STATUSES}
142
+ ORDER BY created_at ASC, id ASC
143
+ `).all();
144
+ let adoptedInterrupted = 0;
145
+ let legacyRecovered = 0;
146
+ let childRowsTerminalized = 0;
147
+ let ticketsErrored = 0;
148
+ let questionsReopened = 0;
149
+ let automationPaused = 0;
150
+ let inconsistentBatchesRecovered = 0;
151
+ const createLegacyRecoveryProgression = (batch) => {
152
+ const state = getBundleAutomationState(batch.project_id, batch.worktree_bundle_id);
153
+ if (!state?.automation_progression_run_id
154
+ && !state?.automation_pause_reason_code
155
+ && (!state?.automation_paused_reason || state.automation_paused_code === 'open_questions')) {
156
+ return getWaitingOpenQuestionProgression({
157
+ projectId: batch.project_id,
158
+ bundleId: batch.worktree_bundle_id,
159
+ });
160
+ }
161
+ return null;
162
+ };
163
+ for (const batch of batches) {
164
+ const referencedRuns = runs.filter(run => getBuildOpenQuestionBatchId(run.metadata_json) === batch.id);
165
+ const ownedRuns = referencedRuns.filter(run => {
166
+ if (!ownsBuildOpenQuestionBatch(run, batch)) {
167
+ return false;
168
+ }
169
+ try {
170
+ resolveProgressionForChild({
171
+ projectId: batch.project_id,
172
+ bundleId: batch.worktree_bundle_id,
173
+ childRunId: run.id,
174
+ });
175
+ return true;
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ });
181
+ if (referencedRuns.length > 0 && (referencedRuns.length !== 1 || ownedRuns.length !== 1)) {
182
+ createLegacyRecoveryProgression(batch);
183
+ const recovered = withExecutionRunTransaction(transaction => {
184
+ let terminalized = 0;
185
+ let errored = 0;
186
+ for (const referencedRun of referencedRuns) {
187
+ const interrupted = interruptBuildOpenQuestionRun(transaction, referencedRun);
188
+ terminalized += interrupted.terminalized;
189
+ errored += interrupted.errored;
190
+ }
191
+ return {
192
+ terminalized,
193
+ errored,
194
+ batchRecovery: recoverInterruptedBuildOpenQuestionBatch(batch.id),
195
+ };
196
+ });
197
+ inconsistentBatchesRecovered += recovered.batchRecovery.batch_recovered;
198
+ childRowsTerminalized += recovered.terminalized;
199
+ ticketsErrored += recovered.errored;
200
+ questionsReopened += recovered.batchRecovery.questions_reopened;
201
+ automationPaused += recovered.batchRecovery.automation_paused;
202
+ continue;
203
+ }
204
+ const [ownedRun] = ownedRuns;
205
+ if (ownedRun) {
206
+ const progression = resolveProgressionForChild({
207
+ projectId: batch.project_id,
208
+ bundleId: batch.worktree_bundle_id,
209
+ childRunId: ownedRun.id,
210
+ });
211
+ const recovered = withExecutionRunTransaction(transaction => {
212
+ const interrupted = interruptBuildOpenQuestionRun(transaction, ownedRun);
213
+ const batchRecovery = recoverInterruptedBuildOpenQuestionBatch(batch.id);
214
+ waitAutomationProgression({
215
+ projectId: batch.project_id,
216
+ bundleId: batch.worktree_bundle_id,
217
+ progressionRunId: progression.id,
218
+ pauseCode: 'open_questions',
219
+ pauseReason: 'Build open question follow-up was interrupted by a server restart',
220
+ reasonCode: 'server_restart',
221
+ pausedStageRunId: ownedRun.id,
222
+ });
223
+ return { ...interrupted, batchRecovery };
224
+ });
225
+ adoptedInterrupted += recovered.batchRecovery.batch_recovered;
226
+ childRowsTerminalized += recovered.terminalized;
227
+ ticketsErrored += recovered.errored;
228
+ questionsReopened += recovered.batchRecovery.questions_reopened;
229
+ automationPaused += recovered.batchRecovery.automation_paused;
230
+ continue;
231
+ }
232
+ createLegacyRecoveryProgression(batch);
233
+ const recovered = db.transaction(() => recoverInterruptedBuildOpenQuestionBatch(batch.id))();
234
+ legacyRecovered += recovered.batch_recovered;
235
+ questionsReopened += recovered.questions_reopened;
236
+ automationPaused += recovered.automation_paused;
237
+ }
238
+ return {
239
+ adopted_interrupted: adoptedInterrupted,
240
+ legacy_recovered: legacyRecovered,
241
+ child_rows_terminalized: childRowsTerminalized,
242
+ tickets_errored: ticketsErrored,
243
+ questions_reopened: questionsReopened,
244
+ automation_paused: automationPaused,
245
+ inconsistent_batches_recovered: inconsistentBatchesRecovered,
246
+ };
247
+ };
248
+ const interruptSequenceBuild = (input) => {
249
+ const rows = db.prepare(`
250
+ SELECT execution_runs.id, execution_runs.project_id
251
+ FROM execution_runs
252
+ INNER JOIN execution_run_links sequence_link
253
+ ON sequence_link.execution_run_id = execution_runs.id
254
+ AND sequence_link.project_id = execution_runs.project_id
255
+ AND sequence_link.entity_type = 'build_sequence'
256
+ AND sequence_link.entity_id = ?
257
+ AND sequence_link.relationship = 'context'
258
+ INNER JOIN execution_run_links ticket_link
259
+ ON ticket_link.execution_run_id = execution_runs.id
260
+ AND ticket_link.project_id = execution_runs.project_id
261
+ AND ticket_link.entity_type = 'ticket'
262
+ AND ticket_link.entity_id = ?
263
+ AND ticket_link.relationship = 'primary'
264
+ WHERE execution_runs.project_id = ?
265
+ AND execution_runs.kind = 'build'
266
+ AND execution_runs.status IN ${ACTIVE_EXECUTION_STATUSES}
267
+ `).all(input.sequenceId, input.ticketId, input.projectId);
268
+ if (rows.length > 1) {
269
+ return false;
270
+ }
271
+ if (rows.length === 0) {
272
+ db.prepare(`
273
+ UPDATE tickets SET agent_status = 'error'
274
+ WHERE id = ? AND project_id = ? AND (agent_status = 'running' OR agent_status IS NULL)
275
+ `).run(input.ticketId, input.projectId);
276
+ return true;
277
+ }
278
+ const [run] = rows;
279
+ withExecutionRunTransaction(transaction => {
280
+ transaction.transitionExecutionRun({
281
+ projectId: run.project_id,
282
+ runId: run.id,
283
+ status: 'interrupted',
284
+ domainStatus: 'interrupted',
285
+ failure: { code: 'server_restarted', message: 'The server restarted while this sequenced Build run was active.' },
286
+ eventType: 'build_interrupted',
287
+ eventMessage: 'The server restarted while this sequenced Build run was active.',
288
+ });
289
+ terminalizeAgentRunsForExecutionRun(run.id, 'error', RESTART_FAILURE_MESSAGE);
290
+ db.prepare(`
291
+ UPDATE tickets SET agent_status = 'error'
292
+ WHERE id = ? AND project_id = ? AND (agent_status = 'running' OR agent_status IS NULL)
293
+ `).run(input.ticketId, input.projectId);
294
+ });
295
+ return true;
296
+ };
297
+ const reconcileSpecReviews = () => {
298
+ const rows = db.prepare(`
299
+ SELECT id, project_id
300
+ FROM execution_runs
301
+ WHERE kind = 'spec_review' AND status IN ${ACTIVE_EXECUTION_STATUSES}
302
+ ORDER BY created_at ASC, id ASC
303
+ `).all();
304
+ let childRowsTerminalized = 0;
305
+ let domainRunsErrored = 0;
306
+ for (const row of rows) {
307
+ withExecutionRunTransaction(transaction => {
308
+ domainRunsErrored += db.prepare(`
309
+ UPDATE spec_review_runs
310
+ SET agent_status = 'error',
311
+ response_text = COALESCE(response_text, ?),
312
+ streaming_response = NULL,
313
+ completed_at = CURRENT_TIMESTAMP
314
+ WHERE agent_status = 'running'
315
+ AND id IN (
316
+ SELECT entity_id
317
+ FROM execution_run_links
318
+ WHERE execution_run_id = ?
319
+ AND entity_type = 'spec_review_run'
320
+ AND relationship = 'result'
321
+ )
322
+ `).run(RESTART_FAILURE_MESSAGE, row.id).changes;
323
+ childRowsTerminalized += terminalizeAgentRunsForExecutionRun(row.id, 'error', RESTART_FAILURE_MESSAGE);
324
+ transaction.transitionExecutionRun({
325
+ projectId: row.project_id,
326
+ runId: row.id,
327
+ status: 'interrupted',
328
+ domainStatus: 'error',
329
+ failure: { code: 'server_restarted', message: 'The server restarted while this Spec Review was active.' },
330
+ eventType: 'spec_review_interrupted',
331
+ eventMessage: 'The server restarted while this Spec Review was active.',
332
+ });
333
+ });
334
+ }
335
+ const legacyRunsErrored = reconcileInterruptedSpecReviewRuns();
336
+ return {
337
+ interrupted: rows.length,
338
+ child_rows_terminalized: childRowsTerminalized,
339
+ domain_runs_errored: domainRunsErrored,
340
+ legacy_runs_errored: legacyRunsErrored,
341
+ };
342
+ };
343
+ const reconcileDirectWorkflow = (policy) => {
344
+ const rows = db.prepare(`
345
+ SELECT id, project_id, source_kind, source_id
346
+ FROM execution_runs
347
+ WHERE kind = ? AND status IN ${ACTIVE_EXECUTION_STATUSES}
348
+ AND NOT EXISTS (
349
+ SELECT 1 FROM execution_runs parent
350
+ WHERE parent.id = execution_runs.parent_run_id
351
+ AND parent.project_id = execution_runs.project_id
352
+ AND parent.kind IN ('automation_progression', 'automation_review_fix')
353
+ )
354
+ ORDER BY created_at ASC, id ASC
355
+ `).all(policy.kind);
356
+ let childRowsTerminalized = 0;
357
+ let domainParentsErrored = 0;
358
+ const interruptRun = (row) => {
359
+ withExecutionRunTransaction(transaction => {
360
+ transaction.transitionExecutionRun({
361
+ projectId: row.project_id,
362
+ runId: row.id,
363
+ status: 'interrupted',
364
+ domainStatus: 'interrupted',
365
+ failure: {
366
+ code: 'server_restarted',
367
+ message: policy.failureMessage,
368
+ },
369
+ eventType: policy.eventType,
370
+ eventMessage: policy.failureMessage,
371
+ });
372
+ childRowsTerminalized += terminalizeAgentRunsForExecutionRun(row.id, 'error', RESTART_FAILURE_MESSAGE);
373
+ if (policy.domainParent && row.source_kind === policy.domainParent.sourceKind && row.source_id) {
374
+ const parentStatusCondition = policy.kind === 'review' || policy.kind === 'build'
375
+ ? "(agent_status = 'running' OR agent_status IS NULL)"
376
+ : "agent_status = 'running'";
377
+ domainParentsErrored += db.prepare(`
378
+ UPDATE ${policy.domainParent.table}
379
+ SET agent_status = 'error'
380
+ WHERE id = ? AND project_id = ? AND ${parentStatusCondition}
381
+ `).run(row.source_id, row.project_id).changes;
382
+ }
383
+ });
384
+ };
385
+ for (const row of rows) {
386
+ interruptRun(row);
387
+ }
388
+ if (policy.domainParent) {
389
+ domainParentsErrored += db.prepare(`
390
+ UPDATE ${policy.domainParent.table}
391
+ SET agent_status = 'error'
392
+ WHERE agent_status = 'running'
393
+ AND NOT EXISTS (
394
+ SELECT 1
395
+ FROM execution_run_links owner_link
396
+ JOIN execution_runs owner_run ON owner_run.id = owner_link.execution_run_id
397
+ WHERE owner_link.project_id = ${policy.domainParent.table}.project_id
398
+ AND owner_link.entity_type = ?
399
+ AND owner_link.entity_id = ${policy.domainParent.table}.id
400
+ AND owner_link.relationship = 'primary'
401
+ AND owner_run.status IN ${ACTIVE_EXECUTION_STATUSES}
402
+ )
403
+ `).run(policy.domainParent.sourceKind).changes;
404
+ }
405
+ return {
406
+ interrupted: rows.length,
407
+ child_rows_terminalized: childRowsTerminalized,
408
+ domain_parents_errored: domainParentsErrored,
409
+ };
410
+ };
411
+ export const createExecutionReconciliationPolicies = (input) => [
412
+ {
413
+ key: 'automation',
414
+ workLocality: 'durable_orchestration',
415
+ startupStrategy: 'reconcile',
416
+ terminalStatus: null,
417
+ failureCode: null,
418
+ updatesDomainRecords: true,
419
+ pausesAutomation: true,
420
+ reconcile: reconcileAutomationExecutions,
421
+ },
422
+ {
423
+ key: 'test',
424
+ workLocality: 'local_process',
425
+ startupStrategy: 'interrupt',
426
+ terminalStatus: 'interrupted',
427
+ failureCode: 'server_restarted',
428
+ updatesDomainRecords: false,
429
+ pausesAutomation: false,
430
+ reconcile: () => ({ interrupted: reconcileInterruptedTestRuns() }),
431
+ },
432
+ {
433
+ key: 'build_sequence',
434
+ workLocality: 'durable_orchestration',
435
+ startupStrategy: 'reconcile',
436
+ terminalStatus: 'interrupted',
437
+ failureCode: 'server_restarted',
438
+ updatesDomainRecords: true,
439
+ pausesAutomation: false,
440
+ reconcile: () => reconcileActiveBuildSequences({ interruptActiveChild: interruptSequenceBuild }),
441
+ },
442
+ {
443
+ key: 'build_open_question_batch',
444
+ workLocality: 'durable_orchestration',
445
+ startupStrategy: 'reconcile',
446
+ terminalStatus: 'interrupted',
447
+ failureCode: 'server_restarted',
448
+ updatesDomainRecords: true,
449
+ pausesAutomation: true,
450
+ reconcile: reconcileBuildOpenQuestionBatches,
451
+ },
452
+ ...directWorkflowPolicies.map(policy => ({
453
+ key: policy.kind,
454
+ workLocality: 'local_process',
455
+ startupStrategy: 'interrupt',
456
+ terminalStatus: 'interrupted',
457
+ failureCode: 'server_restarted',
458
+ updatesDomainRecords: Boolean(policy.domainParent),
459
+ pausesAutomation: false,
460
+ reconcile: () => reconcileDirectWorkflow(policy),
461
+ })),
462
+ {
463
+ key: 'spec_review',
464
+ workLocality: 'local_process',
465
+ startupStrategy: 'interrupt',
466
+ terminalStatus: 'interrupted',
467
+ failureCode: 'server_restarted',
468
+ updatesDomainRecords: true,
469
+ pausesAutomation: false,
470
+ reconcile: reconcileSpecReviews,
471
+ },
472
+ {
473
+ key: 'github_actions',
474
+ workLocality: 'externally_observable',
475
+ startupStrategy: 'reconcile',
476
+ terminalStatus: null,
477
+ failureCode: null,
478
+ updatesDomainRecords: false,
479
+ pausesAutomation: false,
480
+ reconcile: () => reconcileGitHubActionsRuns({
481
+ getConfig: input.getGitHubConfig,
482
+ startPolling: false,
483
+ }),
484
+ },
485
+ ];
486
+ export const reconcileStartupExecutions = async (input) => {
487
+ const policies = input.policies ?? createExecutionReconciliationPolicies(input);
488
+ const summary = {};
489
+ const failures = [];
490
+ const policyKeys = new Set();
491
+ for (const policy of policies) {
492
+ if (policyKeys.has(policy.key)) {
493
+ throw new Error(`Duplicate startup reconciliation policy key: ${policy.key}`);
494
+ }
495
+ policyKeys.add(policy.key);
496
+ }
497
+ const legacyRowsTerminalized = terminalizeLegacyAgentRuns('error', RESTART_FAILURE_MESSAGE);
498
+ summary.legacy_agent_runs = { terminalized: legacyRowsTerminalized };
499
+ for (const policy of policies) {
500
+ try {
501
+ summary[policy.key] = await policy.reconcile();
502
+ }
503
+ catch (error) {
504
+ const failure = error instanceof Error ? error : new Error(String(error));
505
+ summary[policy.key] = { policy_failed: 1 };
506
+ failures.push(new Error(`${policy.key}: ${failure.message}`, { cause: failure }));
507
+ }
508
+ }
509
+ console.info('[execution-reconciliation] Startup reconciliation summary', {
510
+ policies: policies.map(({ reconcile: _reconcile, ...policy }) => policy),
511
+ outcomes: summary,
512
+ });
513
+ if (failures.length > 0) {
514
+ throw new AggregateError(failures, `Startup execution reconciliation failed for ${failures.length} policy/policies`);
515
+ }
516
+ return summary;
517
+ };
518
+ //# sourceMappingURL=executionReconciliation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionReconciliation.js","sourceRoot":"","sources":["../../../server/lib/executionReconciliation.ts"],"names":[],"mappings":"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"}