@straiffi/archon 1.0.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/README.md +224 -0
- package/dist/cli.js +216 -0
- package/dist/client/assets/index-8_-boBBA.css +2 -0
- package/dist/client/assets/index-s_jjeqha.js +176 -0
- package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/dist/client/favicon.svg +62 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +14 -0
- package/dist/server/db.js +764 -0
- package/dist/server/db.js.map +1 -0
- package/dist/server/index.js +5134 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/agent.js +1302 -0
- package/dist/server/lib/agent.js.map +1 -0
- package/dist/server/lib/buildChains.js +2 -0
- package/dist/server/lib/buildChains.js.map +1 -0
- package/dist/server/lib/buildFlow.js +59 -0
- package/dist/server/lib/buildFlow.js.map +1 -0
- package/dist/server/lib/buildSequences.js +599 -0
- package/dist/server/lib/buildSequences.js.map +1 -0
- package/dist/server/lib/bundleActivity.js +95 -0
- package/dist/server/lib/bundleActivity.js.map +1 -0
- package/dist/server/lib/bundlePullRequests.js +126 -0
- package/dist/server/lib/bundlePullRequests.js.map +1 -0
- package/dist/server/lib/chatMessages.js +60 -0
- package/dist/server/lib/chatMessages.js.map +1 -0
- package/dist/server/lib/chatTargets.js +123 -0
- package/dist/server/lib/chatTargets.js.map +1 -0
- package/dist/server/lib/chatTicketProposals.js +180 -0
- package/dist/server/lib/chatTicketProposals.js.map +1 -0
- package/dist/server/lib/chats.js +279 -0
- package/dist/server/lib/chats.js.map +1 -0
- package/dist/server/lib/config.js +3 -0
- package/dist/server/lib/config.js.map +1 -0
- package/dist/server/lib/cors.js +30 -0
- package/dist/server/lib/cors.js.map +1 -0
- package/dist/server/lib/directoryPicker.js +174 -0
- package/dist/server/lib/directoryPicker.js.map +1 -0
- package/dist/server/lib/git.js +1284 -0
- package/dist/server/lib/git.js.map +1 -0
- package/dist/server/lib/integrations/github.js +511 -0
- package/dist/server/lib/integrations/github.js.map +1 -0
- package/dist/server/lib/integrations/index.js +162 -0
- package/dist/server/lib/integrations/index.js.map +1 -0
- package/dist/server/lib/integrations/jira.js +283 -0
- package/dist/server/lib/integrations/jira.js.map +1 -0
- package/dist/server/lib/integrations/planning.js +27 -0
- package/dist/server/lib/integrations/planning.js.map +1 -0
- package/dist/server/lib/integrations/types.js +2 -0
- package/dist/server/lib/integrations/types.js.map +1 -0
- package/dist/server/lib/lightweightPrompt.js +88 -0
- package/dist/server/lib/lightweightPrompt.js.map +1 -0
- package/dist/server/lib/models.js +219 -0
- package/dist/server/lib/models.js.map +1 -0
- package/dist/server/lib/preview.js +377 -0
- package/dist/server/lib/preview.js.map +1 -0
- package/dist/server/lib/previewProxy.js +659 -0
- package/dist/server/lib/previewProxy.js.map +1 -0
- package/dist/server/lib/projectAutoConfig.js +682 -0
- package/dist/server/lib/projectAutoConfig.js.map +1 -0
- package/dist/server/lib/projectFileSuggestions.js +133 -0
- package/dist/server/lib/projectFileSuggestions.js.map +1 -0
- package/dist/server/lib/projectMemory.js +1519 -0
- package/dist/server/lib/projectMemory.js.map +1 -0
- package/dist/server/lib/projectMemoryPrompt.js +390 -0
- package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
- package/dist/server/lib/projectMemoryScan.js +681 -0
- package/dist/server/lib/projectMemoryScan.js.map +1 -0
- package/dist/server/lib/projectMemorySuggestions.js +166 -0
- package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
- package/dist/server/lib/projectMemoryTransfer.js +958 -0
- package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
- package/dist/server/lib/projects.js +569 -0
- package/dist/server/lib/projects.js.map +1 -0
- package/dist/server/lib/promptSkills.js +28 -0
- package/dist/server/lib/promptSkills.js.map +1 -0
- package/dist/server/lib/queue.js +15 -0
- package/dist/server/lib/queue.js.map +1 -0
- package/dist/server/lib/reviewFindings.js +390 -0
- package/dist/server/lib/reviewFindings.js.map +1 -0
- package/dist/server/lib/run.js +416 -0
- package/dist/server/lib/run.js.map +1 -0
- package/dist/server/lib/runtimePaths.js +93 -0
- package/dist/server/lib/runtimePaths.js.map +1 -0
- package/dist/server/lib/shell.js +27 -0
- package/dist/server/lib/shell.js.map +1 -0
- package/dist/server/lib/skills.js +124 -0
- package/dist/server/lib/skills.js.map +1 -0
- package/dist/server/lib/startDev.js +18 -0
- package/dist/server/lib/startDev.js.map +1 -0
- package/dist/server/lib/staticClient.js +80 -0
- package/dist/server/lib/staticClient.js.map +1 -0
- package/dist/server/lib/terminal.js +366 -0
- package/dist/server/lib/terminal.js.map +1 -0
- package/dist/server/lib/ticketDependencies.js +174 -0
- package/dist/server/lib/ticketDependencies.js.map +1 -0
- package/dist/server/lib/ticketMessages.js +65 -0
- package/dist/server/lib/ticketMessages.js.map +1 -0
- package/dist/server/lib/ticketOpenQuestions.js +128 -0
- package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
- package/dist/server/lib/ticketUndo.js +549 -0
- package/dist/server/lib/ticketUndo.js.map +1 -0
- package/dist/server/lib/tickets.js +981 -0
- package/dist/server/lib/tickets.js.map +1 -0
- package/dist/server/lib/types.js +2 -0
- package/dist/server/lib/types.js.map +1 -0
- package/dist/server/package.json +3 -0
- package/dist/server/workers/build.js +229 -0
- package/dist/server/workers/build.js.map +1 -0
- package/dist/server/workers/chat.js +190 -0
- package/dist/server/workers/chat.js.map +1 -0
- package/dist/server/workers/followUp.js +204 -0
- package/dist/server/workers/followUp.js.map +1 -0
- package/dist/server/workers/plan.js +1130 -0
- package/dist/server/workers/plan.js.map +1 -0
- package/dist/server/workers/planFollowUp.js +360 -0
- package/dist/server/workers/planFollowUp.js.map +1 -0
- package/dist/server/workers/review.js +167 -0
- package/dist/server/workers/review.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import db from '../db.js';
|
|
3
|
+
import { isTicketBuildComplete, listTicketDependencies } from './ticketDependencies.js';
|
|
4
|
+
const compareTickets = (left, right) => {
|
|
5
|
+
const createdAtComparison = left.created_at.localeCompare(right.created_at);
|
|
6
|
+
if (createdAtComparison !== 0) {
|
|
7
|
+
return createdAtComparison;
|
|
8
|
+
}
|
|
9
|
+
const titleComparison = left.title.localeCompare(right.title, undefined, { sensitivity: 'base' });
|
|
10
|
+
if (titleComparison !== 0) {
|
|
11
|
+
return titleComparison;
|
|
12
|
+
}
|
|
13
|
+
return left.id.localeCompare(right.id);
|
|
14
|
+
};
|
|
15
|
+
const listProjectTickets = (projectId) => {
|
|
16
|
+
return db.prepare('SELECT id, title, created_at, build_completed_at, state, agent_status FROM tickets WHERE project_id = ? ORDER BY created_at ASC, title COLLATE NOCASE ASC, id ASC').all(projectId);
|
|
17
|
+
};
|
|
18
|
+
const getReachableDependentTicketIds = (rootTicketId, dependencies) => {
|
|
19
|
+
const queue = [rootTicketId];
|
|
20
|
+
const visited = new Set();
|
|
21
|
+
const reachableDependentTicketIds = new Set();
|
|
22
|
+
while (queue.length > 0) {
|
|
23
|
+
const currentTicketId = queue.shift();
|
|
24
|
+
if (!currentTicketId || visited.has(currentTicketId)) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
visited.add(currentTicketId);
|
|
28
|
+
for (const dependency of dependencies) {
|
|
29
|
+
if (dependency.blocker_ticket_id !== currentTicketId) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
reachableDependentTicketIds.add(dependency.dependent_ticket_id);
|
|
33
|
+
queue.push(dependency.dependent_ticket_id);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return reachableDependentTicketIds;
|
|
37
|
+
};
|
|
38
|
+
const insertSorted = (queue, ticketId, ticketById) => {
|
|
39
|
+
const ticket = ticketById.get(ticketId);
|
|
40
|
+
if (!ticket) {
|
|
41
|
+
queue.push(ticketId);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let inserted = false;
|
|
45
|
+
for (let index = 0; index < queue.length; index += 1) {
|
|
46
|
+
const current = ticketById.get(queue[index]);
|
|
47
|
+
if (!current) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (compareTickets(ticket, current) < 0) {
|
|
51
|
+
queue.splice(index, 0, ticketId);
|
|
52
|
+
inserted = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!inserted) {
|
|
57
|
+
queue.push(ticketId);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const buildTopologicallyOrderedTicketIds = (ticketIds, dependencies, ticketById) => {
|
|
61
|
+
const normalizedTicketIds = [...new Set(ticketIds)].filter(ticketId => ticketById.has(ticketId));
|
|
62
|
+
const ticketIdSet = new Set(normalizedTicketIds);
|
|
63
|
+
const indegree = new Map();
|
|
64
|
+
const outgoing = new Map();
|
|
65
|
+
for (const ticketId of normalizedTicketIds) {
|
|
66
|
+
indegree.set(ticketId, 0);
|
|
67
|
+
outgoing.set(ticketId, []);
|
|
68
|
+
}
|
|
69
|
+
for (const dependency of dependencies) {
|
|
70
|
+
if (!ticketIdSet.has(dependency.blocker_ticket_id) || !ticketIdSet.has(dependency.dependent_ticket_id)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
outgoing.get(dependency.blocker_ticket_id)?.push(dependency.dependent_ticket_id);
|
|
74
|
+
indegree.set(dependency.dependent_ticket_id, (indegree.get(dependency.dependent_ticket_id) ?? 0) + 1);
|
|
75
|
+
}
|
|
76
|
+
const queue = [];
|
|
77
|
+
for (const ticketId of normalizedTicketIds) {
|
|
78
|
+
if ((indegree.get(ticketId) ?? 0) === 0) {
|
|
79
|
+
insertSorted(queue, ticketId, ticketById);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const orderedTicketIds = [];
|
|
83
|
+
while (queue.length > 0) {
|
|
84
|
+
const currentTicketId = queue.shift();
|
|
85
|
+
if (!currentTicketId) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
orderedTicketIds.push(currentTicketId);
|
|
89
|
+
for (const dependentTicketId of outgoing.get(currentTicketId) ?? []) {
|
|
90
|
+
const nextIndegree = (indegree.get(dependentTicketId) ?? 0) - 1;
|
|
91
|
+
indegree.set(dependentTicketId, nextIndegree);
|
|
92
|
+
if (nextIndegree === 0) {
|
|
93
|
+
insertSorted(queue, dependentTicketId, ticketById);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return orderedTicketIds;
|
|
98
|
+
};
|
|
99
|
+
const buildDependencyOrderedTicketIds = (rootTicketId, dependencies, ticketById) => {
|
|
100
|
+
const reachableDependentTicketIds = getReachableDependentTicketIds(rootTicketId, dependencies);
|
|
101
|
+
if (reachableDependentTicketIds.size === 0) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
return buildTopologicallyOrderedTicketIds([rootTicketId, ...reachableDependentTicketIds], dependencies, ticketById);
|
|
105
|
+
};
|
|
106
|
+
export const getDependencyOrderedBundleTicketIds = (projectId, bundleTicketIds) => {
|
|
107
|
+
if (bundleTicketIds.length <= 1) {
|
|
108
|
+
return [...bundleTicketIds];
|
|
109
|
+
}
|
|
110
|
+
const projectTickets = listProjectTickets(projectId);
|
|
111
|
+
const ticketById = new Map(projectTickets.map(ticket => [ticket.id, ticket]));
|
|
112
|
+
const orderedTicketIds = buildTopologicallyOrderedTicketIds(bundleTicketIds, listTicketDependencies(projectId), ticketById);
|
|
113
|
+
return orderedTicketIds;
|
|
114
|
+
};
|
|
115
|
+
const getSequenceRow = (sequenceId) => db.prepare('SELECT * FROM build_sequences WHERE id = ?').get(sequenceId);
|
|
116
|
+
const listSequenceItems = (sequenceId) => db.prepare('SELECT * FROM build_sequence_tickets WHERE build_sequence_id = ? ORDER BY position ASC, entered_queue_at ASC, ticket_id ASC').all(sequenceId);
|
|
117
|
+
const getSequenceByTicketId = (ticketId, kind) => db.prepare(`
|
|
118
|
+
SELECT build_sequences.*
|
|
119
|
+
FROM build_sequences
|
|
120
|
+
INNER JOIN build_sequence_tickets
|
|
121
|
+
ON build_sequence_tickets.build_sequence_id = build_sequences.id
|
|
122
|
+
WHERE build_sequence_tickets.ticket_id = ?
|
|
123
|
+
AND build_sequences.status = 'active'
|
|
124
|
+
${kind ? "AND build_sequences.kind = ?" : ''}
|
|
125
|
+
ORDER BY build_sequences.created_at ASC, build_sequences.id ASC
|
|
126
|
+
LIMIT 1
|
|
127
|
+
`).get(...(kind ? [ticketId, kind] : [ticketId]));
|
|
128
|
+
const getActiveSequenceByBundle = (projectId, bundleId) => db.prepare(`
|
|
129
|
+
SELECT *
|
|
130
|
+
FROM build_sequences
|
|
131
|
+
WHERE project_id = ?
|
|
132
|
+
AND worktree_bundle_id = ?
|
|
133
|
+
AND status = 'active'
|
|
134
|
+
ORDER BY created_at ASC, id ASC
|
|
135
|
+
LIMIT 1
|
|
136
|
+
`).get(projectId, bundleId);
|
|
137
|
+
const getLatestSequenceByBundle = (projectId, bundleId) => db.prepare(`
|
|
138
|
+
SELECT *
|
|
139
|
+
FROM build_sequences
|
|
140
|
+
WHERE project_id = ?
|
|
141
|
+
AND worktree_bundle_id = ?
|
|
142
|
+
AND kind = 'bundle_queue'
|
|
143
|
+
ORDER BY created_at DESC, id DESC
|
|
144
|
+
LIMIT 1
|
|
145
|
+
`).get(projectId, bundleId);
|
|
146
|
+
const listBundleQueueSequences = (projectId, bundleId) => db.prepare(`
|
|
147
|
+
SELECT *
|
|
148
|
+
FROM build_sequences
|
|
149
|
+
WHERE project_id = ?
|
|
150
|
+
AND worktree_bundle_id = ?
|
|
151
|
+
AND kind = 'bundle_queue'
|
|
152
|
+
ORDER BY created_at ASC, id ASC
|
|
153
|
+
`).all(projectId, bundleId);
|
|
154
|
+
const getBuildSequenceStateById = (sequenceId) => {
|
|
155
|
+
const sequence = getSequenceRow(sequenceId);
|
|
156
|
+
if (!sequence) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
sequence,
|
|
161
|
+
items: listSequenceItems(sequenceId),
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
const getBuildSequenceStateByTicketId = (ticketId, kind) => {
|
|
165
|
+
const sequence = getSequenceByTicketId(ticketId, kind);
|
|
166
|
+
if (!sequence) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
return getBuildSequenceStateById(sequence.id);
|
|
170
|
+
};
|
|
171
|
+
const setSequenceStatus = (sequenceId, status) => {
|
|
172
|
+
db.prepare('UPDATE build_sequences SET status = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(status, sequenceId);
|
|
173
|
+
};
|
|
174
|
+
const getAffectedTicketIds = (state) => state.items.map(item => item.ticket_id);
|
|
175
|
+
const deleteSequenceItem = (sequenceId, ticketId) => {
|
|
176
|
+
db.prepare('DELETE FROM build_sequence_tickets WHERE build_sequence_id = ? AND ticket_id = ?').run(sequenceId, ticketId);
|
|
177
|
+
};
|
|
178
|
+
const renumberSequenceItems = (sequenceId) => {
|
|
179
|
+
const items = listSequenceItems(sequenceId);
|
|
180
|
+
const update = db.prepare('UPDATE build_sequence_tickets SET position = ? WHERE build_sequence_id = ? AND ticket_id = ?');
|
|
181
|
+
items.forEach((item, index) => {
|
|
182
|
+
if (item.position !== index) {
|
|
183
|
+
update.run(index, sequenceId, item.ticket_id);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
const cancelQueuedSequenceItems = (sequenceId) => {
|
|
188
|
+
db.prepare(`
|
|
189
|
+
UPDATE build_sequence_tickets
|
|
190
|
+
SET status = 'cancelled', finished_at = COALESCE(finished_at, CURRENT_TIMESTAMP)
|
|
191
|
+
WHERE build_sequence_id = ?
|
|
192
|
+
AND status = 'queued'
|
|
193
|
+
`).run(sequenceId);
|
|
194
|
+
};
|
|
195
|
+
const getNextBundleQueuedItem = (state) => {
|
|
196
|
+
const nextQueuedItem = state.items.find(item => item.status === 'queued') ?? null;
|
|
197
|
+
if (!nextQueuedItem) {
|
|
198
|
+
return {
|
|
199
|
+
blockedByInternalDependency: false,
|
|
200
|
+
item: null,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const itemByTicketId = new Map(state.items.map(item => [item.ticket_id, item]));
|
|
204
|
+
const sequenceTicketIdSet = new Set(state.items.map(item => item.ticket_id));
|
|
205
|
+
const hasPendingInternalBlocker = listTicketDependencies(state.sequence.project_id).some(dependency => {
|
|
206
|
+
if (dependency.dependent_ticket_id !== nextQueuedItem.ticket_id) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
if (!sequenceTicketIdSet.has(dependency.blocker_ticket_id)) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return itemByTicketId.get(dependency.blocker_ticket_id)?.status !== 'done';
|
|
213
|
+
});
|
|
214
|
+
return {
|
|
215
|
+
blockedByInternalDependency: hasPendingInternalBlocker,
|
|
216
|
+
item: hasPendingInternalBlocker ? null : nextQueuedItem,
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
const createSequence = ({ kind, projectId, worktreeBundleId, rootTicketId, orderedTicketIds, activeTicketId, }) => {
|
|
220
|
+
const sequenceId = randomUUID();
|
|
221
|
+
db.prepare('INSERT INTO build_sequences (id, project_id, worktree_bundle_id, kind, root_ticket_id, status) VALUES (?, ?, ?, ?, ?, ?)').run(sequenceId, projectId, worktreeBundleId ?? null, kind, rootTicketId ?? null, 'active');
|
|
222
|
+
const insert = db.prepare(`
|
|
223
|
+
INSERT INTO build_sequence_tickets (
|
|
224
|
+
build_sequence_id,
|
|
225
|
+
ticket_id,
|
|
226
|
+
position,
|
|
227
|
+
status,
|
|
228
|
+
entered_queue_at,
|
|
229
|
+
started_at,
|
|
230
|
+
finished_at
|
|
231
|
+
) VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, ?, ?)
|
|
232
|
+
`);
|
|
233
|
+
orderedTicketIds.forEach((ticketId, index) => {
|
|
234
|
+
const isActive = ticketId === activeTicketId;
|
|
235
|
+
insert.run(sequenceId, ticketId, index, isActive ? 'active' : 'queued', isActive ? new Date().toISOString() : null, null);
|
|
236
|
+
});
|
|
237
|
+
return sequenceId;
|
|
238
|
+
};
|
|
239
|
+
export const getBuildChainTicketState = (ticketId) => {
|
|
240
|
+
const state = getBuildSequenceStateByTicketId(ticketId, 'dependency_chain');
|
|
241
|
+
if (!state) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
const activeItem = state.items.find(item => item.status === 'active') ?? null;
|
|
245
|
+
const queuedItems = state.items.filter(item => item.status === 'queued');
|
|
246
|
+
return {
|
|
247
|
+
root_ticket_id: state.sequence.root_ticket_id ?? activeItem?.ticket_id ?? ticketId,
|
|
248
|
+
active_ticket_id: activeItem?.ticket_id ?? null,
|
|
249
|
+
queued_ticket_ids: queuedItems.map(item => item.ticket_id),
|
|
250
|
+
is_root: state.sequence.root_ticket_id === ticketId,
|
|
251
|
+
is_active: activeItem?.ticket_id === ticketId,
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
export const getLatestBundleExecutionOrder = (projectId, bundleId) => {
|
|
255
|
+
const latestSequence = getLatestSequenceByBundle(projectId, bundleId);
|
|
256
|
+
if (!latestSequence) {
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
return listSequenceItems(latestSequence.id).map(item => item.ticket_id);
|
|
260
|
+
};
|
|
261
|
+
export const getStableBundleExecutionOrder = (projectId, bundleId) => {
|
|
262
|
+
const orderedTicketIds = [];
|
|
263
|
+
const seenTicketIds = new Set();
|
|
264
|
+
for (const sequence of listBundleQueueSequences(projectId, bundleId)) {
|
|
265
|
+
for (const item of listSequenceItems(sequence.id)) {
|
|
266
|
+
if (seenTicketIds.has(item.ticket_id)) {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
seenTicketIds.add(item.ticket_id);
|
|
270
|
+
orderedTicketIds.push(item.ticket_id);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return orderedTicketIds;
|
|
274
|
+
};
|
|
275
|
+
export const startBuildChain = (rootTicketId, projectId) => {
|
|
276
|
+
const existingState = getBuildSequenceStateByTicketId(rootTicketId, 'dependency_chain');
|
|
277
|
+
if (existingState) {
|
|
278
|
+
return {
|
|
279
|
+
ok: false,
|
|
280
|
+
status: 409,
|
|
281
|
+
error: 'A build chain is already active for this project.',
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
const existingProjectChain = db.prepare(`
|
|
285
|
+
SELECT 1
|
|
286
|
+
FROM build_sequences
|
|
287
|
+
WHERE project_id = ?
|
|
288
|
+
AND kind = 'dependency_chain'
|
|
289
|
+
AND status = 'active'
|
|
290
|
+
LIMIT 1
|
|
291
|
+
`).get(projectId);
|
|
292
|
+
if (existingProjectChain) {
|
|
293
|
+
return {
|
|
294
|
+
ok: false,
|
|
295
|
+
status: 409,
|
|
296
|
+
error: 'A build chain is already active for this project.',
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const projectTickets = listProjectTickets(projectId);
|
|
300
|
+
const ticketById = new Map(projectTickets.map(ticket => [ticket.id, ticket]));
|
|
301
|
+
if (!ticketById.has(rootTicketId)) {
|
|
302
|
+
return {
|
|
303
|
+
ok: false,
|
|
304
|
+
status: 404,
|
|
305
|
+
error: 'Not found',
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const dependencies = listTicketDependencies(projectId);
|
|
309
|
+
const orderedTicketIds = buildDependencyOrderedTicketIds(rootTicketId, dependencies, ticketById);
|
|
310
|
+
if (orderedTicketIds.length === 0) {
|
|
311
|
+
return {
|
|
312
|
+
ok: false,
|
|
313
|
+
status: 409,
|
|
314
|
+
error: 'Build chain requires at least one dependent ticket.',
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
const pendingTicketIds = orderedTicketIds.filter(ticketId => !isTicketBuildComplete(ticketById.get(ticketId)));
|
|
318
|
+
if (pendingTicketIds.length === 0) {
|
|
319
|
+
return {
|
|
320
|
+
ok: false,
|
|
321
|
+
status: 409,
|
|
322
|
+
error: 'All tickets in this build chain have already finished building.',
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
const sequenceId = createSequence({
|
|
326
|
+
kind: 'dependency_chain',
|
|
327
|
+
projectId,
|
|
328
|
+
rootTicketId,
|
|
329
|
+
orderedTicketIds: pendingTicketIds,
|
|
330
|
+
activeTicketId: pendingTicketIds[0],
|
|
331
|
+
});
|
|
332
|
+
return {
|
|
333
|
+
ok: true,
|
|
334
|
+
activeTicketId: pendingTicketIds[0],
|
|
335
|
+
affectedTicketIds: pendingTicketIds,
|
|
336
|
+
sequenceId,
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
export const stopBuildChain = (ticketId) => {
|
|
340
|
+
const state = getBuildSequenceStateByTicketId(ticketId, 'dependency_chain');
|
|
341
|
+
if (!state) {
|
|
342
|
+
return {
|
|
343
|
+
ok: false,
|
|
344
|
+
affectedTicketIds: [],
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
cancelQueuedSequenceItems(state.sequence.id);
|
|
348
|
+
setSequenceStatus(state.sequence.id, 'stopped');
|
|
349
|
+
return {
|
|
350
|
+
ok: true,
|
|
351
|
+
affectedTicketIds: getAffectedTicketIds(state),
|
|
352
|
+
};
|
|
353
|
+
};
|
|
354
|
+
export const advanceBuildChain = (ticketId, agentStatus) => {
|
|
355
|
+
const state = getBuildSequenceStateByTicketId(ticketId);
|
|
356
|
+
if (!state) {
|
|
357
|
+
return {
|
|
358
|
+
affectedTicketIds: [],
|
|
359
|
+
ignoredBlockerTicketIds: [],
|
|
360
|
+
nextTicketId: null,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
const activeItem = state.items.find(item => item.status === 'active');
|
|
364
|
+
if (!activeItem || activeItem.ticket_id !== ticketId) {
|
|
365
|
+
return {
|
|
366
|
+
affectedTicketIds: [],
|
|
367
|
+
ignoredBlockerTicketIds: [],
|
|
368
|
+
nextTicketId: null,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
const affectedTicketIds = getAffectedTicketIds(state);
|
|
372
|
+
const terminalStatus = agentStatus === 'done' ? 'done' : 'failed';
|
|
373
|
+
db.prepare(`
|
|
374
|
+
UPDATE build_sequence_tickets
|
|
375
|
+
SET status = ?, finished_at = CURRENT_TIMESTAMP
|
|
376
|
+
WHERE build_sequence_id = ?
|
|
377
|
+
AND ticket_id = ?
|
|
378
|
+
`).run(terminalStatus, state.sequence.id, ticketId);
|
|
379
|
+
const nextState = {
|
|
380
|
+
...state,
|
|
381
|
+
items: state.items.map(item => item.ticket_id === ticketId
|
|
382
|
+
? { ...item, status: terminalStatus, finished_at: new Date().toISOString() }
|
|
383
|
+
: item),
|
|
384
|
+
};
|
|
385
|
+
if (agentStatus !== 'done') {
|
|
386
|
+
if (state.sequence.kind === 'bundle_queue') {
|
|
387
|
+
cancelQueuedSequenceItems(state.sequence.id);
|
|
388
|
+
}
|
|
389
|
+
setSequenceStatus(state.sequence.id, 'failed');
|
|
390
|
+
return {
|
|
391
|
+
affectedTicketIds,
|
|
392
|
+
ignoredBlockerTicketIds: [],
|
|
393
|
+
nextTicketId: null,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
const nextQueuedItem = state.sequence.kind === 'bundle_queue'
|
|
397
|
+
? getNextBundleQueuedItem(nextState)
|
|
398
|
+
: {
|
|
399
|
+
blockedByInternalDependency: false,
|
|
400
|
+
item: nextState.items.find(item => item.status === 'queued') ?? null,
|
|
401
|
+
};
|
|
402
|
+
if (!nextQueuedItem.item) {
|
|
403
|
+
if (nextQueuedItem.blockedByInternalDependency) {
|
|
404
|
+
cancelQueuedSequenceItems(state.sequence.id);
|
|
405
|
+
setSequenceStatus(state.sequence.id, 'stopped');
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
setSequenceStatus(state.sequence.id, 'completed');
|
|
409
|
+
}
|
|
410
|
+
return {
|
|
411
|
+
affectedTicketIds,
|
|
412
|
+
ignoredBlockerTicketIds: [],
|
|
413
|
+
nextTicketId: null,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
db.prepare(`
|
|
417
|
+
UPDATE build_sequence_tickets
|
|
418
|
+
SET status = 'active', started_at = COALESCE(started_at, CURRENT_TIMESTAMP)
|
|
419
|
+
WHERE build_sequence_id = ?
|
|
420
|
+
AND ticket_id = ?
|
|
421
|
+
`).run(state.sequence.id, nextQueuedItem.item.ticket_id);
|
|
422
|
+
db.prepare('UPDATE build_sequences SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(state.sequence.id);
|
|
423
|
+
return {
|
|
424
|
+
affectedTicketIds,
|
|
425
|
+
ignoredBlockerTicketIds: state.sequence.kind === 'bundle_queue' ? affectedTicketIds : [],
|
|
426
|
+
nextTicketId: nextQueuedItem.item.ticket_id,
|
|
427
|
+
};
|
|
428
|
+
};
|
|
429
|
+
export const stopBuildSequence = (ticketId) => {
|
|
430
|
+
const state = getBuildSequenceStateByTicketId(ticketId);
|
|
431
|
+
if (!state) {
|
|
432
|
+
return {
|
|
433
|
+
ok: false,
|
|
434
|
+
affectedTicketIds: [],
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
cancelQueuedSequenceItems(state.sequence.id);
|
|
438
|
+
setSequenceStatus(state.sequence.id, 'stopped');
|
|
439
|
+
return {
|
|
440
|
+
ok: true,
|
|
441
|
+
affectedTicketIds: getAffectedTicketIds(state),
|
|
442
|
+
};
|
|
443
|
+
};
|
|
444
|
+
export const removeTicketFromBuildSequence = (ticketId) => {
|
|
445
|
+
const state = getBuildSequenceStateByTicketId(ticketId);
|
|
446
|
+
if (!state) {
|
|
447
|
+
return {
|
|
448
|
+
ok: false,
|
|
449
|
+
affectedTicketIds: [],
|
|
450
|
+
nextTicketId: null,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
const targetItem = state.items.find(item => item.ticket_id === ticketId);
|
|
454
|
+
if (!targetItem) {
|
|
455
|
+
return {
|
|
456
|
+
ok: false,
|
|
457
|
+
affectedTicketIds: [],
|
|
458
|
+
nextTicketId: null,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
deleteSequenceItem(state.sequence.id, ticketId);
|
|
462
|
+
renumberSequenceItems(state.sequence.id);
|
|
463
|
+
db.prepare('UPDATE build_sequences SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(state.sequence.id);
|
|
464
|
+
const nextState = getBuildSequenceStateById(state.sequence.id);
|
|
465
|
+
if (!nextState || nextState.items.length === 0) {
|
|
466
|
+
setSequenceStatus(state.sequence.id, 'completed');
|
|
467
|
+
return {
|
|
468
|
+
ok: true,
|
|
469
|
+
affectedTicketIds: [],
|
|
470
|
+
nextTicketId: null,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
if (targetItem.status !== 'active') {
|
|
474
|
+
return {
|
|
475
|
+
ok: true,
|
|
476
|
+
affectedTicketIds: getAffectedTicketIds(nextState),
|
|
477
|
+
nextTicketId: null,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
const nextQueuedItem = nextState.sequence.kind === 'bundle_queue'
|
|
481
|
+
? getNextBundleQueuedItem(nextState)
|
|
482
|
+
: {
|
|
483
|
+
blockedByInternalDependency: false,
|
|
484
|
+
item: nextState.items.find(item => item.status === 'queued') ?? null,
|
|
485
|
+
};
|
|
486
|
+
if (!nextQueuedItem.item) {
|
|
487
|
+
if (nextQueuedItem.blockedByInternalDependency) {
|
|
488
|
+
cancelQueuedSequenceItems(nextState.sequence.id);
|
|
489
|
+
setSequenceStatus(nextState.sequence.id, 'stopped');
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
setSequenceStatus(nextState.sequence.id, 'completed');
|
|
493
|
+
}
|
|
494
|
+
return {
|
|
495
|
+
ok: true,
|
|
496
|
+
affectedTicketIds: getAffectedTicketIds(nextState),
|
|
497
|
+
nextTicketId: null,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
db.prepare(`
|
|
501
|
+
UPDATE build_sequence_tickets
|
|
502
|
+
SET status = 'active', started_at = COALESCE(started_at, CURRENT_TIMESTAMP)
|
|
503
|
+
WHERE build_sequence_id = ?
|
|
504
|
+
AND ticket_id = ?
|
|
505
|
+
`).run(nextState.sequence.id, nextQueuedItem.item.ticket_id);
|
|
506
|
+
db.prepare('UPDATE build_sequences SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(nextState.sequence.id);
|
|
507
|
+
return {
|
|
508
|
+
ok: true,
|
|
509
|
+
affectedTicketIds: getAffectedTicketIds(getBuildSequenceStateById(nextState.sequence.id) ?? nextState),
|
|
510
|
+
nextTicketId: nextQueuedItem.item.ticket_id,
|
|
511
|
+
};
|
|
512
|
+
};
|
|
513
|
+
export const enqueueBundledBuild = ({ ticketId, projectId, worktreeBundleId, activate, }) => {
|
|
514
|
+
const activeSequence = getActiveSequenceByBundle(projectId, worktreeBundleId);
|
|
515
|
+
if (!activeSequence) {
|
|
516
|
+
const sequenceId = createSequence({
|
|
517
|
+
kind: 'bundle_queue',
|
|
518
|
+
projectId,
|
|
519
|
+
worktreeBundleId,
|
|
520
|
+
orderedTicketIds: [ticketId],
|
|
521
|
+
activeTicketId: ticketId,
|
|
522
|
+
});
|
|
523
|
+
return {
|
|
524
|
+
sequenceId,
|
|
525
|
+
shouldStartNow: activate,
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
const existing = db.prepare(`
|
|
529
|
+
SELECT 1
|
|
530
|
+
FROM build_sequence_tickets
|
|
531
|
+
WHERE build_sequence_id = ?
|
|
532
|
+
AND ticket_id = ?
|
|
533
|
+
LIMIT 1
|
|
534
|
+
`).get(activeSequence.id, ticketId);
|
|
535
|
+
if (existing) {
|
|
536
|
+
return {
|
|
537
|
+
sequenceId: activeSequence.id,
|
|
538
|
+
shouldStartNow: false,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
const lastPositionRow = db.prepare(`
|
|
542
|
+
SELECT MAX(position) AS position
|
|
543
|
+
FROM build_sequence_tickets
|
|
544
|
+
WHERE build_sequence_id = ?
|
|
545
|
+
`).get(activeSequence.id);
|
|
546
|
+
const nextPosition = Number(lastPositionRow?.position ?? -1) + 1;
|
|
547
|
+
db.prepare(`
|
|
548
|
+
INSERT INTO build_sequence_tickets (
|
|
549
|
+
build_sequence_id,
|
|
550
|
+
ticket_id,
|
|
551
|
+
position,
|
|
552
|
+
status,
|
|
553
|
+
entered_queue_at,
|
|
554
|
+
started_at,
|
|
555
|
+
finished_at
|
|
556
|
+
) VALUES (?, ?, ?, 'queued', CURRENT_TIMESTAMP, NULL, NULL)
|
|
557
|
+
`).run(activeSequence.id, ticketId, nextPosition);
|
|
558
|
+
db.prepare('UPDATE build_sequences SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(activeSequence.id);
|
|
559
|
+
return {
|
|
560
|
+
sequenceId: activeSequence.id,
|
|
561
|
+
shouldStartNow: false,
|
|
562
|
+
};
|
|
563
|
+
};
|
|
564
|
+
export const hasActiveSequenceForBundle = (projectId, worktreeBundleId) => {
|
|
565
|
+
return Boolean(getActiveSequenceByBundle(projectId, worktreeBundleId));
|
|
566
|
+
};
|
|
567
|
+
export const hasDependencyBuildChainForProject = (projectId) => {
|
|
568
|
+
const row = db.prepare(`
|
|
569
|
+
SELECT 1
|
|
570
|
+
FROM build_sequences
|
|
571
|
+
WHERE project_id = ?
|
|
572
|
+
AND kind = 'dependency_chain'
|
|
573
|
+
AND status = 'active'
|
|
574
|
+
LIMIT 1
|
|
575
|
+
`).get(projectId);
|
|
576
|
+
return Boolean(row);
|
|
577
|
+
};
|
|
578
|
+
export const stopAllActiveBuildSequences = () => {
|
|
579
|
+
db.prepare(`
|
|
580
|
+
UPDATE build_sequence_tickets
|
|
581
|
+
SET status = CASE
|
|
582
|
+
WHEN status = 'queued' THEN 'cancelled'
|
|
583
|
+
ELSE 'failed'
|
|
584
|
+
END,
|
|
585
|
+
finished_at = COALESCE(finished_at, CURRENT_TIMESTAMP)
|
|
586
|
+
WHERE build_sequence_id IN (
|
|
587
|
+
SELECT id
|
|
588
|
+
FROM build_sequences
|
|
589
|
+
WHERE status = 'active'
|
|
590
|
+
)
|
|
591
|
+
AND status IN ('queued', 'active')
|
|
592
|
+
`).run();
|
|
593
|
+
db.prepare(`
|
|
594
|
+
UPDATE build_sequences
|
|
595
|
+
SET status = 'failed', updated_at = CURRENT_TIMESTAMP
|
|
596
|
+
WHERE status = 'active'
|
|
597
|
+
`).run();
|
|
598
|
+
};
|
|
599
|
+
//# sourceMappingURL=buildSequences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSequences.js","sourceRoot":"","sources":["../../../server/lib/buildSequences.ts"],"names":[],"mappings":"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"}
|