@on-par/factory-core 0.9.28-next.8 → 0.9.28
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/blockers/declared-prerequisites.d.ts +4 -1
- package/dist/blockers/declared-prerequisites.d.ts.map +1 -1
- package/dist/blockers/declared-prerequisites.js +10 -5
- package/dist/blockers/declared-prerequisites.js.map +1 -1
- package/dist/checkers/app-smoke.d.ts.map +1 -1
- package/dist/checkers/app-smoke.js +4 -1
- package/dist/checkers/app-smoke.js.map +1 -1
- package/dist/checkers/evidence-plan.d.ts +2 -0
- package/dist/checkers/evidence-plan.d.ts.map +1 -1
- package/dist/checkers/evidence-plan.js +13 -6
- package/dist/checkers/evidence-plan.js.map +1 -1
- package/dist/checkers/evidence-selector.d.ts +2 -0
- package/dist/checkers/evidence-selector.d.ts.map +1 -1
- package/dist/checkers/evidence-selector.js +13 -10
- package/dist/checkers/evidence-selector.js.map +1 -1
- package/dist/checkers/evidence-workspace.d.ts +21 -0
- package/dist/checkers/evidence-workspace.d.ts.map +1 -0
- package/dist/checkers/evidence-workspace.js +118 -0
- package/dist/checkers/evidence-workspace.js.map +1 -0
- package/dist/checkers/index.js +1 -1
- package/dist/checkers/index.js.map +1 -1
- package/dist/checkers/internal-exports.d.ts +3 -1
- package/dist/checkers/internal-exports.d.ts.map +1 -1
- package/dist/checkers/internal-exports.js +3 -1
- package/dist/checkers/internal-exports.js.map +1 -1
- package/dist/checkers/resolve-commands.d.ts.map +1 -1
- package/dist/checkers/resolve-commands.js +5 -1
- package/dist/checkers/resolve-commands.js.map +1 -1
- package/dist/config/example.d.ts.map +1 -1
- package/dist/config/example.js +5 -2
- package/dist/config/example.js.map +1 -1
- package/dist/config/index.d.ts +6 -32
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +17 -32
- package/dist/config/index.js.map +1 -1
- package/dist/config/merge-policy.d.ts +36 -0
- package/dist/config/merge-policy.d.ts.map +1 -0
- package/dist/config/merge-policy.js +31 -0
- package/dist/config/merge-policy.js.map +1 -0
- package/dist/config/repo.js +1 -1
- package/dist/config/repo.js.map +1 -1
- package/dist/config/run-config-env.d.ts +5 -0
- package/dist/config/run-config-env.d.ts.map +1 -0
- package/dist/config/run-config-env.js +11 -0
- package/dist/config/run-config-env.js.map +1 -0
- package/dist/config/run-config-ladder.d.ts +18 -0
- package/dist/config/run-config-ladder.d.ts.map +1 -0
- package/dist/config/run-config-ladder.js +110 -0
- package/dist/config/run-config-ladder.js.map +1 -0
- package/dist/config/run-config-source.d.ts +6 -6
- package/dist/config/run-config-source.d.ts.map +1 -1
- package/dist/config/run-config-source.js +16 -15
- package/dist/config/run-config-source.js.map +1 -1
- package/dist/constitutions/index.d.ts.map +1 -1
- package/dist/constitutions/index.js +8 -0
- package/dist/constitutions/index.js.map +1 -1
- package/dist/environment/process-groups.d.ts +5 -0
- package/dist/environment/process-groups.d.ts.map +1 -1
- package/dist/environment/process-groups.js +19 -0
- package/dist/environment/process-groups.js.map +1 -1
- package/dist/events/config-traits.d.ts +1 -1
- package/dist/events/config-traits.d.ts.map +1 -1
- package/dist/events/config-traits.js +2 -0
- package/dist/events/config-traits.js.map +1 -1
- package/dist/events/queue-traits.d.ts +1 -1
- package/dist/events/queue-traits.d.ts.map +1 -1
- package/dist/events/queue-traits.js +8 -1
- package/dist/events/queue-traits.js.map +1 -1
- package/dist/events/rotation.js +1 -1
- package/dist/events/rotation.js.map +1 -1
- package/dist/fakes/octokit.d.ts +13 -1
- package/dist/fakes/octokit.d.ts.map +1 -1
- package/dist/fakes/octokit.js +13 -0
- package/dist/fakes/octokit.js.map +1 -1
- package/dist/filing/redact.d.ts +1 -0
- package/dist/filing/redact.d.ts.map +1 -1
- package/dist/filing/redact.js +1 -1
- package/dist/filing/redact.js.map +1 -1
- package/dist/harness/opencode-version.d.ts +2 -2
- package/dist/harness/opencode-version.d.ts.map +1 -1
- package/dist/harness/opencode-version.js +3 -3
- package/dist/harness/opencode-version.js.map +1 -1
- package/dist/internal.d.ts +13 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +14 -0
- package/dist/internal.js.map +1 -1
- package/dist/kpis/index.d.ts.map +1 -1
- package/dist/kpis/index.js +2 -1
- package/dist/kpis/index.js.map +1 -1
- package/dist/kpis/park.d.ts.map +1 -1
- package/dist/kpis/park.js +2 -1
- package/dist/kpis/park.js.map +1 -1
- package/dist/kpis/phase.d.ts.map +1 -1
- package/dist/kpis/phase.js +1 -0
- package/dist/kpis/phase.js.map +1 -1
- package/dist/land/changelog.d.ts +8 -0
- package/dist/land/changelog.d.ts.map +1 -0
- package/dist/land/changelog.js +90 -0
- package/dist/land/changelog.js.map +1 -0
- package/dist/land/sync.d.ts.map +1 -1
- package/dist/land/sync.js +93 -32
- package/dist/land/sync.js.map +1 -1
- package/dist/phases/check-evidence.d.ts.map +1 -1
- package/dist/phases/check-evidence.js +5 -1
- package/dist/phases/check-evidence.js.map +1 -1
- package/dist/phases/ship-approval.d.ts +17 -0
- package/dist/phases/ship-approval.d.ts.map +1 -0
- package/dist/phases/ship-approval.js +21 -0
- package/dist/phases/ship-approval.js.map +1 -0
- package/dist/phases/ship-branch-push.d.ts +17 -0
- package/dist/phases/ship-branch-push.d.ts.map +1 -0
- package/dist/phases/ship-branch-push.js +77 -0
- package/dist/phases/ship-branch-push.js.map +1 -0
- package/dist/phases/ship-ci-watch.d.ts +25 -0
- package/dist/phases/ship-ci-watch.d.ts.map +1 -0
- package/dist/phases/ship-ci-watch.js +53 -0
- package/dist/phases/ship-ci-watch.js.map +1 -0
- package/dist/phases/ship-evidence-comment.d.ts +14 -0
- package/dist/phases/ship-evidence-comment.d.ts.map +1 -0
- package/dist/phases/ship-evidence-comment.js +31 -0
- package/dist/phases/ship-evidence-comment.js.map +1 -0
- package/dist/phases/ship-existing-pr.d.ts +11 -0
- package/dist/phases/ship-existing-pr.d.ts.map +1 -0
- package/dist/phases/ship-existing-pr.js +36 -0
- package/dist/phases/ship-existing-pr.js.map +1 -0
- package/dist/phases/ship-finish.d.ts +15 -0
- package/dist/phases/ship-finish.d.ts.map +1 -0
- package/dist/phases/ship-finish.js +69 -0
- package/dist/phases/ship-finish.js.map +1 -0
- package/dist/phases/ship-git-detail.d.ts +31 -0
- package/dist/phases/ship-git-detail.d.ts.map +1 -0
- package/dist/phases/ship-git-detail.js +71 -0
- package/dist/phases/ship-git-detail.js.map +1 -0
- package/dist/phases/ship-git-remote.d.ts +51 -0
- package/dist/phases/ship-git-remote.d.ts.map +1 -0
- package/dist/phases/ship-git-remote.js +70 -0
- package/dist/phases/ship-git-remote.js.map +1 -0
- package/dist/phases/ship-git.d.ts +4 -79
- package/dist/phases/ship-git.d.ts.map +1 -1
- package/dist/phases/ship-git.js +2 -135
- package/dist/phases/ship-git.js.map +1 -1
- package/dist/phases/ship-main-sync.d.ts +18 -0
- package/dist/phases/ship-main-sync.d.ts.map +1 -0
- package/dist/phases/ship-main-sync.js +34 -0
- package/dist/phases/ship-main-sync.js.map +1 -0
- package/dist/phases/ship-open-pr.d.ts +24 -0
- package/dist/phases/ship-open-pr.d.ts.map +1 -0
- package/dist/phases/ship-open-pr.js +75 -0
- package/dist/phases/ship-open-pr.js.map +1 -0
- package/dist/phases/ship-options.d.ts +81 -0
- package/dist/phases/ship-options.d.ts.map +1 -0
- package/dist/phases/ship-options.js +4 -0
- package/dist/phases/ship-options.js.map +1 -0
- package/dist/phases/ship-recovery.d.ts +16 -0
- package/dist/phases/ship-recovery.d.ts.map +1 -0
- package/dist/phases/ship-recovery.js +81 -0
- package/dist/phases/ship-recovery.js.map +1 -0
- package/dist/phases/ship-reentry.d.ts +20 -0
- package/dist/phases/ship-reentry.d.ts.map +1 -0
- package/dist/phases/ship-reentry.js +47 -0
- package/dist/phases/ship-reentry.js.map +1 -0
- package/dist/phases/ship.d.ts +4 -76
- package/dist/phases/ship.d.ts.map +1 -1
- package/dist/phases/ship.js +67 -425
- package/dist/phases/ship.js.map +1 -1
- package/dist/phases/stack-order.d.ts +9 -0
- package/dist/phases/stack-order.d.ts.map +1 -1
- package/dist/phases/stack-order.js +13 -0
- package/dist/phases/stack-order.js.map +1 -1
- package/dist/queue/comment-rework-trigger.d.ts +24 -0
- package/dist/queue/comment-rework-trigger.d.ts.map +1 -0
- package/dist/queue/comment-rework-trigger.js +128 -0
- package/dist/queue/comment-rework-trigger.js.map +1 -0
- package/dist/queue/github-queue.d.ts +4 -2
- package/dist/queue/github-queue.d.ts.map +1 -1
- package/dist/queue/github-queue.js.map +1 -1
- package/dist/queue/internal-exports.d.ts +3 -0
- package/dist/queue/internal-exports.d.ts.map +1 -1
- package/dist/queue/internal-exports.js +2 -0
- package/dist/queue/internal-exports.js.map +1 -1
- package/dist/queue/lane-discovery-interval.d.ts +6 -0
- package/dist/queue/lane-discovery-interval.d.ts.map +1 -0
- package/dist/queue/lane-discovery-interval.js +9 -0
- package/dist/queue/lane-discovery-interval.js.map +1 -0
- package/dist/queue/linear-queue-backend.d.ts +17 -0
- package/dist/queue/linear-queue-backend.d.ts.map +1 -0
- package/dist/queue/linear-queue-backend.js +42 -0
- package/dist/queue/linear-queue-backend.js.map +1 -0
- package/dist/queue/linear-queue.d.ts +4 -2
- package/dist/queue/linear-queue.d.ts.map +1 -1
- package/dist/queue/linear-queue.js +79 -2
- package/dist/queue/linear-queue.js.map +1 -1
- package/dist/queue/prerequisite-stack.d.ts +47 -0
- package/dist/queue/prerequisite-stack.d.ts.map +1 -0
- package/dist/queue/prerequisite-stack.js +41 -0
- package/dist/queue/prerequisite-stack.js.map +1 -0
- package/dist/queue/queue-backend.d.ts +11 -5
- package/dist/queue/queue-backend.d.ts.map +1 -1
- package/dist/queue/queue-backend.js +8 -3
- package/dist/queue/queue-backend.js.map +1 -1
- package/dist/queue/review-rework-trigger.d.ts +7 -2
- package/dist/queue/review-rework-trigger.d.ts.map +1 -1
- package/dist/queue/review-rework-trigger.js +16 -8
- package/dist/queue/review-rework-trigger.js.map +1 -1
- package/dist/reports/pr-body.d.ts +5 -2
- package/dist/reports/pr-body.d.ts.map +1 -1
- package/dist/reports/pr-body.js +21 -10
- package/dist/reports/pr-body.js.map +1 -1
- package/dist/run/ci-rework-loop.d.ts.map +1 -1
- package/dist/run/ci-rework-loop.js +5 -1
- package/dist/run/ci-rework-loop.js.map +1 -1
- package/dist/run/feedback-github.d.ts +50 -0
- package/dist/run/feedback-github.d.ts.map +1 -0
- package/dist/run/feedback-github.js +87 -0
- package/dist/run/feedback-github.js.map +1 -0
- package/dist/run/feedback-round-hooks.d.ts +19 -0
- package/dist/run/feedback-round-hooks.d.ts.map +1 -0
- package/dist/run/feedback-round-hooks.js +106 -0
- package/dist/run/feedback-round-hooks.js.map +1 -0
- package/dist/run/feedback-round.d.ts +97 -0
- package/dist/run/feedback-round.d.ts.map +1 -0
- package/dist/run/feedback-round.js +275 -0
- package/dist/run/feedback-round.js.map +1 -0
- package/dist/run/linear-run.d.ts +23 -0
- package/dist/run/linear-run.d.ts.map +1 -0
- package/dist/run/linear-run.js +18 -0
- package/dist/run/linear-run.js.map +1 -0
- package/dist/run/park-comment.d.ts +9 -0
- package/dist/run/park-comment.d.ts.map +1 -1
- package/dist/run/park-comment.js +12 -0
- package/dist/run/park-comment.js.map +1 -1
- package/dist/run/ports.d.ts +10 -0
- package/dist/run/ports.d.ts.map +1 -1
- package/dist/run/ports.js +12 -0
- package/dist/run/ports.js.map +1 -1
- package/dist/run/pr-run-state.d.ts +99 -0
- package/dist/run/pr-run-state.d.ts.map +1 -0
- package/dist/run/pr-run-state.js +235 -0
- package/dist/run/pr-run-state.js.map +1 -0
- package/dist/run/prerequisite-restack.d.ts +39 -0
- package/dist/run/prerequisite-restack.d.ts.map +1 -0
- package/dist/run/prerequisite-restack.js +79 -0
- package/dist/run/prerequisite-restack.js.map +1 -0
- package/dist/run/review-rework-cap.d.ts +3 -1
- package/dist/run/review-rework-cap.d.ts.map +1 -1
- package/dist/run/review-rework-cap.js +2 -1
- package/dist/run/review-rework-cap.js.map +1 -1
- package/dist/run/review-rework.d.ts +17 -2
- package/dist/run/review-rework.d.ts.map +1 -1
- package/dist/run/review-rework.js +99 -33
- package/dist/run/review-rework.js.map +1 -1
- package/dist/run/run-issue.d.ts +5 -1
- package/dist/run/run-issue.d.ts.map +1 -1
- package/dist/run/run-issue.js +35 -28
- package/dist/run/run-issue.js.map +1 -1
- package/dist/run/stack-rebase.d.ts +28 -0
- package/dist/run/stack-rebase.d.ts.map +1 -0
- package/dist/run/stack-rebase.js +79 -0
- package/dist/run/stack-rebase.js.map +1 -0
- package/dist/run/stack-restack.d.ts.map +1 -1
- package/dist/run/stack-restack.js +21 -49
- package/dist/run/stack-restack.js.map +1 -1
- package/dist/utils/command-runner.d.ts.map +1 -1
- package/dist/utils/command-runner.js +4 -1
- package/dist/utils/command-runner.js.map +1 -1
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +4 -1
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/in-place.d.ts +24 -0
- package/dist/utils/in-place.d.ts.map +1 -0
- package/dist/utils/in-place.js +105 -0
- package/dist/utils/in-place.js.map +1 -0
- package/dist/work/internal-exports.d.ts +3 -0
- package/dist/work/internal-exports.d.ts.map +1 -0
- package/dist/work/internal-exports.js +4 -0
- package/dist/work/internal-exports.js.map +1 -0
- package/dist/work/ticket-writeback.d.ts +22 -0
- package/dist/work/ticket-writeback.d.ts.map +1 -0
- package/dist/work/ticket-writeback.js +73 -0
- package/dist/work/ticket-writeback.js.map +1 -0
- package/dist/work/work-key.d.ts +2 -0
- package/dist/work/work-key.d.ts.map +1 -1
- package/dist/work/work-key.js +4 -0
- package/dist/work/work-key.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import type { RunStatus } from '../types/index.js';
|
|
3
|
+
import { type WorkKey } from '../work/work-key.js';
|
|
4
|
+
export declare const PR_RUN_STATE_VERSION = "v1";
|
|
5
|
+
export declare const PR_RUN_STATUSES: readonly ['building', 'awaiting-ci', 'awaiting-review', 'parked'];
|
|
6
|
+
export type PrRunStatus = (typeof PR_RUN_STATUSES)[number];
|
|
7
|
+
export declare const SPEC_SUMMARY_MAX = 1000;
|
|
8
|
+
export declare const MAX_HANDLED_IDS = 200;
|
|
9
|
+
export declare const MAX_ROUNDS = 50;
|
|
10
|
+
export declare const MAX_ENCODED_CHARS = 60000;
|
|
11
|
+
export declare function prRunStateMarker(key: WorkKey): string;
|
|
12
|
+
export interface PrRunRound {
|
|
13
|
+
kind: 'check' | 'review' | 'ci';
|
|
14
|
+
id?: number;
|
|
15
|
+
headSha: string;
|
|
16
|
+
at: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PrRunState {
|
|
19
|
+
version: 1;
|
|
20
|
+
key: WorkKey;
|
|
21
|
+
prNumber: number;
|
|
22
|
+
status: PrRunStatus;
|
|
23
|
+
spec: {
|
|
24
|
+
sha256: string;
|
|
25
|
+
summary: string;
|
|
26
|
+
};
|
|
27
|
+
checkRework: {
|
|
28
|
+
used: number;
|
|
29
|
+
cap: number;
|
|
30
|
+
};
|
|
31
|
+
reviewRework: {
|
|
32
|
+
used: number;
|
|
33
|
+
cap: number;
|
|
34
|
+
};
|
|
35
|
+
handledReviewIds: number[];
|
|
36
|
+
handledCommentIds: number[];
|
|
37
|
+
rounds: PrRunRound[];
|
|
38
|
+
updatedAt: string;
|
|
39
|
+
}
|
|
40
|
+
export type PrRunStateRejectReason = 'untrusted-author' | 'digest-mismatch' | 'key-mismatch' | 'malformed' | 'identity-unavailable';
|
|
41
|
+
export interface PrStateComment {
|
|
42
|
+
id: number;
|
|
43
|
+
authorId: number | undefined;
|
|
44
|
+
body: string;
|
|
45
|
+
}
|
|
46
|
+
type Ignored = {
|
|
47
|
+
commentId: number;
|
|
48
|
+
reason: PrRunStateRejectReason;
|
|
49
|
+
}[];
|
|
50
|
+
export type PrRunStateLoad = {
|
|
51
|
+
status: 'found';
|
|
52
|
+
commentId: number;
|
|
53
|
+
state: PrRunState;
|
|
54
|
+
ignored: Ignored;
|
|
55
|
+
} | {
|
|
56
|
+
status: 'none';
|
|
57
|
+
ignored: Ignored;
|
|
58
|
+
};
|
|
59
|
+
/** Allow-list step: rebuilds the state from known fields only, redacts the summary and bounds every list. */
|
|
60
|
+
export declare function sanitizePrRunState(state: PrRunState, maxIds?: number, maxRounds?: number): PrRunState;
|
|
61
|
+
/** The hidden marker block for a state; halves rounds and handled ids until it fits one comment. */
|
|
62
|
+
export declare function encodePrRunState(state: PrRunState): string;
|
|
63
|
+
export declare function decodePrRunState(body: string, key: WorkKey): {
|
|
64
|
+
ok: true;
|
|
65
|
+
state: PrRunState;
|
|
66
|
+
} | {
|
|
67
|
+
ok: false;
|
|
68
|
+
reason: PrRunStateRejectReason;
|
|
69
|
+
} | null;
|
|
70
|
+
/**
|
|
71
|
+
* Picks the state to trust: only a comment by `selfId` (the authenticated identity) is decoded. Lowest comment id
|
|
72
|
+
* wins, as in `readParkState`. An unknown identity fails closed: every marker comment is ignored.
|
|
73
|
+
*/
|
|
74
|
+
export declare function selectTrustedPrRunState(comments: readonly PrStateComment[], selfId: number | undefined, key: WorkKey): PrRunStateLoad;
|
|
75
|
+
/**
|
|
76
|
+
* Monotonic merge of local and remote state. `used` counters take the max (a restore can only raise them, never
|
|
77
|
+
* reset a cap), `cap` comes from local because local config is current, handled ids and rounds are unioned (rounds
|
|
78
|
+
* deduped by kind+id+headSha, sorted by `at`), and `status`, `spec` and `prNumber` come from the side with the
|
|
79
|
+
* later `updatedAt`. One missing side returns the other.
|
|
80
|
+
*/
|
|
81
|
+
export declare function reconcilePrRunState(local: PrRunState | null, remote: PrRunState | null): PrRunState | null;
|
|
82
|
+
export declare function prRunStatusFor(status: RunStatus, ciPending?: boolean): PrRunStatus;
|
|
83
|
+
export declare function loadPrRunState(deps: {
|
|
84
|
+
octokit: Pick<Octokit, 'rest'>;
|
|
85
|
+
repo: string;
|
|
86
|
+
prNumber: number;
|
|
87
|
+
key: WorkKey;
|
|
88
|
+
}): Promise<PrRunStateLoad>;
|
|
89
|
+
export declare function savePrRunState(deps: {
|
|
90
|
+
octokit: Octokit;
|
|
91
|
+
repo: string;
|
|
92
|
+
prNumber: number;
|
|
93
|
+
state: PrRunState;
|
|
94
|
+
}): Promise<{
|
|
95
|
+
commentId: number;
|
|
96
|
+
created: boolean;
|
|
97
|
+
}>;
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=pr-run-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-run-state.d.ts","sourceRoot":"","sources":["../../src/run/pr-run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
// packages/core/src/run/pr-run-state.ts — a run's resumable state in a factory-owned PR comment (#3909, ADR-0174)
|
|
2
|
+
//
|
|
3
|
+
// A disposable host loses `.factory/state` with the container. The run persists the state it needs to resume
|
|
4
|
+
// (rework counters, handled review ids, status, spec summary) in one hidden comment on its open PR. Anyone can post
|
|
5
|
+
// the marker, so only a comment by the authenticated identity whose sha256 digest matches is trusted.
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { redactSecrets } from '../filing/redact.js';
|
|
9
|
+
import { workKeyFromIssue } from '../work/work-key.js';
|
|
10
|
+
import { upsertMarkerComment } from './park-comment.js';
|
|
11
|
+
export const PR_RUN_STATE_VERSION = 'v1';
|
|
12
|
+
export const PR_RUN_STATUSES = ['building', 'awaiting-ci', 'awaiting-review', 'parked'];
|
|
13
|
+
export const SPEC_SUMMARY_MAX = 1000;
|
|
14
|
+
export const MAX_HANDLED_IDS = 200;
|
|
15
|
+
export const MAX_ROUNDS = 50;
|
|
16
|
+
export const MAX_ENCODED_CHARS = 60_000;
|
|
17
|
+
const MARKER_PREFIX = `<!-- factory:run-state ${PR_RUN_STATE_VERSION} key:`;
|
|
18
|
+
const MARKER_RE = new RegExp(`<!-- factory:run-state ${PR_RUN_STATE_VERSION} key:(\\S+) -->`);
|
|
19
|
+
const DATA_RE = /<!-- factory:run-state-data ([A-Za-z0-9+/=]*) sha256:([0-9a-f]{64}) -->/;
|
|
20
|
+
const PAGE_SIZE = 100;
|
|
21
|
+
export function prRunStateMarker(key) {
|
|
22
|
+
return `${MARKER_PREFIX}${key} -->`;
|
|
23
|
+
}
|
|
24
|
+
const count = z.number().int().nonnegative();
|
|
25
|
+
const sha = z.string().regex(/^[0-9a-f]{7,40}$/);
|
|
26
|
+
const counter = z.object({ used: count, cap: count }).strict();
|
|
27
|
+
const schema = z
|
|
28
|
+
.object({
|
|
29
|
+
version: z.literal(1),
|
|
30
|
+
key: z.string().min(1),
|
|
31
|
+
prNumber: count,
|
|
32
|
+
status: z.enum(PR_RUN_STATUSES),
|
|
33
|
+
spec: z.object({ sha256: z.string().regex(/^[0-9a-f]{64}$|^$/), summary: z.string() }).strict(),
|
|
34
|
+
checkRework: counter,
|
|
35
|
+
reviewRework: counter,
|
|
36
|
+
handledReviewIds: z.array(count),
|
|
37
|
+
handledCommentIds: z.array(count),
|
|
38
|
+
rounds: z.array(z
|
|
39
|
+
.object({ kind: z.enum(['check', 'review', 'ci']), id: count.optional(), headSha: sha, at: z.string() })
|
|
40
|
+
.strict()),
|
|
41
|
+
updatedAt: z.string(),
|
|
42
|
+
})
|
|
43
|
+
.strict();
|
|
44
|
+
const sha256 = (text) => createHash('sha256').update(text).digest('hex');
|
|
45
|
+
const clampCount = (n) => (Number.isFinite(n) ? Math.max(0, Math.trunc(n)) : 0);
|
|
46
|
+
const uniqueSorted = (ids) => [...new Set(ids.map(clampCount))].sort((a, b) => a - b);
|
|
47
|
+
/** Allow-list step: rebuilds the state from known fields only, redacts the summary and bounds every list. */
|
|
48
|
+
export function sanitizePrRunState(state, maxIds = MAX_HANDLED_IDS, maxRounds = MAX_ROUNDS) {
|
|
49
|
+
return {
|
|
50
|
+
version: 1,
|
|
51
|
+
key: state.key,
|
|
52
|
+
prNumber: clampCount(state.prNumber),
|
|
53
|
+
status: state.status,
|
|
54
|
+
spec: { sha256: state.spec.sha256, summary: redactSecrets(state.spec.summary).slice(0, SPEC_SUMMARY_MAX) },
|
|
55
|
+
checkRework: { used: clampCount(state.checkRework.used), cap: clampCount(state.checkRework.cap) },
|
|
56
|
+
reviewRework: { used: clampCount(state.reviewRework.used), cap: clampCount(state.reviewRework.cap) },
|
|
57
|
+
handledReviewIds: uniqueSorted(state.handledReviewIds).slice(-maxIds),
|
|
58
|
+
handledCommentIds: uniqueSorted(state.handledCommentIds).slice(-maxIds),
|
|
59
|
+
rounds: state.rounds.slice(-maxRounds).map((r) => ({
|
|
60
|
+
kind: r.kind,
|
|
61
|
+
...(r.id === undefined ? {} : { id: clampCount(r.id) }),
|
|
62
|
+
headSha: r.headSha,
|
|
63
|
+
at: r.at,
|
|
64
|
+
})),
|
|
65
|
+
updatedAt: state.updatedAt,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function render(state) {
|
|
69
|
+
const json = JSON.stringify(state);
|
|
70
|
+
return [
|
|
71
|
+
prRunStateMarker(state.key),
|
|
72
|
+
'_Factory run state for resuming on another host. Do not edit; edits are ignored._',
|
|
73
|
+
`<!-- factory:run-state-data ${Buffer.from(json).toString('base64')} sha256:${sha256(json)} -->`,
|
|
74
|
+
].join('\n');
|
|
75
|
+
}
|
|
76
|
+
/** The hidden marker block for a state; halves rounds and handled ids until it fits one comment. */
|
|
77
|
+
export function encodePrRunState(state) {
|
|
78
|
+
let ids = MAX_HANDLED_IDS;
|
|
79
|
+
let rounds = MAX_ROUNDS;
|
|
80
|
+
let body = render(sanitizePrRunState(state, ids, rounds));
|
|
81
|
+
while (body.length > MAX_ENCODED_CHARS && (ids > 0 || rounds > 0)) {
|
|
82
|
+
ids = Math.floor(ids / 2);
|
|
83
|
+
rounds = Math.floor(rounds / 2);
|
|
84
|
+
body = render(sanitizePrRunState(state, ids, rounds));
|
|
85
|
+
}
|
|
86
|
+
return body;
|
|
87
|
+
}
|
|
88
|
+
export function decodePrRunState(body, key) {
|
|
89
|
+
const marker = MARKER_RE.exec(body);
|
|
90
|
+
if (!marker)
|
|
91
|
+
return null;
|
|
92
|
+
if (marker[1] !== key)
|
|
93
|
+
return { ok: false, reason: 'key-mismatch' };
|
|
94
|
+
const data = DATA_RE.exec(body);
|
|
95
|
+
if (!data)
|
|
96
|
+
return { ok: false, reason: 'malformed' };
|
|
97
|
+
const json = Buffer.from(data[1] ?? '', 'base64').toString('utf8');
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(json);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return { ok: false, reason: 'malformed' };
|
|
104
|
+
}
|
|
105
|
+
const checked = schema.safeParse(parsed);
|
|
106
|
+
if (!checked.success)
|
|
107
|
+
return { ok: false, reason: 'malformed' };
|
|
108
|
+
if (sha256(json) !== data[2])
|
|
109
|
+
return { ok: false, reason: 'digest-mismatch' };
|
|
110
|
+
if (checked.data.key !== key)
|
|
111
|
+
return { ok: false, reason: 'key-mismatch' };
|
|
112
|
+
return { ok: true, state: { ...checked.data, key } };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Picks the state to trust: only a comment by `selfId` (the authenticated identity) is decoded. Lowest comment id
|
|
116
|
+
* wins, as in `readParkState`. An unknown identity fails closed: every marker comment is ignored.
|
|
117
|
+
*/
|
|
118
|
+
export function selectTrustedPrRunState(comments, selfId, key) {
|
|
119
|
+
const ignored = [];
|
|
120
|
+
let winner;
|
|
121
|
+
for (const c of [...comments].sort((a, b) => a.id - b.id)) {
|
|
122
|
+
if (!MARKER_RE.test(c.body))
|
|
123
|
+
continue;
|
|
124
|
+
if (selfId === undefined) {
|
|
125
|
+
ignored.push({ commentId: c.id, reason: 'identity-unavailable' });
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (c.authorId !== selfId) {
|
|
129
|
+
ignored.push({ commentId: c.id, reason: 'untrusted-author' });
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const decoded = decodePrRunState(c.body, key);
|
|
133
|
+
if (decoded === null)
|
|
134
|
+
continue;
|
|
135
|
+
if (!decoded.ok)
|
|
136
|
+
ignored.push({ commentId: c.id, reason: decoded.reason });
|
|
137
|
+
else
|
|
138
|
+
winner ??= { commentId: c.id, state: decoded.state };
|
|
139
|
+
}
|
|
140
|
+
return winner ? { status: 'found', ...winner, ignored } : { status: 'none', ignored };
|
|
141
|
+
}
|
|
142
|
+
function mergeRounds(a, b) {
|
|
143
|
+
const seen = new Map();
|
|
144
|
+
for (const r of [...a, ...b])
|
|
145
|
+
seen.set(`${r.kind}:${r.id ?? ''}:${r.headSha}`, r);
|
|
146
|
+
return [...seen.values()].sort((x, y) => x.at.localeCompare(y.at));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Monotonic merge of local and remote state. `used` counters take the max (a restore can only raise them, never
|
|
150
|
+
* reset a cap), `cap` comes from local because local config is current, handled ids and rounds are unioned (rounds
|
|
151
|
+
* deduped by kind+id+headSha, sorted by `at`), and `status`, `spec` and `prNumber` come from the side with the
|
|
152
|
+
* later `updatedAt`. One missing side returns the other.
|
|
153
|
+
*/
|
|
154
|
+
export function reconcilePrRunState(local, remote) {
|
|
155
|
+
if (local === null)
|
|
156
|
+
return remote;
|
|
157
|
+
if (remote === null)
|
|
158
|
+
return local;
|
|
159
|
+
const later = remote.updatedAt > local.updatedAt ? remote : local;
|
|
160
|
+
return {
|
|
161
|
+
version: 1,
|
|
162
|
+
key: local.key,
|
|
163
|
+
prNumber: later.prNumber,
|
|
164
|
+
status: later.status,
|
|
165
|
+
spec: later.spec,
|
|
166
|
+
checkRework: { used: Math.max(local.checkRework.used, remote.checkRework.used), cap: local.checkRework.cap },
|
|
167
|
+
reviewRework: { used: Math.max(local.reviewRework.used, remote.reviewRework.used), cap: local.reviewRework.cap },
|
|
168
|
+
handledReviewIds: uniqueSorted([...local.handledReviewIds, ...remote.handledReviewIds]),
|
|
169
|
+
handledCommentIds: uniqueSorted([...local.handledCommentIds, ...remote.handledCommentIds]),
|
|
170
|
+
rounds: mergeRounds(local.rounds, remote.rounds),
|
|
171
|
+
updatedAt: local.updatedAt > remote.updatedAt ? local.updatedAt : remote.updatedAt,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
export function prRunStatusFor(status, ciPending) {
|
|
175
|
+
switch (status) {
|
|
176
|
+
case 'pending':
|
|
177
|
+
case 'planning':
|
|
178
|
+
case 'building':
|
|
179
|
+
case 'checking':
|
|
180
|
+
case 'reworking':
|
|
181
|
+
return 'building';
|
|
182
|
+
case 'shipping':
|
|
183
|
+
return 'awaiting-ci';
|
|
184
|
+
case 'ready':
|
|
185
|
+
return ciPending ? 'awaiting-ci' : 'awaiting-review';
|
|
186
|
+
case 'awaiting-review':
|
|
187
|
+
case 'merged':
|
|
188
|
+
return 'awaiting-review';
|
|
189
|
+
case 'parked':
|
|
190
|
+
case 'escalated':
|
|
191
|
+
case 'failed':
|
|
192
|
+
return 'parked';
|
|
193
|
+
default: {
|
|
194
|
+
const unreachable = status;
|
|
195
|
+
return unreachable;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export async function loadPrRunState(deps) {
|
|
200
|
+
const { octokit, repo, prNumber, key } = deps;
|
|
201
|
+
const [owner, name] = repo.split('/');
|
|
202
|
+
let selfId;
|
|
203
|
+
try {
|
|
204
|
+
selfId = (await octokit.rest.users.getAuthenticated()).data.id;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
selfId = undefined;
|
|
208
|
+
}
|
|
209
|
+
const comments = [];
|
|
210
|
+
for (let page = 1;; page++) {
|
|
211
|
+
const { data } = await octokit.rest.issues.listComments({
|
|
212
|
+
owner,
|
|
213
|
+
repo: name,
|
|
214
|
+
issue_number: prNumber,
|
|
215
|
+
per_page: PAGE_SIZE,
|
|
216
|
+
page,
|
|
217
|
+
});
|
|
218
|
+
for (const c of data)
|
|
219
|
+
comments.push({ id: c.id, authorId: c.user?.id, body: c.body ?? '' });
|
|
220
|
+
if (data.length < PAGE_SIZE)
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
return selectTrustedPrRunState(comments, selfId, key);
|
|
224
|
+
}
|
|
225
|
+
export function savePrRunState(deps) {
|
|
226
|
+
const { octokit, repo, prNumber, state } = deps;
|
|
227
|
+
return upsertMarkerComment({
|
|
228
|
+
octokit,
|
|
229
|
+
repo,
|
|
230
|
+
issue: workKeyFromIssue(prNumber),
|
|
231
|
+
marker: prRunStateMarker(state.key),
|
|
232
|
+
body: encodePrRunState(state),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=pr-run-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-run-state.js","sourceRoot":"","sources":["../../src/run/pr-run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import type { PrerequisiteStackTarget } from '../queue/prerequisite-stack.js';
|
|
3
|
+
export interface PrerequisiteRestackOptions {
|
|
4
|
+
/** Main checkout; a short-lived detached worktree is added from it. */
|
|
5
|
+
repoRoot: string;
|
|
6
|
+
octokit: Octokit;
|
|
7
|
+
/** owner/name */
|
|
8
|
+
repo: string;
|
|
9
|
+
/** The stacked PR. */
|
|
10
|
+
prNumber: number;
|
|
11
|
+
branch: string;
|
|
12
|
+
/** The stacked branch head the factory last saw; the push lease and the ownership check. */
|
|
13
|
+
recordedHead: string;
|
|
14
|
+
/** The prerequisite PR and head the stacked branch was built on (from the PR body marker). */
|
|
15
|
+
stackedOn: PrerequisiteStackTarget;
|
|
16
|
+
onto: {
|
|
17
|
+
kind: 'main';
|
|
18
|
+
mergedHead: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'prerequisite';
|
|
21
|
+
newHead: string;
|
|
22
|
+
};
|
|
23
|
+
/** Default 'origin'. */
|
|
24
|
+
remote?: string;
|
|
25
|
+
/** Default 'main'. */
|
|
26
|
+
baseBranch?: string;
|
|
27
|
+
}
|
|
28
|
+
export type PrerequisiteRestackOutcome = {
|
|
29
|
+
status: 'restacked';
|
|
30
|
+
headSha: string;
|
|
31
|
+
retargeted: boolean;
|
|
32
|
+
} | {
|
|
33
|
+
status: 'park';
|
|
34
|
+
reason: string;
|
|
35
|
+
files: string[];
|
|
36
|
+
};
|
|
37
|
+
/** Rebases the stacked branch `--onto` main (prerequisite merged) or the prerequisite's new head, then updates the PR. */
|
|
38
|
+
export declare function restackOnPrerequisite(opts: PrerequisiteRestackOptions): Promise<PrerequisiteRestackOutcome>;
|
|
39
|
+
//# sourceMappingURL=prerequisite-restack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisite-restack.d.ts","sourceRoot":"","sources":["../../src/run/prerequisite-restack.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI9E,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,YAAY,EAAE,MAAM,CAAC;IACrB,8FAA8F;IAC9F,SAAS,EAAE,uBAAuB,CAAC;IACnC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,0BAA0B,GACpC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAQtH,0HAA0H;AAC1H,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA+EjH"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// packages/core/src/run/prerequisite-restack.ts — cross-issue stacks (#3916): rebase a stacked PR onto main after its
|
|
2
|
+
// prerequisite squash-merged, or onto the prerequisite's new head after it moved. Reuses ADR-0161's rebase/push.
|
|
3
|
+
import { prerequisiteStackOrder, renderPrerequisiteStackLine, replaceStackOrderLine } from '../phases/stack-order.js';
|
|
4
|
+
import { execGit } from '../utils/git-exec.js';
|
|
5
|
+
import { gitErrorDetail, rebaseAndPushStack } from './stack-rebase.js';
|
|
6
|
+
const PREREQUISITE_MARKER_PREFIX = '<!-- factory:prerequisite-stack ';
|
|
7
|
+
async function git(cwd, ...args) {
|
|
8
|
+
return (await execGit(args, { cwd })).stdout.trim();
|
|
9
|
+
}
|
|
10
|
+
/** Rebases the stacked branch `--onto` main (prerequisite merged) or the prerequisite's new head, then updates the PR. */
|
|
11
|
+
export async function restackOnPrerequisite(opts) {
|
|
12
|
+
const { repoRoot, octokit, prNumber, branch, recordedHead, stackedOn, onto } = opts;
|
|
13
|
+
const remote = opts.remote ?? 'origin';
|
|
14
|
+
const base = opts.baseBranch ?? 'main';
|
|
15
|
+
const [owner, repoName] = opts.repo.split('/');
|
|
16
|
+
const park = (reason, files = []) => ({
|
|
17
|
+
status: 'park',
|
|
18
|
+
reason,
|
|
19
|
+
files,
|
|
20
|
+
});
|
|
21
|
+
const label = `PR #${prNumber} (${branch})`;
|
|
22
|
+
let startBase;
|
|
23
|
+
try {
|
|
24
|
+
await git(repoRoot, 'fetch', remote, `+refs/heads/${base}:refs/remotes/${remote}/${base}`);
|
|
25
|
+
await git(repoRoot, 'fetch', remote, `+refs/heads/${branch}:refs/remotes/${remote}/${branch}`);
|
|
26
|
+
if (onto.kind === 'prerequisite') {
|
|
27
|
+
await git(repoRoot, 'fetch', remote, `+refs/heads/${stackedOn.branch}:refs/remotes/${remote}/${stackedOn.branch}`);
|
|
28
|
+
await git(repoRoot, 'cat-file', '-e', `${onto.newHead}^{commit}`);
|
|
29
|
+
startBase = onto.newHead;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
startBase = `${remote}/${base}`;
|
|
33
|
+
}
|
|
34
|
+
const head = await git(repoRoot, 'rev-parse', `refs/remotes/${remote}/${branch}`);
|
|
35
|
+
if (head !== recordedHead) {
|
|
36
|
+
return park(`${label} moved since the factory recorded ${recordedHead}; a human may have pushed — not restacking onto prerequisite PR #${stackedOn.prNumber}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return park(`restack of ${label} onto prerequisite PR #${stackedOn.prNumber} could not fetch: ${gitErrorDetail(err)}`);
|
|
41
|
+
}
|
|
42
|
+
const rebased = await rebaseAndPushStack({
|
|
43
|
+
repoRoot,
|
|
44
|
+
remote,
|
|
45
|
+
startBase,
|
|
46
|
+
layers: [{ branch, recordedHead, upstream: stackedOn.headSha }],
|
|
47
|
+
});
|
|
48
|
+
if (!rebased.ok) {
|
|
49
|
+
return park(`restack of ${label} ${rebased.reason}`, rebased.files);
|
|
50
|
+
}
|
|
51
|
+
const headSha = rebased.newHeads[0];
|
|
52
|
+
try {
|
|
53
|
+
const { data } = await octokit.rest.pulls.get({ owner, repo: repoName, pull_number: prNumber });
|
|
54
|
+
const merged = onto.kind === 'main';
|
|
55
|
+
const retargeted = merged && data.base.ref !== base;
|
|
56
|
+
const without = (data.body ?? '')
|
|
57
|
+
.split('\n')
|
|
58
|
+
.filter((l) => !l.startsWith(PREREQUISITE_MARKER_PREFIX))
|
|
59
|
+
.join('\n');
|
|
60
|
+
const issue = Number(/^factory\/(\d+)-/.exec(branch)?.[1]);
|
|
61
|
+
const body = merged
|
|
62
|
+
? replaceStackOrderLine(without, renderPrerequisiteStackLine({ prerequisite: stackedOn, issue, base }))
|
|
63
|
+
: replaceStackOrderLine(without, prerequisiteStackOrder({ ...stackedOn, headSha: onto.newHead }, issue, stackedOn.branch));
|
|
64
|
+
if (retargeted || body !== (data.body ?? '')) {
|
|
65
|
+
await octokit.rest.pulls.update({
|
|
66
|
+
owner,
|
|
67
|
+
repo: repoName,
|
|
68
|
+
pull_number: prNumber,
|
|
69
|
+
body,
|
|
70
|
+
...(retargeted ? { base } : {}),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return { status: 'restacked', headSha, retargeted };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return park(`${label} restacked and pushed but updating the PR failed: ${gitErrorDetail(err)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=prerequisite-restack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisite-restack.js","sourceRoot":"","sources":["../../src/run/prerequisite-restack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FactoryConfig } from '../config/index.js';
|
|
2
2
|
import { type QueueGitHubClient } from '../queue/github-queue.js';
|
|
3
|
-
import type { ReviewReworkStore } from '../queue/review-rework-trigger.js';
|
|
3
|
+
import type { ReviewReworkSource, ReviewReworkStore } from '../queue/review-rework-trigger.js';
|
|
4
4
|
import { type ParkCommentInput } from './park-comment.js';
|
|
5
5
|
import { type WorkKey } from '../work/work-key.js';
|
|
6
6
|
export declare function resolveMaxReviewReworkRuns(config: Pick<FactoryConfig, 'queue'>): number;
|
|
@@ -12,6 +12,7 @@ export declare function reviewReworkCapMessage(input: {
|
|
|
12
12
|
cap: number;
|
|
13
13
|
count: number;
|
|
14
14
|
reviewIds: readonly number[];
|
|
15
|
+
source?: ReviewReworkSource;
|
|
15
16
|
}): string;
|
|
16
17
|
export declare function parkAtReviewReworkCap(deps: {
|
|
17
18
|
queue: QueueGitHubClient;
|
|
@@ -24,6 +25,7 @@ export declare function parkAtReviewReworkCap(deps: {
|
|
|
24
25
|
cap: number;
|
|
25
26
|
count: number;
|
|
26
27
|
reviewIds: readonly number[];
|
|
28
|
+
source?: ReviewReworkSource;
|
|
27
29
|
publishComment?: (input: Omit<ParkCommentInput, 'parkSha' | 'order'>) => Promise<unknown>;
|
|
28
30
|
}): Promise<void>;
|
|
29
31
|
//# sourceMappingURL=review-rework-cap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-rework-cap.d.ts","sourceRoot":"","sources":["../../src/run/review-rework-cap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"review-rework-cap.d.ts","sourceRoot":"","sources":["../../src/run/review-rework-cap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC/F,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAElE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM,CAEvF;AAED,qGAAqG;AACrG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B,GAAG,MAAM,CAIT;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3F,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB"}
|
|
@@ -12,7 +12,8 @@ export function countReviewReworkRuns(store, issue) {
|
|
|
12
12
|
}
|
|
13
13
|
export function reviewReworkCapMessage(input) {
|
|
14
14
|
const { issue, pr, cap, count, reviewIds } = input;
|
|
15
|
-
|
|
15
|
+
const what = input.source === 'comment' ? 'comment' : input.source === 'feedback' ? 'feedback round' : 'review';
|
|
16
|
+
return `#${issue} has had ${count} review-rework runs (cap ${cap}, queue.max_review_rework_runs); PR #${pr} ${what} ${reviewIds.join(', ')} started no new run. Resolve the review by hand, then run \`factory unpark ${issue}\`.`;
|
|
16
17
|
}
|
|
17
18
|
export async function parkAtReviewReworkCap(deps) {
|
|
18
19
|
const { queue, owner, repo, issue } = deps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-rework-cap.js","sourceRoot":"","sources":["../../src/run/review-rework-cap.ts"],"names":[],"mappings":"AAAA,iIAAiI;AACjI,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,eAAe,EAA0B,MAAM,0BAA0B,CAAC;AAEjG,OAAO,EAAE,iBAAiB,EAAyB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAgB,MAAM,qBAAqB,CAAC;AAElE,MAAM,UAAU,0BAA0B,CAAC,MAAoC;IAC7E,OAAO,MAAM,CAAC,KAAK,EAAE,sBAAsB,IAAI,oBAAoB,CAAC,KAAK,CAAC,sBAAsB,CAAC;AACnG,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,qBAAqB,CAAC,KAAsC,EAAE,KAAc;IAC1F,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"review-rework-cap.js","sourceRoot":"","sources":["../../src/run/review-rework-cap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { Octokit } from '@octokit/rest';
|
|
2
2
|
import { reworkWorker, type checkPhase } from '../phases/check.js';
|
|
3
3
|
import type { CheckSummary } from '../types/index.js';
|
|
4
|
+
import type { FeedbackRoundPlan, FeedbackRoundTarget } from './feedback-round.js';
|
|
4
5
|
import type { RunPorts, RunRequest } from './run-issue.js';
|
|
5
6
|
export interface ReviewReworkTarget {
|
|
6
7
|
prNumber: number;
|
|
7
8
|
reviewId: number;
|
|
8
9
|
reviewer: string;
|
|
10
|
+
/** `'comment'`: `reviewId` is a `/factory rework` issue-comment id (#3882). */
|
|
11
|
+
source?: 'comment';
|
|
9
12
|
}
|
|
10
13
|
/** #3625: a trusted `/factory iterate` comment; the run re-runs CHECK/rework on the PR branch. */
|
|
11
14
|
export interface IterateTarget {
|
|
@@ -19,6 +22,10 @@ export interface ReworkRequestFields {
|
|
|
19
22
|
reviewRework?: ReviewReworkTarget;
|
|
20
23
|
/** #3625: a /factory iterate comment — skip PLAN/BUILD and re-run CHECK/rework on the PR branch. */
|
|
21
24
|
iterate?: IterateTarget;
|
|
25
|
+
/** #3910: a feedback round — read every unhandled trusted PR feedback item, triage, then rework or re-plan. */
|
|
26
|
+
feedbackRound?: FeedbackRoundTarget;
|
|
27
|
+
/** Logins trusted to give feedback (intake.trustedApprovers); absent falls back to repo permission (ADR-0128). */
|
|
28
|
+
trustedApprovers?: readonly string[];
|
|
22
29
|
}
|
|
23
30
|
export interface ReviewFeedback {
|
|
24
31
|
prNumber: number;
|
|
@@ -32,6 +39,7 @@ export interface ReviewFeedback {
|
|
|
32
39
|
body: string;
|
|
33
40
|
author: string;
|
|
34
41
|
}[];
|
|
42
|
+
source?: 'comment';
|
|
35
43
|
}
|
|
36
44
|
export declare class ReviewReworkError extends Error {
|
|
37
45
|
name: string;
|
|
@@ -44,11 +52,18 @@ export declare function fetchReviewFeedback(octokit: Pick<Octokit, 'rest' | 'pag
|
|
|
44
52
|
prNumber: number;
|
|
45
53
|
reviewId: number;
|
|
46
54
|
}): Promise<ReviewFeedback>;
|
|
55
|
+
/** The feedback of one `/factory rework` comment, re-read from GitHub so only the text after the command is used. */
|
|
56
|
+
export declare function fetchCommentFeedback(octokit: Pick<Octokit, 'rest'>, opts: {
|
|
57
|
+
owner: string;
|
|
58
|
+
repo: string;
|
|
59
|
+
prNumber: number;
|
|
60
|
+
commentId: number;
|
|
61
|
+
}): Promise<ReviewFeedback>;
|
|
47
62
|
export declare function renderReviewFeedback(feedback: ReviewFeedback): string;
|
|
48
63
|
/** The review as a one-result CheckSummary, the same shape ciReworkSummary gives the rework worker. */
|
|
49
64
|
export declare function reviewReworkSummary(feedback: ReviewFeedback): CheckSummary;
|
|
50
65
|
/** A synthetic CHECK resume: skips PLAN and BUILD for a review-rework run. */
|
|
51
|
-
export declare function reviewReworkResume(request: Pick<RunRequest, 'reviewRework' | 'iterate' | 'preferredRoute' | 'modelPins'>): NonNullable<RunRequest['resumeFrom']> | undefined;
|
|
66
|
+
export declare function reviewReworkResume(request: Pick<RunRequest, 'reviewRework' | 'iterate' | 'feedbackRound' | 'preferredRoute' | 'modelPins'>, feedbackPlan?: Pick<FeedbackRoundPlan, 'replan'>): NonNullable<RunRequest['resumeFrom']> | undefined;
|
|
52
67
|
export declare function runReviewReworkBuild(opts: {
|
|
53
68
|
target: ReviewReworkTarget;
|
|
54
69
|
repo: string;
|
|
@@ -60,5 +75,5 @@ export declare function runReviewReworkBuild(opts: {
|
|
|
60
75
|
feedback: ReviewFeedback;
|
|
61
76
|
}>;
|
|
62
77
|
/** runIssue's hook before the first CHECK: reworks the requested review unless a CHECK resume was asked for. */
|
|
63
|
-
export declare function runRequestedReviewRework(request: Pick<RunRequest, 'reviewRework' | 'iterate' | 'resumeFrom' | 'repo' | 'branch'>, ports: Pick<RunPorts, 'octokit' | 'reworkWorker'>, checkOpts: Parameters<typeof checkPhase>[0]): Promise<void>;
|
|
78
|
+
export declare function runRequestedReviewRework(request: Pick<RunRequest, 'reviewRework' | 'iterate' | 'feedbackRound' | 'resumeFrom' | 'repo' | 'branch'>, ports: Pick<RunPorts, 'octokit' | 'reworkWorker'>, checkOpts: Parameters<typeof checkPhase>[0], feedbackPlan?: Pick<FeedbackRoundPlan, 'prNumber' | 'summary'>): Promise<void>;
|
|
64
79
|
//# sourceMappingURL=review-rework.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-rework.d.ts","sourceRoot":"","sources":["../../src/run/review-rework.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-rework.d.ts","sourceRoot":"","sources":["../../src/run/review-rework.ts"],"names":[],"mappings":"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"}
|