@straiffi/archon 1.3.11 → 1.4.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/{TestsDialog-BUCv8I-8.js → TestsDialog-CD_kQh8y.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-C3Jb8g9R.js → architectureDiagram-3BPJPVTR-eKhX8J5g.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-CZcqQgBX.js → blockDiagram-GPEHLZMM-dYzMDN2p.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Cpv5hJF9.js → c4Diagram-AAUBKEIU-Bfe91lzp.js} +1 -1
- package/dist/client/assets/channel-ByZgAb3R.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-DkbZ544o.js → chunk-2J33WTMH-Box1ZnSe.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-CTkBmjbl.js → chunk-3OPIFGDE-BOkhWfjl.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-Cvt23bYu.js → chunk-5ZQYHXKU-DZt1zqaf.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DX5ql843.js → chunk-727SXJPM-DZYZCHLI.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BWR4RAvi.js → chunk-AQP2D5EJ-CmgJLI9e.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-BrZJ9QMn.js → chunk-CSCIHK7Q-D8FHELNF.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-Xsa2cnhz.js → chunk-KSCS5N6A-DtLUz0Po.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-5L-9s_-b.js → chunk-L5ZTLDWV-CBk5m6ON.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-XcqcrPu3.js → chunk-LZXEDZCA-CaexlXfB.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-Cehi3-t2.js → chunk-ND2GUHAM-ma7eMIEB.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-s6NmMa8K.js → chunk-NZK2D7GU-Da9F4EmF.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-CkU-v8ar.js → chunk-O5CBEL6O-BLScYRER.js} +1 -1
- package/dist/client/assets/{chunk-WU5MYG2G-DJrhJw82.js → chunk-WU5MYG2G-r_Zx_ykt.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-ALbA3AZT.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CRtCF2Am.js +1 -0
- package/dist/client/assets/{dagre-BM42HDAG-B-PypVRB.js → dagre-BM42HDAG-CQZZ6fkN.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-Cm3pGoMu.js → diagram-2AECGRRQ-8fz_9Wj4.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DCwV7VX3.js → diagram-5GNKFQAL-D2QIzYwx.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-B5RVwHze.js → diagram-KO2AKTUF-Dg7-VWuS.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CmLaK5_k.js → diagram-LMA3HP47-CyvkOeSI.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-Mj0hhakE.js → diagram-OG6HWLK6-C6TmKjxR.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-D30rUvl5.js → erDiagram-TEJ5UH35-KO_Kcloa.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Dh1RDWX7.js → flowDiagram-I6XJVG4X-BYDZ3qQE.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-B7f77DA_.js → ganttDiagram-6RSMTGT7-BLDujCf9.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CKBXqaKU.js → gitGraphDiagram-PVQCEYII-B-zvAAKD.js} +1 -1
- package/dist/client/assets/{index-Cs7XmROA.js → index-C5vJR8lI.js} +114 -114
- package/dist/client/assets/index-mgNREnGE.css +2 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BPpU75Ej.js → infoDiagram-5YYISTIA-BZadMEs3.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-C4J2Eb6K.js → ishikawaDiagram-YF4QCWOH-BnuStPyf.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BthEH9FE.js → journeyDiagram-JHISSGLW-13FrVYMv.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DzSlAH8r.js → kanban-definition-UN3LZRKU-B4yGkr5P.js} +1 -1
- package/dist/client/assets/{line-BTeJbdYR.js → line-D3D8vY5q.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-BJonz176.js → mermaid-parser.core-DE23MjEP.js} +1 -1
- package/dist/client/assets/{mermaid.core-tt3Uc0ap.js → mermaid.core-C47RYkRV.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-iITkeEX1.js → mindmap-definition-RKZ34NQL-H9vxHA6z.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5--CgS4G7C.js → pieDiagram-4H26LBE5-gtm2r2QV.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Clq6DEX-.js → quadrantDiagram-W4KKPZXB-CvQ8DgZT.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-r_apj3BK.js → requirementDiagram-4Y6WPE33-BJdKQQGp.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-2XqJHFyi.js → sankeyDiagram-5OEKKPKP-C8MvJ4qc.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-k4Qrdp_I.js → sequenceDiagram-3UESZ5HK-vnLK2sVC.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CMr088KL.js → stateDiagram-AJRCARHV-xmrmmwh0.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DCX_KXXR.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BpkNV3oH.js → timeline-definition-PNZ67QCA-BS6qgXzV.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-Bmte21GM.js → vennDiagram-CIIHVFJN-BY2_Ffta.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CLJX-O9B.js → wardleyDiagram-YWT4CUSO-CkoA3xv4.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-Bc_SL4rS.js → xychartDiagram-2RQKCTM6-DbdiR5DY.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/db.js +22 -0
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +115 -167
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/bundlePullRequests.js +47 -0
- package/dist/server/lib/bundlePullRequests.js.map +1 -1
- package/dist/server/lib/bundleReviewOperations.js +83 -0
- package/dist/server/lib/bundleReviewOperations.js.map +1 -0
- package/dist/server/lib/commitMessage.js +32 -0
- package/dist/server/lib/commitMessage.js.map +1 -0
- package/dist/server/lib/integrations/github.js +7 -0
- package/dist/server/lib/integrations/github.js.map +1 -1
- package/dist/server/lib/projects.js +44 -0
- package/dist/server/lib/projects.js.map +1 -1
- package/dist/server/lib/pullRequestContent.js +77 -0
- package/dist/server/lib/pullRequestContent.js.map +1 -0
- package/dist/server/lib/ticketAutomation.js +194 -0
- package/dist/server/lib/ticketAutomation.js.map +1 -0
- package/dist/server/lib/ticketAutomationCommit.js +188 -0
- package/dist/server/lib/ticketAutomationCommit.js.map +1 -0
- package/dist/server/lib/ticketSettingsOperations.js +35 -2
- package/dist/server/lib/ticketSettingsOperations.js.map +1 -1
- package/dist/server/lib/ticketWorkflowOperations.js +11 -0
- package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
- package/dist/server/lib/tickets.js +31 -1
- package/dist/server/lib/tickets.js.map +1 -1
- package/dist/server/workers/build.js +11 -0
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/followUp.js +30 -3
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/review.js +78 -4
- package/dist/server/workers/review.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/channel-DmMIqd-b.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CDTuTjGy.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BhEXEoEw.js +0 -1
- package/dist/client/assets/index-ZyUvSLAF.css +0 -2
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-t7kpZS05.js +0 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import db from '../db.js';
|
|
2
|
+
const DEPTH_RANK = {
|
|
3
|
+
manual: 0,
|
|
4
|
+
auto_review: 1,
|
|
5
|
+
auto_commit: 2,
|
|
6
|
+
auto_push: 3,
|
|
7
|
+
auto_pr: 4,
|
|
8
|
+
};
|
|
9
|
+
const SEVERITY_RANK = {
|
|
10
|
+
low: 0,
|
|
11
|
+
medium: 1,
|
|
12
|
+
high: 2,
|
|
13
|
+
};
|
|
14
|
+
export const isAutomationDepth = (value) => {
|
|
15
|
+
return value === 'manual'
|
|
16
|
+
|| value === 'auto_review'
|
|
17
|
+
|| value === 'auto_commit'
|
|
18
|
+
|| value === 'auto_push'
|
|
19
|
+
|| value === 'auto_pr';
|
|
20
|
+
};
|
|
21
|
+
export const isAutomationReviewSeverity = (value) => {
|
|
22
|
+
return value === 'low' || value === 'medium' || value === 'high';
|
|
23
|
+
};
|
|
24
|
+
export const depthAtLeast = (depth, floor) => {
|
|
25
|
+
return DEPTH_RANK[depth] >= DEPTH_RANK[floor];
|
|
26
|
+
};
|
|
27
|
+
export const severityBlocks = (severity, threshold) => {
|
|
28
|
+
return SEVERITY_RANK[severity] >= SEVERITY_RANK[threshold];
|
|
29
|
+
};
|
|
30
|
+
export const resolveAutomationConfig = (ticket, project) => {
|
|
31
|
+
const projectDepth = project?.automation_depth ?? 'manual';
|
|
32
|
+
const projectFixEnabled = project?.automation_review_fix_enabled ?? 0;
|
|
33
|
+
const ticketDepth = ticket.automation_depth;
|
|
34
|
+
const ticketFixEnabled = ticket.automation_review_fix_enabled;
|
|
35
|
+
return {
|
|
36
|
+
depth: ticketDepth ?? projectDepth,
|
|
37
|
+
reviewFixEnabled: ticketFixEnabled !== null ? Boolean(ticketFixEnabled) : Boolean(projectFixEnabled),
|
|
38
|
+
reviewSeverity: project?.automation_review_severity ?? 'medium',
|
|
39
|
+
reviewMaxIterations: project?.automation_review_max_iterations ?? 3,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export const isAutomationActive = (config) => {
|
|
43
|
+
return config.depth !== 'manual';
|
|
44
|
+
};
|
|
45
|
+
export const serializeBundleAutomationState = (row) => {
|
|
46
|
+
if (!row) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
review_iteration_count: row.review_iteration_count,
|
|
51
|
+
fix_loop_active: Boolean(row.fix_loop_active),
|
|
52
|
+
automation_paused_reason: row.automation_paused_reason,
|
|
53
|
+
automation_paused_at: row.automation_paused_at,
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
export const getBundleAutomationState = (projectId, bundleId) => {
|
|
57
|
+
return db
|
|
58
|
+
.prepare('SELECT * FROM bundle_automation_state WHERE project_id = ? AND worktree_bundle_id = ?')
|
|
59
|
+
.get(projectId, bundleId) ?? null;
|
|
60
|
+
};
|
|
61
|
+
const getBundleAutomationStateCacheKey = (projectId, bundleId) => {
|
|
62
|
+
return `${projectId}:${bundleId}`;
|
|
63
|
+
};
|
|
64
|
+
export const resolveBundleAutomationState = (projectId, bundleId, cache) => {
|
|
65
|
+
const key = getBundleAutomationStateCacheKey(projectId, bundleId);
|
|
66
|
+
if (cache?.has(key)) {
|
|
67
|
+
return cache.get(key) ?? null;
|
|
68
|
+
}
|
|
69
|
+
const state = getBundleAutomationState(projectId, bundleId);
|
|
70
|
+
cache?.set(key, state);
|
|
71
|
+
return state;
|
|
72
|
+
};
|
|
73
|
+
export const loadBundleAutomationStateMap = (projectId, bundleIds) => {
|
|
74
|
+
const cache = new Map();
|
|
75
|
+
if (bundleIds.length === 0) {
|
|
76
|
+
return cache;
|
|
77
|
+
}
|
|
78
|
+
const placeholders = bundleIds.map(() => '?').join(', ');
|
|
79
|
+
const rows = db
|
|
80
|
+
.prepare(`SELECT * FROM bundle_automation_state WHERE project_id = ? AND worktree_bundle_id IN (${placeholders})`)
|
|
81
|
+
.all(projectId, ...bundleIds);
|
|
82
|
+
for (const row of rows) {
|
|
83
|
+
cache.set(getBundleAutomationStateCacheKey(projectId, row.worktree_bundle_id), row);
|
|
84
|
+
}
|
|
85
|
+
for (const bundleId of bundleIds) {
|
|
86
|
+
const key = getBundleAutomationStateCacheKey(projectId, bundleId);
|
|
87
|
+
if (!cache.has(key)) {
|
|
88
|
+
cache.set(key, null);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return cache;
|
|
92
|
+
};
|
|
93
|
+
export const upsertBundleAutomationState = (projectId, bundleId, patch) => {
|
|
94
|
+
const existing = getBundleAutomationState(projectId, bundleId);
|
|
95
|
+
if (!existing) {
|
|
96
|
+
db.prepare(`
|
|
97
|
+
INSERT INTO bundle_automation_state (
|
|
98
|
+
project_id,
|
|
99
|
+
worktree_bundle_id,
|
|
100
|
+
review_iteration_count,
|
|
101
|
+
fix_loop_active,
|
|
102
|
+
automation_paused_reason,
|
|
103
|
+
automation_paused_at
|
|
104
|
+
)
|
|
105
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
106
|
+
`).run(projectId, bundleId, patch.review_iteration_count ?? 0, patch.fix_loop_active ?? 0, patch.automation_paused_reason ?? null, patch.automation_paused_at ?? null);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
db.prepare(`
|
|
110
|
+
UPDATE bundle_automation_state
|
|
111
|
+
SET
|
|
112
|
+
review_iteration_count = ?,
|
|
113
|
+
fix_loop_active = ?,
|
|
114
|
+
automation_paused_reason = ?,
|
|
115
|
+
automation_paused_at = ?,
|
|
116
|
+
updated_at = CURRENT_TIMESTAMP
|
|
117
|
+
WHERE project_id = ? AND worktree_bundle_id = ?
|
|
118
|
+
`).run(patch.review_iteration_count ?? existing.review_iteration_count, patch.fix_loop_active ?? existing.fix_loop_active, patch.automation_paused_reason !== undefined
|
|
119
|
+
? patch.automation_paused_reason
|
|
120
|
+
: existing.automation_paused_reason, patch.automation_paused_at !== undefined
|
|
121
|
+
? patch.automation_paused_at
|
|
122
|
+
: existing.automation_paused_at, projectId, bundleId);
|
|
123
|
+
};
|
|
124
|
+
export const recordAutomationPause = (projectId, bundleId, reason) => {
|
|
125
|
+
upsertBundleAutomationState(projectId, bundleId, {
|
|
126
|
+
automation_paused_reason: reason,
|
|
127
|
+
automation_paused_at: new Date().toISOString(),
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
export const clearAutomationPause = (projectId, bundleId) => {
|
|
131
|
+
upsertBundleAutomationState(projectId, bundleId, {
|
|
132
|
+
automation_paused_reason: null,
|
|
133
|
+
automation_paused_at: null,
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
export const resetBundleAutomationLoop = (projectId, bundleId) => {
|
|
137
|
+
upsertBundleAutomationState(projectId, bundleId, {
|
|
138
|
+
review_iteration_count: 0,
|
|
139
|
+
fix_loop_active: 0,
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
export const countBlockingFindings = (findings, config) => {
|
|
143
|
+
return findings.filter(finding => severityBlocks(finding.severity, config.reviewSeverity)).length;
|
|
144
|
+
};
|
|
145
|
+
export const decideReviewAutomation = (config, bundleState, reviewRunId, parsedStatus, findings) => {
|
|
146
|
+
if (!isAutomationActive(config)) {
|
|
147
|
+
return { kind: 'manual' };
|
|
148
|
+
}
|
|
149
|
+
if (bundleState?.automation_paused_reason) {
|
|
150
|
+
return { kind: 'paused' };
|
|
151
|
+
}
|
|
152
|
+
if (!reviewRunId || parsedStatus !== 'completed') {
|
|
153
|
+
return { kind: 'parse_failed' };
|
|
154
|
+
}
|
|
155
|
+
const blockingCount = countBlockingFindings(findings, config);
|
|
156
|
+
const iteration = bundleState?.review_iteration_count ?? 0;
|
|
157
|
+
if (config.reviewFixEnabled && blockingCount > 0 && iteration < config.reviewMaxIterations) {
|
|
158
|
+
return { kind: 'fix_iteration', iteration: iteration + 1, max: config.reviewMaxIterations };
|
|
159
|
+
}
|
|
160
|
+
if (blockingCount > 0) {
|
|
161
|
+
return {
|
|
162
|
+
kind: 'pause_blocking',
|
|
163
|
+
reason: buildBlockingFindingsPauseReason(blockingCount, config.reviewSeverity, config.reviewFixEnabled, iteration),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return { kind: 'clean' };
|
|
167
|
+
};
|
|
168
|
+
export const buildBlockingFindingsPauseReason = (blockingCount, severity, fixEnabled, iteration) => {
|
|
169
|
+
if (!fixEnabled) {
|
|
170
|
+
return `blocking findings, auto-fix disabled (${blockingCount} at ${severity} or above)`;
|
|
171
|
+
}
|
|
172
|
+
const findingWord = blockingCount === 1 ? 'finding remains' : 'findings remain';
|
|
173
|
+
const iterationWord = iteration === 1 ? 'iteration' : 'iterations';
|
|
174
|
+
return `review fix loop exhausted, ${blockingCount} ${severity}+ ${findingWord} after ${iteration} ${iterationWord}`;
|
|
175
|
+
};
|
|
176
|
+
export const buildAutomationFixInstruction = (severity) => {
|
|
177
|
+
return `Fix the code review findings at or above "${severity}" severity. Address each blocking finding directly and minimally. Do not introduce unrelated changes, reformatting, or refactors. Do not commit.`;
|
|
178
|
+
};
|
|
179
|
+
export const buildAutomationFixStatusMessage = (iteration, max) => {
|
|
180
|
+
return `Automation: fixing review findings (iteration ${iteration} of ${max})`;
|
|
181
|
+
};
|
|
182
|
+
export const decideReviewFollowUpAutomation = (config, bundleState) => {
|
|
183
|
+
if (!isAutomationActive(config)) {
|
|
184
|
+
return { kind: 'manual' };
|
|
185
|
+
}
|
|
186
|
+
if (bundleState?.automation_paused_reason) {
|
|
187
|
+
return { kind: 'paused' };
|
|
188
|
+
}
|
|
189
|
+
if (bundleState?.fix_loop_active === 1) {
|
|
190
|
+
return { kind: 're_review' };
|
|
191
|
+
}
|
|
192
|
+
return { kind: 'fall_through' };
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=ticketAutomation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketAutomation.js","sourceRoot":"","sources":["../../../server/lib/ticketAutomation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import config from './config.js';
|
|
2
|
+
import { buildCommitMessagePrompt, normalizeGeneratedCommitMessage, } from './commitMessage.js';
|
|
3
|
+
import { commitGitChanges, getGitStatus, getReviewDiffData, getSelectedGitUnifiedDiff, pushCurrentBranch, resolveWorktreePath, } from './git.js';
|
|
4
|
+
import { runLightweightPrompt } from './lightweightPrompt.js';
|
|
5
|
+
import { buildPullRequestContentPrompt, parsePullRequestContent, } from './pullRequestContent.js';
|
|
6
|
+
import { isProjectRootBundle } from './tickets.js';
|
|
7
|
+
import { createOrFindGitHubPullRequest, hasGitHubRemoteBranch } from './integrations/github.js';
|
|
8
|
+
import { getGitHubConnectionConfig } from './integrations/index.js';
|
|
9
|
+
import { hasOpenBundlePullRequest, syncTrackedBundlePullRequestIfNeeded, upsertBundlePullRequestFromGitHub, } from './bundlePullRequests.js';
|
|
10
|
+
import { recordAutomationPause } from './ticketAutomation.js';
|
|
11
|
+
import { getTicket } from './tickets.js';
|
|
12
|
+
const getErrorMessage = (error) => {
|
|
13
|
+
return error instanceof Error ? error.message : String(error);
|
|
14
|
+
};
|
|
15
|
+
export const evaluateCommitPrecondition = (gitStatus) => {
|
|
16
|
+
if (gitStatus.files.length === 0) {
|
|
17
|
+
return { ok: true };
|
|
18
|
+
}
|
|
19
|
+
if (gitStatus.operation_state !== 'idle') {
|
|
20
|
+
return { ok: false, reason: `worktree is mid-${gitStatus.operation_state}` };
|
|
21
|
+
}
|
|
22
|
+
return { ok: true };
|
|
23
|
+
};
|
|
24
|
+
export const evaluatePrPrecondition = (connectionConfig, bundle, gitStatus, hasRemoteBranch, existingTrackedPr) => {
|
|
25
|
+
if (!connectionConfig) {
|
|
26
|
+
return { ok: false, reason: 'GitHub integration not connected' };
|
|
27
|
+
}
|
|
28
|
+
if (isProjectRootBundle(bundle)) {
|
|
29
|
+
return { ok: false, reason: 'pull requests are not available for the project root bundle' };
|
|
30
|
+
}
|
|
31
|
+
if (!connectionConfig.default_base_branch) {
|
|
32
|
+
return { ok: false, reason: 'no default base branch configured for the GitHub connection' };
|
|
33
|
+
}
|
|
34
|
+
if (gitStatus.ahead > 0 || !hasRemoteBranch) {
|
|
35
|
+
return { ok: false, reason: 'branch must be pushed and up to date before opening a pull request' };
|
|
36
|
+
}
|
|
37
|
+
return { ok: true };
|
|
38
|
+
};
|
|
39
|
+
const buildCommitExecution = (project) => {
|
|
40
|
+
if (project.helper_model) {
|
|
41
|
+
return {
|
|
42
|
+
tool: 'opencode',
|
|
43
|
+
model: project.helper_model,
|
|
44
|
+
variant: project.helper_variant,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return { tool: config.tool ?? 'opencode' };
|
|
48
|
+
};
|
|
49
|
+
const generateCommitMessage = async (cwd, project, selectedPaths) => {
|
|
50
|
+
const gitStatus = getGitStatus(cwd, null, project);
|
|
51
|
+
const selectedPathSet = new Set(selectedPaths);
|
|
52
|
+
const selectedFiles = gitStatus.files
|
|
53
|
+
.filter(file => selectedPathSet.has(file.path))
|
|
54
|
+
.map(file => `${file.status}: ${file.path}`);
|
|
55
|
+
const prompt = buildCommitMessagePrompt({
|
|
56
|
+
commitMessageRules: project.commit_message_rules,
|
|
57
|
+
selectedFiles,
|
|
58
|
+
diff: getSelectedGitUnifiedDiff(cwd, selectedPaths),
|
|
59
|
+
});
|
|
60
|
+
const rawMessage = await runLightweightPrompt(buildCommitExecution(project), prompt, cwd);
|
|
61
|
+
return normalizeGeneratedCommitMessage(rawMessage);
|
|
62
|
+
};
|
|
63
|
+
const generatePullRequestContent = async (cwd, project, ticket, branch) => {
|
|
64
|
+
const diffData = getReviewDiffData({ cwd, branch, project });
|
|
65
|
+
if (!diffData.diff.trim()) {
|
|
66
|
+
return { title: ticket.title, body: ticket.description ?? '' };
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const githubConfig = getGitHubConnectionConfig(ticket.project_id ?? '');
|
|
70
|
+
const baseBranch = githubConfig?.default_base_branch ?? 'main';
|
|
71
|
+
const prompt = buildPullRequestContentPrompt({
|
|
72
|
+
ticketTitle: ticket.title,
|
|
73
|
+
ticketDescription: ticket.description,
|
|
74
|
+
diff: diffData.diff,
|
|
75
|
+
baseBranch,
|
|
76
|
+
});
|
|
77
|
+
const rawOutput = await runLightweightPrompt(buildCommitExecution(project), prompt, cwd);
|
|
78
|
+
const parsed = parsePullRequestContent(rawOutput);
|
|
79
|
+
if (parsed) {
|
|
80
|
+
return parsed;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Fall back to ticket fields on any failure
|
|
85
|
+
}
|
|
86
|
+
return { title: ticket.title, body: ticket.description ?? '' };
|
|
87
|
+
};
|
|
88
|
+
const emitUpdated = (io, ticketId) => {
|
|
89
|
+
const updated = getTicket(ticketId);
|
|
90
|
+
if (updated) {
|
|
91
|
+
io.emit('ticket:updated', updated);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export const runAutomationCommitChain = async (ticket, project, bundle, automationConfig, io) => {
|
|
95
|
+
if (!ticket.project_id || !ticket.worktree_bundle_id) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const projectId = ticket.project_id;
|
|
99
|
+
const bundleId = ticket.worktree_bundle_id;
|
|
100
|
+
const branch = bundle?.branch ?? null;
|
|
101
|
+
if (!branch) {
|
|
102
|
+
recordAutomationPause(projectId, bundleId, 'automation commit chain skipped: bundle has no branch');
|
|
103
|
+
emitUpdated(io, ticket.id);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const cwd = bundle?.kind === 'project_root'
|
|
107
|
+
? project.repo_path
|
|
108
|
+
: resolveWorktreePath(branch, project);
|
|
109
|
+
const emitPaused = (reason) => {
|
|
110
|
+
recordAutomationPause(projectId, bundleId, reason);
|
|
111
|
+
emitUpdated(io, ticket.id);
|
|
112
|
+
};
|
|
113
|
+
// Commit leg (auto_commit and deeper)
|
|
114
|
+
try {
|
|
115
|
+
const gitStatus = getGitStatus(cwd, branch, project);
|
|
116
|
+
const commitCheck = evaluateCommitPrecondition(gitStatus);
|
|
117
|
+
if (!commitCheck.ok) {
|
|
118
|
+
emitPaused(commitCheck.reason);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (gitStatus.files.length > 0) {
|
|
122
|
+
const selectedPaths = gitStatus.files.map(file => file.path);
|
|
123
|
+
const message = await generateCommitMessage(cwd, project, selectedPaths);
|
|
124
|
+
if (!message) {
|
|
125
|
+
emitPaused('commit message generation produced an empty result');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
await commitGitChanges(cwd, branch, project, message, selectedPaths);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
emitPaused(`commit failed: ${getErrorMessage(error)}`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (automationConfig.depth === 'auto_commit') {
|
|
136
|
+
emitUpdated(io, ticket.id);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Push leg (auto_push and deeper). pushCurrentBranch is idempotent — a no-op
|
|
140
|
+
// when the branch is already up to date — so no separate precondition is needed.
|
|
141
|
+
try {
|
|
142
|
+
await pushCurrentBranch(cwd, branch);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
emitPaused(`push failed: ${getErrorMessage(error)}`);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (automationConfig.depth === 'auto_push') {
|
|
149
|
+
emitUpdated(io, ticket.id);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// PR leg (auto_pr)
|
|
153
|
+
try {
|
|
154
|
+
const githubConfig = getGitHubConnectionConfig(projectId);
|
|
155
|
+
const prGitStatus = getGitStatus(cwd, branch, project);
|
|
156
|
+
const hasRemoteBranch = hasGitHubRemoteBranch(cwd, branch);
|
|
157
|
+
const tracked = bundle
|
|
158
|
+
? await syncTrackedBundlePullRequestIfNeeded(project, bundle, { force: true })
|
|
159
|
+
: null;
|
|
160
|
+
const prCheck = evaluatePrPrecondition(githubConfig, bundle, prGitStatus, hasRemoteBranch, tracked);
|
|
161
|
+
if (!prCheck.ok) {
|
|
162
|
+
emitPaused(prCheck.reason);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (hasOpenBundlePullRequest(tracked)) {
|
|
166
|
+
emitUpdated(io, ticket.id);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (!githubConfig) {
|
|
170
|
+
emitPaused('GitHub integration not connected');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const baseBranch = githubConfig.default_base_branch ?? '';
|
|
174
|
+
const prContent = await generatePullRequestContent(cwd, project, ticket, branch);
|
|
175
|
+
const nextPullRequest = await createOrFindGitHubPullRequest(githubConfig, {
|
|
176
|
+
title: prContent.title,
|
|
177
|
+
body: prContent.body,
|
|
178
|
+
baseBranch,
|
|
179
|
+
headBranch: branch,
|
|
180
|
+
});
|
|
181
|
+
upsertBundlePullRequestFromGitHub(projectId, bundleId, githubConfig, nextPullRequest);
|
|
182
|
+
emitUpdated(io, ticket.id);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
emitPaused(`pull request failed: ${getErrorMessage(error)}`);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=ticketAutomationCommit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketAutomationCommit.js","sourceRoot":"","sources":["../../../server/lib/ticketAutomationCommit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import db from '../db.js';
|
|
2
2
|
import { normalizeTicketModelId } from './models.js';
|
|
3
3
|
import { normalizeSkillNames } from './skills.js';
|
|
4
|
+
import { isAutomationDepth } from './ticketAutomation.js';
|
|
4
5
|
import { getTicket } from './tickets.js';
|
|
5
6
|
const hasOwn = (object, key) => {
|
|
6
7
|
return !!object && typeof object === 'object' && Object.prototype.hasOwnProperty.call(object, key);
|
|
@@ -15,11 +16,13 @@ export const isTicketAgentSettingsPayload = (payload) => {
|
|
|
15
16
|
const hasModelField = hasOwn(payload, 'model');
|
|
16
17
|
const hasVariantField = hasOwn(payload, 'variant');
|
|
17
18
|
const hasSkillsField = hasOwn(payload, 'skills');
|
|
19
|
+
const hasAutomationDepthField = hasOwn(payload, 'automation_depth');
|
|
20
|
+
const hasAutomationFixField = hasOwn(payload, 'automation_review_fix_enabled');
|
|
18
21
|
const hasEditableContentField = hasOwn(payload, 'title')
|
|
19
22
|
|| hasOwn(payload, 'description')
|
|
20
23
|
|| hasOwn(payload, 'project_id')
|
|
21
24
|
|| hasOwn(payload, 'worktree_bundle_id');
|
|
22
|
-
return !hasEditableContentField && (hasModelField || hasVariantField || hasSkillsField);
|
|
25
|
+
return !hasEditableContentField && (hasModelField || hasVariantField || hasSkillsField || hasAutomationDepthField || hasAutomationFixField);
|
|
23
26
|
};
|
|
24
27
|
export const updateTicketAgentSettings = ({ ticketId, requestedProjectId, payload, broadcaster, }) => {
|
|
25
28
|
const ticket = getTicket(ticketId);
|
|
@@ -32,6 +35,8 @@ export const updateTicketAgentSettings = ({ ticketId, requestedProjectId, payloa
|
|
|
32
35
|
let resolvedModel = ticket.model;
|
|
33
36
|
let resolvedVariant = ticket.variant;
|
|
34
37
|
let resolvedSkills = ticket.skills;
|
|
38
|
+
let resolvedAutomationDepth = ticket.automation_depth ?? null;
|
|
39
|
+
let resolvedAutomationReviewFixEnabled = ticket.automation_review_fix_enabled ?? null;
|
|
35
40
|
if (hasOwn(payload, 'model')) {
|
|
36
41
|
if (payload?.model == null) {
|
|
37
42
|
resolvedModel = null;
|
|
@@ -54,7 +59,35 @@ export const updateTicketAgentSettings = ({ ticketId, requestedProjectId, payloa
|
|
|
54
59
|
if (hasOwn(payload, 'skills')) {
|
|
55
60
|
resolvedSkills = normalizeSkillNames(payload?.skills);
|
|
56
61
|
}
|
|
57
|
-
|
|
62
|
+
if (hasOwn(payload, 'automation_depth')) {
|
|
63
|
+
const value = payload?.automation_depth;
|
|
64
|
+
if (value == null || value === '') {
|
|
65
|
+
resolvedAutomationDepth = null;
|
|
66
|
+
}
|
|
67
|
+
else if (isAutomationDepth(value)) {
|
|
68
|
+
resolvedAutomationDepth = value;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return {
|
|
72
|
+
ok: false,
|
|
73
|
+
status: 400,
|
|
74
|
+
error: 'automation_depth must be one of: manual, auto_review, auto_commit, auto_push, auto_pr',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (hasOwn(payload, 'automation_review_fix_enabled')) {
|
|
79
|
+
const value = payload?.automation_review_fix_enabled;
|
|
80
|
+
if (value == null) {
|
|
81
|
+
resolvedAutomationReviewFixEnabled = null;
|
|
82
|
+
}
|
|
83
|
+
else if (typeof value === 'boolean') {
|
|
84
|
+
resolvedAutomationReviewFixEnabled = value ? 1 : 0;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
return { ok: false, status: 400, error: 'automation_review_fix_enabled must be a boolean' };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
db.prepare('UPDATE tickets SET model = ?, variant = ?, skills_json = ?, automation_depth = ?, automation_review_fix_enabled = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(resolvedModel, resolvedVariant, JSON.stringify(resolvedSkills), resolvedAutomationDepth, resolvedAutomationReviewFixEnabled, ticket.id);
|
|
58
91
|
const updated = getTicket(ticket.id);
|
|
59
92
|
broadcaster.emit('ticket:updated', updated);
|
|
60
93
|
return { ok: true, status: 200, value: updated };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticketSettingsOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketSettingsOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AASxC,MAAM,MAAM,GAAG,CAAC,MAAe,EAAE,GAAW,EAAE,EAAE;IAC9C,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACpG,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAC,MAAkC,EAAE,kBAA2B,EAAE,EAAE;IAClG,OAAO,kBAAkB,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,kBAAkB,CAAA;AACrF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,OAA8B,EAAE,EAAE;IAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAChD,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;WACnD,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;WAC9B,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;WAC7B,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;IAE1C,OAAO,CAAC,uBAAuB,IAAI,CAAC,aAAa,IAAI,eAAe,IAAI,cAAc,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"ticketSettingsOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketSettingsOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { prepareTicketForBuild } from './buildFlow.js';
|
|
|
5
5
|
import { isBundleBuildBlocked } from './bundleActivity.js';
|
|
6
6
|
import { getEffectiveProject } from './projects.js';
|
|
7
7
|
import { assignTicketLaneOrder, autoParkTicketIfStale, getTicket, resolveTicketTool } from './tickets.js';
|
|
8
|
+
import { getBundleAutomationState, recordAutomationPause } from './ticketAutomation.js';
|
|
8
9
|
import { startBuild } from '../workers/build.js';
|
|
9
10
|
import { startReview } from '../workers/review.js';
|
|
10
11
|
const VALID_TICKET_STATES = ['plan', 'build', 'review'];
|
|
@@ -46,6 +47,16 @@ export const transitionTicketState = ({ ticketId, requestedState, requestedProje
|
|
|
46
47
|
if (requestedProjectId !== undefined && existing.project_id !== requestedProjectId) {
|
|
47
48
|
return { ok: false, status: 404, error: 'Not found' };
|
|
48
49
|
}
|
|
50
|
+
if (existing.project_id && existing.worktree_bundle_id) {
|
|
51
|
+
const bundleState = getBundleAutomationState(existing.project_id, existing.worktree_bundle_id);
|
|
52
|
+
if (bundleState && !bundleState.automation_paused_reason && bundleState.fix_loop_active === 1) {
|
|
53
|
+
recordAutomationPause(existing.project_id, existing.worktree_bundle_id, 'manual transition');
|
|
54
|
+
const pausedTicket = getTicket(existing.id);
|
|
55
|
+
if (pausedTicket) {
|
|
56
|
+
broadcaster.emit('ticket:updated', pausedTicket);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
49
60
|
if (ticketState === 'plan' && existing.state !== 'plan') {
|
|
50
61
|
return { ok: false, status: 409, error: 'Tickets cannot be moved back to plan after work begins' };
|
|
51
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticketWorkflowOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketWorkflowOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"ticketWorkflowOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketWorkflowOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { getGitHubConnectionConfig } from './integrations/index.js';
|
|
|
8
8
|
import { getEffectiveProject, getProjectById, hasProjectRunIde } from './projects.js';
|
|
9
9
|
import { getReviewContextState } from './reviewFindings.js';
|
|
10
10
|
import { hasRunConfig, isRunning } from './run.js';
|
|
11
|
+
import { loadBundleAutomationStateMap, resolveAutomationConfig, resolveBundleAutomationState, } from './ticketAutomation.js';
|
|
11
12
|
import { listTicketMessages, upsertTicketDescriptionMessage } from './ticketMessages.js';
|
|
12
13
|
import { getTicketUndo } from './ticketUndo.js';
|
|
13
14
|
const ticketSelect = `
|
|
@@ -445,7 +446,7 @@ export const serializeTicket = (row, options = {}) => {
|
|
|
445
446
|
if (!row) {
|
|
446
447
|
return null;
|
|
447
448
|
}
|
|
448
|
-
const { diffStatsCache, gitStatusCache, existingWorktreePaths, worktreeRecordsCache, includeDetail = true, includeMessages = includeDetail, includeLogs = includeDetail, includeUndo = includeDetail, includeDiffStats = includeDetail, includeStaleState = includeDetail, includeWorktreeState = includeDetail, bundleExecutionPositionByTicketId, githubConnectionCache, bundlePullRequestCache, } = options;
|
|
449
|
+
const { diffStatsCache, gitStatusCache, existingWorktreePaths, worktreeRecordsCache, includeDetail = true, includeMessages = includeDetail, includeLogs = includeDetail, includeUndo = includeDetail, includeDiffStats = includeDetail, includeStaleState = includeDetail, includeWorktreeState = includeDetail, bundleExecutionPositionByTicketId, githubConnectionCache, bundlePullRequestCache, bundleAutomationStateCache, } = options;
|
|
449
450
|
const project = getEffectiveProject(row);
|
|
450
451
|
const bundle = serializeBundle(row, {
|
|
451
452
|
githubConnectionCache,
|
|
@@ -493,6 +494,14 @@ export const serializeTicket = (row, options = {}) => {
|
|
|
493
494
|
const hasGitHubConnection = row.project_id
|
|
494
495
|
? resolveProjectGitHubConnection(row.project_id, githubConnectionCache)
|
|
495
496
|
: false;
|
|
497
|
+
const automationConfig = resolveAutomationConfig({
|
|
498
|
+
automation_depth: row.automation_depth ?? null,
|
|
499
|
+
automation_review_fix_enabled: row.automation_review_fix_enabled ?? null,
|
|
500
|
+
project_id: row.project_id,
|
|
501
|
+
}, project);
|
|
502
|
+
const bundleAutomationState = row.project_id && row.worktree_bundle_id
|
|
503
|
+
? resolveBundleAutomationState(row.project_id, row.worktree_bundle_id, bundleAutomationStateCache)
|
|
504
|
+
: null;
|
|
496
505
|
const canReReview = reviewContextState.hasCompletedReview
|
|
497
506
|
&& reviewContextState.hasFollowUpSinceLastReview
|
|
498
507
|
&& row.agent_status !== 'running';
|
|
@@ -531,6 +540,13 @@ export const serializeTicket = (row, options = {}) => {
|
|
|
531
540
|
external_source: parseExternalSource(row),
|
|
532
541
|
origin_spec_session_id: row.origin_spec_session_id ?? null,
|
|
533
542
|
origin_spec_snapshot_id: row.origin_spec_snapshot_id ?? null,
|
|
543
|
+
automation_depth: row.automation_depth ?? null,
|
|
544
|
+
automation_review_fix_enabled: row.automation_review_fix_enabled ?? null,
|
|
545
|
+
automation_config: automationConfig,
|
|
546
|
+
automation_paused_reason: bundleAutomationState?.automation_paused_reason ?? null,
|
|
547
|
+
automation_paused_at: bundleAutomationState?.automation_paused_at ?? null,
|
|
548
|
+
automation_review_iteration_count: bundleAutomationState?.review_iteration_count ?? 0,
|
|
549
|
+
automation_fix_loop_active: Boolean(bundleAutomationState?.fix_loop_active),
|
|
534
550
|
...parseUsageSnapshotJson(row.usage_snapshot_json),
|
|
535
551
|
};
|
|
536
552
|
const ticketWithOptionalFields = {
|
|
@@ -606,6 +622,11 @@ export const listTickets = (projectId, options = {}) => {
|
|
|
606
622
|
tickets.updated_at DESC,
|
|
607
623
|
tickets.id DESC`).all(projectId);
|
|
608
624
|
const rowsLoadedAt = performance.now();
|
|
625
|
+
const bundleAutomationStateCache = projectId
|
|
626
|
+
? loadBundleAutomationStateMap(projectId, rows
|
|
627
|
+
.filter(row => row.worktree_bundle_id)
|
|
628
|
+
.map(row => row.worktree_bundle_id))
|
|
629
|
+
: new Map();
|
|
609
630
|
const serializedRows = rows
|
|
610
631
|
.map(row => serializeTicket(row, {
|
|
611
632
|
includeDetail: includeFullDetail,
|
|
@@ -620,6 +641,7 @@ export const listTickets = (projectId, options = {}) => {
|
|
|
620
641
|
worktreeRecordsCache,
|
|
621
642
|
githubConnectionCache,
|
|
622
643
|
bundlePullRequestCache,
|
|
644
|
+
bundleAutomationStateCache,
|
|
623
645
|
}))
|
|
624
646
|
.filter((ticket) => ticket !== null);
|
|
625
647
|
const rowsSerializedAt = performance.now();
|
|
@@ -804,10 +826,14 @@ export const listBoardTicketEnrichment = (projectId) => {
|
|
|
804
826
|
};
|
|
805
827
|
export const getTicket = (id) => {
|
|
806
828
|
const row = db.prepare(`${ticketSelect} WHERE tickets.id = ?`).get(id);
|
|
829
|
+
const bundleAutomationStateCache = row?.project_id && row?.worktree_bundle_id
|
|
830
|
+
? loadBundleAutomationStateMap(row.project_id, [row.worktree_bundle_id])
|
|
831
|
+
: new Map();
|
|
807
832
|
const ticket = serializeTicket(row, {
|
|
808
833
|
includeDetail: true,
|
|
809
834
|
githubConnectionCache: new Map(),
|
|
810
835
|
bundlePullRequestCache: new Map(),
|
|
836
|
+
bundleAutomationStateCache,
|
|
811
837
|
});
|
|
812
838
|
if (!ticket) {
|
|
813
839
|
return null;
|
|
@@ -947,6 +973,9 @@ export const listTicketsInRunContext = (ticket, options = {}) => {
|
|
|
947
973
|
CASE WHEN tickets.parked_at IS NULL THEN COALESCE(tickets.lane_order, 0) ELSE COALESCE(tickets.done_order, 0) END DESC,
|
|
948
974
|
tickets.updated_at DESC,
|
|
949
975
|
tickets.id DESC`).all(ticket.worktree_bundle_id, ticket.project_id);
|
|
976
|
+
const bundleAutomationStateCache = ticket.project_id
|
|
977
|
+
? loadBundleAutomationStateMap(ticket.project_id, [ticket.worktree_bundle_id])
|
|
978
|
+
: new Map();
|
|
950
979
|
return applyBundleExecutionPositions(rows
|
|
951
980
|
.map(row => serializeTicket(row, {
|
|
952
981
|
includeDetail,
|
|
@@ -962,6 +991,7 @@ export const listTicketsInRunContext = (ticket, options = {}) => {
|
|
|
962
991
|
worktreeRecordsCache,
|
|
963
992
|
githubConnectionCache,
|
|
964
993
|
bundlePullRequestCache,
|
|
994
|
+
bundleAutomationStateCache,
|
|
965
995
|
}))
|
|
966
996
|
.filter((entry) => entry !== null));
|
|
967
997
|
}
|