@straiffi/archon 1.7.9 → 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.
Files changed (170) hide show
  1. package/dist/client/assets/{ActivityView-CDLQOXZm.js → ActivityView-EVy76nes.js} +1 -1
  2. package/dist/client/assets/{GitHubActionsDialog-DYxLX2HS.js → GitHubActionsDialog-D53aA0Fv.js} +1 -1
  3. package/dist/client/assets/VerificationDialog-Dm5DcY8F.js +4 -0
  4. package/dist/client/assets/{architectureDiagram-3BPJPVTR-ByNXcCIO.js → architectureDiagram-3BPJPVTR-CmMRkze6.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-GPEHLZMM-ByykLAaG.js → blockDiagram-GPEHLZMM-BgLsRgxM.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AAUBKEIU-CmWA4Pli.js → c4Diagram-AAUBKEIU-C3WJl13c.js} +1 -1
  7. package/dist/client/assets/channel-xqaERdN6.js +1 -0
  8. package/dist/client/assets/{chunk-2J33WTMH-CTgbXRh4.js → chunk-2J33WTMH-BfH4_PkQ.js} +1 -1
  9. package/dist/client/assets/{chunk-3OPIFGDE-D3FajVfq.js → chunk-3OPIFGDE-CkVGPLM4.js} +1 -1
  10. package/dist/client/assets/{chunk-5ZQYHXKU-CUMg_Vfo.js → chunk-5ZQYHXKU-CDTwT753.js} +1 -1
  11. package/dist/client/assets/{chunk-727SXJPM-Oc9MgxZD.js → chunk-727SXJPM-CKEhBrr_.js} +1 -1
  12. package/dist/client/assets/{chunk-AQP2D5EJ-5JZboHeP.js → chunk-AQP2D5EJ-D5QPK_k7.js} +1 -1
  13. package/dist/client/assets/{chunk-CSCIHK7Q-BpkSMHjB.js → chunk-CSCIHK7Q-BU4Ysr_2.js} +1 -1
  14. package/dist/client/assets/{chunk-KSCS5N6A-BPBMAswO.js → chunk-KSCS5N6A-B9lHLGg1.js} +1 -1
  15. package/dist/client/assets/{chunk-L5ZTLDWV-BA2sHmu7.js → chunk-L5ZTLDWV-BrNsmxtD.js} +1 -1
  16. package/dist/client/assets/{chunk-LZXEDZCA-Blc9q-fQ.js → chunk-LZXEDZCA-CVgZc1nv.js} +2 -2
  17. package/dist/client/assets/{chunk-ND2GUHAM-GlVS74JP.js → chunk-ND2GUHAM-DWWdi42a.js} +1 -1
  18. package/dist/client/assets/{chunk-NZK2D7GU-fctBFnAm.js → chunk-NZK2D7GU-46-aRMvO.js} +1 -1
  19. package/dist/client/assets/{chunk-O5CBEL6O-eGs4DDLJ.js → chunk-O5CBEL6O-BW6wHmzD.js} +1 -1
  20. package/dist/client/assets/{chunk-WU5MYG2G-vxa50E7g.js → chunk-WU5MYG2G-Wfk15Qtf.js} +1 -1
  21. package/dist/client/assets/classDiagram-4FO5ZUOK-BdwFrsZE.js +1 -0
  22. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DxAuXA1L.js +1 -0
  23. package/dist/client/assets/{dagre-BM42HDAG-DXGXNVUp.js → dagre-BM42HDAG-CZ_BDahz.js} +1 -1
  24. package/dist/client/assets/{diagram-2AECGRRQ-BRYr1GvB.js → diagram-2AECGRRQ-CQKXQvjO.js} +1 -1
  25. package/dist/client/assets/{diagram-5GNKFQAL-BcwgMag4.js → diagram-5GNKFQAL-Dgsh82oA.js} +1 -1
  26. package/dist/client/assets/{diagram-KO2AKTUF-Delk7lbr.js → diagram-KO2AKTUF-DUwmm3sV.js} +1 -1
  27. package/dist/client/assets/{diagram-LMA3HP47-BVtc_fjo.js → diagram-LMA3HP47-DLGz0g10.js} +1 -1
  28. package/dist/client/assets/{diagram-OG6HWLK6-weIPvUz5.js → diagram-OG6HWLK6-CjS6v8Zz.js} +1 -1
  29. package/dist/client/assets/{erDiagram-TEJ5UH35-DKde70dA.js → erDiagram-TEJ5UH35-DHaCFHn9.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-I6XJVG4X-B7Jrk-6c.js → flowDiagram-I6XJVG4X-E4LSVqs6.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CDzWDgnA.js → ganttDiagram-6RSMTGT7-BWywa_xn.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DYZCryuN.js → gitGraphDiagram-PVQCEYII-BK4kWKuB.js} +1 -1
  33. package/dist/client/assets/index-CS2arNNP.js +274 -0
  34. package/dist/client/assets/index-Cb_ZVYaw.css +2 -0
  35. package/dist/client/assets/{infoDiagram-5YYISTIA-DmQOgVKK.js → infoDiagram-5YYISTIA-BX7HzDWX.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DCpu-q-Z.js → ishikawaDiagram-YF4QCWOH-CEnWCNes.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-JHISSGLW-DhBoglhI.js → journeyDiagram-JHISSGLW-MQPDgPxD.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-UN3LZRKU-BSjvGFTY.js → kanban-definition-UN3LZRKU-PwVLKAnN.js} +1 -1
  39. package/dist/client/assets/{line-ClKBZwDr.js → line-BJMnG1sl.js} +1 -1
  40. package/dist/client/assets/{mermaid-parser.core-BRA4mJ40.js → mermaid-parser.core-Bwv8qN83.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-BZ7kSfEt.js → mermaid.core-DpFOXZmb.js} +3 -3
  42. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DoUdLHgj.js → mindmap-definition-RKZ34NQL-Dt-9JT_z.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-4H26LBE5-NVnzqltb.js → pieDiagram-4H26LBE5-aD3cg6m3.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DOITgkan.js → quadrantDiagram-W4KKPZXB-DUh4hgmW.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-4Y6WPE33-D0VPxrFE.js → requirementDiagram-4Y6WPE33-DOgz-iLT.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bx0uU7xV.js → sankeyDiagram-5OEKKPKP-BqpDXW6-.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B4lFL6cO.js → sequenceDiagram-3UESZ5HK-BM0Gvqia.js} +1 -1
  48. package/dist/client/assets/{stateDiagram-AJRCARHV-CsLVsMZ4.js → stateDiagram-AJRCARHV-XZMyDtEy.js} +1 -1
  49. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C0Qe8FiL.js +1 -0
  50. package/dist/client/assets/{timeline-definition-PNZ67QCA-BkcYpPFI.js → timeline-definition-PNZ67QCA-gqiDwxVu.js} +1 -1
  51. package/dist/client/assets/{vennDiagram-CIIHVFJN-Xc5f2sRQ.js → vennDiagram-CIIHVFJN-MxeqqqyG.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-n3Dpk02Q.js → wardleyDiagram-YWT4CUSO-pMgGO6cB.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-2RQKCTM6-BTMzF8zg.js → xychartDiagram-2RQKCTM6-_VK_NZDn.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/server/db.js +467 -11
  56. package/dist/server/db.js.map +1 -1
  57. package/dist/server/index.js +356 -150
  58. package/dist/server/index.js.map +1 -1
  59. package/dist/server/lib/activeAutomationChild.js +6 -1
  60. package/dist/server/lib/activeAutomationChild.js.map +1 -1
  61. package/dist/server/lib/agent.js +5 -4
  62. package/dist/server/lib/agent.js.map +1 -1
  63. package/dist/server/lib/automationCheckGate.js +211 -59
  64. package/dist/server/lib/automationCheckGate.js.map +1 -1
  65. package/dist/server/lib/automationProgression.js +78 -10
  66. package/dist/server/lib/automationProgression.js.map +1 -1
  67. package/dist/server/lib/automationReconciliation.js +65 -0
  68. package/dist/server/lib/automationReconciliation.js.map +1 -1
  69. package/dist/server/lib/automationResumeDecision.js +82 -20
  70. package/dist/server/lib/automationResumeDecision.js.map +1 -1
  71. package/dist/server/lib/automationReviewGate.js +147 -0
  72. package/dist/server/lib/automationReviewGate.js.map +1 -0
  73. package/dist/server/lib/bundleActivity.js +20 -0
  74. package/dist/server/lib/bundleActivity.js.map +1 -1
  75. package/dist/server/lib/bundleReviewOperations.js +36 -5
  76. package/dist/server/lib/bundleReviewOperations.js.map +1 -1
  77. package/dist/server/lib/chatTicketProposals.js +2 -1
  78. package/dist/server/lib/chatTicketProposals.js.map +1 -1
  79. package/dist/server/lib/checkDefinitions.js +11 -0
  80. package/dist/server/lib/checkDefinitions.js.map +1 -1
  81. package/dist/server/lib/checkDiagnosticParsers.js +301 -0
  82. package/dist/server/lib/checkDiagnosticParsers.js.map +1 -0
  83. package/dist/server/lib/checkDiagnostics.js +142 -0
  84. package/dist/server/lib/checkDiagnostics.js.map +1 -0
  85. package/dist/server/lib/checkGateEvaluations.js +92 -4
  86. package/dist/server/lib/checkGateEvaluations.js.map +1 -1
  87. package/dist/server/lib/checkRepair.js +1031 -0
  88. package/dist/server/lib/checkRepair.js.map +1 -0
  89. package/dist/server/lib/checkRepairLifecycle.js +56 -0
  90. package/dist/server/lib/checkRepairLifecycle.js.map +1 -0
  91. package/dist/server/lib/checkRepairReconciliation.js +145 -0
  92. package/dist/server/lib/checkRepairReconciliation.js.map +1 -0
  93. package/dist/server/lib/checkRunner.js +142 -25
  94. package/dist/server/lib/checkRunner.js.map +1 -1
  95. package/dist/server/lib/checkRuns.js +75 -9
  96. package/dist/server/lib/checkRuns.js.map +1 -1
  97. package/dist/server/lib/executionReconciliation.js +21 -11
  98. package/dist/server/lib/executionReconciliation.js.map +1 -1
  99. package/dist/server/lib/executionRetryPredicates.js +3 -1
  100. package/dist/server/lib/executionRetryPredicates.js.map +1 -1
  101. package/dist/server/lib/executionRunRetention.js +24 -3
  102. package/dist/server/lib/executionRunRetention.js.map +1 -1
  103. package/dist/server/lib/executionRuns.js +5 -2
  104. package/dist/server/lib/executionRuns.js.map +1 -1
  105. package/dist/server/lib/git.js +5 -1
  106. package/dist/server/lib/git.js.map +1 -1
  107. package/dist/server/lib/lightweightPrompt.js +2 -1
  108. package/dist/server/lib/lightweightPrompt.js.map +1 -1
  109. package/dist/server/lib/planModeQuestions.js +2 -0
  110. package/dist/server/lib/planModeQuestions.js.map +1 -1
  111. package/dist/server/lib/planQuestions.js +39 -7
  112. package/dist/server/lib/planQuestions.js.map +1 -1
  113. package/dist/server/lib/projectAutoConfig.js +2 -1
  114. package/dist/server/lib/projectAutoConfig.js.map +1 -1
  115. package/dist/server/lib/projectMemorySuggestions.js +2 -1
  116. package/dist/server/lib/projectMemorySuggestions.js.map +1 -1
  117. package/dist/server/lib/projects.js +57 -9
  118. package/dist/server/lib/projects.js.map +1 -1
  119. package/dist/server/lib/pullRequestContent.js +14 -0
  120. package/dist/server/lib/pullRequestContent.js.map +1 -1
  121. package/dist/server/lib/requiredCheckPolicy.js +88 -18
  122. package/dist/server/lib/requiredCheckPolicy.js.map +1 -1
  123. package/dist/server/lib/requiredCheckPolicyPrompt.js +46 -0
  124. package/dist/server/lib/requiredCheckPolicyPrompt.js.map +1 -0
  125. package/dist/server/lib/run.js +3 -2
  126. package/dist/server/lib/run.js.map +1 -1
  127. package/dist/server/lib/specDraft.js +6 -0
  128. package/dist/server/lib/specDraft.js.map +1 -1
  129. package/dist/server/lib/specResources.js +42 -0
  130. package/dist/server/lib/specResources.js.map +1 -0
  131. package/dist/server/lib/specs.js +9 -5
  132. package/dist/server/lib/specs.js.map +1 -1
  133. package/dist/server/lib/terminal.js +5 -7
  134. package/dist/server/lib/terminal.js.map +1 -1
  135. package/dist/server/lib/testSessions.js +2 -2
  136. package/dist/server/lib/testSessions.js.map +1 -1
  137. package/dist/server/lib/ticketAutomation.js +10 -3
  138. package/dist/server/lib/ticketAutomation.js.map +1 -1
  139. package/dist/server/lib/ticketAutomationCommit.js +37 -11
  140. package/dist/server/lib/ticketAutomationCommit.js.map +1 -1
  141. package/dist/server/lib/ticketFollowUpOperations.js +24 -9
  142. package/dist/server/lib/ticketFollowUpOperations.js.map +1 -1
  143. package/dist/server/lib/tickets.js +18 -0
  144. package/dist/server/lib/tickets.js.map +1 -1
  145. package/dist/server/lib/types.js +1 -0
  146. package/dist/server/lib/types.js.map +1 -1
  147. package/dist/server/lib/workspaceProcessEnvironment.js +21 -0
  148. package/dist/server/lib/workspaceProcessEnvironment.js.map +1 -0
  149. package/dist/server/workers/build.js +41 -28
  150. package/dist/server/workers/build.js.map +1 -1
  151. package/dist/server/workers/chat.js +4 -3
  152. package/dist/server/workers/chat.js.map +1 -1
  153. package/dist/server/workers/followUp.js +99 -103
  154. package/dist/server/workers/followUp.js.map +1 -1
  155. package/dist/server/workers/plan.js +9 -4
  156. package/dist/server/workers/plan.js.map +1 -1
  157. package/dist/server/workers/planFollowUp.js +5 -6
  158. package/dist/server/workers/planFollowUp.js.map +1 -1
  159. package/dist/server/workers/review.js +38 -6
  160. package/dist/server/workers/review.js.map +1 -1
  161. package/dist/server/workers/specSession.js +10 -4
  162. package/dist/server/workers/specSession.js.map +1 -1
  163. package/package.json +1 -1
  164. package/dist/client/assets/VerificationDialog-DEKvZG75.js +0 -4
  165. package/dist/client/assets/channel-BvcRv90i.js +0 -1
  166. package/dist/client/assets/classDiagram-4FO5ZUOK-IuovJyxl.js +0 -1
  167. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BBJ3avX6.js +0 -1
  168. package/dist/client/assets/index-BlKOx9Vf.css +0 -2
  169. package/dist/client/assets/index-CmaBDvIB.js +0 -273
  170. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CvrvaIdF.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)));
@@ -41,19 +89,27 @@ const addMultiplicityReasons = (reasons, requiredIds, representedIds) => {
41
89
  reasons.add('extra_evidence');
42
90
  }
43
91
  };
44
- const isPolicySnapshotValid = (policy, target) => {
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
48
101
  && sameOrderedIds(policy.definitionIds, definitionIds)
49
- && policy.fingerprint === getRequiredCheckPolicySnapshotFingerprint(policy, target);
102
+ && policy.fingerprint === getRequiredCheckPolicySnapshotFingerprint(policy, target, boundaryKind);
50
103
  };
51
104
  export const evaluateCheckGate = (input) => {
52
105
  const reasons = new Set(input.blockingReasonCodes);
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]));
56
- if (!isPolicySnapshotValid(input.policy, input.target)) {
109
+ if (input.policy.status === 'invalid') {
110
+ reasons.add('policy_invalid');
111
+ }
112
+ if (!isPolicySnapshotValid(input.policy, input.target, input.boundaryKind)) {
57
113
  reasons.add('policy_drift');
58
114
  }
59
115
  if ((input.target.targetKind === 'bundle' && input.bundle?.id !== input.target.targetBundleId)
@@ -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,