@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.
Files changed (124) hide show
  1. package/README.md +224 -0
  2. package/dist/cli.js +216 -0
  3. package/dist/client/assets/index-8_-boBBA.css +2 -0
  4. package/dist/client/assets/index-s_jjeqha.js +176 -0
  5. package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  6. package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  7. package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  8. package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  9. package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  10. package/dist/client/favicon.svg +62 -0
  11. package/dist/client/icons.svg +24 -0
  12. package/dist/client/index.html +14 -0
  13. package/dist/server/db.js +764 -0
  14. package/dist/server/db.js.map +1 -0
  15. package/dist/server/index.js +5134 -0
  16. package/dist/server/index.js.map +1 -0
  17. package/dist/server/lib/agent.js +1302 -0
  18. package/dist/server/lib/agent.js.map +1 -0
  19. package/dist/server/lib/buildChains.js +2 -0
  20. package/dist/server/lib/buildChains.js.map +1 -0
  21. package/dist/server/lib/buildFlow.js +59 -0
  22. package/dist/server/lib/buildFlow.js.map +1 -0
  23. package/dist/server/lib/buildSequences.js +599 -0
  24. package/dist/server/lib/buildSequences.js.map +1 -0
  25. package/dist/server/lib/bundleActivity.js +95 -0
  26. package/dist/server/lib/bundleActivity.js.map +1 -0
  27. package/dist/server/lib/bundlePullRequests.js +126 -0
  28. package/dist/server/lib/bundlePullRequests.js.map +1 -0
  29. package/dist/server/lib/chatMessages.js +60 -0
  30. package/dist/server/lib/chatMessages.js.map +1 -0
  31. package/dist/server/lib/chatTargets.js +123 -0
  32. package/dist/server/lib/chatTargets.js.map +1 -0
  33. package/dist/server/lib/chatTicketProposals.js +180 -0
  34. package/dist/server/lib/chatTicketProposals.js.map +1 -0
  35. package/dist/server/lib/chats.js +279 -0
  36. package/dist/server/lib/chats.js.map +1 -0
  37. package/dist/server/lib/config.js +3 -0
  38. package/dist/server/lib/config.js.map +1 -0
  39. package/dist/server/lib/cors.js +30 -0
  40. package/dist/server/lib/cors.js.map +1 -0
  41. package/dist/server/lib/directoryPicker.js +174 -0
  42. package/dist/server/lib/directoryPicker.js.map +1 -0
  43. package/dist/server/lib/git.js +1284 -0
  44. package/dist/server/lib/git.js.map +1 -0
  45. package/dist/server/lib/integrations/github.js +511 -0
  46. package/dist/server/lib/integrations/github.js.map +1 -0
  47. package/dist/server/lib/integrations/index.js +162 -0
  48. package/dist/server/lib/integrations/index.js.map +1 -0
  49. package/dist/server/lib/integrations/jira.js +283 -0
  50. package/dist/server/lib/integrations/jira.js.map +1 -0
  51. package/dist/server/lib/integrations/planning.js +27 -0
  52. package/dist/server/lib/integrations/planning.js.map +1 -0
  53. package/dist/server/lib/integrations/types.js +2 -0
  54. package/dist/server/lib/integrations/types.js.map +1 -0
  55. package/dist/server/lib/lightweightPrompt.js +88 -0
  56. package/dist/server/lib/lightweightPrompt.js.map +1 -0
  57. package/dist/server/lib/models.js +219 -0
  58. package/dist/server/lib/models.js.map +1 -0
  59. package/dist/server/lib/preview.js +377 -0
  60. package/dist/server/lib/preview.js.map +1 -0
  61. package/dist/server/lib/previewProxy.js +659 -0
  62. package/dist/server/lib/previewProxy.js.map +1 -0
  63. package/dist/server/lib/projectAutoConfig.js +682 -0
  64. package/dist/server/lib/projectAutoConfig.js.map +1 -0
  65. package/dist/server/lib/projectFileSuggestions.js +133 -0
  66. package/dist/server/lib/projectFileSuggestions.js.map +1 -0
  67. package/dist/server/lib/projectMemory.js +1519 -0
  68. package/dist/server/lib/projectMemory.js.map +1 -0
  69. package/dist/server/lib/projectMemoryPrompt.js +390 -0
  70. package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
  71. package/dist/server/lib/projectMemoryScan.js +681 -0
  72. package/dist/server/lib/projectMemoryScan.js.map +1 -0
  73. package/dist/server/lib/projectMemorySuggestions.js +166 -0
  74. package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
  75. package/dist/server/lib/projectMemoryTransfer.js +958 -0
  76. package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
  77. package/dist/server/lib/projects.js +569 -0
  78. package/dist/server/lib/projects.js.map +1 -0
  79. package/dist/server/lib/promptSkills.js +28 -0
  80. package/dist/server/lib/promptSkills.js.map +1 -0
  81. package/dist/server/lib/queue.js +15 -0
  82. package/dist/server/lib/queue.js.map +1 -0
  83. package/dist/server/lib/reviewFindings.js +390 -0
  84. package/dist/server/lib/reviewFindings.js.map +1 -0
  85. package/dist/server/lib/run.js +416 -0
  86. package/dist/server/lib/run.js.map +1 -0
  87. package/dist/server/lib/runtimePaths.js +93 -0
  88. package/dist/server/lib/runtimePaths.js.map +1 -0
  89. package/dist/server/lib/shell.js +27 -0
  90. package/dist/server/lib/shell.js.map +1 -0
  91. package/dist/server/lib/skills.js +124 -0
  92. package/dist/server/lib/skills.js.map +1 -0
  93. package/dist/server/lib/startDev.js +18 -0
  94. package/dist/server/lib/startDev.js.map +1 -0
  95. package/dist/server/lib/staticClient.js +80 -0
  96. package/dist/server/lib/staticClient.js.map +1 -0
  97. package/dist/server/lib/terminal.js +366 -0
  98. package/dist/server/lib/terminal.js.map +1 -0
  99. package/dist/server/lib/ticketDependencies.js +174 -0
  100. package/dist/server/lib/ticketDependencies.js.map +1 -0
  101. package/dist/server/lib/ticketMessages.js +65 -0
  102. package/dist/server/lib/ticketMessages.js.map +1 -0
  103. package/dist/server/lib/ticketOpenQuestions.js +128 -0
  104. package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
  105. package/dist/server/lib/ticketUndo.js +549 -0
  106. package/dist/server/lib/ticketUndo.js.map +1 -0
  107. package/dist/server/lib/tickets.js +981 -0
  108. package/dist/server/lib/tickets.js.map +1 -0
  109. package/dist/server/lib/types.js +2 -0
  110. package/dist/server/lib/types.js.map +1 -0
  111. package/dist/server/package.json +3 -0
  112. package/dist/server/workers/build.js +229 -0
  113. package/dist/server/workers/build.js.map +1 -0
  114. package/dist/server/workers/chat.js +190 -0
  115. package/dist/server/workers/chat.js.map +1 -0
  116. package/dist/server/workers/followUp.js +204 -0
  117. package/dist/server/workers/followUp.js.map +1 -0
  118. package/dist/server/workers/plan.js +1130 -0
  119. package/dist/server/workers/plan.js.map +1 -0
  120. package/dist/server/workers/planFollowUp.js +360 -0
  121. package/dist/server/workers/planFollowUp.js.map +1 -0
  122. package/dist/server/workers/review.js +167 -0
  123. package/dist/server/workers/review.js.map +1 -0
  124. 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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"}