@cat-factory/worker 0.219.0 → 0.221.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 (32) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +17 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/infrastructure/container-assembly.d.ts.map +1 -1
  6. package/dist/infrastructure/container-assembly.js +5 -0
  7. package/dist/infrastructure/container-assembly.js.map +1 -1
  8. package/dist/infrastructure/container.d.ts.map +1 -1
  9. package/dist/infrastructure/container.js +2 -0
  10. package/dist/infrastructure/container.js.map +1 -1
  11. package/dist/infrastructure/env.d.ts +5 -0
  12. package/dist/infrastructure/env.d.ts.map +1 -1
  13. package/dist/infrastructure/env.js.map +1 -1
  14. package/dist/infrastructure/events/DurableObjectEventPublisher.d.ts +2 -1
  15. package/dist/infrastructure/events/DurableObjectEventPublisher.d.ts.map +1 -1
  16. package/dist/infrastructure/events/DurableObjectEventPublisher.js +3 -0
  17. package/dist/infrastructure/events/DurableObjectEventPublisher.js.map +1 -1
  18. package/dist/infrastructure/repositories/D1GuidedReviewRepository.d.ts +48 -0
  19. package/dist/infrastructure/repositories/D1GuidedReviewRepository.d.ts.map +1 -0
  20. package/dist/infrastructure/repositories/D1GuidedReviewRepository.js +360 -0
  21. package/dist/infrastructure/repositories/D1GuidedReviewRepository.js.map +1 -0
  22. package/dist/infrastructure/workflows/GuidedReviewWorkflow.d.ts +14 -0
  23. package/dist/infrastructure/workflows/GuidedReviewWorkflow.d.ts.map +1 -0
  24. package/dist/infrastructure/workflows/GuidedReviewWorkflow.js +25 -0
  25. package/dist/infrastructure/workflows/GuidedReviewWorkflow.js.map +1 -0
  26. package/dist/infrastructure/workflows/WorkflowsGuidedReviewRunner.d.ts +14 -0
  27. package/dist/infrastructure/workflows/WorkflowsGuidedReviewRunner.d.ts.map +1 -0
  28. package/dist/infrastructure/workflows/WorkflowsGuidedReviewRunner.js +21 -0
  29. package/dist/infrastructure/workflows/WorkflowsGuidedReviewRunner.js.map +1 -0
  30. package/migrations/0104_guided_review.sql +96 -0
  31. package/migrations/0105_guided_review_owner_kind.sql +10 -0
  32. package/package.json +19 -19
@@ -1 +1 @@
1
- {"version":3,"file":"DurableObjectEventPublisher.js","sourceRoot":"","sources":["../../../src/infrastructure/events/DurableObjectEventPublisher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DurableObjectEventPublisher.js","sourceRoot":"","sources":["../../../src/infrastructure/events/DurableObjectEventPublisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { GuidedReviewClaim, GuidedReviewCommentDraft, GuidedReviewDraftEdit, GuidedReviewDraftProposal, GuidedReviewDriver, GuidedReviewExchange, GuidedReviewDraftPostOutcome, GuidedReviewMessage, GuidedReviewMessageOutcome, GuidedReviewNewSession, GuidedReviewOverviewOutcome, GuidedReviewRefresh, GuidedReviewRepository, GuidedReviewSession, GuidedReviewSessionFilter, GuidedReviewSessionPage, GuidedReviewStaleJob, GuidedReviewThread, GuidedReviewThreadSummary } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ /**
4
+ * Guided PR review sessions over D1 (migration 0104). Every conditional transition is a single
5
+ * guarded statement or an atomic `batch`, and SQLite serializes writers, so each batch observes
6
+ * one consistent snapshot. The Drizzle mirror reaches the same outcomes under Postgres READ
7
+ * COMMITTED through the same unique indexes.
8
+ */
9
+ export declare class D1GuidedReviewRepository implements GuidedReviewRepository {
10
+ private readonly db;
11
+ constructor({ db }: {
12
+ db: D1Database;
13
+ });
14
+ openSession(workspaceId: string, s: GuidedReviewNewSession, driver: GuidedReviewDriver): Promise<GuidedReviewSession>;
15
+ getSession(workspaceId: string, id: string): Promise<GuidedReviewSession | null>;
16
+ listSessions(workspaceId: string, filter: GuidedReviewSessionFilter): Promise<GuidedReviewSession[]>;
17
+ pageSessions(workspaceId: string, filter: Omit<GuidedReviewSessionFilter, 'limit'>, page: GuidedReviewSessionPage): Promise<GuidedReviewSession[]>;
18
+ deleteSession(workspaceId: string, id: string): Promise<void>;
19
+ restartOverview(workspaceId: string, id: string, expectedGeneration: number, refresh: GuidedReviewRefresh, driver: GuidedReviewDriver, now: number): Promise<boolean>;
20
+ claimOverview(workspaceId: string, id: string, generation: number, leaseCutoff: number, now: number): Promise<GuidedReviewClaim | null>;
21
+ settleOverview(workspaceId: string, id: string, generation: number, outcome: GuidedReviewOverviewOutcome, now: number, claim: GuidedReviewClaim): Promise<boolean>;
22
+ createThread(workspaceId: string, t: GuidedReviewThread): Promise<void>;
23
+ getThread(workspaceId: string, id: string): Promise<GuidedReviewThread | null>;
24
+ listThreads(workspaceId: string, sessionId: string): Promise<GuidedReviewThreadSummary[]>;
25
+ appendExchange(workspaceId: string, x: GuidedReviewExchange, driver: GuidedReviewDriver): Promise<{
26
+ ok: true;
27
+ question: GuidedReviewMessage;
28
+ placeholder: GuidedReviewMessage;
29
+ } | {
30
+ ok: false;
31
+ reason: 'thread_busy' | 'thread_not_found';
32
+ }>;
33
+ getMessage(workspaceId: string, id: string): Promise<GuidedReviewMessage | null>;
34
+ listMessages(workspaceId: string, threadId: string): Promise<GuidedReviewMessage[]>;
35
+ claimMessage(workspaceId: string, id: string, leaseCutoff: number, now: number): Promise<GuidedReviewClaim | null>;
36
+ settleMessage(workspaceId: string, id: string, outcome: GuidedReviewMessageOutcome, now: number, claim: GuidedReviewClaim): Promise<boolean>;
37
+ private settleMessageStatement;
38
+ settleDrafts(workspaceId: string, messageId: string, drafts: GuidedReviewDraftProposal[], outcome: Extract<GuidedReviewMessageOutcome, {
39
+ status: 'complete';
40
+ }>, now: number, claim: GuidedReviewClaim): Promise<boolean>;
41
+ getDraft(workspaceId: string, id: string): Promise<GuidedReviewCommentDraft | null>;
42
+ listDrafts(workspaceId: string, sessionId: string): Promise<GuidedReviewCommentDraft[]>;
43
+ editDraft(workspaceId: string, id: string, expectedRev: number, edit: GuidedReviewDraftEdit, now: number): Promise<GuidedReviewCommentDraft | null>;
44
+ claimDraftsForPost(workspaceId: string, sessionId: string, ids: string[], leaseCutoff: number, now: number): Promise<GuidedReviewCommentDraft[]>;
45
+ settleDraftPosts(workspaceId: string, outcomes: GuidedReviewDraftPostOutcome[], now: number): Promise<string[]>;
46
+ listStaleJobs(driver: GuidedReviewDriver, cutoff: number, limit: number): Promise<GuidedReviewStaleJob[]>;
47
+ }
48
+ //# sourceMappingURL=D1GuidedReviewRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1GuidedReviewRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1GuidedReviewRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,360 @@
1
+ import { GUIDED_REVIEW_LIVE_STATUSES } from '@cat-factory/contracts';
2
+ import { applyGuidedReviewDraftEdit, checkGuidedReviewDraftFields, encodeGuidedReviewMessageOutcome, encodeGuidedReviewOverviewOutcome, rowToGuidedReviewDraft as rowToDraft, rowToGuidedReviewMessage as rowToMessage, rowToGuidedReviewSession as rowToSession, rowToGuidedReviewThread as rowToThread, } from '@cat-factory/server';
3
+ import { chunkForIn } from './chunk';
4
+ const LIVE = `(${GUIDED_REVIEW_LIVE_STATUSES.map((s) => `'${s}'`).join(', ')})`;
5
+ /**
6
+ * Guided PR review sessions over D1 (migration 0104). Every conditional transition is a single
7
+ * guarded statement or an atomic `batch`, and SQLite serializes writers, so each batch observes
8
+ * one consistent snapshot. The Drizzle mirror reaches the same outcomes under Postgres READ
9
+ * COMMITTED through the same unique indexes.
10
+ */
11
+ export class D1GuidedReviewRepository {
12
+ db;
13
+ constructor({ db }) {
14
+ this.db = db;
15
+ }
16
+ async openSession(workspaceId, s, driver) {
17
+ await this.db
18
+ .prepare(`INSERT INTO guided_review_sessions
19
+ (workspace_id, id, provider, repo_id, owner, repo, pr_number, pr_title,
20
+ reviewed_head_sha, base_ref, created_by, created_by_kind, overview_status,
21
+ overview_generation, overview_content, overview_failure, overview_model,
22
+ overview_driver, created_at, updated_at)
23
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', 1, NULL, NULL, NULL, ?, ?, ?)
24
+ ON CONFLICT (workspace_id, repo_id, pr_number, created_by) DO NOTHING`)
25
+ .bind(workspaceId, s.id, s.provider, s.repoId, s.owner, s.repo, s.prNumber, s.prTitle, s.reviewedHeadSha, s.baseRef, s.createdBy, s.createdByKind, driver, s.createdAt, s.updatedAt)
26
+ .run();
27
+ const row = await this.db
28
+ .prepare(`SELECT * FROM guided_review_sessions
29
+ WHERE workspace_id = ? AND repo_id = ? AND pr_number = ? AND created_by = ?`)
30
+ .bind(workspaceId, s.repoId, s.prNumber, s.createdBy)
31
+ .first();
32
+ if (!row)
33
+ throw new Error(`guided review session for PR #${s.prNumber} vanished after insert`);
34
+ return rowToSession(row);
35
+ }
36
+ async getSession(workspaceId, id) {
37
+ const row = await this.db
38
+ .prepare(`SELECT * FROM guided_review_sessions WHERE workspace_id = ? AND id = ?`)
39
+ .bind(workspaceId, id)
40
+ .first();
41
+ return row ? rowToSession(row) : null;
42
+ }
43
+ async listSessions(workspaceId, filter) {
44
+ const { where, binds } = sessionFilter(workspaceId, filter);
45
+ const { results } = await this.db
46
+ .prepare(`SELECT * FROM guided_review_sessions WHERE ${where.join(' AND ')}
47
+ ORDER BY updated_at DESC, id LIMIT ?`)
48
+ .bind(...binds, filter.limit ?? 50)
49
+ .all();
50
+ return results.map(rowToSession);
51
+ }
52
+ async pageSessions(workspaceId, filter, page) {
53
+ const { where, binds } = sessionFilter(workspaceId, filter);
54
+ if (page.cursor) {
55
+ where.push('(created_at < ? OR (created_at = ? AND id < ?))');
56
+ binds.push(page.cursor.createdAt, page.cursor.createdAt, page.cursor.id);
57
+ }
58
+ const { results } = await this.db
59
+ .prepare(`SELECT * FROM guided_review_sessions WHERE ${where.join(' AND ')}
60
+ ORDER BY created_at DESC, id DESC LIMIT ?`)
61
+ .bind(...binds, page.limit)
62
+ .all();
63
+ return results.map(rowToSession);
64
+ }
65
+ async deleteSession(workspaceId, id) {
66
+ const tables = [
67
+ 'guided_review_threads',
68
+ 'guided_review_messages',
69
+ 'guided_review_comment_drafts',
70
+ ];
71
+ await this.db.batch([
72
+ ...tables.map((t) => this.db
73
+ .prepare(`DELETE FROM ${t} WHERE workspace_id = ? AND session_id = ?`)
74
+ .bind(workspaceId, id)),
75
+ this.db
76
+ .prepare(`DELETE FROM guided_review_sessions WHERE workspace_id = ? AND id = ?`)
77
+ .bind(workspaceId, id),
78
+ ]);
79
+ }
80
+ async restartOverview(workspaceId, id, expectedGeneration, refresh, driver, now) {
81
+ const result = await this.db
82
+ .prepare(`UPDATE guided_review_sessions SET
83
+ pr_title = ?, reviewed_head_sha = ?, base_ref = ?, overview_driver = ?,
84
+ overview_status = 'pending', overview_generation = overview_generation + 1,
85
+ overview_content = NULL, overview_failure = NULL, overview_model = NULL,
86
+ overview_claimed_at = NULL, updated_at = ?
87
+ WHERE workspace_id = ? AND id = ? AND overview_generation = ?`)
88
+ .bind(refresh.prTitle, refresh.reviewedHeadSha, refresh.baseRef, driver, now, workspaceId, id, expectedGeneration)
89
+ .run();
90
+ return result.meta.changes > 0;
91
+ }
92
+ async claimOverview(workspaceId, id, generation, leaseCutoff, now) {
93
+ const result = await this.db
94
+ .prepare(`UPDATE guided_review_sessions SET
95
+ overview_status = 'running', overview_claimed_at = ?, updated_at = ?
96
+ WHERE workspace_id = ? AND id = ? AND overview_generation = ?
97
+ AND (overview_status = 'pending'
98
+ OR (overview_status = 'running' AND overview_claimed_at < ?))`)
99
+ .bind(now, now, workspaceId, id, generation, leaseCutoff)
100
+ .run();
101
+ return result.meta.changes > 0 ? { claimedAt: now } : null;
102
+ }
103
+ async settleOverview(workspaceId, id, generation, outcome, now, claim) {
104
+ const encoded = encodeGuidedReviewOverviewOutcome(outcome);
105
+ const result = await this.db
106
+ .prepare(`UPDATE guided_review_sessions SET
107
+ overview_status = ?, overview_content = ?, overview_failure = ?, overview_model = ?,
108
+ overview_claimed_at = NULL, updated_at = ?
109
+ WHERE workspace_id = ? AND id = ? AND overview_generation = ?
110
+ AND overview_status = 'running' AND overview_claimed_at = ?`)
111
+ .bind(outcome.status, encoded.content, encoded.failure, outcome.model, now, workspaceId, id, generation, claim.claimedAt)
112
+ .run();
113
+ return result.meta.changes > 0;
114
+ }
115
+ async createThread(workspaceId, t) {
116
+ await this.db
117
+ .prepare(`INSERT INTO guided_review_threads
118
+ (workspace_id, id, session_id, title, created_by, created_at, updated_at)
119
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
120
+ .bind(workspaceId, t.id, t.sessionId, t.title, t.createdBy, t.createdAt, t.updatedAt)
121
+ .run();
122
+ }
123
+ async getThread(workspaceId, id) {
124
+ const row = await this.db
125
+ .prepare(`SELECT * FROM guided_review_threads WHERE workspace_id = ? AND id = ?`)
126
+ .bind(workspaceId, id)
127
+ .first();
128
+ return row ? rowToThread(row) : null;
129
+ }
130
+ async listThreads(workspaceId, sessionId) {
131
+ const { results } = await this.db
132
+ .prepare(`SELECT t.*, m.id AS pending_message_id
133
+ FROM guided_review_threads t
134
+ LEFT JOIN guided_review_messages m
135
+ ON m.workspace_id = t.workspace_id AND m.thread_id = t.id
136
+ AND m.role = 'assistant' AND m.status IN ${LIVE}
137
+ WHERE t.workspace_id = ? AND t.session_id = ?
138
+ ORDER BY t.created_at, t.id`)
139
+ .bind(workspaceId, sessionId)
140
+ .all();
141
+ return results.map((row) => ({
142
+ ...rowToThread(row),
143
+ pendingMessageId: row.pending_message_id ?? null,
144
+ }));
145
+ }
146
+ async appendExchange(workspaceId, x, driver) {
147
+ // The placeholder goes first, conflict-targeted at the one-live-answer index and inserted
148
+ // only while the thread exists in the session. The question follows only if that placeholder
149
+ // row now exists. Both sit in one serialized batch.
150
+ const columns = `(workspace_id, id, thread_id, session_id, seq, role, kind, depth, content,
151
+ status, citations, failure, draft_report, model, created_at, updated_at,
152
+ driver)`;
153
+ const placePlaceholder = this.db
154
+ .prepare(`INSERT INTO guided_review_messages ${columns}
155
+ SELECT ?1, ?2, ?3, ?4,
156
+ (SELECT COALESCE(MAX(seq), 0) + 2 FROM guided_review_messages
157
+ WHERE workspace_id = ?1 AND thread_id = ?3),
158
+ 'assistant', ?5, ?6, '', 'pending', '[]', NULL, NULL, NULL, ?7, ?7, ?8
159
+ WHERE EXISTS (SELECT 1 FROM guided_review_threads
160
+ WHERE workspace_id = ?1 AND id = ?3 AND session_id = ?4)
161
+ ON CONFLICT (workspace_id, thread_id)
162
+ WHERE role = 'assistant' AND status IN ${LIVE} DO NOTHING`)
163
+ .bind(workspaceId, x.placeholderId, x.threadId, x.sessionId, x.kind, x.depth, x.at, driver);
164
+ const placeQuestion = this.db
165
+ .prepare(`INSERT INTO guided_review_messages ${columns}
166
+ SELECT ?1, ?2, ?3, ?4, p.seq - 1, 'user', ?5, ?6, ?7, 'complete', '[]', NULL, NULL,
167
+ NULL, ?8, ?8, ?9
168
+ FROM guided_review_messages p
169
+ WHERE p.workspace_id = ?1 AND p.id = ?10`)
170
+ .bind(workspaceId, x.questionId, x.threadId, x.sessionId, x.kind, x.depth, x.question, x.at, driver, x.placeholderId);
171
+ const [placed] = await this.db.batch([placePlaceholder, placeQuestion]);
172
+ if (!placed || placed.meta.changes === 0) {
173
+ const thread = await this.db
174
+ .prepare(`SELECT 1 AS found FROM guided_review_threads
175
+ WHERE workspace_id = ? AND id = ? AND session_id = ?`)
176
+ .bind(workspaceId, x.threadId, x.sessionId)
177
+ .first();
178
+ return { ok: false, reason: thread ? 'thread_busy' : 'thread_not_found' };
179
+ }
180
+ const { results } = await this.db
181
+ .prepare(`SELECT * FROM guided_review_messages WHERE workspace_id = ? AND id IN (?, ?)`)
182
+ .bind(workspaceId, x.questionId, x.placeholderId)
183
+ .all();
184
+ const byId = new Map(results.map((r) => [r.id, rowToMessage(r)]));
185
+ const question = byId.get(x.questionId);
186
+ const placeholder = byId.get(x.placeholderId);
187
+ if (!question || !placeholder) {
188
+ throw new Error(`guided review exchange ${x.placeholderId} vanished after insert`);
189
+ }
190
+ return { ok: true, question, placeholder };
191
+ }
192
+ async getMessage(workspaceId, id) {
193
+ const row = await this.db
194
+ .prepare(`SELECT * FROM guided_review_messages WHERE workspace_id = ? AND id = ?`)
195
+ .bind(workspaceId, id)
196
+ .first();
197
+ return row ? rowToMessage(row) : null;
198
+ }
199
+ async listMessages(workspaceId, threadId) {
200
+ const { results } = await this.db
201
+ .prepare(`SELECT * FROM guided_review_messages WHERE workspace_id = ? AND thread_id = ?
202
+ ORDER BY seq`)
203
+ .bind(workspaceId, threadId)
204
+ .all();
205
+ return results.map(rowToMessage);
206
+ }
207
+ async claimMessage(workspaceId, id, leaseCutoff, now) {
208
+ const result = await this.db
209
+ .prepare(`UPDATE guided_review_messages SET status = 'running', claimed_at = ?, updated_at = ?
210
+ WHERE workspace_id = ? AND id = ? AND role = 'assistant'
211
+ AND (status = 'pending' OR (status = 'running' AND claimed_at < ?))`)
212
+ .bind(now, now, workspaceId, id, leaseCutoff)
213
+ .run();
214
+ return result.meta.changes > 0 ? { claimedAt: now } : null;
215
+ }
216
+ async settleMessage(workspaceId, id, outcome, now, claim) {
217
+ const result = await this.settleMessageStatement(workspaceId, id, outcome, now, claim).run();
218
+ return result.meta.changes > 0;
219
+ }
220
+ settleMessageStatement(workspaceId, id, outcome, now, claim, kind) {
221
+ const encoded = encodeGuidedReviewMessageOutcome(outcome);
222
+ return this.db
223
+ .prepare(`UPDATE guided_review_messages SET
224
+ status = ?, content = ?, citations = ?, failure = ?, draft_report = ?, model = ?,
225
+ claimed_at = NULL, updated_at = ?
226
+ WHERE workspace_id = ? AND id = ? AND status = 'running' AND claimed_at = ?
227
+ ${kind ? 'AND kind = ?' : ''}`)
228
+ .bind(outcome.status, encoded.content, encoded.citations, encoded.failure, encoded.draftReport, outcome.model, now, workspaceId, id, claim.claimedAt, ...(kind ? [kind] : []));
229
+ }
230
+ async settleDrafts(workspaceId, messageId, drafts, outcome, now, claim) {
231
+ for (const d of drafts)
232
+ checkGuidedReviewDraftFields(d);
233
+ // Each draft is inserted only while its message is still the claimed `running`
234
+ // `comment-drafts` message, and takes its session and thread from that message. The message
235
+ // settles last, so either the whole set lands with it or none does.
236
+ const inserts = drafts.map((d) => this.db
237
+ .prepare(`INSERT INTO guided_review_comment_drafts
238
+ (workspace_id, id, session_id, thread_id, message_id, path, line, start_line, side,
239
+ body, rationale, status, post_error, posted_url, rev, created_at, updated_at)
240
+ SELECT m.workspace_id, ?, m.session_id, m.thread_id, m.id, ?, ?, ?, ?, ?, ?,
241
+ 'proposed', NULL, NULL, 1, ?, ?
242
+ FROM guided_review_messages m
243
+ WHERE m.workspace_id = ? AND m.id = ? AND m.status = 'running' AND m.claimed_at = ?
244
+ AND m.kind = 'comment-drafts'`)
245
+ .bind(d.id, d.path, d.line, d.startLine, d.side, d.body, d.rationale, now, now, workspaceId, messageId, claim.claimedAt));
246
+ const results = await this.db.batch([
247
+ ...inserts,
248
+ this.settleMessageStatement(workspaceId, messageId, outcome, now, claim, 'comment-drafts'),
249
+ ]);
250
+ return (results.at(-1)?.meta.changes ?? 0) > 0;
251
+ }
252
+ async getDraft(workspaceId, id) {
253
+ const row = await this.db
254
+ .prepare(`SELECT * FROM guided_review_comment_drafts WHERE workspace_id = ? AND id = ?`)
255
+ .bind(workspaceId, id)
256
+ .first();
257
+ return row ? rowToDraft(row) : null;
258
+ }
259
+ async listDrafts(workspaceId, sessionId) {
260
+ const { results } = await this.db
261
+ .prepare(`SELECT * FROM guided_review_comment_drafts WHERE workspace_id = ? AND session_id = ?
262
+ ORDER BY created_at, id`)
263
+ .bind(workspaceId, sessionId)
264
+ .all();
265
+ return results.map(rowToDraft);
266
+ }
267
+ async editDraft(workspaceId, id, expectedRev, edit, now) {
268
+ const current = await this.getDraft(workspaceId, id);
269
+ if (!current || current.rev !== expectedRev)
270
+ return null;
271
+ const next = applyGuidedReviewDraftEdit(current, edit);
272
+ const row = await this.db
273
+ .prepare(`UPDATE guided_review_comment_drafts SET
274
+ path = ?, line = ?, start_line = ?, side = ?, body = ?, status = ?, post_error = ?,
275
+ rev = rev + 1, updated_at = ?
276
+ WHERE workspace_id = ? AND id = ? AND rev = ? AND status IN ('proposed', 'failed')
277
+ RETURNING *`)
278
+ .bind(next.path, next.line, next.startLine, next.side, next.body, next.status, next.postError, now, workspaceId, id, expectedRev)
279
+ .first();
280
+ return row ? rowToDraft(row) : null;
281
+ }
282
+ async claimDraftsForPost(workspaceId, sessionId, ids, leaseCutoff, now) {
283
+ if (ids.length === 0)
284
+ return [];
285
+ const results = await this.db.batch(chunkForIn(ids).map((chunk) => this.db
286
+ .prepare(`UPDATE guided_review_comment_drafts SET status = 'posting', post_error = NULL,
287
+ rev = rev + 1, updated_at = ?
288
+ WHERE workspace_id = ? AND session_id = ? AND id IN (${chunk.map(() => '?').join(', ')})
289
+ AND (status IN ('proposed', 'failed')
290
+ OR (status = 'posting' AND updated_at < ?))
291
+ RETURNING *`)
292
+ .bind(now, workspaceId, sessionId, ...chunk, leaseCutoff)));
293
+ return results.flatMap((r) => r.results.map(rowToDraft));
294
+ }
295
+ async settleDraftPosts(workspaceId, outcomes, now) {
296
+ if (outcomes.length === 0)
297
+ return [];
298
+ const results = await this.db.batch(outcomes.map((o) => this.db
299
+ .prepare(`UPDATE guided_review_comment_drafts SET
300
+ status = ?, posted_url = ?, post_error = ?, rev = rev + 1, updated_at = ?
301
+ WHERE workspace_id = ? AND id = ? AND rev = ? AND status = 'posting'
302
+ RETURNING id`)
303
+ .bind(o.status, o.status === 'posted' ? o.postedUrl : null, o.status === 'failed' ? o.error : null, now, workspaceId, o.id, o.rev)));
304
+ return results.flatMap((r) => r.results.map((row) => row.id));
305
+ }
306
+ async listStaleJobs(driver, cutoff, limit) {
307
+ const [overviews, messages] = await this.db.batch([
308
+ this.db
309
+ .prepare(`SELECT workspace_id, id, overview_generation, updated_at FROM guided_review_sessions
310
+ WHERE overview_driver = ? AND overview_status IN ${LIVE} AND updated_at < ?
311
+ ORDER BY updated_at LIMIT ?`)
312
+ .bind(driver, cutoff, limit),
313
+ this.db
314
+ .prepare(`SELECT workspace_id, id, updated_at FROM guided_review_messages
315
+ WHERE driver = ? AND role = 'assistant' AND status IN ${LIVE} AND updated_at < ?
316
+ ORDER BY updated_at LIMIT ?`)
317
+ .bind(driver, cutoff, limit),
318
+ ]);
319
+ const overviewRows = (overviews?.results ?? []);
320
+ const messageRows = (messages?.results ?? []);
321
+ const jobs = [
322
+ ...overviewRows.map((r) => ({
323
+ at: r.updated_at,
324
+ job: {
325
+ kind: 'overview',
326
+ workspaceId: r.workspace_id,
327
+ sessionId: r.id,
328
+ generation: r.overview_generation,
329
+ },
330
+ })),
331
+ ...messageRows.map((r) => ({
332
+ at: r.updated_at,
333
+ job: { kind: 'message', workspaceId: r.workspace_id, messageId: r.id },
334
+ })),
335
+ ];
336
+ return jobs
337
+ .sort((a, b) => a.at - b.at)
338
+ .slice(0, limit)
339
+ .map((j) => j.job);
340
+ }
341
+ }
342
+ /** The WHERE clause both session lists share: the workspace plus each filter the caller set. */
343
+ function sessionFilter(workspaceId, filter) {
344
+ const where = ['workspace_id = ?'];
345
+ const binds = [workspaceId];
346
+ if (filter.repoId !== undefined) {
347
+ where.push('repo_id = ?');
348
+ binds.push(filter.repoId);
349
+ }
350
+ if (filter.prNumber !== undefined) {
351
+ where.push('pr_number = ?');
352
+ binds.push(filter.prNumber);
353
+ }
354
+ if (filter.createdBy !== undefined) {
355
+ where.push('created_by = ?');
356
+ binds.push(filter.createdBy);
357
+ }
358
+ return { where, binds };
359
+ }
360
+ //# sourceMappingURL=D1GuidedReviewRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1GuidedReviewRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1GuidedReviewRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { GuidedReviewJob } from '@cat-factory/kernel';
2
+ import { WorkflowEntrypoint, type WorkflowEvent, type WorkflowStep } from 'cloudflare:workers';
3
+ import type { Env } from '../env';
4
+ /** Params passed to a GuidedReviewWorkflow instance. */
5
+ export interface GuidedReviewWorkflowParams {
6
+ workspaceId: string;
7
+ job: GuidedReviewJob;
8
+ }
9
+ /** Durable driver for one guided-review job: generating an overview or one assistant message. */
10
+ export declare class GuidedReviewWorkflow extends WorkflowEntrypoint<Env, GuidedReviewWorkflowParams> {
11
+ run(event: WorkflowEvent<GuidedReviewWorkflowParams>, step: WorkflowStep): Promise<void>;
12
+ private drive;
13
+ }
14
+ //# sourceMappingURL=GuidedReviewWorkflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GuidedReviewWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/GuidedReviewWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAKjC,wDAAwD;AACxD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,eAAe,CAAA;CACrB;AAWD,iGAAiG;AACjG,qBAAa,oBAAqB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,0BAA0B,CAAC;IAClF,GAAG,CACV,KAAK,EAAE,aAAa,CAAC,0BAA0B,CAAC,EAChD,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAEf;YAEa,KAAK;CAUpB"}
@@ -0,0 +1,25 @@
1
+ import { WorkflowEntrypoint, } from 'cloudflare:workers';
2
+ import { buildContainer } from '../container';
3
+ import { withWorkflowLogExport } from './logExport';
4
+ import { buildWorkflowRuntime } from './runtime';
5
+ /**
6
+ * A retry re-runs `runJob`, whose claim makes it a no-op while the first attempt's lease holds; the
7
+ * cron re-drive takes the job back over once the lease lapses.
8
+ */
9
+ const STEP_CONFIG = {
10
+ retries: { limit: 2, delay: '10 seconds', backoff: 'exponential' },
11
+ timeout: '15 minutes',
12
+ };
13
+ /** Durable driver for one guided-review job: generating an overview or one assistant message. */
14
+ export class GuidedReviewWorkflow extends WorkflowEntrypoint {
15
+ run(event, step) {
16
+ return withWorkflowLogExport(this.env, step, (step) => this.drive(event.payload, step));
17
+ }
18
+ async drive(params, step) {
19
+ const container = await buildWorkflowRuntime(() => buildContainer(this.env), step, 'guided-review');
20
+ await step.do('run', STEP_CONFIG, async () => {
21
+ await container.guidedReview?.service.runJob(params.workspaceId, params.job);
22
+ });
23
+ }
24
+ }
25
+ //# sourceMappingURL=GuidedReviewWorkflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GuidedReviewWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/GuidedReviewWorkflow.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,GAInB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAQhD;;;GAGG;AACH,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE;IAClE,OAAO,EAAE,YAAY;CACO,CAAA;AAE9B,iGAAiG;AACjG,MAAM,OAAO,oBAAqB,SAAQ,kBAAmD;IAClF,GAAG,CACV,KAAgD,EAChD,IAAkB;QAElB,OAAO,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACzF,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,MAAkC,EAAE,IAAkB;QACxE,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAC1C,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAC9B,IAAI,EACJ,eAAe,CAChB,CAAA;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { GuidedReviewJob, GuidedReviewRunner } from '@cat-factory/kernel';
2
+ import type { Workflow } from '@cloudflare/workers-types';
3
+ /**
4
+ * Drives guided-review jobs through Cloudflare Workflows. Each start creates a fresh instance:
5
+ * a finished instance id cannot be reused, and the job's own claim already makes a duplicate
6
+ * delivery a no-op.
7
+ */
8
+ export declare class WorkflowsGuidedReviewRunner implements GuidedReviewRunner {
9
+ private readonly workflow;
10
+ private readonly now;
11
+ constructor(workflow: Workflow, now?: () => number);
12
+ start(workspaceId: string, job: GuidedReviewJob): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=WorkflowsGuidedReviewRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsGuidedReviewRunner.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/WorkflowsGuidedReviewRunner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAGzD;;;;GAIG;AACH,qBAAa,2BAA4B,YAAW,kBAAkB;IAElE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFtB,YACmB,QAAQ,EAAE,QAAQ,EAClB,GAAG,GAAE,MAAM,MAAiB,EAC3C;IAEE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;CACF"}
@@ -0,0 +1,21 @@
1
+ import { guidedReviewJobKey } from '@cat-factory/kernel';
2
+ /**
3
+ * Drives guided-review jobs through Cloudflare Workflows. Each start creates a fresh instance:
4
+ * a finished instance id cannot be reused, and the job's own claim already makes a duplicate
5
+ * delivery a no-op.
6
+ */
7
+ export class WorkflowsGuidedReviewRunner {
8
+ workflow;
9
+ now;
10
+ constructor(workflow, now = Date.now) {
11
+ this.workflow = workflow;
12
+ this.now = now;
13
+ }
14
+ async start(workspaceId, job) {
15
+ await this.workflow.create({
16
+ id: `${guidedReviewJobKey(job)}-${this.now()}`,
17
+ params: { workspaceId, job },
18
+ });
19
+ }
20
+ }
21
+ //# sourceMappingURL=WorkflowsGuidedReviewRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsGuidedReviewRunner.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/WorkflowsGuidedReviewRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAKxD;;;;GAIG;AACH,MAAM,OAAO,2BAA2B;IAEnB,QAAQ;IACR,GAAG;IAFtB,YACmB,QAAkB,EAClB,GAAG,GAAiB,IAAI,CAAC,GAAG;wBAD5B,QAAQ;mBACR,GAAG;IACnB,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,GAAoB;QACnD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,EAAE,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YAC9C,MAAM,EAAE,EAAE,WAAW,EAAE,GAAG,EAAuC;SAClE,CAAC,CAAA;IACJ,CAAC;CACF"}