@codetreker/daynight 0.0.0-stage → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +17 -0
- package/dist/cli.js +164 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.js +263 -0
- package/dist/config.js.map +1 -0
- package/dist/coordinator.d.ts +39 -0
- package/dist/coordinator.js +390 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/copilot.d.ts +44 -0
- package/dist/copilot.js +263 -0
- package/dist/copilot.js.map +1 -0
- package/dist/diagnostics.d.ts +1 -0
- package/dist/diagnostics.js +16 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/git.d.ts +41 -0
- package/dist/git.js +539 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +70 -0
- package/dist/github.js +675 -0
- package/dist/github.js.map +1 -0
- package/dist/instance-lock.d.ts +5 -0
- package/dist/instance-lock.js +115 -0
- package/dist/instance-lock.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +12 -0
- package/dist/main.js.map +1 -0
- package/dist/paths.d.ts +33 -0
- package/dist/paths.js +155 -0
- package/dist/paths.js.map +1 -0
- package/dist/processes.d.ts +23 -0
- package/dist/processes.js +182 -0
- package/dist/processes.js.map +1 -0
- package/dist/repositories.d.ts +15 -0
- package/dist/repositories.js +159 -0
- package/dist/repositories.js.map +1 -0
- package/dist/review-list.d.ts +5 -0
- package/dist/review-list.js +122 -0
- package/dist/review-list.js.map +1 -0
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.js +77 -0
- package/dist/runtime.js.map +1 -0
- package/dist/store.d.ts +136 -0
- package/dist/store.js +579 -0
- package/dist/store.js.map +1 -0
- package/package.json +40 -4
- package/README.md +0 -3
package/dist/store.js
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { lstatSync, statSync } from "node:fs";
|
|
3
|
+
import Database from "better-sqlite3";
|
|
4
|
+
const repositoryColumns = `host, github_id AS githubId, remote, local_path AS localPath,
|
|
5
|
+
start_pr_no AS startPrNumber, initialized_at AS initializedAt,
|
|
6
|
+
last_poll_at AS lastPollAt, last_poll_error AS lastPollError`;
|
|
7
|
+
const pullRequestColumns = `host, github_id AS githubId, number, state, draft,
|
|
8
|
+
head_sha AS headSha, base_ref AS baseRef, base_sha AS baseSha,
|
|
9
|
+
desired_revision AS desiredRevision, completed_revision AS completedRevision,
|
|
10
|
+
session_id AS sessionId, session_established AS sessionEstablished,
|
|
11
|
+
worktree_path AS worktreePath, cleanup_pending AS cleanupPending, cleanup_error AS cleanupError, observed_at AS observedAt`;
|
|
12
|
+
const reviewColumns = `host, github_id AS githubId, number, id, revision,
|
|
13
|
+
head_sha AS headSha, base_ref AS baseRef, base_sha AS baseSha, status,
|
|
14
|
+
attempt_count AS attemptCount, max_attempts AS maxAttempts, retry_at AS retryAt,
|
|
15
|
+
process_owner AS processOwner, process_id AS processId, process_identity AS processIdentity,
|
|
16
|
+
stdout_log_path AS stdoutLogPath, stderr_log_path AS stderrLogPath, last_error AS lastError,
|
|
17
|
+
created_at AS createdAt, updated_at AS updatedAt`;
|
|
18
|
+
const activeStatuses = "'preparing', 'running', 'retry_wait', 'interrupted'";
|
|
19
|
+
const requireText = (value, name) => {
|
|
20
|
+
if (typeof value !== "string" || value.trim().length === 0)
|
|
21
|
+
throw new Error(`${name} must be a nonempty string.`);
|
|
22
|
+
};
|
|
23
|
+
const requireInteger = (value, name, minimum = 0) => {
|
|
24
|
+
if (!Number.isSafeInteger(value) || value < minimum)
|
|
25
|
+
throw new Error(`${name} must be a safe integer of at least ${minimum}.`);
|
|
26
|
+
};
|
|
27
|
+
const requireUuid = (value, name) => {
|
|
28
|
+
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
|
|
29
|
+
throw new Error(`${name} must be a UUID.`);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const repositoryKey = (identity) => {
|
|
33
|
+
requireText(identity.host, "Repository host");
|
|
34
|
+
requireText(identity.githubId, "GitHub repository ID");
|
|
35
|
+
return { host: identity.host.toLowerCase(), githubId: identity.githubId };
|
|
36
|
+
};
|
|
37
|
+
const pullRequestKey = (identity) => {
|
|
38
|
+
requireInteger(identity.number, "PR number", 1);
|
|
39
|
+
return { ...repositoryKey(identity), number: identity.number };
|
|
40
|
+
};
|
|
41
|
+
const asPullRequest = (row) => ({
|
|
42
|
+
...row, draft: row.draft === 1, sessionEstablished: row.sessionEstablished === 1, cleanupPending: row.cleanupPending === 1,
|
|
43
|
+
});
|
|
44
|
+
const requireStopped = (proof) => {
|
|
45
|
+
if (proof.operationsStopped !== true)
|
|
46
|
+
throw new Error("The caller must confirm that all PR operations have stopped.");
|
|
47
|
+
};
|
|
48
|
+
const requireExcluded = (proof) => {
|
|
49
|
+
if (proof.processesExcluded !== true)
|
|
50
|
+
throw new Error("The caller must exclude any previous agent processes first.");
|
|
51
|
+
};
|
|
52
|
+
const schema = `
|
|
53
|
+
CREATE TABLE repositories (
|
|
54
|
+
host TEXT NOT NULL,
|
|
55
|
+
github_id TEXT NOT NULL,
|
|
56
|
+
remote TEXT NOT NULL,
|
|
57
|
+
local_path TEXT NOT NULL,
|
|
58
|
+
start_pr_no INTEGER CHECK(start_pr_no >= 0),
|
|
59
|
+
initialized_at INTEGER,
|
|
60
|
+
last_poll_at INTEGER,
|
|
61
|
+
last_poll_error TEXT,
|
|
62
|
+
PRIMARY KEY(host, github_id),
|
|
63
|
+
CHECK((start_pr_no IS NULL) = (initialized_at IS NULL))
|
|
64
|
+
) STRICT;
|
|
65
|
+
CREATE TABLE pull_requests (
|
|
66
|
+
host TEXT NOT NULL,
|
|
67
|
+
github_id TEXT NOT NULL,
|
|
68
|
+
number INTEGER NOT NULL CHECK(number > 0),
|
|
69
|
+
state TEXT NOT NULL CHECK(state IN ('open', 'closed', 'merged')),
|
|
70
|
+
draft INTEGER NOT NULL CHECK(draft IN (0, 1)),
|
|
71
|
+
head_sha TEXT NOT NULL,
|
|
72
|
+
base_ref TEXT NOT NULL,
|
|
73
|
+
base_sha TEXT NOT NULL,
|
|
74
|
+
desired_revision INTEGER NOT NULL CHECK(desired_revision > 0),
|
|
75
|
+
completed_revision INTEGER NOT NULL DEFAULT 0 CHECK(completed_revision >= 0 AND completed_revision <= desired_revision),
|
|
76
|
+
session_id TEXT,
|
|
77
|
+
session_established INTEGER NOT NULL DEFAULT 0 CHECK(session_established IN (0, 1)),
|
|
78
|
+
worktree_path TEXT,
|
|
79
|
+
cleanup_pending INTEGER NOT NULL DEFAULT 0 CHECK(cleanup_pending IN (0, 1)),
|
|
80
|
+
cleanup_error TEXT,
|
|
81
|
+
observed_at INTEGER NOT NULL,
|
|
82
|
+
PRIMARY KEY(host, github_id, number),
|
|
83
|
+
CHECK(session_established = 0 OR session_id IS NOT NULL),
|
|
84
|
+
CHECK(cleanup_pending = 0 OR worktree_path IS NOT NULL)
|
|
85
|
+
) STRICT;
|
|
86
|
+
CREATE TABLE reviews (
|
|
87
|
+
id TEXT PRIMARY KEY,
|
|
88
|
+
host TEXT NOT NULL,
|
|
89
|
+
github_id TEXT NOT NULL,
|
|
90
|
+
number INTEGER NOT NULL,
|
|
91
|
+
revision INTEGER NOT NULL CHECK(revision > 0),
|
|
92
|
+
head_sha TEXT NOT NULL,
|
|
93
|
+
base_ref TEXT NOT NULL,
|
|
94
|
+
base_sha TEXT,
|
|
95
|
+
status TEXT NOT NULL CHECK(status IN ('preparing', 'running', 'retry_wait', 'completed', 'failed', 'interrupted', 'superseded')),
|
|
96
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
|
|
97
|
+
max_attempts INTEGER NOT NULL CHECK(max_attempts > 0 AND attempt_count <= max_attempts),
|
|
98
|
+
retry_at INTEGER,
|
|
99
|
+
process_owner TEXT,
|
|
100
|
+
process_id INTEGER,
|
|
101
|
+
process_identity TEXT,
|
|
102
|
+
stdout_log_path TEXT,
|
|
103
|
+
stderr_log_path TEXT,
|
|
104
|
+
last_error TEXT,
|
|
105
|
+
created_at INTEGER NOT NULL,
|
|
106
|
+
updated_at INTEGER NOT NULL,
|
|
107
|
+
CHECK((status = 'retry_wait') = (retry_at IS NOT NULL)),
|
|
108
|
+
CHECK(status <> 'running' OR (base_sha IS NOT NULL AND attempt_count > 0 AND process_owner IS NOT NULL AND stdout_log_path IS NOT NULL AND stderr_log_path IS NOT NULL)),
|
|
109
|
+
CHECK((process_id IS NULL) = (process_identity IS NULL))
|
|
110
|
+
) STRICT;
|
|
111
|
+
CREATE UNIQUE INDEX reviews_one_active_per_pr ON reviews(host, github_id, number)
|
|
112
|
+
WHERE status IN (${activeStatuses});
|
|
113
|
+
CREATE INDEX reviews_revision ON reviews(host, github_id, number, revision);
|
|
114
|
+
PRAGMA user_version = 1;
|
|
115
|
+
`;
|
|
116
|
+
const reviewDatabaseIsMissing = (databaseFile) => {
|
|
117
|
+
// Windows may report ENOENT for a file ancestor; ordinary absence requires an existing directory.
|
|
118
|
+
// https://github.com/nodejs/node/blob/955266bfdd854cd280dffd47548673914484e4c0/deps/uv/src/win/error.c#L134-L142
|
|
119
|
+
let candidate = databaseFile;
|
|
120
|
+
while (true) {
|
|
121
|
+
let status;
|
|
122
|
+
try {
|
|
123
|
+
status = lstatSync(candidate);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
127
|
+
throw error;
|
|
128
|
+
const parent = path.dirname(candidate);
|
|
129
|
+
if (parent === candidate)
|
|
130
|
+
throw error;
|
|
131
|
+
candidate = parent;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (candidate === databaseFile)
|
|
135
|
+
return false;
|
|
136
|
+
const ancestor = status.isSymbolicLink() ? statSync(candidate) : status;
|
|
137
|
+
if (!ancestor.isDirectory())
|
|
138
|
+
throw new Error(`The SQLite database path ancestor ${candidate} is not a directory.`);
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
export const readReviewListingSnapshot = (databaseFile) => {
|
|
143
|
+
if (!path.isAbsolute(databaseFile))
|
|
144
|
+
throw new Error("The SQLite database path must be absolute.");
|
|
145
|
+
if (reviewDatabaseIsMissing(databaseFile))
|
|
146
|
+
return null;
|
|
147
|
+
const db = new Database(databaseFile, { readonly: true, fileMustExist: true, timeout: 5000 });
|
|
148
|
+
let operationFailed = false;
|
|
149
|
+
let operationError;
|
|
150
|
+
try {
|
|
151
|
+
return db.transaction(() => {
|
|
152
|
+
const version = db.pragma("user_version", { simple: true });
|
|
153
|
+
if (version !== 1)
|
|
154
|
+
throw new Error(`Review listing requires SQLite schema version 1; found version ${version}.`);
|
|
155
|
+
const repositories = db.prepare(`SELECT ${repositoryColumns} FROM repositories ORDER BY host, github_id`).all();
|
|
156
|
+
const pullRequests = db.prepare(`SELECT ${pullRequestColumns} FROM pull_requests WHERE state = 'open' ORDER BY host, github_id, number`)
|
|
157
|
+
.all().map(asPullRequest);
|
|
158
|
+
const reviews = db.prepare(`SELECT ${reviewColumns} FROM reviews r
|
|
159
|
+
WHERE EXISTS(SELECT 1 FROM pull_requests p WHERE p.host = r.host AND p.github_id = r.github_id AND p.number = r.number AND p.state = 'open'
|
|
160
|
+
AND ((r.revision = p.desired_revision AND r.head_sha = p.head_sha AND r.base_ref = p.base_ref) OR r.status IN (${activeStatuses})))
|
|
161
|
+
ORDER BY host, github_id, number, created_at, id`).all();
|
|
162
|
+
return { repositories, pullRequests, reviews };
|
|
163
|
+
}).deferred();
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
operationFailed = true;
|
|
167
|
+
operationError = error;
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
try {
|
|
172
|
+
db.close();
|
|
173
|
+
}
|
|
174
|
+
catch (closeError) {
|
|
175
|
+
if (operationFailed)
|
|
176
|
+
throw new AggregateError([operationError, closeError], "SQLite review listing and connection cleanup failed.");
|
|
177
|
+
throw closeError;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
export const openStore = (databaseFile, options = {}) => {
|
|
182
|
+
if (!path.isAbsolute(databaseFile))
|
|
183
|
+
throw new Error("The SQLite database path must be absolute.");
|
|
184
|
+
const busyTimeoutMs = options.busyTimeoutMs === undefined ? 5000 : options.busyTimeoutMs;
|
|
185
|
+
requireInteger(busyTimeoutMs, "SQLite busy timeout", 1);
|
|
186
|
+
if (busyTimeoutMs > 60000)
|
|
187
|
+
throw new Error("SQLite busy timeout must not exceed 60000 milliseconds.");
|
|
188
|
+
const db = new Database(databaseFile, { timeout: busyTimeoutMs });
|
|
189
|
+
try {
|
|
190
|
+
const version = db.pragma("user_version", { simple: true });
|
|
191
|
+
if (version > 1)
|
|
192
|
+
throw new Error(`SQLite schema version ${version} is newer than supported version 1.`);
|
|
193
|
+
if (version < 0)
|
|
194
|
+
throw new Error(`Unsupported SQLite schema version ${version}.`);
|
|
195
|
+
const journalMode = db.pragma("journal_mode = WAL", { simple: true });
|
|
196
|
+
if (journalMode !== "wal")
|
|
197
|
+
throw new Error(`SQLite refused WAL mode: ${String(journalMode)}.`);
|
|
198
|
+
db.pragma("synchronous = FULL");
|
|
199
|
+
if (db.pragma("synchronous", { simple: true }) !== 2)
|
|
200
|
+
throw new Error("SQLite refused synchronous=FULL.");
|
|
201
|
+
if (version === 0)
|
|
202
|
+
db.transaction(() => db.exec(schema)).immediate();
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
try {
|
|
206
|
+
db.close();
|
|
207
|
+
}
|
|
208
|
+
catch (closeError) {
|
|
209
|
+
throw new AggregateError([error, closeError], "SQLite startup and connection cleanup failed.");
|
|
210
|
+
}
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
const atomic = (operation) => db.transaction(operation).immediate();
|
|
214
|
+
const getRepository = (identity) => {
|
|
215
|
+
const key = repositoryKey(identity);
|
|
216
|
+
return db.prepare(`SELECT ${repositoryColumns} FROM repositories WHERE host = @host AND github_id = @githubId`).get(key) ?? null;
|
|
217
|
+
};
|
|
218
|
+
const needRepository = (identity) => {
|
|
219
|
+
const repository = getRepository(identity);
|
|
220
|
+
if (repository === null)
|
|
221
|
+
throw new Error("Repository is not registered.");
|
|
222
|
+
return repository;
|
|
223
|
+
};
|
|
224
|
+
const getPullRequest = (identity) => {
|
|
225
|
+
const row = db.prepare(`SELECT ${pullRequestColumns} FROM pull_requests WHERE host = @host AND github_id = @githubId AND number = @number`).get(pullRequestKey(identity));
|
|
226
|
+
return row === undefined ? null : asPullRequest(row);
|
|
227
|
+
};
|
|
228
|
+
const needPullRequest = (identity) => {
|
|
229
|
+
const pullRequest = getPullRequest(identity);
|
|
230
|
+
if (pullRequest === null)
|
|
231
|
+
throw new Error("PR is not tracked.");
|
|
232
|
+
return pullRequest;
|
|
233
|
+
};
|
|
234
|
+
const getReview = (reviewId) => {
|
|
235
|
+
return db.prepare(`SELECT ${reviewColumns} FROM reviews WHERE id = ?`).get(reviewId) ?? null;
|
|
236
|
+
};
|
|
237
|
+
const needReview = (reviewId) => {
|
|
238
|
+
const review = getReview(reviewId);
|
|
239
|
+
if (review === null)
|
|
240
|
+
throw new Error("Review does not exist.");
|
|
241
|
+
return review;
|
|
242
|
+
};
|
|
243
|
+
const activeReview = (identity) => {
|
|
244
|
+
return db.prepare(`SELECT ${reviewColumns} FROM reviews WHERE host = @host AND github_id = @githubId AND number = @number AND status IN (${activeStatuses})`).get(pullRequestKey(identity)) ?? null;
|
|
245
|
+
};
|
|
246
|
+
const isCurrentTarget = (review, pullRequest) => pullRequest.state === "open" && !pullRequest.draft && !pullRequest.cleanupPending &&
|
|
247
|
+
review.revision === pullRequest.desiredRevision && review.headSha === pullRequest.headSha && review.baseRef === pullRequest.baseRef;
|
|
248
|
+
const attemptReview = (identity) => {
|
|
249
|
+
const review = needReview(identity.reviewId);
|
|
250
|
+
if (review.status !== "running" || review.attemptCount !== identity.attempt)
|
|
251
|
+
throw new Error("The review attempt is not the current running attempt.");
|
|
252
|
+
return review;
|
|
253
|
+
};
|
|
254
|
+
const setStatus = (review, status, now, error, retryAt = null) => {
|
|
255
|
+
db.prepare("UPDATE reviews SET status = @status, retry_at = @retryAt, last_error = @error, updated_at = @now WHERE id = @id")
|
|
256
|
+
.run({ id: review.id, status, retryAt, error, now });
|
|
257
|
+
return needReview(review.id);
|
|
258
|
+
};
|
|
259
|
+
const store = {
|
|
260
|
+
close: () => { db.close(); },
|
|
261
|
+
getRepository,
|
|
262
|
+
getPullRequest,
|
|
263
|
+
getReview,
|
|
264
|
+
listRepositories: () => db.prepare(`SELECT ${repositoryColumns} FROM repositories ORDER BY host, github_id`).all(),
|
|
265
|
+
listPullRequests: (identity) => db.prepare(`SELECT ${pullRequestColumns} FROM pull_requests WHERE host = @host AND github_id = @githubId ORDER BY number`).all(repositoryKey(identity)).map(asPullRequest),
|
|
266
|
+
listActiveReviews: () => db.prepare(`SELECT ${reviewColumns} FROM reviews WHERE status IN (${activeStatuses}) ORDER BY created_at, id`).all(),
|
|
267
|
+
listCleanupCandidates: () => db.prepare(`SELECT ${pullRequestColumns} FROM pull_requests p WHERE cleanup_pending = 1
|
|
268
|
+
AND NOT EXISTS(SELECT 1 FROM reviews r WHERE r.host = p.host AND r.github_id = p.github_id AND r.number = p.number AND r.status IN (${activeStatuses}))
|
|
269
|
+
ORDER BY observed_at, host, github_id, number`).all().map(asPullRequest),
|
|
270
|
+
listReviews: (identity) => db.prepare(`SELECT ${reviewColumns} FROM reviews WHERE host = @host AND github_id = @githubId AND number = @number ORDER BY created_at, id`).all(pullRequestKey(identity)),
|
|
271
|
+
registerRepository: (input) => atomic(() => {
|
|
272
|
+
const key = repositoryKey(input);
|
|
273
|
+
requireText(input.remote, "Repository remote");
|
|
274
|
+
requireText(input.localPath, "Repository local path");
|
|
275
|
+
const existing = getRepository(key);
|
|
276
|
+
if (existing !== null && existing.localPath !== input.localPath) {
|
|
277
|
+
const worktree = db.prepare("SELECT 1 FROM pull_requests WHERE host = @host AND github_id = @githubId AND worktree_path IS NOT NULL LIMIT 1").get(key);
|
|
278
|
+
if (worktree !== undefined)
|
|
279
|
+
throw new Error("A repository with registered worktrees cannot change its local path.");
|
|
280
|
+
}
|
|
281
|
+
db.prepare(`INSERT INTO repositories(host, github_id, remote, local_path) VALUES(@host, @githubId, @remote, @localPath)
|
|
282
|
+
ON CONFLICT(host, github_id) DO UPDATE SET remote = excluded.remote, local_path = excluded.local_path`).run({ ...key, remote: input.remote, localPath: input.localPath });
|
|
283
|
+
return needRepository(key);
|
|
284
|
+
}),
|
|
285
|
+
initializeRepository: (identity, startPrNumber, now) => atomic(() => {
|
|
286
|
+
const key = repositoryKey(identity);
|
|
287
|
+
requireInteger(startPrNumber, "Start PR number");
|
|
288
|
+
requireInteger(now, "Initialization time");
|
|
289
|
+
needRepository(key);
|
|
290
|
+
db.prepare("UPDATE repositories SET start_pr_no = @startPrNumber, initialized_at = @now WHERE host = @host AND github_id = @githubId AND start_pr_no IS NULL")
|
|
291
|
+
.run({ ...key, startPrNumber, now });
|
|
292
|
+
return needRepository(key);
|
|
293
|
+
}),
|
|
294
|
+
recordPollSuccess: (identity, now) => atomic(() => {
|
|
295
|
+
const key = repositoryKey(identity);
|
|
296
|
+
requireInteger(now, "Poll time");
|
|
297
|
+
needRepository(key);
|
|
298
|
+
db.prepare("UPDATE repositories SET last_poll_at = @now, last_poll_error = NULL WHERE host = @host AND github_id = @githubId").run({ ...key, now });
|
|
299
|
+
return needRepository(key);
|
|
300
|
+
}),
|
|
301
|
+
recordPollError: (identity, error) => atomic(() => {
|
|
302
|
+
const key = repositoryKey(identity);
|
|
303
|
+
requireText(error, "Poll error");
|
|
304
|
+
needRepository(key);
|
|
305
|
+
db.prepare("UPDATE repositories SET last_poll_error = @error WHERE host = @host AND github_id = @githubId").run({ ...key, error });
|
|
306
|
+
return needRepository(key);
|
|
307
|
+
}),
|
|
308
|
+
observePullRequest: (identity, observation, now) => atomic(() => {
|
|
309
|
+
const key = pullRequestKey({ ...identity, number: observation.number });
|
|
310
|
+
requireInteger(now, "Observation time");
|
|
311
|
+
if (!["open", "closed", "merged"].includes(observation.state) || typeof observation.draft !== "boolean")
|
|
312
|
+
throw new Error("Invalid PR state or Draft flag.");
|
|
313
|
+
requireText(observation.headSha, "PR head SHA");
|
|
314
|
+
requireText(observation.baseRef, "PR base branch");
|
|
315
|
+
requireText(observation.baseSha, "PR base SHA");
|
|
316
|
+
const repository = needRepository(key);
|
|
317
|
+
if (repository.startPrNumber === null)
|
|
318
|
+
throw new Error("Repository initialization has not completed.");
|
|
319
|
+
if (observation.number <= repository.startPrNumber)
|
|
320
|
+
return null;
|
|
321
|
+
const previous = getPullRequest(key);
|
|
322
|
+
const triggered = previous === null || previous.headSha !== observation.headSha || previous.baseRef !== observation.baseRef ||
|
|
323
|
+
(previous.draft && !observation.draft) || (previous.state !== "open" && observation.state === "open");
|
|
324
|
+
const desiredRevision = previous === null ? 1 : previous.desiredRevision + Number(triggered);
|
|
325
|
+
requireInteger(desiredRevision, "Desired revision", 1);
|
|
326
|
+
// Observations cannot prove that an earlier cleanup operation has stopped.
|
|
327
|
+
const cleanupPending = previous !== null && (previous.cleanupPending || (observation.state !== "open" && previous.worktreePath !== null));
|
|
328
|
+
const parameters = { ...key, state: observation.state, draft: Number(observation.draft), headSha: observation.headSha,
|
|
329
|
+
baseRef: observation.baseRef, baseSha: observation.baseSha, desiredRevision, cleanupPending: Number(cleanupPending),
|
|
330
|
+
cleanupError: previous === null ? null : previous.cleanupError, now };
|
|
331
|
+
if (previous === null) {
|
|
332
|
+
db.prepare(`INSERT INTO pull_requests(host, github_id, number, state, draft, head_sha, base_ref, base_sha, desired_revision, cleanup_pending, observed_at)
|
|
333
|
+
VALUES(@host, @githubId, @number, @state, @draft, @headSha, @baseRef, @baseSha, @desiredRevision, @cleanupPending, @now)`).run(parameters);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
db.prepare(`UPDATE pull_requests SET state = @state, draft = @draft, head_sha = @headSha, base_ref = @baseRef, base_sha = @baseSha,
|
|
337
|
+
desired_revision = @desiredRevision, cleanup_pending = @cleanupPending, cleanup_error = @cleanupError, observed_at = @now
|
|
338
|
+
WHERE host = @host AND github_id = @githubId AND number = @number`).run(parameters);
|
|
339
|
+
}
|
|
340
|
+
return needPullRequest(key);
|
|
341
|
+
}),
|
|
342
|
+
listCandidates: (now) => {
|
|
343
|
+
requireInteger(now, "Selection time");
|
|
344
|
+
const rows = db.prepare(`SELECT ${pullRequestColumns} FROM pull_requests p WHERE state = 'open' AND draft = 0 AND cleanup_pending = 0
|
|
345
|
+
AND desired_revision > completed_revision
|
|
346
|
+
AND NOT EXISTS(SELECT 1 FROM reviews r WHERE r.host = p.host AND r.github_id = p.github_id AND r.number = p.number AND r.revision = p.desired_revision AND r.status = 'failed')
|
|
347
|
+
AND NOT EXISTS(SELECT 1 FROM reviews r WHERE r.host = p.host AND r.github_id = p.github_id AND r.number = p.number AND r.status IN ('preparing', 'running', 'interrupted'))
|
|
348
|
+
AND NOT EXISTS(SELECT 1 FROM reviews r WHERE r.host = p.host AND r.github_id = p.github_id AND r.number = p.number AND r.status = 'retry_wait' AND r.revision = p.desired_revision AND r.retry_at > @now)
|
|
349
|
+
ORDER BY observed_at, host, github_id, number`).all({ now });
|
|
350
|
+
return rows.map((row) => { const pullRequest = asPullRequest(row); return { pullRequest, review: activeReview(pullRequest) }; });
|
|
351
|
+
},
|
|
352
|
+
reserveReview: (identity, input, now) => atomic(() => {
|
|
353
|
+
const pullRequest = needPullRequest(identity);
|
|
354
|
+
requireInteger(now, "Reservation time");
|
|
355
|
+
requireInteger(input.maxAttempts, "Maximum attempts", 1);
|
|
356
|
+
requireUuid(input.reviewId, "Review ID");
|
|
357
|
+
requireUuid(input.sessionId, "Session ID");
|
|
358
|
+
if (pullRequest.state !== "open" || pullRequest.draft || pullRequest.cleanupPending || pullRequest.desiredRevision <= pullRequest.completedRevision)
|
|
359
|
+
return null;
|
|
360
|
+
let active = activeReview(pullRequest);
|
|
361
|
+
if (active !== null && active.status === "retry_wait" && !isCurrentTarget(active, pullRequest)) {
|
|
362
|
+
setStatus(active, "superseded", now, active.lastError);
|
|
363
|
+
active = null;
|
|
364
|
+
}
|
|
365
|
+
if (active !== null) {
|
|
366
|
+
if (active.status !== "retry_wait" || active.retryAt === null || active.retryAt > now)
|
|
367
|
+
return null;
|
|
368
|
+
if (active.attemptCount >= active.maxAttempts) {
|
|
369
|
+
setStatus(active, "failed", now, active.lastError);
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
return setStatus(active, "preparing", now, active.lastError);
|
|
373
|
+
}
|
|
374
|
+
const failed = db.prepare("SELECT 1 FROM reviews WHERE host = @host AND github_id = @githubId AND number = @number AND revision = @revision AND status = 'failed' LIMIT 1")
|
|
375
|
+
.get({ ...pullRequestKey(pullRequest), revision: pullRequest.desiredRevision });
|
|
376
|
+
if (failed !== undefined)
|
|
377
|
+
return null;
|
|
378
|
+
if (pullRequest.sessionId === null) {
|
|
379
|
+
db.prepare("UPDATE pull_requests SET session_id = @sessionId WHERE host = @host AND github_id = @githubId AND number = @number")
|
|
380
|
+
.run({ ...pullRequestKey(pullRequest), sessionId: input.sessionId });
|
|
381
|
+
}
|
|
382
|
+
db.prepare(`INSERT INTO reviews(id, host, github_id, number, revision, head_sha, base_ref, status, max_attempts, created_at, updated_at)
|
|
383
|
+
VALUES(@id, @host, @githubId, @number, @revision, @headSha, @baseRef, 'preparing', @maxAttempts, @now, @now)`)
|
|
384
|
+
.run({ ...pullRequestKey(pullRequest), id: input.reviewId, revision: pullRequest.desiredRevision, headSha: pullRequest.headSha,
|
|
385
|
+
baseRef: pullRequest.baseRef, maxAttempts: input.maxAttempts, now });
|
|
386
|
+
return needReview(input.reviewId);
|
|
387
|
+
}),
|
|
388
|
+
pinReviewBase: (reviewId, baseSha, now) => atomic(() => {
|
|
389
|
+
requireText(baseSha, "Pinned base SHA");
|
|
390
|
+
requireInteger(now, "Pin time");
|
|
391
|
+
const review = needReview(reviewId);
|
|
392
|
+
if (review.status !== "preparing")
|
|
393
|
+
throw new Error("Only a preparing review may pin its base SHA.");
|
|
394
|
+
if (review.baseSha !== null && review.baseSha !== baseSha)
|
|
395
|
+
throw new Error("A review's pinned base SHA is immutable.");
|
|
396
|
+
db.prepare("UPDATE reviews SET base_sha = @baseSha, updated_at = @now WHERE id = @id").run({ id: reviewId, baseSha, now });
|
|
397
|
+
return needReview(reviewId);
|
|
398
|
+
}),
|
|
399
|
+
startAttempt: (reviewId, input, now) => atomic(() => {
|
|
400
|
+
requireInteger(now, "Launch time");
|
|
401
|
+
requireText(input.processOwner, "Process owner");
|
|
402
|
+
requireText(input.stdoutLogPath, "Stdout log path");
|
|
403
|
+
requireText(input.stderrLogPath, "Stderr log path");
|
|
404
|
+
const review = needReview(reviewId);
|
|
405
|
+
const pullRequest = needPullRequest(review);
|
|
406
|
+
if (review.status !== "preparing" || !isCurrentTarget(review, pullRequest))
|
|
407
|
+
throw new Error("The captured review target is no longer ready to run.");
|
|
408
|
+
if (review.baseSha === null || pullRequest.worktreePath === null || pullRequest.sessionId === null)
|
|
409
|
+
throw new Error("The review's base, worktree, and session must be persisted before launch.");
|
|
410
|
+
if (review.attemptCount >= review.maxAttempts)
|
|
411
|
+
throw new Error("The review attempt budget is exhausted.");
|
|
412
|
+
// Launch intent consumes the budget before spawn; a crash in that gap cannot grant another attempt.
|
|
413
|
+
db.prepare(`UPDATE reviews SET status = 'running', attempt_count = attempt_count + 1, retry_at = NULL,
|
|
414
|
+
process_owner = @processOwner, process_id = NULL, process_identity = NULL, stdout_log_path = @stdoutLogPath,
|
|
415
|
+
stderr_log_path = @stderrLogPath, updated_at = @now WHERE id = @id`).run({ id: reviewId, ...input, now });
|
|
416
|
+
return needReview(reviewId);
|
|
417
|
+
}),
|
|
418
|
+
recordProcess: (identity, input) => atomic(() => {
|
|
419
|
+
requireInteger(input.pid, "Process ID", 1);
|
|
420
|
+
requireText(input.identity, "Process identity");
|
|
421
|
+
const review = attemptReview(identity);
|
|
422
|
+
if (review.processId !== null && (review.processId !== input.pid || review.processIdentity !== input.identity))
|
|
423
|
+
throw new Error("The running attempt already has a different process identity.");
|
|
424
|
+
db.prepare("UPDATE reviews SET process_id = @pid, process_identity = @identity WHERE id = @id").run({ id: review.id, ...input });
|
|
425
|
+
return needReview(review.id);
|
|
426
|
+
}),
|
|
427
|
+
markSessionEstablished: (identity) => atomic(() => {
|
|
428
|
+
const pullRequest = needPullRequest(identity);
|
|
429
|
+
if (pullRequest.sessionId === null)
|
|
430
|
+
throw new Error("The PR has no persisted session ID.");
|
|
431
|
+
db.prepare("UPDATE pull_requests SET session_established = 1 WHERE host = @host AND github_id = @githubId AND number = @number").run(pullRequestKey(pullRequest));
|
|
432
|
+
return needPullRequest(pullRequest);
|
|
433
|
+
}),
|
|
434
|
+
completeReview: (identity, proof, now) => atomic(() => {
|
|
435
|
+
requireExcluded(proof);
|
|
436
|
+
requireInteger(now, "Completion time");
|
|
437
|
+
const review = attemptReview(identity);
|
|
438
|
+
const completed = setStatus(review, "completed", now, null);
|
|
439
|
+
db.prepare("UPDATE pull_requests SET completed_revision = MAX(completed_revision, @revision) WHERE host = @host AND github_id = @githubId AND number = @number")
|
|
440
|
+
.run({ ...pullRequestKey(review), revision: review.revision });
|
|
441
|
+
return completed;
|
|
442
|
+
}),
|
|
443
|
+
retryReview: (identity, proof, input, now) => atomic(() => {
|
|
444
|
+
requireExcluded(proof);
|
|
445
|
+
requireInteger(now, "Attempt end time");
|
|
446
|
+
requireInteger(input.retryAt, "Retry time");
|
|
447
|
+
if (input.retryAt < now)
|
|
448
|
+
throw new Error("Retry time cannot precede the attempt end time.");
|
|
449
|
+
requireText(input.error, "Attempt error");
|
|
450
|
+
const review = attemptReview(identity);
|
|
451
|
+
if (!isCurrentTarget(review, needPullRequest(review)))
|
|
452
|
+
return setStatus(review, "superseded", now, input.error);
|
|
453
|
+
if (review.attemptCount >= review.maxAttempts)
|
|
454
|
+
return setStatus(review, "failed", now, input.error);
|
|
455
|
+
return setStatus(review, "retry_wait", now, input.error, input.retryAt);
|
|
456
|
+
}),
|
|
457
|
+
deferPreparation: (reviewId, proof, input, now) => atomic(() => {
|
|
458
|
+
requireStopped(proof);
|
|
459
|
+
requireInteger(now, "Preparation end time");
|
|
460
|
+
requireInteger(input.retryAt, "Retry time");
|
|
461
|
+
if (input.retryAt < now)
|
|
462
|
+
throw new Error("Retry time cannot precede preparation end time.");
|
|
463
|
+
requireText(input.error, "Preparation error");
|
|
464
|
+
const review = needReview(reviewId);
|
|
465
|
+
if (review.status !== "preparing")
|
|
466
|
+
throw new Error("Only preparation can be deferred without consuming an agent attempt.");
|
|
467
|
+
if (!isCurrentTarget(review, needPullRequest(review)))
|
|
468
|
+
return setStatus(review, "superseded", now, input.error);
|
|
469
|
+
return setStatus(review, "retry_wait", now, input.error, input.retryAt);
|
|
470
|
+
}),
|
|
471
|
+
markInterrupted: (reviewId, error, now) => atomic(() => {
|
|
472
|
+
requireInteger(now, "Interruption time");
|
|
473
|
+
requireText(error, "Interruption error");
|
|
474
|
+
const review = needReview(reviewId);
|
|
475
|
+
if (review.status !== "preparing" && review.status !== "running" && review.status !== "interrupted")
|
|
476
|
+
throw new Error("Only unresolved preparation or execution can be interrupted.");
|
|
477
|
+
return setStatus(review, "interrupted", now, error);
|
|
478
|
+
}),
|
|
479
|
+
resolveInterrupted: (reviewId, proof, retryAt, now) => atomic(() => {
|
|
480
|
+
requireExcluded(proof);
|
|
481
|
+
requireStopped(proof);
|
|
482
|
+
requireInteger(now, "Recovery time");
|
|
483
|
+
requireInteger(retryAt, "Retry time");
|
|
484
|
+
if (retryAt < now)
|
|
485
|
+
throw new Error("Retry time cannot precede recovery time.");
|
|
486
|
+
const review = needReview(reviewId);
|
|
487
|
+
if (review.status !== "interrupted")
|
|
488
|
+
throw new Error("Review is not interrupted.");
|
|
489
|
+
if (!isCurrentTarget(review, needPullRequest(review)))
|
|
490
|
+
return setStatus(review, "superseded", now, review.lastError);
|
|
491
|
+
if (review.attemptCount >= review.maxAttempts)
|
|
492
|
+
return setStatus(review, "failed", now, review.lastError);
|
|
493
|
+
return setStatus(review, "retry_wait", now, review.lastError, retryAt);
|
|
494
|
+
}),
|
|
495
|
+
supersedeReview: (reviewId, proof, now) => atomic(() => {
|
|
496
|
+
requireStopped(proof);
|
|
497
|
+
requireInteger(now, "Supersession time");
|
|
498
|
+
const review = needReview(reviewId);
|
|
499
|
+
if (review.status !== "preparing" && review.status !== "retry_wait")
|
|
500
|
+
throw new Error("Running or interrupted execution cannot be superseded before it is resolved.");
|
|
501
|
+
if (isCurrentTarget(review, needPullRequest(review)))
|
|
502
|
+
throw new Error("A current review target cannot be superseded.");
|
|
503
|
+
return setStatus(review, "superseded", now, review.lastError);
|
|
504
|
+
}),
|
|
505
|
+
registerWorktree: (identity, worktreePath) => atomic(() => {
|
|
506
|
+
requireText(worktreePath, "Worktree path");
|
|
507
|
+
const pullRequest = needPullRequest(identity);
|
|
508
|
+
if (pullRequest.state !== "open" || pullRequest.cleanupPending)
|
|
509
|
+
throw new Error("Cannot register a worktree for a closed PR.");
|
|
510
|
+
if (pullRequest.worktreePath !== null && pullRequest.worktreePath !== worktreePath)
|
|
511
|
+
throw new Error("The PR already owns a different worktree.");
|
|
512
|
+
const active = activeReview(pullRequest);
|
|
513
|
+
if (active !== null && (active.status === "running" || active.status === "interrupted"))
|
|
514
|
+
throw new Error("Cannot change worktree registration while execution is unresolved.");
|
|
515
|
+
db.prepare("UPDATE pull_requests SET worktree_path = @worktreePath WHERE host = @host AND github_id = @githubId AND number = @number")
|
|
516
|
+
.run({ ...pullRequestKey(pullRequest), worktreePath });
|
|
517
|
+
return needPullRequest(pullRequest);
|
|
518
|
+
}),
|
|
519
|
+
recordCleanupError: (identity, worktreePath, error) => atomic(() => {
|
|
520
|
+
requireText(error, "Cleanup error");
|
|
521
|
+
const pullRequest = needPullRequest(identity);
|
|
522
|
+
if (!pullRequest.cleanupPending || pullRequest.worktreePath !== worktreePath)
|
|
523
|
+
throw new Error("The pending worktree does not match cleanup.");
|
|
524
|
+
db.prepare("UPDATE pull_requests SET cleanup_error = @error WHERE host = @host AND github_id = @githubId AND number = @number")
|
|
525
|
+
.run({ ...pullRequestKey(pullRequest), error });
|
|
526
|
+
return needPullRequest(pullRequest);
|
|
527
|
+
}),
|
|
528
|
+
cancelCleanup: (identity, worktreePath, proof) => atomic(() => {
|
|
529
|
+
requireStopped(proof);
|
|
530
|
+
requireExcluded(proof);
|
|
531
|
+
const pullRequest = needPullRequest(identity);
|
|
532
|
+
if (pullRequest.state !== "open")
|
|
533
|
+
throw new Error("Only a reopened PR can cancel pending worktree cleanup.");
|
|
534
|
+
if (!pullRequest.cleanupPending || pullRequest.worktreePath !== worktreePath)
|
|
535
|
+
throw new Error("The pending worktree does not match cleanup.");
|
|
536
|
+
if (activeReview(pullRequest) !== null)
|
|
537
|
+
throw new Error("An active review blocks worktree cleanup cancellation.");
|
|
538
|
+
db.prepare("UPDATE pull_requests SET cleanup_pending = 0, cleanup_error = NULL WHERE host = @host AND github_id = @githubId AND number = @number").run(pullRequestKey(pullRequest));
|
|
539
|
+
return needPullRequest(pullRequest);
|
|
540
|
+
}),
|
|
541
|
+
completeCleanup: (identity, worktreePath, proof) => atomic(() => {
|
|
542
|
+
requireStopped(proof);
|
|
543
|
+
requireExcluded(proof);
|
|
544
|
+
const pullRequest = needPullRequest(identity);
|
|
545
|
+
if (pullRequest.state === "open")
|
|
546
|
+
throw new Error("A reopened PR must retain its worktree.");
|
|
547
|
+
if (!pullRequest.cleanupPending || pullRequest.worktreePath !== worktreePath)
|
|
548
|
+
throw new Error("The pending worktree does not match cleanup.");
|
|
549
|
+
if (activeReview(pullRequest) !== null)
|
|
550
|
+
throw new Error("An active review blocks worktree cleanup.");
|
|
551
|
+
db.prepare("UPDATE pull_requests SET worktree_path = NULL, cleanup_pending = 0, cleanup_error = NULL WHERE host = @host AND github_id = @githubId AND number = @number").run(pullRequestKey(pullRequest));
|
|
552
|
+
return needPullRequest(pullRequest);
|
|
553
|
+
}),
|
|
554
|
+
};
|
|
555
|
+
const applyRepositoryPoll = (identity, update, now) => atomic(() => {
|
|
556
|
+
if (update.kind === "initialize") {
|
|
557
|
+
store.initializeRepository(identity, update.startPrNumber, now);
|
|
558
|
+
}
|
|
559
|
+
else if (update.kind === "snapshot") {
|
|
560
|
+
if (needRepository(identity).startPrNumber === null) {
|
|
561
|
+
throw new Error("Repository initialization has not completed.");
|
|
562
|
+
}
|
|
563
|
+
const observedNumbers = new Set();
|
|
564
|
+
for (const observation of update.observations) {
|
|
565
|
+
if (observedNumbers.has(observation.number)) {
|
|
566
|
+
throw new Error(`A repository snapshot contains duplicate PR ${observation.number}.`);
|
|
567
|
+
}
|
|
568
|
+
observedNumbers.add(observation.number);
|
|
569
|
+
store.observePullRequest(identity, observation, now);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
throw new Error("Unsupported repository poll update.");
|
|
574
|
+
}
|
|
575
|
+
return store.recordPollSuccess(identity, now);
|
|
576
|
+
});
|
|
577
|
+
return { ...store, applyRepositoryPoll };
|
|
578
|
+
};
|
|
579
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|