@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.
Files changed (47) hide show
  1. package/dist/cli.d.ts +17 -0
  2. package/dist/cli.js +164 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/config.d.ts +32 -0
  5. package/dist/config.js +263 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/coordinator.d.ts +39 -0
  8. package/dist/coordinator.js +390 -0
  9. package/dist/coordinator.js.map +1 -0
  10. package/dist/copilot.d.ts +44 -0
  11. package/dist/copilot.js +263 -0
  12. package/dist/copilot.js.map +1 -0
  13. package/dist/diagnostics.d.ts +1 -0
  14. package/dist/diagnostics.js +16 -0
  15. package/dist/diagnostics.js.map +1 -0
  16. package/dist/git.d.ts +41 -0
  17. package/dist/git.js +539 -0
  18. package/dist/git.js.map +1 -0
  19. package/dist/github.d.ts +70 -0
  20. package/dist/github.js +675 -0
  21. package/dist/github.js.map +1 -0
  22. package/dist/instance-lock.d.ts +5 -0
  23. package/dist/instance-lock.js +115 -0
  24. package/dist/instance-lock.js.map +1 -0
  25. package/dist/main.d.ts +2 -0
  26. package/dist/main.js +12 -0
  27. package/dist/main.js.map +1 -0
  28. package/dist/paths.d.ts +33 -0
  29. package/dist/paths.js +155 -0
  30. package/dist/paths.js.map +1 -0
  31. package/dist/processes.d.ts +23 -0
  32. package/dist/processes.js +182 -0
  33. package/dist/processes.js.map +1 -0
  34. package/dist/repositories.d.ts +15 -0
  35. package/dist/repositories.js +159 -0
  36. package/dist/repositories.js.map +1 -0
  37. package/dist/review-list.d.ts +5 -0
  38. package/dist/review-list.js +122 -0
  39. package/dist/review-list.js.map +1 -0
  40. package/dist/runtime.d.ts +24 -0
  41. package/dist/runtime.js +77 -0
  42. package/dist/runtime.js.map +1 -0
  43. package/dist/store.d.ts +136 -0
  44. package/dist/store.js +579 -0
  45. package/dist/store.js.map +1 -0
  46. package/package.json +40 -4
  47. 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>;
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAUzD,MAAM,mBAAmB,GAAwB;IAC/C,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,gBAAgB;IACxE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,uBAAuB,EAAE,UAAU,EAAE,cAAc;CACxG,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAuB,EAAU,EAAE;IACxE,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE;QAC/F,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,QAAQ,EAAE;QACrE,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE;QACvE,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzH,OAAO,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AAChP,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,aAA4B,EAC5B,KAAmB,EACnB,OAAO,GAA0G,EAAE,EACpG,EAAE;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACrG,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAuB,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACnJ,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,GAAS,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAqB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3H,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjF,IAAI,IAAiE,CAAC;IACtE,IAAI,KAA+C,CAAC;IACpD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACtC,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;QACvH,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,oCAAoC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QAC/G,IAAI,GAAG,KAAK,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpH,IAAI,GAAG,MAAM,CAAC,iBAAiB,IAAI,SAAS,CAAC,iBAAiB,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,KAAK,CAAC,QAAQ,6HAA6H,CAAC,CAAC;IAC5O,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,GAAG,KAAK,CAAC;IAAC,CAAC;IACpC,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,GAAG,KAAK,CAAC;QAAC,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,gDAAgD,CAAC,CAAC;IAAC,CAAC;IACzL,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,oDAAoD,CAAC,CAAC;QAAC,CAAC;IACvL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1F,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC;AAC3C,CAAC,CAAC"}
@@ -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>;