@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processes.js","sourceRoot":"","sources":["../src/processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RepositoryConfiguration } from "./config.js";
|
|
2
|
+
import type { RuntimePaths } from "./paths.js";
|
|
3
|
+
export type AddRepositoryInput = {
|
|
4
|
+
remote: string;
|
|
5
|
+
path?: string;
|
|
6
|
+
};
|
|
7
|
+
export type AddRepositoryOptions = {
|
|
8
|
+
workingDirectory: string;
|
|
9
|
+
homeDirectory: string;
|
|
10
|
+
};
|
|
11
|
+
export type AddRepositoryResult = {
|
|
12
|
+
repository: RepositoryConfiguration;
|
|
13
|
+
added: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const addRepository: (input: AddRepositoryInput, runtimePaths: RuntimePaths, options: AddRepositoryOptions) => Promise<AddRepositoryResult>;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir, open, readFile, rename, unlink } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { Document } from "yaml";
|
|
5
|
+
import { defaultRepositoryRoot, parseConfigurationDocument, remoteIdentity, resolveRepositoryRoot, validateConfigurationSource } from "./config.js";
|
|
6
|
+
import { missingPathsReferToSameDirectory, resolvePhysicalDirectory } from "./paths.js";
|
|
7
|
+
const hasCode = (error, code) => error instanceof Error && "code" in error && error.code === code;
|
|
8
|
+
const repositoryPathComponent = (component) => {
|
|
9
|
+
let escaped = component.replace(/[<>:"/\\|?*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`)
|
|
10
|
+
.replace(/\.+$/, (dots) => "%2E".repeat(dots.length));
|
|
11
|
+
if (/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(escaped)) {
|
|
12
|
+
escaped = `%${escaped.charCodeAt(0).toString(16).toUpperCase()}${escaped.slice(1)}`;
|
|
13
|
+
}
|
|
14
|
+
return escaped;
|
|
15
|
+
};
|
|
16
|
+
const sameDirectory = async (first, second) => {
|
|
17
|
+
const [left, right] = await Promise.all([resolvePhysicalDirectory(first), resolvePhysicalDirectory(second)]);
|
|
18
|
+
if (left.ancestorIdentity !== right.ancestorIdentity || left.missingComponents.length !== right.missingComponents.length) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return left.missingComponents.every((component, index) => component === right.missingComponents[index]) ||
|
|
22
|
+
missingPathsReferToSameDirectory(left.ancestorPath, left.missingComponents, right.missingComponents);
|
|
23
|
+
};
|
|
24
|
+
const updateConfiguration = async (input, runtimePaths, options) => {
|
|
25
|
+
let existingEntry;
|
|
26
|
+
try {
|
|
27
|
+
existingEntry = await lstat(runtimePaths.configFile);
|
|
28
|
+
}
|
|
29
|
+
catch (cause) {
|
|
30
|
+
if (!hasCode(cause, "ENOENT")) {
|
|
31
|
+
throw new Error(`Cannot inspect configuration file ${runtimePaths.configFile}.`, { cause });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (existingEntry !== undefined && !existingEntry.isFile()) {
|
|
35
|
+
throw new Error(`Configuration file ${runtimePaths.configFile} must be a regular file; symbolic-link writes are not supported.`);
|
|
36
|
+
}
|
|
37
|
+
const source = existingEntry === undefined ? undefined : await readFile(runtimePaths.configFile, "utf8");
|
|
38
|
+
const existing = source === undefined ? undefined : await validateConfigurationSource(source, runtimePaths);
|
|
39
|
+
const document = source === undefined ? new Document({ repositoryRoot: defaultRepositoryRoot, repositories: [] }) : parseConfigurationDocument(source, runtimePaths);
|
|
40
|
+
const decoded = document.toJS();
|
|
41
|
+
const root = document.has("repositoryRoot") ? decoded.repositoryRoot : defaultRepositoryRoot;
|
|
42
|
+
const identity = remoteIdentity(input.remote, "remote");
|
|
43
|
+
const previous = existing?.repositories.find((repository) => repository.coordinate === identity.coordinate);
|
|
44
|
+
if (previous !== undefined && input.path === undefined) {
|
|
45
|
+
return { repository: previous, added: false };
|
|
46
|
+
}
|
|
47
|
+
let repositoryPath;
|
|
48
|
+
if (input.path === undefined) {
|
|
49
|
+
repositoryPath = path.join(resolveRepositoryRoot(root, runtimePaths, options.homeDirectory), ...[identity.host, identity.owner, identity.name].map(repositoryPathComponent));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
if (input.path.trim() === "" || input.path.includes("\0") || input.path.startsWith("~")) {
|
|
53
|
+
throw new Error("path must be a nonempty absolute path or working-directory-relative path without NUL characters; expand ~ before passing --path.");
|
|
54
|
+
}
|
|
55
|
+
if (path.sep === "\\" && /^[a-z]:(?![\\/])/i.test(input.path)) {
|
|
56
|
+
throw new Error("path must not use a drive-relative Windows path.");
|
|
57
|
+
}
|
|
58
|
+
repositoryPath = path.resolve(options.workingDirectory, input.path);
|
|
59
|
+
}
|
|
60
|
+
if (previous !== undefined) {
|
|
61
|
+
if (await sameDirectory(previous.path, repositoryPath)) {
|
|
62
|
+
return { repository: previous, added: false };
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Repository ${identity.coordinate} is already configured at ${previous.path}; the requested path ${repositoryPath} differs.`);
|
|
65
|
+
}
|
|
66
|
+
if (!document.has("repositoryRoot")) {
|
|
67
|
+
document.set("repositoryRoot", defaultRepositoryRoot);
|
|
68
|
+
}
|
|
69
|
+
document.addIn(["repositories"], { remote: input.remote, path: repositoryPath });
|
|
70
|
+
const updatedSource = document.toString();
|
|
71
|
+
const configuration = await validateConfigurationSource(updatedSource, runtimePaths);
|
|
72
|
+
const repository = configuration.repositories.at(-1);
|
|
73
|
+
const temporaryFile = path.join(path.dirname(runtimePaths.configFile), `.config-${randomUUID()}.tmp`);
|
|
74
|
+
const handle = await open(temporaryFile, "wx", 0o600);
|
|
75
|
+
let failure;
|
|
76
|
+
let renamed = false;
|
|
77
|
+
let closed = false;
|
|
78
|
+
try {
|
|
79
|
+
await handle.writeFile(updatedSource, "utf8");
|
|
80
|
+
if (existingEntry !== undefined) {
|
|
81
|
+
await handle.chmod(existingEntry.mode & 0o777);
|
|
82
|
+
}
|
|
83
|
+
await handle.sync();
|
|
84
|
+
await handle.close();
|
|
85
|
+
closed = true;
|
|
86
|
+
await rename(temporaryFile, runtimePaths.configFile);
|
|
87
|
+
renamed = true;
|
|
88
|
+
return { repository, added: true };
|
|
89
|
+
}
|
|
90
|
+
catch (cause) {
|
|
91
|
+
failure = cause;
|
|
92
|
+
throw cause;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
const cleanup = [];
|
|
96
|
+
if (!closed) {
|
|
97
|
+
try {
|
|
98
|
+
await handle.close();
|
|
99
|
+
}
|
|
100
|
+
catch (cause) {
|
|
101
|
+
cleanup.push(cause);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (!renamed) {
|
|
105
|
+
try {
|
|
106
|
+
await unlink(temporaryFile);
|
|
107
|
+
}
|
|
108
|
+
catch (cause) {
|
|
109
|
+
cleanup.push(cause);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (cleanup.length !== 0) {
|
|
113
|
+
throw new AggregateError(failure === undefined ? cleanup : [failure, ...cleanup], "Configuration write or temporary-file cleanup failed.");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
export const addRepository = async (input, runtimePaths, options) => {
|
|
118
|
+
if (!path.isAbsolute(options.workingDirectory) || !path.isAbsolute(options.homeDirectory)) {
|
|
119
|
+
throw new Error("The working directory and home directory must be absolute paths.");
|
|
120
|
+
}
|
|
121
|
+
await mkdir(path.dirname(runtimePaths.configFile), { recursive: true });
|
|
122
|
+
const lockFile = `${runtimePaths.configFile}.lock`;
|
|
123
|
+
let lock;
|
|
124
|
+
try {
|
|
125
|
+
lock = await open(lockFile, "wx", 0o600);
|
|
126
|
+
}
|
|
127
|
+
catch (cause) {
|
|
128
|
+
throw new Error(hasCode(cause, "EEXIST")
|
|
129
|
+
? `Configuration is locked by another writer at ${lockFile}; retry when that writer exits. Remove the lock only after confirming no writer is running.`
|
|
130
|
+
: `Cannot acquire configuration lock ${lockFile}.`, { cause });
|
|
131
|
+
}
|
|
132
|
+
let failure;
|
|
133
|
+
try {
|
|
134
|
+
return await updateConfiguration(input, runtimePaths, options);
|
|
135
|
+
}
|
|
136
|
+
catch (cause) {
|
|
137
|
+
failure = cause;
|
|
138
|
+
throw cause;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
const cleanup = [];
|
|
142
|
+
try {
|
|
143
|
+
await lock.close();
|
|
144
|
+
}
|
|
145
|
+
catch (cause) {
|
|
146
|
+
cleanup.push(cause);
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await unlink(lockFile);
|
|
150
|
+
}
|
|
151
|
+
catch (cause) {
|
|
152
|
+
cleanup.push(cause);
|
|
153
|
+
}
|
|
154
|
+
if (cleanup.length !== 0) {
|
|
155
|
+
throw new AggregateError(failure === undefined ? cleanup : [failure, ...cleanup], "Configuration update or lock cleanup failed.");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=repositories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositories.js","sourceRoot":"","sources":["../src/repositories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Configuration } from "./config.js";
|
|
2
|
+
import type { RuntimePaths } from "./paths.js";
|
|
3
|
+
import type { ReviewListingSnapshot } from "./store.js";
|
|
4
|
+
export declare const formatReviewListing: (configuration: Configuration, snapshot: ReviewListingSnapshot | null) => string;
|
|
5
|
+
export declare const listReviews: (paths: RuntimePaths) => Promise<string>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { parseConfiguration, remoteIdentity } from "./config.js";
|
|
3
|
+
import { readReviewListingSnapshot } from "./store.js";
|
|
4
|
+
const reviewNames = {
|
|
5
|
+
preparing: "Preparing",
|
|
6
|
+
running: "Running",
|
|
7
|
+
retry_wait: "Retry waiting",
|
|
8
|
+
completed: "Completed",
|
|
9
|
+
failed: "Failed",
|
|
10
|
+
interrupted: "Interrupted",
|
|
11
|
+
superseded: "Pending",
|
|
12
|
+
};
|
|
13
|
+
const activeStatuses = new Set(["preparing", "running", "retry_wait", "interrupted"]);
|
|
14
|
+
const repositoryKey = ({ host, githubId }) => JSON.stringify([host.toLowerCase(), githubId]);
|
|
15
|
+
const pullRequestKey = (pullRequest) => JSON.stringify([pullRequest.host.toLowerCase(), pullRequest.githubId, pullRequest.number]);
|
|
16
|
+
const terminalSafe = (text) => text.replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029\u202a-\u202e\u2066-\u2069]/g, (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`);
|
|
17
|
+
const timestamp = (value) => new Date(value).toISOString();
|
|
18
|
+
const reviewDetails = (review, prefix = "") => {
|
|
19
|
+
const lines = [];
|
|
20
|
+
if (review.retryAt !== null)
|
|
21
|
+
lines.push(`${prefix}Retry at: ${timestamp(review.retryAt)}`);
|
|
22
|
+
if (review.lastError !== null)
|
|
23
|
+
lines.push(`${prefix}Error: ${terminalSafe(review.lastError)}`);
|
|
24
|
+
return lines;
|
|
25
|
+
};
|
|
26
|
+
const rowFor = (pullRequest, reviews) => {
|
|
27
|
+
const ordered = [...reviews].sort((first, second) => first.createdAt - second.createdAt || first.updatedAt - second.updatedAt || first.id.localeCompare(second.id));
|
|
28
|
+
const isCurrent = (review) => review.revision === pullRequest.desiredRevision &&
|
|
29
|
+
review.headSha === pullRequest.headSha && review.baseRef === pullRequest.baseRef;
|
|
30
|
+
const current = ordered.filter(isCurrent).at(-1);
|
|
31
|
+
const previousActive = ordered.filter((review) => !isCurrent(review) && activeStatuses.has(review.status));
|
|
32
|
+
let status = current === undefined ? "Pending" : reviewNames[current.status];
|
|
33
|
+
if (pullRequest.draft)
|
|
34
|
+
status = "Paused";
|
|
35
|
+
else if (current === undefined && pullRequest.cleanupPending)
|
|
36
|
+
status = "Pending (cleanup blocked)";
|
|
37
|
+
else if (current === undefined && previousActive.length > 0) {
|
|
38
|
+
status = `Pending (previous revision ${reviewNames[previousActive.at(-1).status].toLowerCase()})`;
|
|
39
|
+
}
|
|
40
|
+
const details = current === undefined ? [] : reviewDetails(current);
|
|
41
|
+
if (pullRequest.draft && current !== undefined)
|
|
42
|
+
details.unshift(`Recorded review: ${reviewNames[current.status]}`);
|
|
43
|
+
if (pullRequest.cleanupPending) {
|
|
44
|
+
details.push("Worktree cleanup: Pending");
|
|
45
|
+
if (pullRequest.cleanupError !== null)
|
|
46
|
+
details.push(`Cleanup error: ${terminalSafe(pullRequest.cleanupError)}`);
|
|
47
|
+
}
|
|
48
|
+
for (const previous of previousActive) {
|
|
49
|
+
details.push(`Previous revision ${previous.revision}: ${reviewNames[previous.status]}; attempts: ${previous.attemptCount}/${previous.maxAttempts}`);
|
|
50
|
+
details.push(...reviewDetails(previous, "Previous revision "));
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
columns: [`#${pullRequest.number}`, pullRequest.draft ? "Draft" : "Open", status, current === undefined ? "-" : String(current.attemptCount)],
|
|
54
|
+
details,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
const renderRows = (rows) => {
|
|
58
|
+
const headings = ["PR", "PR STATE", "REVIEW", "ATTEMPTS"];
|
|
59
|
+
const widths = headings.map((heading, index) => Math.max(heading.length, ...rows.map(({ columns }) => columns[index].length)));
|
|
60
|
+
const line = (columns) => columns.map((value, index) => index === columns.length - 1 ? value : value.padEnd(widths[index])).join(" ");
|
|
61
|
+
return [line(headings), ...rows.flatMap((row) => [line(row.columns), ...row.details.map((detail) => ` ${detail}`)])];
|
|
62
|
+
};
|
|
63
|
+
export const formatReviewListing = (configuration, snapshot) => {
|
|
64
|
+
const configuredCoordinates = new Set(configuration.repositories.map(({ coordinate }) => coordinate));
|
|
65
|
+
const storedByCoordinate = new Map();
|
|
66
|
+
for (const repository of snapshot?.repositories ?? []) {
|
|
67
|
+
const { coordinate } = remoteIdentity(repository.remote, "Stored repository remote");
|
|
68
|
+
if (!configuredCoordinates.has(coordinate))
|
|
69
|
+
continue;
|
|
70
|
+
const previous = storedByCoordinate.get(coordinate);
|
|
71
|
+
if (previous !== undefined && repositoryKey(previous) !== repositoryKey(repository)) {
|
|
72
|
+
throw new Error(`Ambiguous persisted repository identity for ${coordinate}; multiple GitHub repository IDs match the configured remote.`);
|
|
73
|
+
}
|
|
74
|
+
storedByCoordinate.set(coordinate, repository);
|
|
75
|
+
}
|
|
76
|
+
const reviewsByPullRequest = new Map();
|
|
77
|
+
for (const review of snapshot?.reviews ?? []) {
|
|
78
|
+
const key = pullRequestKey(review);
|
|
79
|
+
const reviews = reviewsByPullRequest.get(key);
|
|
80
|
+
if (reviews === undefined)
|
|
81
|
+
reviewsByPullRequest.set(key, [review]);
|
|
82
|
+
else
|
|
83
|
+
reviews.push(review);
|
|
84
|
+
}
|
|
85
|
+
const groups = configuration.repositories.map(({ coordinate }) => {
|
|
86
|
+
const repository = storedByCoordinate.get(coordinate);
|
|
87
|
+
const lines = [coordinate, `Last observed: ${repository?.lastPollAt === null || repository === undefined ? "never" : timestamp(repository.lastPollAt)}`];
|
|
88
|
+
if (repository?.lastPollError !== null && repository?.lastPollError !== undefined) {
|
|
89
|
+
lines.push(`Last poll error: ${terminalSafe(repository.lastPollError)}`);
|
|
90
|
+
}
|
|
91
|
+
if (repository === undefined || repository.startPrNumber === null || repository.initializedAt === null) {
|
|
92
|
+
lines.push("Not initialized.");
|
|
93
|
+
return lines.join("\n");
|
|
94
|
+
}
|
|
95
|
+
const pullRequests = (snapshot?.pullRequests ?? []).filter((pullRequest) => repositoryKey(pullRequest) === repositoryKey(repository) && pullRequest.state === "open" && pullRequest.number > repository.startPrNumber)
|
|
96
|
+
.sort((first, second) => first.number - second.number);
|
|
97
|
+
if (pullRequests.length === 0)
|
|
98
|
+
lines.push("No tracked ongoing PRs.");
|
|
99
|
+
else
|
|
100
|
+
lines.push("", ...renderRows(pullRequests.map((pullRequest) => rowFor(pullRequest, reviewsByPullRequest.get(pullRequestKey(pullRequest)) ?? []))));
|
|
101
|
+
return lines.join("\n");
|
|
102
|
+
});
|
|
103
|
+
return `Local persisted snapshot (Running means recorded state, not proof of process liveness).\n\n${groups.join("\n\n")}\n`;
|
|
104
|
+
};
|
|
105
|
+
export const listReviews = async (paths) => {
|
|
106
|
+
let source;
|
|
107
|
+
try {
|
|
108
|
+
source = await readFile(paths.configFile, "utf8");
|
|
109
|
+
}
|
|
110
|
+
catch (cause) {
|
|
111
|
+
throw new Error(`Cannot read configuration file ${paths.configFile}.`, { cause });
|
|
112
|
+
}
|
|
113
|
+
let configuration;
|
|
114
|
+
try {
|
|
115
|
+
configuration = parseConfiguration(source, paths);
|
|
116
|
+
}
|
|
117
|
+
catch (cause) {
|
|
118
|
+
throw new Error(`Invalid configuration file ${paths.configFile}: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
119
|
+
}
|
|
120
|
+
return formatReviewListing(configuration, readReviewListingSnapshot(paths.databaseFile));
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=review-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-list.js","sourceRoot":"","sources":["../src/review-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createCopilotRunner } from "./copilot.js";
|
|
2
|
+
import { runCoordinator } from "./coordinator.js";
|
|
3
|
+
import { createGitManager } from "./git.js";
|
|
4
|
+
import { createGitHubClient } from "./github.js";
|
|
5
|
+
import { createProcessSupervisor } from "./processes.js";
|
|
6
|
+
import { openStore } from "./store.js";
|
|
7
|
+
import type { Configuration } from "./config.js";
|
|
8
|
+
import type { CoordinatorEvent } from "./coordinator.js";
|
|
9
|
+
import type { RuntimePaths } from "./paths.js";
|
|
10
|
+
export { acquireInstanceLock } from "./instance-lock.js";
|
|
11
|
+
export type RuntimeDependencies = {
|
|
12
|
+
openStore: typeof openStore;
|
|
13
|
+
createClient: typeof createGitHubClient;
|
|
14
|
+
createGit: typeof createGitManager;
|
|
15
|
+
createRunner: typeof createCopilotRunner;
|
|
16
|
+
createProcesses: typeof createProcessSupervisor;
|
|
17
|
+
coordinate: typeof runCoordinator;
|
|
18
|
+
};
|
|
19
|
+
export declare const formatCoordinatorEvent: (event: CoordinatorEvent) => string;
|
|
20
|
+
export declare const runForegroundReview: (configuration: Configuration, paths: RuntimePaths, options?: {
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
log?: (event: CoordinatorEvent) => void;
|
|
23
|
+
dependencies?: RuntimeDependencies;
|
|
24
|
+
}) => Promise<void>;
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import { formatError } from "./diagnostics.js";
|
|
3
|
+
import { createCopilotRunner } from "./copilot.js";
|
|
4
|
+
import { runCoordinator } from "./coordinator.js";
|
|
5
|
+
import { createGitManager } from "./git.js";
|
|
6
|
+
import { createGitHubClient } from "./github.js";
|
|
7
|
+
import { acquireInstanceLock } from "./instance-lock.js";
|
|
8
|
+
import { createProcessSupervisor } from "./processes.js";
|
|
9
|
+
import { openStore } from "./store.js";
|
|
10
|
+
export { acquireInstanceLock } from "./instance-lock.js";
|
|
11
|
+
const defaultDependencies = {
|
|
12
|
+
openStore, createClient: createGitHubClient, createGit: createGitManager,
|
|
13
|
+
createRunner: createCopilotRunner, createProcesses: createProcessSupervisor, coordinate: runCoordinator,
|
|
14
|
+
};
|
|
15
|
+
export const formatCoordinatorEvent = (event) => {
|
|
16
|
+
const identity = [event.repository, event.number === undefined ? undefined : `PR ${event.number}`,
|
|
17
|
+
event.reviewId === undefined ? undefined : `review=${event.reviewId}`,
|
|
18
|
+
event.revision === undefined ? undefined : `revision=${event.revision}`,
|
|
19
|
+
event.attempt === undefined ? undefined : `attempt=${event.attempt}`].filter((value) => value !== undefined).join(" ");
|
|
20
|
+
return `${identity === "" ? "" : `${identity} `}${event.phase}: ${event.message}${event.retryAt === undefined ? "" : ` retryAt=${new Date(event.retryAt).toISOString()}`}${event.error === undefined ? "" : `\n${formatError(event.error)}`}`;
|
|
21
|
+
};
|
|
22
|
+
export const runForegroundReview = async (configuration, paths, options = {}) => {
|
|
23
|
+
const dependencies = options.dependencies === undefined ? defaultDependencies : options.dependencies;
|
|
24
|
+
const log = options.log === undefined ? (event) => { process.stderr.write(`${formatCoordinatorEvent(event)}\n`); } : options.log;
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const stop = () => { controller.abort(); };
|
|
27
|
+
const signals = process.platform === "win32" ? ["SIGINT", "SIGTERM", "SIGBREAK"] : ["SIGINT", "SIGTERM"];
|
|
28
|
+
if (options.signal === undefined)
|
|
29
|
+
for (const signal of signals)
|
|
30
|
+
process.on(signal, stop);
|
|
31
|
+
const signal = options.signal === undefined ? controller.signal : options.signal;
|
|
32
|
+
let lock;
|
|
33
|
+
let store;
|
|
34
|
+
let safe = true;
|
|
35
|
+
let failure;
|
|
36
|
+
try {
|
|
37
|
+
await mkdir(paths.stateDirectory, { recursive: true });
|
|
38
|
+
lock = await acquireInstanceLock(paths.lockFile);
|
|
39
|
+
safe = lock.previousProcessesExcluded;
|
|
40
|
+
signal.throwIfAborted();
|
|
41
|
+
store = dependencies.openStore(paths.databaseFile);
|
|
42
|
+
const client = dependencies.createClient();
|
|
43
|
+
const git = dependencies.createGit({ temporaryDirectory: paths.temporaryDirectory, client });
|
|
44
|
+
const processes = dependencies.createProcesses(lock.previousProcessesExcluded ? { previousProcessesExcluded: true } : {});
|
|
45
|
+
const runner = dependencies.createRunner({ paths, processOwner: lock.owner, timeoutMs: configuration.agentTimeoutMs });
|
|
46
|
+
log({ level: "info", phase: "startup", message: `Foreground review started; state=${paths.stateDirectory}.` });
|
|
47
|
+
safe = false;
|
|
48
|
+
const result = await dependencies.coordinate({ configuration, store, client, git, runner, processes, signal, log });
|
|
49
|
+
safe = result.safeToReleaseLock && processes.safeToReleaseLock;
|
|
50
|
+
if (!safe)
|
|
51
|
+
throw new Error(`Review execution could not be confirmed stopped. Instance lock ${paths.lockFile} and interrupted state were retained; confirm the CLI and all review agents have stopped before manually removing the lock.`);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
failure = error;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
store?.close();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
safe = false;
|
|
61
|
+
failure = failure === undefined ? error : new AggregateError([failure, error], "Review execution and database shutdown failed.");
|
|
62
|
+
}
|
|
63
|
+
if (lock !== undefined && safe) {
|
|
64
|
+
try {
|
|
65
|
+
await lock.release();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
failure = failure === undefined ? error : new AggregateError([failure, error], "Review execution and instance-lock release failed.");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (options.signal === undefined)
|
|
72
|
+
for (const signal of signals)
|
|
73
|
+
process.off(signal, stop);
|
|
74
|
+
if (failure !== undefined)
|
|
75
|
+
throw failure;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export type RepositoryIdentity = {
|
|
2
|
+
host: string;
|
|
3
|
+
githubId: string;
|
|
4
|
+
};
|
|
5
|
+
export type PullRequestIdentity = RepositoryIdentity & {
|
|
6
|
+
number: number;
|
|
7
|
+
};
|
|
8
|
+
export type RepositoryState = RepositoryIdentity & {
|
|
9
|
+
remote: string;
|
|
10
|
+
localPath: string;
|
|
11
|
+
startPrNumber: number | null;
|
|
12
|
+
initializedAt: number | null;
|
|
13
|
+
lastPollAt: number | null;
|
|
14
|
+
lastPollError: string | null;
|
|
15
|
+
};
|
|
16
|
+
export type PullRequestObservation = {
|
|
17
|
+
number: number;
|
|
18
|
+
state: "open" | "closed" | "merged";
|
|
19
|
+
draft: boolean;
|
|
20
|
+
headSha: string;
|
|
21
|
+
baseRef: string;
|
|
22
|
+
baseSha: string;
|
|
23
|
+
};
|
|
24
|
+
export type RepositoryPollUpdate = {
|
|
25
|
+
kind: "initialize";
|
|
26
|
+
startPrNumber: number;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "snapshot";
|
|
29
|
+
observations: readonly PullRequestObservation[];
|
|
30
|
+
};
|
|
31
|
+
export type PullRequestState = PullRequestIdentity & Omit<PullRequestObservation, "number"> & {
|
|
32
|
+
desiredRevision: number;
|
|
33
|
+
completedRevision: number;
|
|
34
|
+
sessionId: string | null;
|
|
35
|
+
sessionEstablished: boolean;
|
|
36
|
+
worktreePath: string | null;
|
|
37
|
+
cleanupPending: boolean;
|
|
38
|
+
cleanupError: string | null;
|
|
39
|
+
observedAt: number;
|
|
40
|
+
};
|
|
41
|
+
export type ReviewStatus = "preparing" | "running" | "retry_wait" | "completed" | "failed" | "interrupted" | "superseded";
|
|
42
|
+
export type ReviewState = PullRequestIdentity & {
|
|
43
|
+
id: string;
|
|
44
|
+
revision: number;
|
|
45
|
+
headSha: string;
|
|
46
|
+
baseRef: string;
|
|
47
|
+
baseSha: string | null;
|
|
48
|
+
status: ReviewStatus;
|
|
49
|
+
attemptCount: number;
|
|
50
|
+
maxAttempts: number;
|
|
51
|
+
retryAt: number | null;
|
|
52
|
+
processOwner: string | null;
|
|
53
|
+
processId: number | null;
|
|
54
|
+
processIdentity: string | null;
|
|
55
|
+
stdoutLogPath: string | null;
|
|
56
|
+
stderrLogPath: string | null;
|
|
57
|
+
lastError: string | null;
|
|
58
|
+
createdAt: number;
|
|
59
|
+
updatedAt: number;
|
|
60
|
+
};
|
|
61
|
+
export type ReviewCandidate = {
|
|
62
|
+
pullRequest: PullRequestState;
|
|
63
|
+
review: ReviewState | null;
|
|
64
|
+
};
|
|
65
|
+
export type ReviewListingSnapshot = {
|
|
66
|
+
repositories: RepositoryState[];
|
|
67
|
+
pullRequests: PullRequestState[];
|
|
68
|
+
reviews: ReviewState[];
|
|
69
|
+
};
|
|
70
|
+
export type AttemptIdentity = {
|
|
71
|
+
reviewId: string;
|
|
72
|
+
attempt: number;
|
|
73
|
+
};
|
|
74
|
+
export type OperationsStopped = {
|
|
75
|
+
operationsStopped: true;
|
|
76
|
+
};
|
|
77
|
+
export type ProcessesExcluded = {
|
|
78
|
+
processesExcluded: true;
|
|
79
|
+
};
|
|
80
|
+
export declare const readReviewListingSnapshot: (databaseFile: string) => ReviewListingSnapshot | null;
|
|
81
|
+
export declare const openStore: (databaseFile: string, options?: {
|
|
82
|
+
busyTimeoutMs?: number;
|
|
83
|
+
}) => {
|
|
84
|
+
close: () => void;
|
|
85
|
+
getRepository: (identity: RepositoryIdentity) => RepositoryState | null;
|
|
86
|
+
getPullRequest: (identity: PullRequestIdentity) => PullRequestState | null;
|
|
87
|
+
getReview: (reviewId: string) => ReviewState | null;
|
|
88
|
+
listRepositories: () => RepositoryState[];
|
|
89
|
+
listPullRequests: (identity: RepositoryIdentity) => PullRequestState[];
|
|
90
|
+
listActiveReviews: () => ReviewState[];
|
|
91
|
+
listCleanupCandidates: () => PullRequestState[];
|
|
92
|
+
listReviews: (identity: PullRequestIdentity) => ReviewState[];
|
|
93
|
+
registerRepository: (input: RepositoryIdentity & {
|
|
94
|
+
remote: string;
|
|
95
|
+
localPath: string;
|
|
96
|
+
}) => RepositoryState;
|
|
97
|
+
initializeRepository: (identity: RepositoryIdentity, startPrNumber: number, now: number) => RepositoryState;
|
|
98
|
+
recordPollSuccess: (identity: RepositoryIdentity, now: number) => RepositoryState;
|
|
99
|
+
recordPollError: (identity: RepositoryIdentity, error: string) => RepositoryState;
|
|
100
|
+
observePullRequest: (identity: RepositoryIdentity, observation: PullRequestObservation, now: number) => PullRequestState | null;
|
|
101
|
+
listCandidates: (now: number) => ReviewCandidate[];
|
|
102
|
+
reserveReview: (identity: PullRequestIdentity, input: {
|
|
103
|
+
reviewId: string;
|
|
104
|
+
sessionId: string;
|
|
105
|
+
maxAttempts: number;
|
|
106
|
+
}, now: number) => ReviewState | null;
|
|
107
|
+
pinReviewBase: (reviewId: string, baseSha: string, now: number) => ReviewState;
|
|
108
|
+
startAttempt: (reviewId: string, input: {
|
|
109
|
+
processOwner: string;
|
|
110
|
+
stdoutLogPath: string;
|
|
111
|
+
stderrLogPath: string;
|
|
112
|
+
}, now: number) => ReviewState;
|
|
113
|
+
recordProcess: (identity: AttemptIdentity, input: {
|
|
114
|
+
pid: number;
|
|
115
|
+
identity: string;
|
|
116
|
+
}) => ReviewState;
|
|
117
|
+
markSessionEstablished: (identity: PullRequestIdentity) => PullRequestState;
|
|
118
|
+
completeReview: (identity: AttemptIdentity, proof: ProcessesExcluded, now: number) => ReviewState;
|
|
119
|
+
retryReview: (identity: AttemptIdentity, proof: ProcessesExcluded, input: {
|
|
120
|
+
error: string;
|
|
121
|
+
retryAt: number;
|
|
122
|
+
}, now: number) => ReviewState;
|
|
123
|
+
deferPreparation: (reviewId: string, proof: OperationsStopped, input: {
|
|
124
|
+
error: string;
|
|
125
|
+
retryAt: number;
|
|
126
|
+
}, now: number) => ReviewState;
|
|
127
|
+
markInterrupted: (reviewId: string, error: string, now: number) => ReviewState;
|
|
128
|
+
resolveInterrupted: (reviewId: string, proof: ProcessesExcluded & OperationsStopped, retryAt: number, now: number) => ReviewState;
|
|
129
|
+
supersedeReview: (reviewId: string, proof: OperationsStopped, now: number) => ReviewState;
|
|
130
|
+
registerWorktree: (identity: PullRequestIdentity, worktreePath: string) => PullRequestState;
|
|
131
|
+
recordCleanupError: (identity: PullRequestIdentity, worktreePath: string, error: string) => PullRequestState;
|
|
132
|
+
cancelCleanup: (identity: PullRequestIdentity, worktreePath: string, proof: OperationsStopped & ProcessesExcluded) => PullRequestState;
|
|
133
|
+
completeCleanup: (identity: PullRequestIdentity, worktreePath: string, proof: OperationsStopped & ProcessesExcluded) => PullRequestState;
|
|
134
|
+
applyRepositoryPoll: (identity: RepositoryIdentity, update: RepositoryPollUpdate, now: number) => RepositoryState;
|
|
135
|
+
};
|
|
136
|
+
export type Store = ReturnType<typeof openStore>;
|