@straiffi/archon 1.7.10 → 1.8.0
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-IUWr92uj.js → ActivityView-EVy76nes.js} +1 -1
- package/dist/client/assets/{GitHubActionsDialog-0YtWvbFk.js → GitHubActionsDialog-D53aA0Fv.js} +1 -1
- package/dist/client/assets/VerificationDialog-Dm5DcY8F.js +4 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-LLMyOR-6.js → architectureDiagram-3BPJPVTR-CmMRkze6.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-aa1HitBJ.js → blockDiagram-GPEHLZMM-BgLsRgxM.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BpSt5sdj.js → c4Diagram-AAUBKEIU-C3WJl13c.js} +1 -1
- package/dist/client/assets/channel-xqaERdN6.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-D8pf3RNr.js → chunk-2J33WTMH-BfH4_PkQ.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-_yx1N2iT.js → chunk-3OPIFGDE-CkVGPLM4.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-CYURGSbL.js → chunk-5ZQYHXKU-CDTwT753.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-Ci2Mu1zz.js → chunk-727SXJPM-CKEhBrr_.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CqVgrKze.js → chunk-AQP2D5EJ-D5QPK_k7.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-CT8aPk-o.js → chunk-CSCIHK7Q-BU4Ysr_2.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-yM1i0J-p.js → chunk-KSCS5N6A-B9lHLGg1.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-BKMGr31Z.js → chunk-L5ZTLDWV-BrNsmxtD.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-A7oUDETP.js → chunk-LZXEDZCA-CVgZc1nv.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-Cagc-XAG.js → chunk-ND2GUHAM-DWWdi42a.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-pe8tKLWI.js → chunk-NZK2D7GU-46-aRMvO.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-BahwghWW.js → chunk-O5CBEL6O-BW6wHmzD.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-BfSAFufr.js → chunk-WU5MYG2G-Wfk15Qtf.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BdwFrsZE.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DxAuXA1L.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-DCma6-hS.js → dagre-BM42HDAG-CZ_BDahz.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DUeggZrO.js → diagram-2AECGRRQ-CQKXQvjO.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CdjOKGtl.js → diagram-5GNKFQAL-Dgsh82oA.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CYjXhgh_.js → diagram-KO2AKTUF-DUwmm3sV.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DYBCh4cm.js → diagram-LMA3HP47-DLGz0g10.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-D3HPQt3z.js → diagram-OG6HWLK6-CjS6v8Zz.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-mG8Yztg-.js → erDiagram-TEJ5UH35-DHaCFHn9.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-4FvjuoSZ.js → flowDiagram-I6XJVG4X-E4LSVqs6.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-ByCQI8ft.js → ganttDiagram-6RSMTGT7-BWywa_xn.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CzEUA7nB.js → gitGraphDiagram-PVQCEYII-BK4kWKuB.js} +1 -1
- package/dist/client/assets/index-CS2arNNP.js +274 -0
- package/dist/client/assets/index-Cb_ZVYaw.css +2 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-Q9CqnXO1.js → infoDiagram-5YYISTIA-BX7HzDWX.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CO8BToGf.js → ishikawaDiagram-YF4QCWOH-CEnWCNes.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-DtOyWvDJ.js → journeyDiagram-JHISSGLW-MQPDgPxD.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DIn9bYpk.js → kanban-definition-UN3LZRKU-PwVLKAnN.js} +1 -1
- package/dist/client/assets/{line-H-k0M9_s.js → line-BJMnG1sl.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-CZOUS5zK.js → mermaid-parser.core-Bwv8qN83.js} +1 -1
- package/dist/client/assets/{mermaid.core-Ck71Qr7h.js → mermaid.core-DpFOXZmb.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BRFEcJw_.js → mindmap-definition-RKZ34NQL-Dt-9JT_z.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CwihXXcJ.js → pieDiagram-4H26LBE5-aD3cg6m3.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-moiRw4Cm.js → quadrantDiagram-W4KKPZXB-DUh4hgmW.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-tshvM_vV.js → requirementDiagram-4Y6WPE33-DOgz-iLT.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-rtKIuBEp.js → sankeyDiagram-5OEKKPKP-BqpDXW6-.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-lkTCo4wE.js → sequenceDiagram-3UESZ5HK-BM0Gvqia.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CFQhVUSd.js → stateDiagram-AJRCARHV-XZMyDtEy.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C0Qe8FiL.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BmlQ7Wiy.js → timeline-definition-PNZ67QCA-gqiDwxVu.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CZyZepcT.js → vennDiagram-CIIHVFJN-MxeqqqyG.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C2b52gni.js → wardleyDiagram-YWT4CUSO-pMgGO6cB.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-FqnROUHq.js → xychartDiagram-2RQKCTM6-_VK_NZDn.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +452 -7
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +309 -195
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/activeAutomationChild.js +6 -1
- package/dist/server/lib/activeAutomationChild.js.map +1 -1
- package/dist/server/lib/automationCheckGate.js +183 -50
- package/dist/server/lib/automationCheckGate.js.map +1 -1
- package/dist/server/lib/automationProgression.js +76 -9
- package/dist/server/lib/automationProgression.js.map +1 -1
- package/dist/server/lib/automationReconciliation.js +65 -0
- package/dist/server/lib/automationReconciliation.js.map +1 -1
- package/dist/server/lib/automationResumeDecision.js +69 -32
- package/dist/server/lib/automationResumeDecision.js.map +1 -1
- package/dist/server/lib/automationReviewGate.js +6 -1
- package/dist/server/lib/automationReviewGate.js.map +1 -1
- package/dist/server/lib/bundleActivity.js +20 -0
- package/dist/server/lib/bundleActivity.js.map +1 -1
- package/dist/server/lib/bundleReviewOperations.js +36 -5
- package/dist/server/lib/bundleReviewOperations.js.map +1 -1
- package/dist/server/lib/chatTicketProposals.js +2 -1
- package/dist/server/lib/chatTicketProposals.js.map +1 -1
- package/dist/server/lib/checkDiagnosticParsers.js +301 -0
- package/dist/server/lib/checkDiagnosticParsers.js.map +1 -0
- package/dist/server/lib/checkDiagnostics.js +142 -0
- package/dist/server/lib/checkDiagnostics.js.map +1 -0
- package/dist/server/lib/checkGateEvaluations.js +89 -1
- package/dist/server/lib/checkGateEvaluations.js.map +1 -1
- package/dist/server/lib/checkRepair.js +1031 -0
- package/dist/server/lib/checkRepair.js.map +1 -0
- package/dist/server/lib/checkRepairLifecycle.js +56 -0
- package/dist/server/lib/checkRepairLifecycle.js.map +1 -0
- package/dist/server/lib/checkRepairReconciliation.js +145 -0
- package/dist/server/lib/checkRepairReconciliation.js.map +1 -0
- package/dist/server/lib/checkRunner.js +115 -21
- package/dist/server/lib/checkRunner.js.map +1 -1
- package/dist/server/lib/checkRuns.js +37 -3
- package/dist/server/lib/checkRuns.js.map +1 -1
- package/dist/server/lib/executionReconciliation.js +21 -11
- package/dist/server/lib/executionReconciliation.js.map +1 -1
- package/dist/server/lib/executionRetryPredicates.js +3 -1
- package/dist/server/lib/executionRetryPredicates.js.map +1 -1
- package/dist/server/lib/executionRunRetention.js +24 -3
- package/dist/server/lib/executionRunRetention.js.map +1 -1
- package/dist/server/lib/executionRuns.js +5 -2
- package/dist/server/lib/executionRuns.js.map +1 -1
- package/dist/server/lib/planModeQuestions.js +2 -0
- package/dist/server/lib/planModeQuestions.js.map +1 -1
- package/dist/server/lib/planQuestions.js +39 -7
- package/dist/server/lib/planQuestions.js.map +1 -1
- package/dist/server/lib/projectMemorySuggestions.js +2 -1
- package/dist/server/lib/projectMemorySuggestions.js.map +1 -1
- package/dist/server/lib/projects.js +1 -26
- package/dist/server/lib/projects.js.map +1 -1
- package/dist/server/lib/pullRequestContent.js +14 -0
- package/dist/server/lib/pullRequestContent.js.map +1 -1
- package/dist/server/lib/requiredCheckPolicy.js +13 -49
- package/dist/server/lib/requiredCheckPolicy.js.map +1 -1
- package/dist/server/lib/requiredCheckPolicyPrompt.js +46 -0
- package/dist/server/lib/requiredCheckPolicyPrompt.js.map +1 -0
- package/dist/server/lib/specDraft.js +6 -0
- package/dist/server/lib/specDraft.js.map +1 -1
- package/dist/server/lib/specResources.js +42 -0
- package/dist/server/lib/specResources.js.map +1 -0
- package/dist/server/lib/specs.js +9 -5
- package/dist/server/lib/specs.js.map +1 -1
- package/dist/server/lib/ticketAutomation.js +10 -3
- package/dist/server/lib/ticketAutomation.js.map +1 -1
- package/dist/server/lib/ticketAutomationCommit.js +36 -11
- package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
- package/dist/server/lib/ticketFollowUpOperations.js +24 -9
- package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
- package/dist/server/lib/tickets.js +9 -32
- package/dist/server/lib/tickets.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 +34 -12
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/chat.js +4 -3
- package/dist/server/workers/chat.js.map +1 -1
- package/dist/server/workers/followUp.js +60 -17
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/plan.js +5 -3
- package/dist/server/workers/plan.js.map +1 -1
- package/dist/server/workers/planFollowUp.js +5 -6
- package/dist/server/workers/planFollowUp.js.map +1 -1
- package/dist/server/workers/review.js +38 -6
- package/dist/server/workers/review.js.map +1 -1
- package/dist/server/workers/specSession.js +10 -4
- package/dist/server/workers/specSession.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/VerificationDialog-B4Pyz1LV.js +0 -4
- package/dist/client/assets/channel-DWPRC-jg.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DBZaZLLc.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B7HsVFoJ.js +0 -1
- package/dist/client/assets/index-D-miHTTb.js +0 -273
- package/dist/client/assets/index-TAQIlNdJ.css +0 -2
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-rrN4DgWp.js +0 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve } from 'path';
|
|
2
|
+
export const CHECK_DIAGNOSTIC_PARSER_VERSION = '1';
|
|
3
|
+
export const CHECK_DIAGNOSTIC_LIMIT = 500;
|
|
4
|
+
export const CHECK_DIAGNOSTIC_MESSAGE_LIMIT_BYTES = 16 * 1024;
|
|
5
|
+
export const CHECK_DIAGNOSTIC_PATH_LIMIT_BYTES = 4 * 1024;
|
|
6
|
+
export const CHECK_DIAGNOSTIC_CODE_LIMIT_BYTES = 256;
|
|
7
|
+
export const CHECK_DIAGNOSTIC_INCOMPLETE_BUFFER_LIMIT_BYTES = 64 * 1024;
|
|
8
|
+
const byteLength = (value) => Buffer.byteLength(value, 'utf8');
|
|
9
|
+
const retainUtf8Prefix = (value, byteLimit) => {
|
|
10
|
+
if (byteLength(value) <= byteLimit) {
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
let low = 0;
|
|
14
|
+
let high = value.length;
|
|
15
|
+
while (low < high) {
|
|
16
|
+
const midpoint = Math.ceil((low + high) / 2);
|
|
17
|
+
if (byteLength(value.slice(0, midpoint)) <= byteLimit) {
|
|
18
|
+
low = midpoint;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
high = midpoint - 1;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
let end = low;
|
|
25
|
+
if (end > 0 && end < value.length) {
|
|
26
|
+
const previous = value.charCodeAt(end - 1);
|
|
27
|
+
const next = value.charCodeAt(end);
|
|
28
|
+
if (previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) {
|
|
29
|
+
end -= 1;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return value.slice(0, end);
|
|
33
|
+
};
|
|
34
|
+
const normalizeSeverity = (value) => {
|
|
35
|
+
const normalized = value.toLowerCase();
|
|
36
|
+
if (normalized === 'error' || normalized === 'warning' || normalized === 'info') {
|
|
37
|
+
return normalized;
|
|
38
|
+
}
|
|
39
|
+
return 'unknown';
|
|
40
|
+
};
|
|
41
|
+
const isPathInside = (root, candidate) => {
|
|
42
|
+
const pathFromRoot = relative(root, candidate).replaceAll('\\', '/');
|
|
43
|
+
return pathFromRoot === '' || (!pathFromRoot.startsWith('..') && !pathFromRoot.includes('/../'));
|
|
44
|
+
};
|
|
45
|
+
const normalizeLocation = (pathValue, startLine, startColumn, workspaceCwd, checkCwd, pathByteLimit) => {
|
|
46
|
+
if (!Number.isSafeInteger(startLine) || startLine < 1 || !Number.isSafeInteger(startColumn) || startColumn < 1) {
|
|
47
|
+
return { file_path: null, start_line: null, start_column: null, end_line: null, end_column: null };
|
|
48
|
+
}
|
|
49
|
+
const absolutePath = resolve(isAbsolute(pathValue) ? pathValue : resolve(checkCwd, pathValue));
|
|
50
|
+
if (!isPathInside(workspaceCwd, absolutePath)) {
|
|
51
|
+
return { file_path: null, start_line: null, start_column: null, end_line: null, end_column: null };
|
|
52
|
+
}
|
|
53
|
+
const normalizedPath = relative(workspaceCwd, absolutePath).replaceAll('\\', '/') || '.';
|
|
54
|
+
if (byteLength(normalizedPath) > pathByteLimit) {
|
|
55
|
+
return { file_path: null, start_line: null, start_column: null, end_line: null, end_column: null };
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
file_path: normalizedPath,
|
|
59
|
+
start_line: startLine,
|
|
60
|
+
start_column: startColumn,
|
|
61
|
+
end_line: null,
|
|
62
|
+
end_column: null,
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
const createAnsiStripper = () => {
|
|
66
|
+
let state = 'text';
|
|
67
|
+
return (chunk, finish = false) => {
|
|
68
|
+
let output = '';
|
|
69
|
+
for (const character of chunk) {
|
|
70
|
+
if (state === 'text') {
|
|
71
|
+
if (character === '\u001b') {
|
|
72
|
+
state = 'escape';
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
output += character;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (state === 'escape') {
|
|
79
|
+
if (character === '[') {
|
|
80
|
+
state = 'csi';
|
|
81
|
+
}
|
|
82
|
+
else if (character === ']') {
|
|
83
|
+
state = 'osc';
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
state = 'text';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (state === 'csi') {
|
|
90
|
+
if (character >= '@' && character <= '~') {
|
|
91
|
+
state = 'text';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (state === 'osc') {
|
|
95
|
+
if (character === '\u0007') {
|
|
96
|
+
state = 'text';
|
|
97
|
+
}
|
|
98
|
+
else if (character === '\u001b') {
|
|
99
|
+
state = 'osc_escape';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (character === '\\') {
|
|
103
|
+
state = 'text';
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
state = character === '\u001b' ? 'osc_escape' : 'osc';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (finish) {
|
|
110
|
+
state = 'text';
|
|
111
|
+
}
|
|
112
|
+
return output;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
export const createCheckDiagnosticParserSession = (input) => {
|
|
116
|
+
const diagnosticLimit = input.diagnosticLimit ?? CHECK_DIAGNOSTIC_LIMIT;
|
|
117
|
+
const messageByteLimit = input.messageByteLimit ?? CHECK_DIAGNOSTIC_MESSAGE_LIMIT_BYTES;
|
|
118
|
+
const pathByteLimit = input.pathByteLimit ?? CHECK_DIAGNOSTIC_PATH_LIMIT_BYTES;
|
|
119
|
+
const codeByteLimit = input.codeByteLimit ?? CHECK_DIAGNOSTIC_CODE_LIMIT_BYTES;
|
|
120
|
+
const incompleteBufferByteLimit = input.incompleteBufferByteLimit ?? CHECK_DIAGNOSTIC_INCOMPLETE_BUFFER_LIMIT_BYTES;
|
|
121
|
+
const compatibleKind = input.definition.category === 'typecheck'
|
|
122
|
+
? 'typescript'
|
|
123
|
+
: input.definition.category === 'lint' ? 'eslint' : null;
|
|
124
|
+
const stripAnsi = createAnsiStripper();
|
|
125
|
+
const diagnostics = [];
|
|
126
|
+
let emittedCount = 0;
|
|
127
|
+
let lineBuffer = '';
|
|
128
|
+
let current = null;
|
|
129
|
+
let eslintPath = null;
|
|
130
|
+
let recognized = false;
|
|
131
|
+
let malformedSignature = false;
|
|
132
|
+
let truncated = false;
|
|
133
|
+
const normalizeCode = (value) => {
|
|
134
|
+
if (!value) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (byteLength(value) > codeByteLimit) {
|
|
138
|
+
truncated = true;
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return value;
|
|
142
|
+
};
|
|
143
|
+
const finalizeCurrent = () => {
|
|
144
|
+
if (!current) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const message = current.messageParts.join('\n').trim();
|
|
148
|
+
if (message) {
|
|
149
|
+
const boundedMessage = retainUtf8Prefix(message, messageByteLimit);
|
|
150
|
+
truncated ||= boundedMessage !== message;
|
|
151
|
+
if (emittedCount < diagnosticLimit) {
|
|
152
|
+
const { messageParts: _messageParts, ...diagnostic } = current;
|
|
153
|
+
diagnostics.push({ ...diagnostic, message: boundedMessage });
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
truncated = true;
|
|
157
|
+
}
|
|
158
|
+
emittedCount += 1;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
malformedSignature = true;
|
|
162
|
+
}
|
|
163
|
+
current = null;
|
|
164
|
+
};
|
|
165
|
+
const startDiagnostic = (diagnostic, message) => {
|
|
166
|
+
finalizeCurrent();
|
|
167
|
+
recognized = true;
|
|
168
|
+
current = { ...diagnostic, message: '', messageParts: [message] };
|
|
169
|
+
};
|
|
170
|
+
const appendMessagePart = (value) => {
|
|
171
|
+
if (!current) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const existing = current.messageParts.join('\n');
|
|
175
|
+
const combined = `${existing}\n${value}`;
|
|
176
|
+
const bounded = retainUtf8Prefix(combined, messageByteLimit);
|
|
177
|
+
truncated ||= bounded !== combined;
|
|
178
|
+
current.messageParts = [bounded];
|
|
179
|
+
};
|
|
180
|
+
const processTypeScriptLine = (line) => {
|
|
181
|
+
const match = /^(.+?)(?:\((\d+),(\d+)\):?|:(\d+):(\d+))\s*(?:-\s*)?([^\s:]+)\s+(TS\d+):\s*(.*)$/.exec(line);
|
|
182
|
+
if (match) {
|
|
183
|
+
const lineNumber = Number(match[2] ?? match[4]);
|
|
184
|
+
const columnNumber = Number(match[3] ?? match[5]);
|
|
185
|
+
startDiagnostic({
|
|
186
|
+
severity: normalizeSeverity(match[6]),
|
|
187
|
+
code: normalizeCode(match[7]),
|
|
188
|
+
...normalizeLocation(match[1], lineNumber, columnNumber, input.workspaceCwd, input.checkCwd, pathByteLimit),
|
|
189
|
+
}, match[8]);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const globalMatch = /^([^\s:]+)\s+(TS\d+):\s*(.*)$/.exec(line);
|
|
193
|
+
if (globalMatch) {
|
|
194
|
+
startDiagnostic({
|
|
195
|
+
severity: normalizeSeverity(globalMatch[1]),
|
|
196
|
+
code: normalizeCode(globalMatch[2]),
|
|
197
|
+
file_path: null,
|
|
198
|
+
start_line: null,
|
|
199
|
+
start_column: null,
|
|
200
|
+
end_line: null,
|
|
201
|
+
end_column: null,
|
|
202
|
+
}, globalMatch[3]);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (/\bTS\d+\s*:/.test(line)) {
|
|
206
|
+
malformedSignature = true;
|
|
207
|
+
}
|
|
208
|
+
if (current && line.trim() && !/^Found \d+ errors?\b/.test(line)) {
|
|
209
|
+
appendMessagePart(line.trimEnd());
|
|
210
|
+
}
|
|
211
|
+
else if (current && !line.trim()) {
|
|
212
|
+
finalizeCurrent();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
const processEslintLine = (line) => {
|
|
216
|
+
const match = /^\s*(\d+):(\d+)\s+([^\s]+)\s+(.+?)(?:\s{2,}([^\s]+))?\s*$/.exec(line);
|
|
217
|
+
if (match && eslintPath) {
|
|
218
|
+
const message = match[4];
|
|
219
|
+
const code = normalizeCode(match[5] ?? null);
|
|
220
|
+
startDiagnostic({
|
|
221
|
+
severity: normalizeSeverity(match[3]),
|
|
222
|
+
code,
|
|
223
|
+
...normalizeLocation(eslintPath, Number(match[1]), Number(match[2]), input.workspaceCwd, input.checkCwd, pathByteLimit),
|
|
224
|
+
}, message);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (/^\s*\d+:\d+\s+/.test(line)) {
|
|
228
|
+
malformedSignature = true;
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (!line.trim()) {
|
|
232
|
+
finalizeCurrent();
|
|
233
|
+
eslintPath = null;
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (/^\s*[✖✕]\s+\d+ problems?/.test(line) || /^\s*\d+ problems?/.test(line)) {
|
|
237
|
+
finalizeCurrent();
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (!/^\s/.test(line)) {
|
|
241
|
+
finalizeCurrent();
|
|
242
|
+
eslintPath = line.trim();
|
|
243
|
+
}
|
|
244
|
+
else if (current) {
|
|
245
|
+
appendMessagePart(line.trimEnd());
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const processLine = (line) => {
|
|
249
|
+
const boundedLine = retainUtf8Prefix(line, incompleteBufferByteLimit);
|
|
250
|
+
truncated ||= boundedLine !== line;
|
|
251
|
+
const normalizedLine = boundedLine.endsWith('\r') ? boundedLine.slice(0, -1) : boundedLine;
|
|
252
|
+
if (compatibleKind === 'typescript') {
|
|
253
|
+
processTypeScriptLine(normalizedLine);
|
|
254
|
+
}
|
|
255
|
+
else if (compatibleKind === 'eslint') {
|
|
256
|
+
processEslintLine(normalizedLine);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
const push = (chunk) => {
|
|
260
|
+
const beforeCount = diagnostics.length;
|
|
261
|
+
lineBuffer += stripAnsi(chunk);
|
|
262
|
+
if (byteLength(lineBuffer) > incompleteBufferByteLimit && !lineBuffer.includes('\n')) {
|
|
263
|
+
lineBuffer = retainUtf8Prefix(lineBuffer, incompleteBufferByteLimit);
|
|
264
|
+
truncated = true;
|
|
265
|
+
malformedSignature = true;
|
|
266
|
+
}
|
|
267
|
+
let newlineIndex = lineBuffer.indexOf('\n');
|
|
268
|
+
while (newlineIndex >= 0) {
|
|
269
|
+
processLine(lineBuffer.slice(0, newlineIndex));
|
|
270
|
+
lineBuffer = lineBuffer.slice(newlineIndex + 1);
|
|
271
|
+
newlineIndex = lineBuffer.indexOf('\n');
|
|
272
|
+
}
|
|
273
|
+
return diagnostics.slice(beforeCount);
|
|
274
|
+
};
|
|
275
|
+
const finish = () => {
|
|
276
|
+
lineBuffer += stripAnsi('', true);
|
|
277
|
+
if (lineBuffer) {
|
|
278
|
+
processLine(lineBuffer);
|
|
279
|
+
lineBuffer = '';
|
|
280
|
+
}
|
|
281
|
+
finalizeCurrent();
|
|
282
|
+
if (!compatibleKind || !recognized) {
|
|
283
|
+
return {
|
|
284
|
+
parser_kind: 'none',
|
|
285
|
+
parser_version: null,
|
|
286
|
+
status: malformedSignature ? 'malformed' : 'unsupported',
|
|
287
|
+
diagnostics: [],
|
|
288
|
+
truncated,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
parser_kind: compatibleKind,
|
|
293
|
+
parser_version: CHECK_DIAGNOSTIC_PARSER_VERSION,
|
|
294
|
+
status: 'complete',
|
|
295
|
+
diagnostics,
|
|
296
|
+
truncated,
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
return { push, finish };
|
|
300
|
+
};
|
|
301
|
+
//# sourceMappingURL=checkDiagnosticParsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkDiagnosticParsers.js","sourceRoot":"","sources":["../../../server/lib/checkDiagnosticParsers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import db from '../db.js';
|
|
3
|
+
import { appendCheckAttemptOutput } from './checkRuns.js';
|
|
4
|
+
const toParserState = (row) => ({
|
|
5
|
+
...row,
|
|
6
|
+
truncated: row.truncated === 1,
|
|
7
|
+
});
|
|
8
|
+
const assertAttemptOwnership = (projectId, attemptRunId) => {
|
|
9
|
+
const row = db.prepare(`
|
|
10
|
+
SELECT details.definition_id
|
|
11
|
+
FROM check_attempt_details details
|
|
12
|
+
JOIN execution_runs run ON run.id = details.execution_run_id
|
|
13
|
+
WHERE run.project_id = ? AND run.id = ? AND run.kind = 'check_attempt'
|
|
14
|
+
`).get(projectId, attemptRunId);
|
|
15
|
+
if (!row) {
|
|
16
|
+
throw new Error(`Check attempt ${attemptRunId} was not found in project ${projectId}`);
|
|
17
|
+
}
|
|
18
|
+
return row;
|
|
19
|
+
};
|
|
20
|
+
export const initializeCheckDiagnosticParser = (projectId, attemptRunId) => {
|
|
21
|
+
const attempt = assertAttemptOwnership(projectId, attemptRunId);
|
|
22
|
+
db.prepare(`
|
|
23
|
+
INSERT OR IGNORE INTO check_attempt_diagnostic_parsers (
|
|
24
|
+
attempt_run_id, definition_id, parser_kind, status
|
|
25
|
+
) VALUES (?, ?, 'none', 'pending')
|
|
26
|
+
`).run(attemptRunId, attempt.definition_id);
|
|
27
|
+
return getCheckDiagnosticParserState(projectId, attemptRunId);
|
|
28
|
+
};
|
|
29
|
+
export const appendCheckDiagnostics = (input) => {
|
|
30
|
+
if (input.diagnostics.length === 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const append = db.transaction(() => {
|
|
34
|
+
const state = getCheckDiagnosticParserState(input.projectId, input.attemptRunId)
|
|
35
|
+
?? initializeCheckDiagnosticParser(input.projectId, input.attemptRunId);
|
|
36
|
+
if (state.status !== 'pending' || state.retention_state !== 'retained') {
|
|
37
|
+
throw new Error(`Check attempt ${input.attemptRunId} diagnostics cannot be appended`);
|
|
38
|
+
}
|
|
39
|
+
const insert = db.prepare(`
|
|
40
|
+
INSERT INTO check_attempt_diagnostics (
|
|
41
|
+
id, attempt_run_id, definition_id, ordinal, severity, message, code, file_path,
|
|
42
|
+
start_line, start_column, end_line, end_column
|
|
43
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
44
|
+
`);
|
|
45
|
+
let ordinal = state.diagnostic_count;
|
|
46
|
+
for (const diagnostic of input.diagnostics) {
|
|
47
|
+
insert.run(randomUUID(), input.attemptRunId, state.definition_id, ordinal, diagnostic.severity, diagnostic.message, diagnostic.code, diagnostic.file_path, diagnostic.start_line, diagnostic.start_column, diagnostic.end_line, diagnostic.end_column);
|
|
48
|
+
ordinal += 1;
|
|
49
|
+
}
|
|
50
|
+
db.prepare(`
|
|
51
|
+
UPDATE check_attempt_diagnostic_parsers SET diagnostic_count = ? WHERE attempt_run_id = ?
|
|
52
|
+
`).run(ordinal, input.attemptRunId);
|
|
53
|
+
});
|
|
54
|
+
append.immediate();
|
|
55
|
+
};
|
|
56
|
+
export const appendCheckAttemptEvidence = (input) => {
|
|
57
|
+
const append = db.transaction(() => {
|
|
58
|
+
const output = appendCheckAttemptOutput({
|
|
59
|
+
projectId: input.projectId,
|
|
60
|
+
runId: input.attemptRunId,
|
|
61
|
+
chunk: input.chunk,
|
|
62
|
+
});
|
|
63
|
+
appendCheckDiagnostics({
|
|
64
|
+
projectId: input.projectId,
|
|
65
|
+
attemptRunId: input.attemptRunId,
|
|
66
|
+
diagnostics: input.diagnostics,
|
|
67
|
+
});
|
|
68
|
+
return output;
|
|
69
|
+
});
|
|
70
|
+
return append.immediate();
|
|
71
|
+
};
|
|
72
|
+
export const completeCheckDiagnosticParser = (input) => {
|
|
73
|
+
const complete = db.transaction(() => {
|
|
74
|
+
const state = getCheckDiagnosticParserState(input.projectId, input.attemptRunId)
|
|
75
|
+
?? initializeCheckDiagnosticParser(input.projectId, input.attemptRunId);
|
|
76
|
+
if (state.status !== 'pending') {
|
|
77
|
+
throw new Error(`Check attempt ${input.attemptRunId} diagnostic parser is already terminal`);
|
|
78
|
+
}
|
|
79
|
+
if (state.diagnostic_count !== input.result.diagnostics.length) {
|
|
80
|
+
throw new Error('Persisted diagnostic count does not match the completed parser result');
|
|
81
|
+
}
|
|
82
|
+
db.prepare(`
|
|
83
|
+
UPDATE check_attempt_diagnostic_parsers
|
|
84
|
+
SET parser_kind = ?, parser_version = ?, status = ?, truncated = ?
|
|
85
|
+
WHERE attempt_run_id = ?
|
|
86
|
+
`).run(input.result.parser_kind, input.result.parser_version, input.result.status, input.result.truncated ? 1 : 0, input.attemptRunId);
|
|
87
|
+
});
|
|
88
|
+
complete.immediate();
|
|
89
|
+
return getCheckDiagnosticParserState(input.projectId, input.attemptRunId);
|
|
90
|
+
};
|
|
91
|
+
export const getCheckDiagnosticParserState = (projectId, attemptRunId) => {
|
|
92
|
+
const row = db.prepare(`
|
|
93
|
+
SELECT parser.*
|
|
94
|
+
FROM check_attempt_diagnostic_parsers parser
|
|
95
|
+
JOIN execution_runs run ON run.id = parser.attempt_run_id
|
|
96
|
+
WHERE run.project_id = ? AND run.id = ?
|
|
97
|
+
`).get(projectId, attemptRunId);
|
|
98
|
+
return row ? toParserState(row) : null;
|
|
99
|
+
};
|
|
100
|
+
export const listCheckAttemptDiagnostics = (projectId, attemptRunId) => db.prepare(`
|
|
101
|
+
SELECT diagnostic.*
|
|
102
|
+
FROM check_attempt_diagnostics diagnostic
|
|
103
|
+
JOIN execution_runs run ON run.id = diagnostic.attempt_run_id
|
|
104
|
+
WHERE run.project_id = ? AND run.id = ?
|
|
105
|
+
ORDER BY diagnostic.ordinal ASC
|
|
106
|
+
`).all(projectId, attemptRunId);
|
|
107
|
+
export const getCheckAttemptDiagnosticResponse = (projectId, attemptRunId) => {
|
|
108
|
+
const parser = getCheckDiagnosticParserState(projectId, attemptRunId);
|
|
109
|
+
if (!parser) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
attempt_run_id: attemptRunId,
|
|
114
|
+
definition_id: parser.definition_id,
|
|
115
|
+
parser,
|
|
116
|
+
diagnostics: parser.retention_state === 'retained' ? listCheckAttemptDiagnostics(projectId, attemptRunId) : [],
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
export const getCheckBatchDiagnosticResponse = (projectId, batchRunId) => {
|
|
120
|
+
const batch = db.prepare(`
|
|
121
|
+
SELECT details.execution_run_id
|
|
122
|
+
FROM check_batch_details details
|
|
123
|
+
JOIN execution_runs run ON run.id = details.execution_run_id
|
|
124
|
+
WHERE run.project_id = ? AND run.id = ?
|
|
125
|
+
`).get(projectId, batchRunId);
|
|
126
|
+
if (!batch) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const attemptRows = db.prepare(`
|
|
130
|
+
SELECT attempt.execution_run_id
|
|
131
|
+
FROM check_attempt_details attempt
|
|
132
|
+
JOIN execution_runs run ON run.id = attempt.execution_run_id
|
|
133
|
+
WHERE run.project_id = ? AND attempt.batch_run_id = ?
|
|
134
|
+
ORDER BY run.created_at ASC, run.id ASC
|
|
135
|
+
`).all(projectId, batchRunId);
|
|
136
|
+
return {
|
|
137
|
+
batch_run_id: batchRunId,
|
|
138
|
+
attempts: attemptRows.map(row => getCheckAttemptDiagnosticResponse(projectId, row.execution_run_id)).filter(Boolean),
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
export const isCheckDiagnosticSeverity = (value) => ['error', 'warning', 'info', 'unknown'].includes(value);
|
|
142
|
+
//# sourceMappingURL=checkDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkDiagnostics.js","sourceRoot":"","sources":["../../../server/lib/checkDiagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,11 @@ import { randomUUID } from 'crypto';
|
|
|
2
2
|
import db from '../db.js';
|
|
3
3
|
import { getCheckDefinitionFingerprint } from './checkDefinitions.js';
|
|
4
4
|
import { getCheckConfigurationFingerprint, isCheckAttemptCurrent } from './checkRuns.js';
|
|
5
|
-
import { getRequiredCheckPolicySnapshotFingerprint } from './requiredCheckPolicy.js';
|
|
5
|
+
import { getInvalidRequiredCheckPolicyFingerprint, getRequiredCheckPolicySnapshotFingerprint } from './requiredCheckPolicy.js';
|
|
6
6
|
import { truncateUtf8 } from './transcriptRuns.js';
|
|
7
7
|
export const CHECK_GATE_REASON_CODES = [
|
|
8
8
|
'not_required',
|
|
9
|
+
'policy_invalid',
|
|
9
10
|
'policy_drift',
|
|
10
11
|
'workspace_unavailable',
|
|
11
12
|
'intended_identity_mismatch',
|
|
@@ -19,8 +20,55 @@ export const CHECK_GATE_REASON_CODES = [
|
|
|
19
20
|
'attempt_failed',
|
|
20
21
|
'attempt_stale',
|
|
21
22
|
'target_busy',
|
|
23
|
+
'check_start_failed',
|
|
22
24
|
];
|
|
23
25
|
const reasonOrder = new Map(CHECK_GATE_REASON_CODES.map((code, index) => [code, index]));
|
|
26
|
+
const reasonDescriptions = {
|
|
27
|
+
not_required: 'required checks are not configured',
|
|
28
|
+
policy_invalid: 'the required-check policy is invalid',
|
|
29
|
+
policy_drift: 'the required-check policy changed',
|
|
30
|
+
workspace_unavailable: 'the workspace is unavailable',
|
|
31
|
+
intended_identity_mismatch: 'the checked workspace no longer matches the automation target',
|
|
32
|
+
missing_evidence: 'required check evidence is missing',
|
|
33
|
+
target_mismatch: 'the checks targeted a different workspace or bundle',
|
|
34
|
+
batch_not_completed: 'the required-check batch has not finished',
|
|
35
|
+
incomplete_evidence: 'required check evidence is incomplete',
|
|
36
|
+
duplicate_evidence: 'duplicate required check evidence was found',
|
|
37
|
+
extra_evidence: 'unexpected required check evidence was found',
|
|
38
|
+
definition_drift: 'a required check definition changed',
|
|
39
|
+
attempt_failed: 'one or more required checks failed',
|
|
40
|
+
attempt_stale: 'required check evidence is stale',
|
|
41
|
+
target_busy: 'another check run is already using the target',
|
|
42
|
+
check_start_failed: 'the required checks could not be started',
|
|
43
|
+
};
|
|
44
|
+
const boundaryDescriptions = {
|
|
45
|
+
check_completion: 'check completion',
|
|
46
|
+
automation_review: 'Review progression',
|
|
47
|
+
automation_commit: 'commit',
|
|
48
|
+
automation_push: 'push',
|
|
49
|
+
automation_pull_request: 'pull-request creation',
|
|
50
|
+
};
|
|
51
|
+
export const createRequiredCheckGateFailure = (boundaryKind, reasonCodes) => ({
|
|
52
|
+
type: 'required_check_gate_failure',
|
|
53
|
+
boundaryKind,
|
|
54
|
+
reasonCodes: [...new Set(reasonCodes.filter(reasonCode => CHECK_GATE_REASON_CODES.includes(reasonCode)))],
|
|
55
|
+
});
|
|
56
|
+
export const formatRequiredCheckGateFailureMessage = (boundaryKind, reasonCodes) => {
|
|
57
|
+
const failure = createRequiredCheckGateFailure(boundaryKind, reasonCodes);
|
|
58
|
+
const descriptions = failure.reasonCodes.map(reasonCode => reasonDescriptions[reasonCode]);
|
|
59
|
+
const explanationDescriptions = descriptions.map((description, index) => index === 0
|
|
60
|
+
? `${description.charAt(0).toUpperCase()}${description.slice(1)}`
|
|
61
|
+
: description);
|
|
62
|
+
const explanation = descriptions.length > 0
|
|
63
|
+
? ` ${explanationDescriptions.join('; ')}.`
|
|
64
|
+
: ' The required checks did not produce usable evidence.';
|
|
65
|
+
return `Required checks blocked the automated ${boundaryDescriptions[boundaryKind] ?? 'automation boundary'}.${explanation} Review the check results and rerun any failed or unfinished checks before resuming automation.`;
|
|
66
|
+
};
|
|
67
|
+
export const serializeRequiredCheckGateFailure = (failure, includeReasonCodes = true) => JSON.stringify({
|
|
68
|
+
type: failure.type,
|
|
69
|
+
boundaryKind: failure.boundaryKind,
|
|
70
|
+
...(includeReasonCodes ? { reasonCodes: failure.reasonCodes } : {}),
|
|
71
|
+
});
|
|
24
72
|
const targetKey = ({ projectId, bundleId }) => `${projectId}\u0000${bundleId}`;
|
|
25
73
|
const compareUtf8 = (left, right) => Buffer.compare(Buffer.from(left, 'utf8'), Buffer.from(right, 'utf8'));
|
|
26
74
|
const sortAttempts = (attempts) => [...attempts].sort((left, right) => (compareUtf8(left.definition_id, right.definition_id) || compareUtf8(left.execution_run_id, right.execution_run_id)));
|
|
@@ -42,6 +90,11 @@ const addMultiplicityReasons = (reasons, requiredIds, representedIds) => {
|
|
|
42
90
|
}
|
|
43
91
|
};
|
|
44
92
|
const isPolicySnapshotValid = (policy, target, boundaryKind) => {
|
|
93
|
+
if (policy.status === 'invalid') {
|
|
94
|
+
return policy.definitionIds.length === 0
|
|
95
|
+
&& policy.definitions.length === 0
|
|
96
|
+
&& policy.fingerprint === getInvalidRequiredCheckPolicyFingerprint(policy.error, target, boundaryKind);
|
|
97
|
+
}
|
|
45
98
|
const definitionIds = policy.definitions.map(definition => definition.id);
|
|
46
99
|
return new Set(policy.definitionIds).size === policy.definitionIds.length
|
|
47
100
|
&& new Set(definitionIds).size === definitionIds.length
|
|
@@ -53,6 +106,9 @@ export const evaluateCheckGate = (input) => {
|
|
|
53
106
|
const attempts = sortAttempts(input.attempts);
|
|
54
107
|
const requiredIds = input.policy.definitionIds;
|
|
55
108
|
const requiredById = new Map(input.policy.definitions.map(definition => [definition.id, definition]));
|
|
109
|
+
if (input.policy.status === 'invalid') {
|
|
110
|
+
reasons.add('policy_invalid');
|
|
111
|
+
}
|
|
56
112
|
if (!isPolicySnapshotValid(input.policy, input.target, input.boundaryKind)) {
|
|
57
113
|
reasons.add('policy_drift');
|
|
58
114
|
}
|
|
@@ -183,9 +239,14 @@ export const createCheckGateAttemptSnapshot = (attempt, workspaceIdentity) => {
|
|
|
183
239
|
};
|
|
184
240
|
const fromRow = (row, attempts) => {
|
|
185
241
|
const snapshot = JSON.parse(row.snapshot_json);
|
|
242
|
+
const persistedPolicy = snapshot.policy;
|
|
243
|
+
const policy = 'status' in persistedPolicy
|
|
244
|
+
? persistedPolicy
|
|
245
|
+
: { ...persistedPolicy, status: 'valid' };
|
|
186
246
|
return {
|
|
187
247
|
id: row.id,
|
|
188
248
|
...snapshot,
|
|
249
|
+
policy,
|
|
189
250
|
decision: row.decision,
|
|
190
251
|
reasonCodes: JSON.parse(row.reason_codes_json),
|
|
191
252
|
evaluatedAttempts: attempts.map(attempt => ({
|
|
@@ -202,6 +263,33 @@ const fromRow = (row, attempts) => {
|
|
|
202
263
|
createdAt: row.created_at,
|
|
203
264
|
};
|
|
204
265
|
};
|
|
266
|
+
const getResolutionFingerprint = (resolution, target, boundaryKind) => resolution.status === 'valid'
|
|
267
|
+
? getRequiredCheckPolicySnapshotFingerprint(resolution.policy, target, boundaryKind)
|
|
268
|
+
: getInvalidRequiredCheckPolicyFingerprint(resolution.error, target, boundaryKind);
|
|
269
|
+
export const hydrateCheckGatePresentApplicability = (evaluation, currentWorkspaceIdentity, currentPolicyResolution) => {
|
|
270
|
+
const workspace = currentWorkspaceIdentity?.state !== 'available'
|
|
271
|
+
? 'unavailable'
|
|
272
|
+
: evaluation.workspaceIdentity.state !== 'available'
|
|
273
|
+
? 'stale'
|
|
274
|
+
: evaluation.workspaceIdentity.fingerprint === currentWorkspaceIdentity.fingerprint
|
|
275
|
+
? 'current'
|
|
276
|
+
: 'stale';
|
|
277
|
+
const policy = currentPolicyResolution === null
|
|
278
|
+
? 'unavailable'
|
|
279
|
+
: getResolutionFingerprint(currentPolicyResolution, evaluation.target, evaluation.boundaryKind) === evaluation.policy.fingerprint
|
|
280
|
+
? 'current'
|
|
281
|
+
: 'stale';
|
|
282
|
+
return {
|
|
283
|
+
...evaluation,
|
|
284
|
+
presentApplicability: {
|
|
285
|
+
workspace,
|
|
286
|
+
policy,
|
|
287
|
+
appliesToCurrentState: workspace === 'unavailable' || policy === 'unavailable'
|
|
288
|
+
? null
|
|
289
|
+
: workspace === 'current' && policy === 'current',
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
};
|
|
205
293
|
const toSummary = (row) => ({
|
|
206
294
|
id: row.id,
|
|
207
295
|
decision: row.decision,
|