@straiffi/archon 1.8.8 → 1.8.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 (176) hide show
  1. package/dist/client/assets/{ActivityView--4X_m6mR.js → ActivityView-gBeoYQdD.js} +1 -1
  2. package/dist/client/assets/{GitHubActionsDialog-DZ1lHM01.js → GitHubActionsDialog-fc1Vwafm.js} +1 -1
  3. package/dist/client/assets/RepositoryGraphDialog-DCOjwUR3.js +1 -0
  4. package/dist/client/assets/VerificationDialog-CIObj1Rw.js +4 -0
  5. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CY5xTOZJ.js → architectureDiagram-3BPJPVTR-B1tJZe1S.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-GPEHLZMM-DkMi7gMh.js → blockDiagram-GPEHLZMM-D_90AQ2Z.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AAUBKEIU-ZZxXBBU4.js → c4Diagram-AAUBKEIU-DSyJfqly.js} +1 -1
  8. package/dist/client/assets/channel-DFw1f2Rh.js +1 -0
  9. package/dist/client/assets/{chunk-2J33WTMH-C9PiKMs-.js → chunk-2J33WTMH-B9RStQGj.js} +1 -1
  10. package/dist/client/assets/{chunk-3OPIFGDE-B81aUmvi.js → chunk-3OPIFGDE-CHKuJYq0.js} +1 -1
  11. package/dist/client/assets/{chunk-5ZQYHXKU-Bk2Owm90.js → chunk-5ZQYHXKU-Cznw7LTJ.js} +1 -1
  12. package/dist/client/assets/{chunk-727SXJPM-Bx-79aJk.js → chunk-727SXJPM-ix6OeZwJ.js} +1 -1
  13. package/dist/client/assets/{chunk-AQP2D5EJ-GQNXYOf0.js → chunk-AQP2D5EJ-DrPJIcE7.js} +1 -1
  14. package/dist/client/assets/{chunk-CSCIHK7Q-BV22j6vn.js → chunk-CSCIHK7Q-BSEHTnBR.js} +1 -1
  15. package/dist/client/assets/{chunk-KSCS5N6A-C9LlcbWv.js → chunk-KSCS5N6A-MdDdaLn8.js} +1 -1
  16. package/dist/client/assets/{chunk-L5ZTLDWV-D8PJqJnh.js → chunk-L5ZTLDWV-D_5xeDG1.js} +1 -1
  17. package/dist/client/assets/{chunk-LZXEDZCA-DcbPPozR.js → chunk-LZXEDZCA-Bz8_Fyt2.js} +2 -2
  18. package/dist/client/assets/{chunk-ND2GUHAM-NV-_2KqZ.js → chunk-ND2GUHAM-DCINKlk8.js} +1 -1
  19. package/dist/client/assets/{chunk-NZK2D7GU-CbqA26gb.js → chunk-NZK2D7GU-rGPgryKx.js} +1 -1
  20. package/dist/client/assets/{chunk-O5CBEL6O-B0DMN44B.js → chunk-O5CBEL6O-BHB8UIYA.js} +1 -1
  21. package/dist/client/assets/{chunk-WU5MYG2G-CYpcnwf9.js → chunk-WU5MYG2G-Bz5BJWjF.js} +1 -1
  22. package/dist/client/assets/classDiagram-4FO5ZUOK-Dt0kmMzQ.js +1 -0
  23. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BuxhA4Gw.js +1 -0
  24. package/dist/client/assets/{dagre-BM42HDAG-B5HD9fyK.js → dagre-BM42HDAG-B4TXLkOG.js} +1 -1
  25. package/dist/client/assets/{diagram-2AECGRRQ-BCXvWFpM.js → diagram-2AECGRRQ-CxMup1wq.js} +1 -1
  26. package/dist/client/assets/{diagram-5GNKFQAL-CSpWGfAO.js → diagram-5GNKFQAL-CTfP_wnS.js} +1 -1
  27. package/dist/client/assets/{diagram-KO2AKTUF-CFECGppT.js → diagram-KO2AKTUF-31NKNt4r.js} +1 -1
  28. package/dist/client/assets/{diagram-LMA3HP47-Dpb99QbZ.js → diagram-LMA3HP47-Cxo7yvjc.js} +1 -1
  29. package/dist/client/assets/{diagram-OG6HWLK6-DJcTGnx0.js → diagram-OG6HWLK6-ChgSAMLv.js} +1 -1
  30. package/dist/client/assets/{erDiagram-TEJ5UH35-jWArJxNU.js → erDiagram-TEJ5UH35-u6msywL_.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-I6XJVG4X-DDF3P1hY.js → flowDiagram-I6XJVG4X-CimeXkDN.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-6RSMTGT7-Corwr_18.js → ganttDiagram-6RSMTGT7-DOu5sDUI.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-WzlpszWn.js → gitGraphDiagram-PVQCEYII-zIToibUf.js} +1 -1
  34. package/dist/client/assets/index-C-VHd0Pr.js +274 -0
  35. package/dist/client/assets/index-D3xlEyeM.css +2 -0
  36. package/dist/client/assets/{infoDiagram-5YYISTIA-C0VwTwNC.js → infoDiagram-5YYISTIA-CAtWGGJI.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-m9l3k2qX.js → ishikawaDiagram-YF4QCWOH-7N-C7DEt.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-JHISSGLW-DMhT8HTW.js → journeyDiagram-JHISSGLW-D7VUypFG.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-UN3LZRKU-C2ZkcOi0.js → kanban-definition-UN3LZRKU-AmbDmzSD.js} +1 -1
  40. package/dist/client/assets/{line-gKkUdUWR.js → line-qf4UZ8vh.js} +1 -1
  41. package/dist/client/assets/{mermaid-parser.core-DdBfJWbP.js → mermaid-parser.core-BssCd1kF.js} +1 -1
  42. package/dist/client/assets/{mermaid.core-DXnhq-eu.js → mermaid.core-DzeMqg9Y.js} +3 -3
  43. package/dist/client/assets/{mindmap-definition-RKZ34NQL-B0gX4aJy.js → mindmap-definition-RKZ34NQL-dEnNQcDm.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-4H26LBE5-BHYdLmpx.js → pieDiagram-4H26LBE5-VjMue0a-.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-C-H-yQwU.js → quadrantDiagram-W4KKPZXB-DQFdm-0f.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DY_pSCFy.js → requirementDiagram-4Y6WPE33-CHIaXlsy.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CC61HRGf.js → sankeyDiagram-5OEKKPKP-D-kzGaKb.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B8fXWNxw.js → sequenceDiagram-3UESZ5HK-CiDmlD8k.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-AJRCARHV-C_VYKsXW.js → stateDiagram-AJRCARHV-BKlnnFdT.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DhJxc4em.js +1 -0
  51. package/dist/client/assets/{timeline-definition-PNZ67QCA-0fB4PIIX.js → timeline-definition-PNZ67QCA-D-BK07Un.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-CIIHVFJN-CfpVF7Aa.js → vennDiagram-CIIHVFJN-CB9_GqSx.js} +1 -1
  53. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CgdK4FcC.js → wardleyDiagram-YWT4CUSO-BEuNfyLT.js} +1 -1
  54. package/dist/client/assets/{xychartDiagram-2RQKCTM6-BEfatQYR.js → xychartDiagram-2RQKCTM6-CSS5WMrZ.js} +1 -1
  55. package/dist/client/index.html +2 -2
  56. package/dist/server/db.js +481 -27
  57. package/dist/server/db.js.map +1 -1
  58. package/dist/server/index.js +72 -18
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/lib/activeAutomationChild.js +1 -0
  61. package/dist/server/lib/activeAutomationChild.js.map +1 -1
  62. package/dist/server/lib/agent.js +127 -15
  63. package/dist/server/lib/agent.js.map +1 -1
  64. package/dist/server/lib/agentRuns.js +12 -0
  65. package/dist/server/lib/agentRuns.js.map +1 -1
  66. package/dist/server/lib/agentSpawnPermits.js +37 -0
  67. package/dist/server/lib/agentSpawnPermits.js.map +1 -0
  68. package/dist/server/lib/automationCheckGate.js +9 -1
  69. package/dist/server/lib/automationCheckGate.js.map +1 -1
  70. package/dist/server/lib/automationProgression.js +19 -5
  71. package/dist/server/lib/automationProgression.js.map +1 -1
  72. package/dist/server/lib/automationReviewGate.js +1 -0
  73. package/dist/server/lib/automationReviewGate.js.map +1 -1
  74. package/dist/server/lib/buildCompletionContinuation.js +144 -4
  75. package/dist/server/lib/buildCompletionContinuation.js.map +1 -1
  76. package/dist/server/lib/buildSequences.js +13 -1
  77. package/dist/server/lib/buildSequences.js.map +1 -1
  78. package/dist/server/lib/bundleActivity.js +19 -0
  79. package/dist/server/lib/bundleActivity.js.map +1 -1
  80. package/dist/server/lib/chatOperations.js +81 -2
  81. package/dist/server/lib/chatOperations.js.map +1 -1
  82. package/dist/server/lib/checkAutoFix.js +604 -0
  83. package/dist/server/lib/checkAutoFix.js.map +1 -0
  84. package/dist/server/lib/checkAutoFixDetails.js +83 -0
  85. package/dist/server/lib/checkAutoFixDetails.js.map +1 -0
  86. package/dist/server/lib/checkAutoFixPolicy.js +59 -0
  87. package/dist/server/lib/checkAutoFixPolicy.js.map +1 -0
  88. package/dist/server/lib/checkRepair.js +149 -54
  89. package/dist/server/lib/checkRepair.js.map +1 -1
  90. package/dist/server/lib/checkRepairDispatch.js +91 -0
  91. package/dist/server/lib/checkRepairDispatch.js.map +1 -0
  92. package/dist/server/lib/checkRepairEvidence.js +84 -0
  93. package/dist/server/lib/checkRepairEvidence.js.map +1 -0
  94. package/dist/server/lib/checkRepairParent.js +21 -0
  95. package/dist/server/lib/checkRepairParent.js.map +1 -0
  96. package/dist/server/lib/checkRepairReconciliation.js +14 -5
  97. package/dist/server/lib/checkRepairReconciliation.js.map +1 -1
  98. package/dist/server/lib/checkRunner.js +27 -8
  99. package/dist/server/lib/checkRunner.js.map +1 -1
  100. package/dist/server/lib/checkRuns.js +63 -4
  101. package/dist/server/lib/checkRuns.js.map +1 -1
  102. package/dist/server/lib/executionReconciliation.js +387 -8
  103. package/dist/server/lib/executionReconciliation.js.map +1 -1
  104. package/dist/server/lib/executionRuns.js +24 -1
  105. package/dist/server/lib/executionRuns.js.map +1 -1
  106. package/dist/server/lib/integrations/github.js +10 -7
  107. package/dist/server/lib/integrations/github.js.map +1 -1
  108. package/dist/server/lib/postBuildCheckRuns.js +200 -5
  109. package/dist/server/lib/postBuildCheckRuns.js.map +1 -1
  110. package/dist/server/lib/postBuildChecks.js +83 -13
  111. package/dist/server/lib/postBuildChecks.js.map +1 -1
  112. package/dist/server/lib/projects.js +25 -1
  113. package/dist/server/lib/projects.js.map +1 -1
  114. package/dist/server/lib/queue.js +9 -3
  115. package/dist/server/lib/queue.js.map +1 -1
  116. package/dist/server/lib/repositoryGraphQueries.js +5 -3
  117. package/dist/server/lib/repositoryGraphQueries.js.map +1 -1
  118. package/dist/server/lib/repositoryGraphScan.js +13 -2
  119. package/dist/server/lib/repositoryGraphScan.js.map +1 -1
  120. package/dist/server/lib/repositoryGraphStore.js +61 -1
  121. package/dist/server/lib/repositoryGraphStore.js.map +1 -1
  122. package/dist/server/lib/specArtifact.js +10 -1
  123. package/dist/server/lib/specArtifact.js.map +1 -1
  124. package/dist/server/lib/specDraft.js +10 -2
  125. package/dist/server/lib/specDraft.js.map +1 -1
  126. package/dist/server/lib/specExport.js +70 -6
  127. package/dist/server/lib/specExport.js.map +1 -1
  128. package/dist/server/lib/specFormatting.js +3 -2
  129. package/dist/server/lib/specFormatting.js.map +1 -1
  130. package/dist/server/lib/specRepositoryEvidenceFormatting.js +75 -0
  131. package/dist/server/lib/specRepositoryEvidenceFormatting.js.map +1 -0
  132. package/dist/server/lib/specRepositoryImpact.js +447 -0
  133. package/dist/server/lib/specRepositoryImpact.js.map +1 -0
  134. package/dist/server/lib/specRepositoryImpactLimits.js +6 -0
  135. package/dist/server/lib/specRepositoryImpactLimits.js.map +1 -0
  136. package/dist/server/lib/specReviewContext.js +15 -5
  137. package/dist/server/lib/specReviewContext.js.map +1 -1
  138. package/dist/server/lib/specReviewValidation.js +1 -1
  139. package/dist/server/lib/specReviewValidation.js.map +1 -1
  140. package/dist/server/lib/specSections.js +28 -3
  141. package/dist/server/lib/specSections.js.map +1 -1
  142. package/dist/server/lib/specSnapshotEvidence.js +162 -0
  143. package/dist/server/lib/specSnapshotEvidence.js.map +1 -0
  144. package/dist/server/lib/specSnapshotEvidenceSerialization.js +202 -0
  145. package/dist/server/lib/specSnapshotEvidenceSerialization.js.map +1 -0
  146. package/dist/server/lib/specs.js +31 -5
  147. package/dist/server/lib/specs.js.map +1 -1
  148. package/dist/server/lib/ticketAutomationCommit.js +3 -1
  149. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  150. package/dist/server/lib/ticketFollowUpOperations.js +16 -12
  151. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  152. package/dist/server/lib/ticketRunOperations.js +13 -1
  153. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  154. package/dist/server/lib/ticketWorkflowOperations.js +5 -2
  155. package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
  156. package/dist/server/lib/types.js +1 -0
  157. package/dist/server/lib/types.js.map +1 -1
  158. package/dist/server/workers/build.js +46 -148
  159. package/dist/server/workers/build.js.map +1 -1
  160. package/dist/server/workers/chat.js +141 -31
  161. package/dist/server/workers/chat.js.map +1 -1
  162. package/dist/server/workers/followUp.js +210 -48
  163. package/dist/server/workers/followUp.js.map +1 -1
  164. package/dist/server/workers/specReview.js +17 -4
  165. package/dist/server/workers/specReview.js.map +1 -1
  166. package/dist/server/workers/specSession.js +127 -22
  167. package/dist/server/workers/specSession.js.map +1 -1
  168. package/package.json +1 -1
  169. package/dist/client/assets/RepositoryGraphDialog-B--YlQcV.js +0 -1
  170. package/dist/client/assets/VerificationDialog-BIWPtBg3.js +0 -4
  171. package/dist/client/assets/channel-b2AN-U3x.js +0 -1
  172. package/dist/client/assets/classDiagram-4FO5ZUOK-C0exS5oM.js +0 -1
  173. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DkB9dQZ1.js +0 -1
  174. package/dist/client/assets/index-Bs5SQZhz.css +0 -2
  175. package/dist/client/assets/index-Dy-7h3lN.js +0 -274
  176. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Ctk1r914.js +0 -1
@@ -1,10 +1,35 @@
1
+ import { randomUUID } from 'crypto';
1
2
  import db from '../db.js';
3
+ import { getCheckAutoFixDetails } from './checkAutoFixDetails.js';
2
4
  const ACTIVE_STATUSES = new Set(['queued', 'running', 'waiting']);
5
+ const TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled', 'interrupted']);
3
6
  export const getPostBuildCheckSummary = (projectId, entityType, entityId) => {
7
+ const hasAutoFixTable = Boolean(db.prepare(`
8
+ SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'check_auto_fix_loops'
9
+ `).get());
10
+ const batchId = hasAutoFixTable ? 'COALESCE(final_batch.id, batch.id)' : 'batch.id';
11
+ const status = hasAutoFixTable
12
+ ? "CASE WHEN loop_run.status IN ('queued', 'running', 'waiting') THEN loop_run.status ELSE COALESCE(final_batch.status, batch.status) END"
13
+ : 'batch.status';
14
+ const count = (column) => hasAutoFixTable
15
+ ? `COALESCE(final_details.${column}, details.${column})`
16
+ : `details.${column}`;
17
+ const autoFixJoins = hasAutoFixTable ? `
18
+ LEFT JOIN check_auto_fix_loops loop ON loop.originating_batch_run_id = batch.id
19
+ LEFT JOIN execution_runs loop_run ON loop_run.id = loop.execution_run_id
20
+ LEFT JOIN execution_runs final_batch ON final_batch.id = loop.final_batch_run_id
21
+ LEFT JOIN check_batch_details final_details ON final_details.execution_run_id = final_batch.id
22
+ ` : '';
4
23
  const row = db.prepare(`
5
- SELECT batch.id AS batch_run_id, details.causal_source_run_id AS source_run_id,
6
- batch.status, details.queued_count, details.running_count, details.passed_count,
7
- details.failed_count, details.cancelled_count, details.interrupted_count,
24
+ SELECT ${batchId} AS batch_run_id, details.causal_source_run_id AS source_run_id,
25
+ ${hasAutoFixTable ? 'loop.execution_run_id' : 'NULL'} AS auto_fix_run_id,
26
+ ${status} AS status,
27
+ ${count('queued_count')} AS queued_count,
28
+ ${count('running_count')} AS running_count,
29
+ ${count('passed_count')} AS passed_count,
30
+ ${count('failed_count')} AS failed_count,
31
+ ${count('cancelled_count')} AS cancelled_count,
32
+ ${count('interrupted_count')} AS interrupted_count,
8
33
  batch.created_at, batch.completed_at
9
34
  FROM check_batch_details details
10
35
  JOIN execution_runs batch ON batch.id = details.execution_run_id
@@ -13,6 +38,7 @@ export const getPostBuildCheckSummary = (projectId, entityType, entityId) => {
13
38
  JOIN execution_run_links owner ON owner.execution_run_id = details.causal_source_run_id
14
39
  AND owner.project_id = batch.project_id
15
40
  AND owner.relationship = 'primary'
41
+ ${autoFixJoins}
16
42
  WHERE batch.project_id = ? AND details.purpose = 'post_build'
17
43
  AND owner.entity_type = ? AND owner.entity_id = ?
18
44
  AND NOT EXISTS (
@@ -24,7 +50,7 @@ export const getPostBuildCheckSummary = (projectId, entityType, entityId) => {
24
50
  AND later_owner.entity_type = owner.entity_type
25
51
  AND later_owner.entity_id = owner.entity_id
26
52
  WHERE later.project_id = batch.project_id
27
- AND (
53
+ AND ${hasAutoFixTable ? '(later.parent_run_id IS NULL OR later.parent_run_id IS NOT loop.execution_run_id) AND' : ''} (
28
54
  later.created_at > source.created_at
29
55
  OR (later.created_at = source.created_at AND later.rowid > source.rowid)
30
56
  )
@@ -36,8 +62,177 @@ export const getPostBuildCheckSummary = (projectId, entityType, entityId) => {
36
62
  ORDER BY batch.created_at DESC, batch.id DESC
37
63
  LIMIT 1
38
64
  `).get(projectId, entityType, entityId);
39
- return row ?? null;
65
+ if (!row) {
66
+ return null;
67
+ }
68
+ const { auto_fix_run_id: autoFixRunId, ...summary } = row;
69
+ return {
70
+ ...summary,
71
+ auto_fix: autoFixRunId ? getCheckAutoFixDetails(projectId, autoFixRunId) : null,
72
+ };
40
73
  };
41
74
  export const isPostBuildCheckActive = (summary) => (Boolean(summary && ACTIVE_STATUSES.has(summary.status)));
42
75
  export const hasActivePostBuildCheck = (projectId, entityType, entityId) => isPostBuildCheckActive(getPostBuildCheckSummary(projectId, entityType, entityId));
76
+ const latestTicketBuildSql = `
77
+ SELECT owner.entity_id AS ticket_id
78
+ FROM execution_runs source
79
+ JOIN execution_run_links owner ON owner.execution_run_id = source.id
80
+ AND owner.project_id = source.project_id
81
+ AND owner.entity_type = 'ticket'
82
+ AND owner.relationship = 'primary'
83
+ WHERE source.project_id = ?
84
+ AND source.id = ?
85
+ AND source.kind IN ('build', 'build_follow_up')
86
+ AND source.status = 'completed'
87
+ AND NOT EXISTS (
88
+ SELECT 1
89
+ FROM execution_runs later
90
+ JOIN execution_run_links later_owner ON later_owner.execution_run_id = later.id
91
+ AND later_owner.project_id = later.project_id
92
+ AND later_owner.entity_type = 'ticket'
93
+ AND later_owner.relationship = 'primary'
94
+ AND later_owner.entity_id = owner.entity_id
95
+ WHERE later.project_id = source.project_id
96
+ AND later.kind IN ('build', 'build_follow_up', 'plan_follow_up')
97
+ AND NOT EXISTS (
98
+ SELECT 1 FROM execution_runs parent
99
+ WHERE parent.id = later.parent_run_id AND parent.kind = 'check_auto_fix'
100
+ )
101
+ AND (
102
+ later.created_at > source.created_at
103
+ OR (later.created_at = source.created_at AND later.rowid > source.rowid)
104
+ )
105
+ )
106
+ LIMIT 1
107
+ `;
108
+ const getLatestTicketBuildSource = (projectId, sourceRunId) => db.prepare(latestTicketBuildSql)
109
+ .get(projectId, sourceRunId);
110
+ export const isLatestTicketBuildSource = (projectId, sourceRunId, ticketId) => (getLatestTicketBuildSource(projectId, sourceRunId)?.ticket_id === ticketId);
111
+ const hasFailure = (batch) => (batch.execution_status !== 'completed'
112
+ || batch.failed_count > 0
113
+ || batch.cancelled_count > 0
114
+ || batch.interrupted_count > 0);
115
+ const formatCheckCounts = (batch) => (`passed: ${batch.passed_count}, failed: ${batch.failed_count}, cancelled: ${batch.cancelled_count}, interrupted: ${batch.interrupted_count}`);
116
+ const getFailureMessage = (batch) => {
117
+ const outcome = batch.execution_status === 'failed'
118
+ ? 'failed'
119
+ : batch.execution_status === 'cancelled'
120
+ ? 'were cancelled'
121
+ : batch.execution_status === 'interrupted'
122
+ ? 'were interrupted'
123
+ : 'did not pass';
124
+ return `Post-build checks ${outcome} (${formatCheckCounts(batch)}). Review the check run details for more information.`;
125
+ };
126
+ const getSourceFailureMessage = (sourceRunId, error) => (`Post-build checks could not be started or completed (${sourceRunId}). ${error.message}`);
127
+ const updateFinalizationMetadata = (projectId, sourceRunId, update) => {
128
+ try {
129
+ const row = db.prepare('SELECT metadata_json FROM execution_runs WHERE id = ? AND project_id = ?').get(sourceRunId, projectId);
130
+ if (!row?.metadata_json) {
131
+ return;
132
+ }
133
+ const metadata = JSON.parse(row.metadata_json);
134
+ const finalization = metadata.post_build_finalization;
135
+ if (!finalization || typeof finalization !== 'object' || Array.isArray(finalization)) {
136
+ return;
137
+ }
138
+ db.prepare('UPDATE execution_runs SET metadata_json = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND project_id = ?')
139
+ .run(JSON.stringify({ ...metadata, post_build_finalization: update(finalization) }), sourceRunId, projectId);
140
+ }
141
+ catch {
142
+ // Legacy or malformed metadata must not prevent ticket finalization.
143
+ }
144
+ };
145
+ export const persistPendingPostBuildFinalization = (projectId, sourceRunId, memorySuggestions, stage = 'build') => {
146
+ try {
147
+ const row = db.prepare('SELECT metadata_json FROM execution_runs WHERE id = ? AND project_id = ?').get(sourceRunId, projectId);
148
+ const metadata = row?.metadata_json ? JSON.parse(row.metadata_json) : {};
149
+ db.prepare('UPDATE execution_runs SET metadata_json = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND project_id = ?').run(JSON.stringify({
150
+ ...metadata,
151
+ post_build_finalization: {
152
+ status: 'pending',
153
+ check_admission: 'pending',
154
+ stage,
155
+ memory_suggestions: memorySuggestions,
156
+ },
157
+ }), sourceRunId, projectId);
158
+ }
159
+ catch {
160
+ // A malformed legacy metadata row must not prevent the completed run from being recorded.
161
+ }
162
+ };
163
+ export const markPostBuildCheckAdmission = (projectId, sourceRunId, admission) => {
164
+ updateFinalizationMetadata(projectId, sourceRunId, finalization => ({ ...finalization, check_admission: admission }));
165
+ };
166
+ export const finalizePostBuildCheckTicket = ({ projectId, sourceRunId, batch = null, error = null, getTicket, emitter, }) => {
167
+ const autoFixOrigin = batch?.purpose === 'auto_fix' ? db.prepare(`
168
+ SELECT origin.causal_source_run_id
169
+ FROM check_auto_fix_loops loop
170
+ JOIN check_batch_details origin ON origin.execution_run_id = loop.originating_batch_run_id
171
+ WHERE loop.final_batch_run_id = ? AND loop.terminal_reason IS NOT NULL
172
+ `).get(batch.execution_run_id) : null;
173
+ if (batch && (!TERMINAL_STATUSES.has(batch.execution_status)
174
+ || (batch.purpose === 'post_build' && batch.causal_source_run_id !== sourceRunId)
175
+ || (batch.purpose === 'auto_fix' && autoFixOrigin?.causal_source_run_id !== sourceRunId)
176
+ || !['post_build', 'auto_fix'].includes(batch.purpose ?? 'manual'))) {
177
+ return { finalized: false, ticket: null };
178
+ }
179
+ const result = db.transaction(() => {
180
+ const source = getLatestTicketBuildSource(projectId, sourceRunId);
181
+ if (!source) {
182
+ return { finalized: false, ticket: null };
183
+ }
184
+ const origin = batch
185
+ ? `post-build-check:${batch.execution_run_id}`
186
+ : `post-build-check:${sourceRunId}:admission`;
187
+ const errorContent = batch && hasFailure(batch)
188
+ ? getFailureMessage(batch)
189
+ : !batch && error
190
+ ? getSourceFailureMessage(sourceRunId, error)
191
+ : null;
192
+ const updated = db.prepare(`
193
+ UPDATE tickets
194
+ SET agent_status = 'done',
195
+ agent_log = NULL,
196
+ streaming_response = NULL,
197
+ build_completed_at = COALESCE(build_completed_at, CURRENT_TIMESTAMP),
198
+ updated_at = CURRENT_TIMESTAMP
199
+ WHERE id = ? AND project_id = ? AND agent_status = 'running'
200
+ `).run(source.ticket_id, projectId);
201
+ if (updated.changes !== 1) {
202
+ return { finalized: false, ticket: null };
203
+ }
204
+ if (errorContent) {
205
+ const existing = db.prepare(`
206
+ SELECT 1
207
+ FROM ticket_messages
208
+ WHERE ticket_id = ? AND role = 'assistant' AND kind = 'error' AND origin = ?
209
+ LIMIT 1
210
+ `).get(source.ticket_id, origin);
211
+ if (!existing) {
212
+ db.prepare(`
213
+ INSERT INTO ticket_messages (id, ticket_id, role, kind, content, origin)
214
+ VALUES (?, ?, 'assistant', 'error', ?, ?)
215
+ `).run(randomUUID(), source.ticket_id, errorContent, origin);
216
+ }
217
+ }
218
+ updateFinalizationMetadata(projectId, sourceRunId, finalization => ({ ...finalization, status: 'finalized' }));
219
+ return { finalized: true, ticketId: source.ticket_id };
220
+ })();
221
+ if (!result.finalized) {
222
+ return { finalized: false, ticket: null };
223
+ }
224
+ const ticket = getTicket?.(result.ticketId) ?? null;
225
+ if (ticket && emitter) {
226
+ try {
227
+ emitter.emit('ticket:updated', ticket);
228
+ }
229
+ catch {
230
+ // Durable ticket and activity state remain authoritative when realtime delivery fails.
231
+ }
232
+ }
233
+ return { finalized: true, ticket };
234
+ };
235
+ export const markPostBuildCheckFinalizationComplete = (projectId, sourceRunId) => {
236
+ updateFinalizationMetadata(projectId, sourceRunId, finalization => ({ ...finalization, status: 'completed' }));
237
+ };
43
238
  //# sourceMappingURL=postBuildCheckRuns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postBuildCheckRuns.js","sourceRoot":"","sources":["../../../server/lib/postBuildCheckRuns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AAGzB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;AAIrF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,SAAiB,EACjB,UAAqC,EACrC,QAAgB,EACc,EAAE;IAChC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCtB,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAA2B,CAAA;IAEjE,OAAO,GAAG,IAAI,IAAI,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAiD,EAAE,EAAE,CAAC,CAC3F,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CACxD,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAAiB,EACjB,UAAqC,EACrC,QAAgB,EAChB,EAAE,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"postBuildCheckRuns.js","sourceRoot":"","sources":["../../../server/lib/postBuildCheckRuns.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,22 @@
1
1
  import db from '../db.js';
2
2
  import { resolveChatSessionTarget } from './chatTargets.js';
3
3
  import { startCheckBatch, waitForCheckBatch } from './checkRunner.js';
4
+ import { getCheckBatchDetails } from './checkRuns.js';
4
5
  import { getExecutionRun } from './executionRuns.js';
5
6
  import { resolveExistingWorktreePath } from './git.js';
6
7
  import { getProjectById, getProjectCheckDefinitions } from './projects.js';
7
8
  import { parseRequiredCheckDefinitionIds } from './requiredCheckPolicy.js';
8
9
  import { resolveAutomationConfig } from './ticketAutomation.js';
9
10
  import { getBundle, isProjectRootBundle } from './tickets.js';
11
+ import { markPostBuildCheckAdmission } from './postBuildCheckRuns.js';
12
+ const emitStatusChange = (onStatusChange) => {
13
+ try {
14
+ onStatusChange();
15
+ }
16
+ catch {
17
+ // Durable check and ticket state remain authoritative when realtime delivery fails.
18
+ }
19
+ };
10
20
  const sourceHasAutomationContext = (sourceRunId) => Boolean(db.prepare(`
11
21
  SELECT 1
12
22
  FROM execution_run_links
@@ -52,15 +62,34 @@ const resolveTarget = (project, owner) => {
52
62
  };
53
63
  const isAutomationOwned = (input, project) => {
54
64
  const source = getExecutionRun(project.id, input.sourceRunId);
55
- if (!source || source.status !== 'completed' || source.initiated_by !== 'user') {
65
+ if (!source) {
56
66
  return true;
57
67
  }
68
+ if (source.status !== 'completed' || source.initiated_by !== 'user') {
69
+ const isBuildSequenceSource = Boolean(source.status === 'completed'
70
+ && source.initiated_by === 'automation'
71
+ && input.owner.kind === 'ticket'
72
+ && ['build', 'build_follow_up'].includes(source.kind)
73
+ && sourceHasAutomationContext(input.sourceRunId));
74
+ if (!isBuildSequenceSource) {
75
+ return true;
76
+ }
77
+ }
58
78
  const parent = source.parent_run_id ? getExecutionRun(project.id, source.parent_run_id) : null;
59
79
  if (parent && ['check_repair', 'automation_review_fix'].includes(parent.kind)) {
60
80
  return true;
61
81
  }
62
82
  if (sourceHasAutomationContext(input.sourceRunId)) {
63
- return true;
83
+ if (source.initiated_by === 'automation') {
84
+ return false;
85
+ }
86
+ if (input.owner.kind === 'ticket') {
87
+ const bundle = input.owner.ticket.worktree_bundle_id
88
+ ? getBundle(input.owner.ticket.worktree_bundle_id, project.id)
89
+ : null;
90
+ return resolveAutomationConfig(bundle, project).depth !== 'manual';
91
+ }
92
+ return false;
64
93
  }
65
94
  if (input.owner.kind === 'ticket') {
66
95
  const bundle = input.owner.ticket.worktree_bundle_id
@@ -77,13 +106,16 @@ export const runPostBuildChecks = async (input) => {
77
106
  project_id: input.project.id,
78
107
  source_run_id: input.sourceRunId,
79
108
  });
109
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
80
110
  return null;
81
111
  }
82
112
  const selectedIds = parseRequiredCheckDefinitionIds(liveProject.post_build_check_definition_ids ?? '[]', 'post_build_check_definition_ids');
83
113
  if ('error' in selectedIds || selectedIds.value.length === 0) {
114
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
84
115
  return null;
85
116
  }
86
117
  if (isAutomationOwned(input, liveProject)) {
118
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
87
119
  return null;
88
120
  }
89
121
  const availableDefinitions = getProjectCheckDefinitions(liveProject);
@@ -91,18 +123,21 @@ export const runPostBuildChecks = async (input) => {
91
123
  const selectedDefinitions = availableDefinitions.filter(definition => selectedIdSet.has(definition.id));
92
124
  if (selectedDefinitions.length !== selectedIds.value.length) {
93
125
  console.error('Post-build checks reference unavailable definitions', { source_run_id: input.sourceRunId });
126
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
94
127
  return null;
95
128
  }
96
129
  const target = resolveTarget(liveProject, input.owner);
97
130
  if (!target) {
98
131
  console.error('Post-build check target is unavailable', { source_run_id: input.sourceRunId });
132
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
99
133
  return null;
100
134
  }
135
+ const sourceReference = input.owner.kind === 'ticket'
136
+ ? { kind: 'ticket', id: input.owner.ticket.id, label: input.owner.ticket.title }
137
+ : { kind: 'chat_session', id: input.owner.chatSession.id, label: input.owner.chatSession.title };
138
+ let batch;
101
139
  try {
102
- const sourceReference = input.owner.kind === 'ticket'
103
- ? { kind: 'ticket', id: input.owner.ticket.id, label: input.owner.ticket.title }
104
- : { kind: 'chat_session', id: input.owner.chatSession.id, label: input.owner.chatSession.title };
105
- const batch = await startCheckBatch({
140
+ batch = await startCheckBatch({
106
141
  projectId: liveProject.id,
107
142
  cwd: target.cwd,
108
143
  targetKind: target.targetKind,
@@ -113,18 +148,53 @@ export const runPostBuildChecks = async (input) => {
113
148
  sourceReference,
114
149
  postBuildParentRunId: input.sourceRunId,
115
150
  }, input.emitter);
116
- input.onStatusChange();
117
- const completed = await waitForCheckBatch(liveProject.id, batch.execution_run_id);
118
- input.onStatusChange();
119
- return completed;
120
151
  }
121
152
  catch (error) {
153
+ const operationalError = error instanceof Error ? error : new Error(String(error));
122
154
  console.error('Unable to run post-build checks', {
123
155
  source_run_id: input.sourceRunId,
124
- error: error instanceof Error ? error.message : String(error),
156
+ error: operationalError.message,
125
157
  });
126
- input.onStatusChange();
127
- return null;
158
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'failed');
159
+ emitStatusChange(input.onStatusChange);
160
+ return {
161
+ batch: null,
162
+ error: operationalError,
163
+ };
164
+ }
165
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'admitted');
166
+ emitStatusChange(input.onStatusChange);
167
+ try {
168
+ const completedBatch = await waitForCheckBatch(liveProject.id, batch.execution_run_id);
169
+ const completed = completedBatch.execution_status === 'failed'
170
+ ? await (await import('./checkAutoFix.js')).runCheckAutoFix({
171
+ projectId: liveProject.id,
172
+ batchRunId: completedBatch.execution_run_id,
173
+ broadcaster: input.emitter,
174
+ releaseOwnerQueue: input.releaseOwnerQueue,
175
+ })
176
+ : completedBatch;
177
+ emitStatusChange(input.onStatusChange);
178
+ return { batch: completed, error: null };
179
+ }
180
+ catch (error) {
181
+ const operationalError = error instanceof Error ? error : new Error(String(error));
182
+ console.error('Unable to run post-build checks', {
183
+ source_run_id: input.sourceRunId,
184
+ error: operationalError.message,
185
+ });
186
+ emitStatusChange(input.onStatusChange);
187
+ let latestBatch = null;
188
+ try {
189
+ latestBatch = getCheckBatchDetails(liveProject.id, batch.execution_run_id);
190
+ }
191
+ catch {
192
+ // Preserve the admitted batch snapshot when durable reconciliation is unavailable.
193
+ }
194
+ return {
195
+ batch: latestBatch,
196
+ error: operationalError,
197
+ };
128
198
  }
129
199
  };
130
200
  //# sourceMappingURL=postBuildChecks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postBuildChecks.js","sourceRoot":"","sources":["../../../server/lib/postBuildChecks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postBuildChecks.js","sourceRoot":"","sources":["../../../server/lib/postBuildChecks.ts"],"names":[],"mappings":"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"}
@@ -449,6 +449,14 @@ export const validateProjectPayload = (body, { partial = false, currentProjectId
449
449
  if ('error' in postBuildIdsResult) {
450
450
  return postBuildIdsResult;
451
451
  }
452
+ const autoFixIdsResult = Object.hasOwn(body, 'auto_fix_check_definition_ids')
453
+ ? canonicalizeRequiredCheckDefinitionIds(body.auto_fix_check_definition_ids, 'auto_fix_check_definition_ids')
454
+ : partial
455
+ ? parseRequiredCheckDefinitionIds(currentProject?.auto_fix_check_definition_ids, 'auto_fix_check_definition_ids')
456
+ : { value: [] };
457
+ if ('error' in autoFixIdsResult) {
458
+ return autoFixIdsResult;
459
+ }
452
460
  const membershipResult = canonicalizeRequiredCheckPolicyMembership({
453
461
  required_check_definition_ids: requiredIdsResult.value,
454
462
  pre_review_check_definition_ids: preReviewIdsResult.value,
@@ -466,6 +474,9 @@ export const validateProjectPayload = (body, { partial = false, currentProjectId
466
474
  if (postBuildIdsResult.value.some(id => !definitionIds.has(id))) {
467
475
  return { error: 'post_build_check_definition_ids must reference current check_definitions entries' };
468
476
  }
477
+ if (autoFixIdsResult.value.some(id => !definitionIds.has(id))) {
478
+ return { error: 'auto_fix_check_definition_ids must reference current check_definitions entries' };
479
+ }
469
480
  const definitionLimitsError = validateCheckDefinitionStorageLimits(resolvedDefinitions);
470
481
  if (definitionLimitsError) {
471
482
  return { error: definitionLimitsError };
@@ -484,6 +495,9 @@ export const validateProjectPayload = (body, { partial = false, currentProjectId
484
495
  if (Object.hasOwn(body, 'post_build_check_definition_ids') || !partial) {
485
496
  values.post_build_check_definition_ids = JSON.stringify(postBuildIdsResult.value);
486
497
  }
498
+ if (Object.hasOwn(body, 'auto_fix_check_definition_ids') || !partial) {
499
+ values.auto_fix_check_definition_ids = JSON.stringify(autoFixIdsResult.value);
500
+ }
487
501
  if (Object.hasOwn(body, 'run_ide')) {
488
502
  if (body.run_ide == null) {
489
503
  values.run_ide = null;
@@ -694,7 +708,7 @@ export const validateProjectPayload = (body, { partial = false, currentProjectId
694
708
  }
695
709
  return { values };
696
710
  };
697
- export const validateProjectRequiredCheckPolicyReferences = ({ projectId, checkDefinitionsJson, requiredCheckDefinitionIdsJson, preReviewCheckDefinitionIdsJson, postBuildCheckDefinitionIdsJson, }) => {
711
+ export const validateProjectRequiredCheckPolicyReferences = ({ projectId, checkDefinitionsJson, requiredCheckDefinitionIdsJson, preReviewCheckDefinitionIdsJson, postBuildCheckDefinitionIdsJson, autoFixCheckDefinitionIdsJson, }) => {
698
712
  const definitions = parseCheckDefinitionsJson(checkDefinitionsJson);
699
713
  const definitionIds = new Set(definitions.map(definition => definition.id));
700
714
  const requiredIds = parseRequiredCheckDefinitionIds(requiredCheckDefinitionIdsJson);
@@ -709,6 +723,10 @@ export const validateProjectRequiredCheckPolicyReferences = ({ projectId, checkD
709
723
  if ('error' in postBuildIds) {
710
724
  return postBuildIds;
711
725
  }
726
+ const autoFixIds = parseRequiredCheckDefinitionIds(autoFixCheckDefinitionIdsJson, 'auto_fix_check_definition_ids');
727
+ if ('error' in autoFixIds) {
728
+ return autoFixIds;
729
+ }
712
730
  const projectMembership = canonicalizeRequiredCheckPolicyMembership({
713
731
  required_check_definition_ids: requiredIds.value,
714
732
  pre_review_check_definition_ids: preReviewIds.value,
@@ -731,6 +749,11 @@ export const validateProjectRequiredCheckPolicyReferences = ({ projectId, checkD
731
749
  return { error: 'post_build_check_definition_ids must reference current check_definitions entries' };
732
750
  }
733
751
  }
752
+ for (const id of autoFixIds.value) {
753
+ if (!definitionIds.has(id)) {
754
+ return { error: 'auto_fix_check_definition_ids must reference current check_definitions entries' };
755
+ }
756
+ }
734
757
  return { ok: true };
735
758
  };
736
759
  export const getProjectById = (projectId) => {
@@ -846,6 +869,7 @@ export const serializeProject = (project) => {
846
869
  required_check_definition_ids: project.required_check_definition_ids,
847
870
  pre_review_check_definition_ids: project.pre_review_check_definition_ids,
848
871
  post_build_check_definition_ids: project.post_build_check_definition_ids,
872
+ auto_fix_check_definition_ids: project.auto_fix_check_definition_ids,
849
873
  test_commands: project.test_commands,
850
874
  run_ide: project.run_ide,
851
875
  preview_service_name: project.preview_service_name,