@straiffi/archon 1.8.8 → 1.8.10

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 (182) hide show
  1. package/dist/client/assets/{ActivityView--4X_m6mR.js → ActivityView-ew2HI3iv.js} +1 -1
  2. package/dist/client/assets/{GitHubActionsDialog-DZ1lHM01.js → GitHubActionsDialog-C9lg87qK.js} +1 -1
  3. package/dist/client/assets/RepositoryGraphDialog-CnED9oZO.js +1 -0
  4. package/dist/client/assets/VerificationDialog-BFEA4LcO.js +4 -0
  5. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CY5xTOZJ.js → architectureDiagram-3BPJPVTR-B468SqWl.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-GPEHLZMM-DkMi7gMh.js → blockDiagram-GPEHLZMM-CcuVr5zL.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AAUBKEIU-ZZxXBBU4.js → c4Diagram-AAUBKEIU-CIVHHAmy.js} +1 -1
  8. package/dist/client/assets/channel-i8pCfCxf.js +1 -0
  9. package/dist/client/assets/{chunk-2J33WTMH-C9PiKMs-.js → chunk-2J33WTMH-BdX4DCtG.js} +1 -1
  10. package/dist/client/assets/{chunk-3OPIFGDE-B81aUmvi.js → chunk-3OPIFGDE-skObTH8f.js} +1 -1
  11. package/dist/client/assets/{chunk-5ZQYHXKU-Bk2Owm90.js → chunk-5ZQYHXKU-DgfXNdzK.js} +1 -1
  12. package/dist/client/assets/{chunk-727SXJPM-Bx-79aJk.js → chunk-727SXJPM-mnXVo2HU.js} +1 -1
  13. package/dist/client/assets/{chunk-AQP2D5EJ-GQNXYOf0.js → chunk-AQP2D5EJ-C3mXtCLv.js} +1 -1
  14. package/dist/client/assets/{chunk-CSCIHK7Q-BV22j6vn.js → chunk-CSCIHK7Q-BrUDaK4w.js} +1 -1
  15. package/dist/client/assets/{chunk-KSCS5N6A-C9LlcbWv.js → chunk-KSCS5N6A-B7ZXhQZZ.js} +1 -1
  16. package/dist/client/assets/{chunk-L5ZTLDWV-D8PJqJnh.js → chunk-L5ZTLDWV-CfWv4E3P.js} +1 -1
  17. package/dist/client/assets/{chunk-LZXEDZCA-DcbPPozR.js → chunk-LZXEDZCA-ByKWnYgl.js} +2 -2
  18. package/dist/client/assets/{chunk-ND2GUHAM-NV-_2KqZ.js → chunk-ND2GUHAM-C3xamRop.js} +1 -1
  19. package/dist/client/assets/{chunk-NZK2D7GU-CbqA26gb.js → chunk-NZK2D7GU-CMbTC0VA.js} +1 -1
  20. package/dist/client/assets/{chunk-O5CBEL6O-B0DMN44B.js → chunk-O5CBEL6O-IrjlcgnD.js} +1 -1
  21. package/dist/client/assets/{chunk-WU5MYG2G-CYpcnwf9.js → chunk-WU5MYG2G-WPjA4G6U.js} +1 -1
  22. package/dist/client/assets/classDiagram-4FO5ZUOK-CZ3Y7ahg.js +1 -0
  23. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-eRiSIrc8.js +1 -0
  24. package/dist/client/assets/{dagre-BM42HDAG-B5HD9fyK.js → dagre-BM42HDAG-B8MWc9Vt.js} +1 -1
  25. package/dist/client/assets/{diagram-2AECGRRQ-BCXvWFpM.js → diagram-2AECGRRQ-CUG9b88X.js} +1 -1
  26. package/dist/client/assets/{diagram-5GNKFQAL-CSpWGfAO.js → diagram-5GNKFQAL-C0sLSoID.js} +1 -1
  27. package/dist/client/assets/{diagram-KO2AKTUF-CFECGppT.js → diagram-KO2AKTUF-D5tls_Ye.js} +1 -1
  28. package/dist/client/assets/{diagram-LMA3HP47-Dpb99QbZ.js → diagram-LMA3HP47-B4X4DO9t.js} +1 -1
  29. package/dist/client/assets/{diagram-OG6HWLK6-DJcTGnx0.js → diagram-OG6HWLK6--Fkpu1xR.js} +1 -1
  30. package/dist/client/assets/{erDiagram-TEJ5UH35-jWArJxNU.js → erDiagram-TEJ5UH35-BcbdxB1u.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-I6XJVG4X-DDF3P1hY.js → flowDiagram-I6XJVG4X-DwNYkjtu.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-6RSMTGT7-Corwr_18.js → ganttDiagram-6RSMTGT7-Sh_eU-Z9.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-WzlpszWn.js → gitGraphDiagram-PVQCEYII-C5FDjOX5.js} +1 -1
  34. package/dist/client/assets/index-BqrNPQ_0.js +274 -0
  35. package/dist/client/assets/index-BsjoiBxI.css +2 -0
  36. package/dist/client/assets/{infoDiagram-5YYISTIA-C0VwTwNC.js → infoDiagram-5YYISTIA-Ck9OJOWG.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-m9l3k2qX.js → ishikawaDiagram-YF4QCWOH-DYXgrkHN.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-JHISSGLW-DMhT8HTW.js → journeyDiagram-JHISSGLW-BwNJvlUR.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-UN3LZRKU-C2ZkcOi0.js → kanban-definition-UN3LZRKU-CQPcarO3.js} +1 -1
  40. package/dist/client/assets/{line-gKkUdUWR.js → line-C0_WiC76.js} +1 -1
  41. package/dist/client/assets/{mermaid-parser.core-DdBfJWbP.js → mermaid-parser.core-DZFY-NQY.js} +1 -1
  42. package/dist/client/assets/{mermaid.core-DXnhq-eu.js → mermaid.core-CQd5d2Vh.js} +3 -3
  43. package/dist/client/assets/{mindmap-definition-RKZ34NQL-B0gX4aJy.js → mindmap-definition-RKZ34NQL-DM1_aBMT.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-4H26LBE5-BHYdLmpx.js → pieDiagram-4H26LBE5-CsErXHmB.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-C-H-yQwU.js → quadrantDiagram-W4KKPZXB-Dbvx_hzM.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DY_pSCFy.js → requirementDiagram-4Y6WPE33-DKjfBx4s.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CC61HRGf.js → sankeyDiagram-5OEKKPKP-BoZ5QkYh.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B8fXWNxw.js → sequenceDiagram-3UESZ5HK-zx3eTqJo.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-AJRCARHV-C_VYKsXW.js → stateDiagram-AJRCARHV-CwjCCvKl.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B0RJBNmi.js +1 -0
  51. package/dist/client/assets/{timeline-definition-PNZ67QCA-0fB4PIIX.js → timeline-definition-PNZ67QCA-_vAeRe5B.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-CIIHVFJN-CfpVF7Aa.js → vennDiagram-CIIHVFJN-BrY9ZFi8.js} +1 -1
  53. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CgdK4FcC.js → wardleyDiagram-YWT4CUSO-ffsNUFbG.js} +1 -1
  54. package/dist/client/assets/{xychartDiagram-2RQKCTM6-BEfatQYR.js → xychartDiagram-2RQKCTM6-Cwg8OKEm.js} +1 -1
  55. package/dist/client/index.html +2 -2
  56. package/dist/server/db.js +481 -37
  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 +94 -32
  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 +86 -4
  81. package/dist/server/lib/chatOperations.js.map +1 -1
  82. package/dist/server/lib/chatPostBuildRuns.js +98 -0
  83. package/dist/server/lib/chatPostBuildRuns.js.map +1 -0
  84. package/dist/server/lib/chats.js +13 -0
  85. package/dist/server/lib/chats.js.map +1 -1
  86. package/dist/server/lib/checkAutoFix.js +604 -0
  87. package/dist/server/lib/checkAutoFix.js.map +1 -0
  88. package/dist/server/lib/checkAutoFixDetails.js +83 -0
  89. package/dist/server/lib/checkAutoFixDetails.js.map +1 -0
  90. package/dist/server/lib/checkAutoFixPolicy.js +59 -0
  91. package/dist/server/lib/checkAutoFixPolicy.js.map +1 -0
  92. package/dist/server/lib/checkGateEvaluations.js +41 -16
  93. package/dist/server/lib/checkGateEvaluations.js.map +1 -1
  94. package/dist/server/lib/checkRepair.js +158 -63
  95. package/dist/server/lib/checkRepair.js.map +1 -1
  96. package/dist/server/lib/checkRepairDispatch.js +91 -0
  97. package/dist/server/lib/checkRepairDispatch.js.map +1 -0
  98. package/dist/server/lib/checkRepairEvidence.js +84 -0
  99. package/dist/server/lib/checkRepairEvidence.js.map +1 -0
  100. package/dist/server/lib/checkRepairParent.js +21 -0
  101. package/dist/server/lib/checkRepairParent.js.map +1 -0
  102. package/dist/server/lib/checkRepairReconciliation.js +14 -5
  103. package/dist/server/lib/checkRepairReconciliation.js.map +1 -1
  104. package/dist/server/lib/checkRunner.js +27 -8
  105. package/dist/server/lib/checkRunner.js.map +1 -1
  106. package/dist/server/lib/checkRuns.js +63 -4
  107. package/dist/server/lib/checkRuns.js.map +1 -1
  108. package/dist/server/lib/executionReconciliation.js +417 -8
  109. package/dist/server/lib/executionReconciliation.js.map +1 -1
  110. package/dist/server/lib/executionRuns.js +25 -2
  111. package/dist/server/lib/executionRuns.js.map +1 -1
  112. package/dist/server/lib/integrations/github.js +10 -7
  113. package/dist/server/lib/integrations/github.js.map +1 -1
  114. package/dist/server/lib/postBuildCheckRuns.js +200 -5
  115. package/dist/server/lib/postBuildCheckRuns.js.map +1 -1
  116. package/dist/server/lib/postBuildChecks.js +107 -21
  117. package/dist/server/lib/postBuildChecks.js.map +1 -1
  118. package/dist/server/lib/projects.js +25 -1
  119. package/dist/server/lib/projects.js.map +1 -1
  120. package/dist/server/lib/queue.js +9 -3
  121. package/dist/server/lib/queue.js.map +1 -1
  122. package/dist/server/lib/repositoryGraphQueries.js +5 -3
  123. package/dist/server/lib/repositoryGraphQueries.js.map +1 -1
  124. package/dist/server/lib/repositoryGraphScan.js +13 -2
  125. package/dist/server/lib/repositoryGraphScan.js.map +1 -1
  126. package/dist/server/lib/repositoryGraphStore.js +61 -1
  127. package/dist/server/lib/repositoryGraphStore.js.map +1 -1
  128. package/dist/server/lib/specArtifact.js +10 -1
  129. package/dist/server/lib/specArtifact.js.map +1 -1
  130. package/dist/server/lib/specDraft.js +10 -2
  131. package/dist/server/lib/specDraft.js.map +1 -1
  132. package/dist/server/lib/specExport.js +70 -6
  133. package/dist/server/lib/specExport.js.map +1 -1
  134. package/dist/server/lib/specFormatting.js +3 -2
  135. package/dist/server/lib/specFormatting.js.map +1 -1
  136. package/dist/server/lib/specRepositoryEvidenceFormatting.js +75 -0
  137. package/dist/server/lib/specRepositoryEvidenceFormatting.js.map +1 -0
  138. package/dist/server/lib/specRepositoryImpact.js +447 -0
  139. package/dist/server/lib/specRepositoryImpact.js.map +1 -0
  140. package/dist/server/lib/specRepositoryImpactLimits.js +6 -0
  141. package/dist/server/lib/specRepositoryImpactLimits.js.map +1 -0
  142. package/dist/server/lib/specReviewContext.js +15 -5
  143. package/dist/server/lib/specReviewContext.js.map +1 -1
  144. package/dist/server/lib/specReviewValidation.js +1 -1
  145. package/dist/server/lib/specReviewValidation.js.map +1 -1
  146. package/dist/server/lib/specSections.js +28 -3
  147. package/dist/server/lib/specSections.js.map +1 -1
  148. package/dist/server/lib/specSnapshotEvidence.js +162 -0
  149. package/dist/server/lib/specSnapshotEvidence.js.map +1 -0
  150. package/dist/server/lib/specSnapshotEvidenceSerialization.js +202 -0
  151. package/dist/server/lib/specSnapshotEvidenceSerialization.js.map +1 -0
  152. package/dist/server/lib/specs.js +31 -5
  153. package/dist/server/lib/specs.js.map +1 -1
  154. package/dist/server/lib/ticketAutomationCommit.js +3 -1
  155. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  156. package/dist/server/lib/ticketFollowUpOperations.js +16 -12
  157. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  158. package/dist/server/lib/ticketRunOperations.js +13 -1
  159. package/dist/server/lib/ticketRunOperations.js.map +1 -1
  160. package/dist/server/lib/ticketWorkflowOperations.js +5 -2
  161. package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
  162. package/dist/server/lib/types.js +1 -0
  163. package/dist/server/lib/types.js.map +1 -1
  164. package/dist/server/workers/build.js +46 -148
  165. package/dist/server/workers/build.js.map +1 -1
  166. package/dist/server/workers/chat.js +185 -43
  167. package/dist/server/workers/chat.js.map +1 -1
  168. package/dist/server/workers/followUp.js +210 -48
  169. package/dist/server/workers/followUp.js.map +1 -1
  170. package/dist/server/workers/specReview.js +17 -4
  171. package/dist/server/workers/specReview.js.map +1 -1
  172. package/dist/server/workers/specSession.js +127 -22
  173. package/dist/server/workers/specSession.js.map +1 -1
  174. package/package.json +1 -1
  175. package/dist/client/assets/RepositoryGraphDialog-B--YlQcV.js +0 -1
  176. package/dist/client/assets/VerificationDialog-BIWPtBg3.js +0 -4
  177. package/dist/client/assets/channel-b2AN-U3x.js +0 -1
  178. package/dist/client/assets/classDiagram-4FO5ZUOK-C0exS5oM.js +0 -1
  179. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DkB9dQZ1.js +0 -1
  180. package/dist/client/assets/index-Bs5SQZhz.css +0 -2
  181. package/dist/client/assets/index-Dy-7h3lN.js +0 -274
  182. 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
- import { resolveAutomationConfig } from './ticketAutomation.js';
9
+ import { depthAtLeast, 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,23 +62,58 @@ 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) {
66
+ return true;
67
+ }
68
+ if (source.status !== 'completed') {
56
69
  return true;
57
70
  }
58
71
  const parent = source.parent_run_id ? getExecutionRun(project.id, source.parent_run_id) : null;
59
72
  if (parent && ['check_repair', 'automation_review_fix'].includes(parent.kind)) {
60
73
  return true;
61
74
  }
62
- if (sourceHasAutomationContext(input.sourceRunId)) {
63
- return true;
75
+ if (source.initiated_by === 'user') {
76
+ return false;
64
77
  }
65
- if (input.owner.kind === 'ticket') {
66
- const bundle = input.owner.ticket.worktree_bundle_id
67
- ? getBundle(input.owner.ticket.worktree_bundle_id, project.id)
78
+ return !(source.initiated_by === 'automation'
79
+ && input.owner.kind === 'ticket'
80
+ && ['build', 'build_follow_up'].includes(source.kind)
81
+ && sourceHasAutomationContext(input.sourceRunId));
82
+ };
83
+ const resolveSelectedDefinitionIds = (project, owner) => {
84
+ const fieldValues = [{
85
+ name: 'post_build_check_definition_ids',
86
+ value: project.post_build_check_definition_ids,
87
+ }];
88
+ if (owner.kind === 'ticket') {
89
+ const bundle = owner.ticket.worktree_bundle_id
90
+ ? getBundle(owner.ticket.worktree_bundle_id, project.id)
68
91
  : null;
69
- return resolveAutomationConfig(bundle, project).depth !== 'manual';
92
+ const depth = resolveAutomationConfig(bundle, project).depth;
93
+ if (depthAtLeast(depth, 'auto_review')) {
94
+ fieldValues.push({
95
+ name: 'pre_review_check_definition_ids',
96
+ value: project.pre_review_check_definition_ids,
97
+ });
98
+ }
99
+ if (depthAtLeast(depth, 'auto_commit')) {
100
+ fieldValues.push({
101
+ name: 'required_check_definition_ids',
102
+ value: project.required_check_definition_ids,
103
+ });
104
+ }
70
105
  }
71
- return false;
106
+ const selectedIds = new Set();
107
+ for (const field of fieldValues) {
108
+ const parsed = parseRequiredCheckDefinitionIds(field.value ?? '[]', field.name);
109
+ if ('error' in parsed) {
110
+ return parsed;
111
+ }
112
+ for (const id of parsed.value) {
113
+ selectedIds.add(id);
114
+ }
115
+ }
116
+ return { value: [...selectedIds] };
72
117
  };
73
118
  export const runPostBuildChecks = async (input) => {
74
119
  const liveProject = getProjectById(input.project.id);
@@ -77,13 +122,16 @@ export const runPostBuildChecks = async (input) => {
77
122
  project_id: input.project.id,
78
123
  source_run_id: input.sourceRunId,
79
124
  });
125
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
80
126
  return null;
81
127
  }
82
- const selectedIds = parseRequiredCheckDefinitionIds(liveProject.post_build_check_definition_ids ?? '[]', 'post_build_check_definition_ids');
128
+ const selectedIds = resolveSelectedDefinitionIds(liveProject, input.owner);
83
129
  if ('error' in selectedIds || selectedIds.value.length === 0) {
130
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
84
131
  return null;
85
132
  }
86
133
  if (isAutomationOwned(input, liveProject)) {
134
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
87
135
  return null;
88
136
  }
89
137
  const availableDefinitions = getProjectCheckDefinitions(liveProject);
@@ -91,18 +139,21 @@ export const runPostBuildChecks = async (input) => {
91
139
  const selectedDefinitions = availableDefinitions.filter(definition => selectedIdSet.has(definition.id));
92
140
  if (selectedDefinitions.length !== selectedIds.value.length) {
93
141
  console.error('Post-build checks reference unavailable definitions', { source_run_id: input.sourceRunId });
142
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
94
143
  return null;
95
144
  }
96
145
  const target = resolveTarget(liveProject, input.owner);
97
146
  if (!target) {
98
147
  console.error('Post-build check target is unavailable', { source_run_id: input.sourceRunId });
148
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'skipped');
99
149
  return null;
100
150
  }
151
+ const sourceReference = input.owner.kind === 'ticket'
152
+ ? { kind: 'ticket', id: input.owner.ticket.id, label: input.owner.ticket.title }
153
+ : { kind: 'chat_session', id: input.owner.chatSession.id, label: input.owner.chatSession.title };
154
+ let batch;
101
155
  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({
156
+ batch = await startCheckBatch({
106
157
  projectId: liveProject.id,
107
158
  cwd: target.cwd,
108
159
  targetKind: target.targetKind,
@@ -113,18 +164,53 @@ export const runPostBuildChecks = async (input) => {
113
164
  sourceReference,
114
165
  postBuildParentRunId: input.sourceRunId,
115
166
  }, input.emitter);
116
- input.onStatusChange();
117
- const completed = await waitForCheckBatch(liveProject.id, batch.execution_run_id);
118
- input.onStatusChange();
119
- return completed;
120
167
  }
121
168
  catch (error) {
169
+ const operationalError = error instanceof Error ? error : new Error(String(error));
122
170
  console.error('Unable to run post-build checks', {
123
171
  source_run_id: input.sourceRunId,
124
- error: error instanceof Error ? error.message : String(error),
172
+ error: operationalError.message,
125
173
  });
126
- input.onStatusChange();
127
- return null;
174
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'failed');
175
+ emitStatusChange(input.onStatusChange);
176
+ return {
177
+ batch: null,
178
+ error: operationalError,
179
+ };
180
+ }
181
+ markPostBuildCheckAdmission(input.project.id, input.sourceRunId, 'admitted');
182
+ emitStatusChange(input.onStatusChange);
183
+ try {
184
+ const completedBatch = await waitForCheckBatch(liveProject.id, batch.execution_run_id);
185
+ const completed = completedBatch.execution_status === 'failed'
186
+ ? await (await import('./checkAutoFix.js')).runCheckAutoFix({
187
+ projectId: liveProject.id,
188
+ batchRunId: completedBatch.execution_run_id,
189
+ broadcaster: input.emitter,
190
+ releaseOwnerQueue: input.releaseOwnerQueue,
191
+ })
192
+ : completedBatch;
193
+ emitStatusChange(input.onStatusChange);
194
+ return { batch: completed, error: null };
195
+ }
196
+ catch (error) {
197
+ const operationalError = error instanceof Error ? error : new Error(String(error));
198
+ console.error('Unable to run post-build checks', {
199
+ source_run_id: input.sourceRunId,
200
+ error: operationalError.message,
201
+ });
202
+ emitStatusChange(input.onStatusChange);
203
+ let latestBatch = null;
204
+ try {
205
+ latestBatch = getCheckBatchDetails(liveProject.id, batch.execution_run_id);
206
+ }
207
+ catch {
208
+ // Preserve the admitted batch snapshot when durable reconciliation is unavailable.
209
+ }
210
+ return {
211
+ batch: latestBatch,
212
+ error: operationalError,
213
+ };
128
214
  }
129
215
  };
130
216
  //# sourceMappingURL=postBuildChecks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postBuildChecks.js","sourceRoot":"","sources":["../../../server/lib/postBuildChecks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAe7D,MAAM,0BAA0B,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;;;;CAI9E,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;AAEpB,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,KAAY,EAAE,EAAE;IACvD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACnE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,UAAU,EAAE,MAAM,CAAC,WAAW;YAC9B,cAAc,EAAE,MAAM,CAAC,gBAAgB;YACvC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,qBAAqB;SACrD,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB;QAC5C,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,IAAI,CAAA;IACR,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,SAAS;YACtB,UAAU,EAAE,WAAoB;YAChC,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,MAAM,CAAC,IAAI;SACzB,CAAA;IACH,CAAC;IACD,MAAM,GAAG,GAAG,2BAA2B,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,GAAG;QACH,UAAU,EAAE,QAAiB;QAC7B,cAAc,EAAE,MAAM,CAAC,EAAE;QACzB,WAAW,EAAE,MAAM,CAAC,IAAI;KACzB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAE,OAAgB,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC7D,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9F,IAAI,MAAM,IAAI,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,0BAA0B,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB;YAClD,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAC;YAC9D,CAAC,CAAC,IAAI,CAAA;QACR,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAA;IACpE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAAY,EAAE,EAAE;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE;YACvD,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5B,aAAa,EAAE,KAAK,CAAC,WAAW;SACjC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,WAAW,GAAG,+BAA+B,CACjD,WAAW,CAAC,+BAA+B,IAAI,IAAI,EACnD,iCAAiC,CAClC,CAAA;IACD,IAAI,OAAO,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;IACpE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAChD,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;IACvG,IAAI,mBAAmB,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1G,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7F,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;YACnD,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;YACzF,CAAC,CAAC,EAAE,IAAI,EAAE,cAAuB,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QAC3G,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC;YAClC,SAAS,EAAE,WAAW,CAAC,EAAE;YACzB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,mBAAmB;YACnB,oBAAoB;YACpB,eAAe;YACf,oBAAoB,EAAE,KAAK,CAAC,WAAW;SACxC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACjB,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAA;QACjF,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC/C,aAAa,EAAE,KAAK,CAAC,WAAW;YAChC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAA;QACF,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
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,