@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.
- package/dist/client/assets/{ActivityView--4X_m6mR.js → ActivityView-gBeoYQdD.js} +1 -1
- package/dist/client/assets/{GitHubActionsDialog-DZ1lHM01.js → GitHubActionsDialog-fc1Vwafm.js} +1 -1
- package/dist/client/assets/RepositoryGraphDialog-DCOjwUR3.js +1 -0
- package/dist/client/assets/VerificationDialog-CIObj1Rw.js +4 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CY5xTOZJ.js → architectureDiagram-3BPJPVTR-B1tJZe1S.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DkMi7gMh.js → blockDiagram-GPEHLZMM-D_90AQ2Z.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-ZZxXBBU4.js → c4Diagram-AAUBKEIU-DSyJfqly.js} +1 -1
- package/dist/client/assets/channel-DFw1f2Rh.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-C9PiKMs-.js → chunk-2J33WTMH-B9RStQGj.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-B81aUmvi.js → chunk-3OPIFGDE-CHKuJYq0.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-Bk2Owm90.js → chunk-5ZQYHXKU-Cznw7LTJ.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-Bx-79aJk.js → chunk-727SXJPM-ix6OeZwJ.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-GQNXYOf0.js → chunk-AQP2D5EJ-DrPJIcE7.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-BV22j6vn.js → chunk-CSCIHK7Q-BSEHTnBR.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-C9LlcbWv.js → chunk-KSCS5N6A-MdDdaLn8.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-D8PJqJnh.js → chunk-L5ZTLDWV-D_5xeDG1.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-DcbPPozR.js → chunk-LZXEDZCA-Bz8_Fyt2.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-NV-_2KqZ.js → chunk-ND2GUHAM-DCINKlk8.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-CbqA26gb.js → chunk-NZK2D7GU-rGPgryKx.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-B0DMN44B.js → chunk-O5CBEL6O-BHB8UIYA.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-CYpcnwf9.js → chunk-WU5MYG2G-Bz5BJWjF.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Dt0kmMzQ.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BuxhA4Gw.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-B5HD9fyK.js → dagre-BM42HDAG-B4TXLkOG.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BCXvWFpM.js → diagram-2AECGRRQ-CxMup1wq.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CSpWGfAO.js → diagram-5GNKFQAL-CTfP_wnS.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CFECGppT.js → diagram-KO2AKTUF-31NKNt4r.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-Dpb99QbZ.js → diagram-LMA3HP47-Cxo7yvjc.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DJcTGnx0.js → diagram-OG6HWLK6-ChgSAMLv.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-jWArJxNU.js → erDiagram-TEJ5UH35-u6msywL_.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DDF3P1hY.js → flowDiagram-I6XJVG4X-CimeXkDN.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-Corwr_18.js → ganttDiagram-6RSMTGT7-DOu5sDUI.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-WzlpszWn.js → gitGraphDiagram-PVQCEYII-zIToibUf.js} +1 -1
- package/dist/client/assets/index-C-VHd0Pr.js +274 -0
- package/dist/client/assets/index-D3xlEyeM.css +2 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-C0VwTwNC.js → infoDiagram-5YYISTIA-CAtWGGJI.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-m9l3k2qX.js → ishikawaDiagram-YF4QCWOH-7N-C7DEt.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DMhT8HTW.js → journeyDiagram-JHISSGLW-D7VUypFG.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-C2ZkcOi0.js → kanban-definition-UN3LZRKU-AmbDmzSD.js} +1 -1
- package/dist/client/assets/{line-gKkUdUWR.js → line-qf4UZ8vh.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-DdBfJWbP.js → mermaid-parser.core-BssCd1kF.js} +1 -1
- package/dist/client/assets/{mermaid.core-DXnhq-eu.js → mermaid.core-DzeMqg9Y.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-B0gX4aJy.js → mindmap-definition-RKZ34NQL-dEnNQcDm.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-BHYdLmpx.js → pieDiagram-4H26LBE5-VjMue0a-.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-C-H-yQwU.js → quadrantDiagram-W4KKPZXB-DQFdm-0f.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DY_pSCFy.js → requirementDiagram-4Y6WPE33-CHIaXlsy.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CC61HRGf.js → sankeyDiagram-5OEKKPKP-D-kzGaKb.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B8fXWNxw.js → sequenceDiagram-3UESZ5HK-CiDmlD8k.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-C_VYKsXW.js → stateDiagram-AJRCARHV-BKlnnFdT.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DhJxc4em.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-0fB4PIIX.js → timeline-definition-PNZ67QCA-D-BK07Un.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CfpVF7Aa.js → vennDiagram-CIIHVFJN-CB9_GqSx.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CgdK4FcC.js → wardleyDiagram-YWT4CUSO-BEuNfyLT.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-BEfatQYR.js → xychartDiagram-2RQKCTM6-CSS5WMrZ.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +481 -27
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +72 -18
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/activeAutomationChild.js +1 -0
- package/dist/server/lib/activeAutomationChild.js.map +1 -1
- package/dist/server/lib/agent.js +127 -15
- package/dist/server/lib/agent.js.map +1 -1
- package/dist/server/lib/agentRuns.js +12 -0
- package/dist/server/lib/agentRuns.js.map +1 -1
- package/dist/server/lib/agentSpawnPermits.js +37 -0
- package/dist/server/lib/agentSpawnPermits.js.map +1 -0
- package/dist/server/lib/automationCheckGate.js +9 -1
- package/dist/server/lib/automationCheckGate.js.map +1 -1
- package/dist/server/lib/automationProgression.js +19 -5
- package/dist/server/lib/automationProgression.js.map +1 -1
- package/dist/server/lib/automationReviewGate.js +1 -0
- package/dist/server/lib/automationReviewGate.js.map +1 -1
- package/dist/server/lib/buildCompletionContinuation.js +144 -4
- package/dist/server/lib/buildCompletionContinuation.js.map +1 -1
- package/dist/server/lib/buildSequences.js +13 -1
- package/dist/server/lib/buildSequences.js.map +1 -1
- package/dist/server/lib/bundleActivity.js +19 -0
- package/dist/server/lib/bundleActivity.js.map +1 -1
- package/dist/server/lib/chatOperations.js +81 -2
- package/dist/server/lib/chatOperations.js.map +1 -1
- package/dist/server/lib/checkAutoFix.js +604 -0
- package/dist/server/lib/checkAutoFix.js.map +1 -0
- package/dist/server/lib/checkAutoFixDetails.js +83 -0
- package/dist/server/lib/checkAutoFixDetails.js.map +1 -0
- package/dist/server/lib/checkAutoFixPolicy.js +59 -0
- package/dist/server/lib/checkAutoFixPolicy.js.map +1 -0
- package/dist/server/lib/checkRepair.js +149 -54
- package/dist/server/lib/checkRepair.js.map +1 -1
- package/dist/server/lib/checkRepairDispatch.js +91 -0
- package/dist/server/lib/checkRepairDispatch.js.map +1 -0
- package/dist/server/lib/checkRepairEvidence.js +84 -0
- package/dist/server/lib/checkRepairEvidence.js.map +1 -0
- package/dist/server/lib/checkRepairParent.js +21 -0
- package/dist/server/lib/checkRepairParent.js.map +1 -0
- package/dist/server/lib/checkRepairReconciliation.js +14 -5
- package/dist/server/lib/checkRepairReconciliation.js.map +1 -1
- package/dist/server/lib/checkRunner.js +27 -8
- package/dist/server/lib/checkRunner.js.map +1 -1
- package/dist/server/lib/checkRuns.js +63 -4
- package/dist/server/lib/checkRuns.js.map +1 -1
- package/dist/server/lib/executionReconciliation.js +387 -8
- package/dist/server/lib/executionReconciliation.js.map +1 -1
- package/dist/server/lib/executionRuns.js +24 -1
- package/dist/server/lib/executionRuns.js.map +1 -1
- package/dist/server/lib/integrations/github.js +10 -7
- package/dist/server/lib/integrations/github.js.map +1 -1
- package/dist/server/lib/postBuildCheckRuns.js +200 -5
- package/dist/server/lib/postBuildCheckRuns.js.map +1 -1
- package/dist/server/lib/postBuildChecks.js +83 -13
- package/dist/server/lib/postBuildChecks.js.map +1 -1
- package/dist/server/lib/projects.js +25 -1
- package/dist/server/lib/projects.js.map +1 -1
- package/dist/server/lib/queue.js +9 -3
- package/dist/server/lib/queue.js.map +1 -1
- package/dist/server/lib/repositoryGraphQueries.js +5 -3
- package/dist/server/lib/repositoryGraphQueries.js.map +1 -1
- package/dist/server/lib/repositoryGraphScan.js +13 -2
- package/dist/server/lib/repositoryGraphScan.js.map +1 -1
- package/dist/server/lib/repositoryGraphStore.js +61 -1
- package/dist/server/lib/repositoryGraphStore.js.map +1 -1
- package/dist/server/lib/specArtifact.js +10 -1
- package/dist/server/lib/specArtifact.js.map +1 -1
- package/dist/server/lib/specDraft.js +10 -2
- package/dist/server/lib/specDraft.js.map +1 -1
- package/dist/server/lib/specExport.js +70 -6
- package/dist/server/lib/specExport.js.map +1 -1
- package/dist/server/lib/specFormatting.js +3 -2
- package/dist/server/lib/specFormatting.js.map +1 -1
- package/dist/server/lib/specRepositoryEvidenceFormatting.js +75 -0
- package/dist/server/lib/specRepositoryEvidenceFormatting.js.map +1 -0
- package/dist/server/lib/specRepositoryImpact.js +447 -0
- package/dist/server/lib/specRepositoryImpact.js.map +1 -0
- package/dist/server/lib/specRepositoryImpactLimits.js +6 -0
- package/dist/server/lib/specRepositoryImpactLimits.js.map +1 -0
- package/dist/server/lib/specReviewContext.js +15 -5
- package/dist/server/lib/specReviewContext.js.map +1 -1
- package/dist/server/lib/specReviewValidation.js +1 -1
- package/dist/server/lib/specReviewValidation.js.map +1 -1
- package/dist/server/lib/specSections.js +28 -3
- package/dist/server/lib/specSections.js.map +1 -1
- package/dist/server/lib/specSnapshotEvidence.js +162 -0
- package/dist/server/lib/specSnapshotEvidence.js.map +1 -0
- package/dist/server/lib/specSnapshotEvidenceSerialization.js +202 -0
- package/dist/server/lib/specSnapshotEvidenceSerialization.js.map +1 -0
- package/dist/server/lib/specs.js +31 -5
- package/dist/server/lib/specs.js.map +1 -1
- package/dist/server/lib/ticketAutomationCommit.js +3 -1
- package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
- package/dist/server/lib/ticketFollowUpOperations.js +16 -12
- package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
- package/dist/server/lib/ticketRunOperations.js +13 -1
- package/dist/server/lib/ticketRunOperations.js.map +1 -1
- package/dist/server/lib/ticketWorkflowOperations.js +5 -2
- package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
- package/dist/server/lib/types.js +1 -0
- package/dist/server/lib/types.js.map +1 -1
- package/dist/server/workers/build.js +46 -148
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/chat.js +141 -31
- package/dist/server/workers/chat.js.map +1 -1
- package/dist/server/workers/followUp.js +210 -48
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/specReview.js +17 -4
- package/dist/server/workers/specReview.js.map +1 -1
- package/dist/server/workers/specSession.js +127 -22
- package/dist/server/workers/specSession.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/RepositoryGraphDialog-B--YlQcV.js +0 -1
- package/dist/client/assets/VerificationDialog-BIWPtBg3.js +0 -4
- package/dist/client/assets/channel-b2AN-U3x.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C0exS5oM.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DkB9dQZ1.js +0 -1
- package/dist/client/assets/index-Bs5SQZhz.css +0 -2
- package/dist/client/assets/index-Dy-7h3lN.js +0 -274
- 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
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
156
|
+
error: operationalError.message,
|
|
125
157
|
});
|
|
126
|
-
input.
|
|
127
|
-
|
|
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":"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;
|
|
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,
|