@on-par/factory-core 0.9.28-next.23 → 0.9.28-next.24

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 (41) hide show
  1. package/dist/events/queue-traits.d.ts +1 -1
  2. package/dist/events/queue-traits.d.ts.map +1 -1
  3. package/dist/events/queue-traits.js +4 -1
  4. package/dist/events/queue-traits.js.map +1 -1
  5. package/dist/fakes/octokit.d.ts +13 -1
  6. package/dist/fakes/octokit.d.ts.map +1 -1
  7. package/dist/fakes/octokit.js +13 -0
  8. package/dist/fakes/octokit.js.map +1 -1
  9. package/dist/internal.d.ts +2 -0
  10. package/dist/internal.d.ts.map +1 -1
  11. package/dist/internal.js +3 -0
  12. package/dist/internal.js.map +1 -1
  13. package/dist/kpis/phase.d.ts.map +1 -1
  14. package/dist/kpis/phase.js +1 -0
  15. package/dist/kpis/phase.js.map +1 -1
  16. package/dist/queue/review-rework-trigger.d.ts +2 -2
  17. package/dist/queue/review-rework-trigger.d.ts.map +1 -1
  18. package/dist/queue/review-rework-trigger.js +6 -2
  19. package/dist/queue/review-rework-trigger.js.map +1 -1
  20. package/dist/run/feedback-github.d.ts +50 -0
  21. package/dist/run/feedback-github.d.ts.map +1 -0
  22. package/dist/run/feedback-github.js +87 -0
  23. package/dist/run/feedback-github.js.map +1 -0
  24. package/dist/run/feedback-round-hooks.d.ts +19 -0
  25. package/dist/run/feedback-round-hooks.d.ts.map +1 -0
  26. package/dist/run/feedback-round-hooks.js +106 -0
  27. package/dist/run/feedback-round-hooks.js.map +1 -0
  28. package/dist/run/feedback-round.d.ts +97 -0
  29. package/dist/run/feedback-round.d.ts.map +1 -0
  30. package/dist/run/feedback-round.js +275 -0
  31. package/dist/run/feedback-round.js.map +1 -0
  32. package/dist/run/review-rework-cap.js +1 -1
  33. package/dist/run/review-rework-cap.js.map +1 -1
  34. package/dist/run/review-rework.d.ts +7 -2
  35. package/dist/run/review-rework.d.ts.map +1 -1
  36. package/dist/run/review-rework.js +66 -30
  37. package/dist/run/review-rework.js.map +1 -1
  38. package/dist/run/run-issue.d.ts.map +1 -1
  39. package/dist/run/run-issue.js +12 -4
  40. package/dist/run/run-issue.js.map +1 -1
  41. package/package.json +5 -5
@@ -0,0 +1,106 @@
1
+ // packages/core/src/run/feedback-round-hooks.ts — runIssue's two hooks for a feedback round: prepare before PLAN, publish after SHIP (#3910)
2
+ import { readFileSync } from 'node:fs';
3
+ import { createOctokitCollaboratorPermissionClient, isTrustedApprover } from '../queue/approval.js';
4
+ import { defaultExecFn } from '../utils/exec.js';
5
+ import { createOctokitFeedbackRoundGitHub } from './feedback-github.js';
6
+ import { prepareFeedbackRound, publishFeedbackRound } from './feedback-round.js';
7
+ const githubFor = (request, ports) => {
8
+ const [owner = '', name = ''] = request.repo.split('/');
9
+ return createOctokitFeedbackRoundGitHub(ports.octokit, owner, name);
10
+ };
11
+ function readSpec(request) {
12
+ try {
13
+ return readFileSync(request.specPath, 'utf8');
14
+ }
15
+ catch {
16
+ return request.work.brief;
17
+ }
18
+ }
19
+ /** Reads and triages the PR's unhandled trusted feedback; undefined when this run is not a fresh feedback round. */
20
+ export async function prepareFeedbackForRun(request, ports, log) {
21
+ if (!request.feedbackRound || request.resumeFrom)
22
+ return undefined;
23
+ const [owner = '', name = ''] = request.repo.split('/');
24
+ const client = createOctokitCollaboratorPermissionClient(ports.octokit);
25
+ const plan = await prepareFeedbackRound({
26
+ github: githubFor(request, ports),
27
+ target: request.feedbackRound,
28
+ spec: readSpec(request),
29
+ isTrusted: (login) => isTrustedApprover(login, { owner, repo: name, trustedApprovers: request.trustedApprovers, client }),
30
+ run: async (prompt) => {
31
+ const res = await ports.router.run('feedback_triage', prompt, {
32
+ worktree: ports.workspace.path,
33
+ timeoutSeconds: request.timeouts.plan,
34
+ });
35
+ return { model: res.model, output: res.output, cost: 0 };
36
+ },
37
+ log,
38
+ });
39
+ if (plan.items.length === 0)
40
+ log('feedback_round_triaged', `PR #${plan.prNumber}: no unhandled trusted feedback`);
41
+ return plan;
42
+ }
43
+ /** The actionable feedback, appended to PLAN's previous-attempt note on a re-plan. */
44
+ export function feedbackReplanNote(previous, plan) {
45
+ if (!plan?.replan)
46
+ return previous;
47
+ const details = plan.summary?.results[0]?.details ?? '';
48
+ return [previous, '## Review feedback that changes scope', details].filter((s) => s !== '').join('\n\n');
49
+ }
50
+ function section(spec, heading) {
51
+ const lines = spec.split(/\r?\n/);
52
+ const start = lines.findIndex((l) => /^#{1,6}\s/.test(l) && heading.test(l));
53
+ if (start < 0)
54
+ return '';
55
+ const level = /^#+/.exec(lines[start] ?? '')?.[0].length ?? 2;
56
+ const rest = lines.slice(start + 1);
57
+ const end = rest.findIndex((l) => {
58
+ const m = /^(#+)\s/.exec(l);
59
+ return m !== null && (m[1]?.length ?? 7) <= level;
60
+ });
61
+ return [lines[start], ...(end < 0 ? rest : rest.slice(0, end))].join('\n').trim();
62
+ }
63
+ /** The new spec's goal and acceptance sections, for the PR body's revised-spec block. */
64
+ export function revisedSpecSummary(specPath) {
65
+ let spec;
66
+ try {
67
+ spec = readFileSync(specPath, 'utf8');
68
+ }
69
+ catch {
70
+ return undefined;
71
+ }
72
+ const text = [section(spec, /goal/i), section(spec, /acceptance/i)].filter((s) => s !== '').join('\n\n');
73
+ return text === '' ? undefined : text;
74
+ }
75
+ /** Answers every item of the round; GitHub failures warn inside publishFeedbackRound and never fail the run. */
76
+ export async function publishFeedbackForRun(request, ports, plan, headSha, log) {
77
+ if (!plan || plan.items.length === 0)
78
+ return;
79
+ let sha = headSha;
80
+ if (sha === undefined && plan.summary !== undefined) {
81
+ try {
82
+ const run = ports.gitExec ?? defaultExecFn;
83
+ sha = (await run('git rev-parse HEAD', { cwd: ports.workspace.path })).stdout.trim() || undefined;
84
+ }
85
+ catch {
86
+ sha = undefined;
87
+ }
88
+ }
89
+ const summary = plan.replan ? revisedSpecSummary(request.specPath) : undefined;
90
+ await publishFeedbackRound({
91
+ github: githubFor(request, ports),
92
+ plan,
93
+ repo: request.repo,
94
+ headSha: sha,
95
+ ...(summary === undefined ? {} : { revisedSpecSummary: summary }),
96
+ log,
97
+ });
98
+ }
99
+ /** With nothing actionable the round only answers its items; the run then ends without CHECK or SHIP. */
100
+ export async function idleFeedbackRound(plan, request, ports, route, log) {
101
+ if (!plan || plan.summary !== undefined)
102
+ return undefined;
103
+ await publishFeedbackForRun(request, ports, plan, undefined, log);
104
+ return { state: 'ready', route: route ?? 'claude', branch: request.branch, reworkRounds: 0, prNumber: plan.prNumber };
105
+ }
106
+ //# sourceMappingURL=feedback-round-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-round-hooks.js","sourceRoot":"","sources":["../../src/run/feedback-round-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { z } from 'zod';
2
+ import type { EventKind } from '../events/kinds.js';
3
+ import type { CheckSummary } from '../types/index.js';
4
+ import type { FeedbackRoundGitHub } from './feedback-github.js';
5
+ export interface FeedbackItem {
6
+ kind: 'review' | 'inline' | 'comment';
7
+ id: number;
8
+ author: string;
9
+ body: string;
10
+ url: string;
11
+ path?: string;
12
+ line?: number;
13
+ threadId?: string;
14
+ /** The top-level comment of the thread an inline item replies to; GitHub only accepts replies to that one. */
15
+ inReplyTo?: number;
16
+ }
17
+ export interface FeedbackRoundTarget {
18
+ prNumber: number;
19
+ }
20
+ declare const DispositionSchema: z.ZodObject<{
21
+ id: z.ZodNumber;
22
+ kind: z.ZodEnum<{
23
+ comment: "comment";
24
+ inline: "inline";
25
+ review: "review";
26
+ }>;
27
+ verdict: z.ZodEnum<{
28
+ actionable: "actionable";
29
+ "out-of-scope": "out-of-scope";
30
+ question: "question";
31
+ }>;
32
+ changesSpec: z.ZodDefault<z.ZodBoolean>;
33
+ summary: z.ZodDefault<z.ZodString>;
34
+ answer: z.ZodOptional<z.ZodString>;
35
+ reason: z.ZodOptional<z.ZodString>;
36
+ followUpIssue: z.ZodOptional<z.ZodNumber>;
37
+ }, z.core.$strip>;
38
+ export type FeedbackDisposition = z.infer<typeof DispositionSchema>;
39
+ export interface FeedbackRoundPlan {
40
+ prNumber: number;
41
+ items: FeedbackItem[];
42
+ dispositions: FeedbackDisposition[];
43
+ replan: boolean;
44
+ reviewers: string[];
45
+ /** Undefined when nothing is actionable. */
46
+ summary: CheckSummary | undefined;
47
+ }
48
+ type TriageRun = (prompt: string) => Promise<{
49
+ model: string;
50
+ output: string;
51
+ cost: number;
52
+ }>;
53
+ type RoundLog = (type: EventKind, message: string) => void;
54
+ export declare function feedbackHandledMarker(item: Pick<FeedbackItem, 'kind' | 'id'>): string;
55
+ /** Trusted, unhandled feedback on the PR, oldest id first. Factory-authored, empty and marker-handled items are dropped. */
56
+ export declare function collectFeedbackItems(opts: {
57
+ github: FeedbackRoundGitHub;
58
+ prNumber: number;
59
+ isTrusted: (login: string) => Promise<boolean>;
60
+ }): Promise<FeedbackItem[]>;
61
+ /** One model call over every item; any parse failure, or a missing or unknown id, falls back to actionable. */
62
+ export declare function triageFeedback(opts: {
63
+ items: readonly FeedbackItem[];
64
+ spec: string;
65
+ run: TriageRun;
66
+ }): Promise<FeedbackDisposition[]>;
67
+ /** The actionable items as a one-result CheckSummary for the rework worker; undefined when nothing is actionable. */
68
+ export declare function feedbackReworkSummary(items: readonly FeedbackItem[], dispositions: readonly FeedbackDisposition[]): CheckSummary | undefined;
69
+ /** Reads, triages and plans one round; throws ReviewReworkError unless the PR is open. */
70
+ export declare function prepareFeedbackRound(opts: {
71
+ github: FeedbackRoundGitHub;
72
+ target: FeedbackRoundTarget;
73
+ spec: string;
74
+ isTrusted: (login: string) => Promise<boolean>;
75
+ run: TriageRun;
76
+ log: RoundLog;
77
+ }): Promise<FeedbackRoundPlan>;
78
+ /** The reply posted where the item was left, ending in the handled marker. */
79
+ export declare function renderFeedbackReply(item: FeedbackItem, disposition: FeedbackDisposition, ctx: {
80
+ repo: string;
81
+ headSha: string | undefined;
82
+ }): string;
83
+ /** Replies to every item, records a revised spec, resolves fixed threads and re-requests review; GitHub errors warn and continue. */
84
+ export declare function publishFeedbackRound(opts: {
85
+ github: FeedbackRoundGitHub;
86
+ plan: FeedbackRoundPlan;
87
+ repo: string;
88
+ headSha: string | undefined;
89
+ revisedSpecSummary?: string;
90
+ log: RoundLog;
91
+ }): Promise<{
92
+ replied: number;
93
+ resolved: number;
94
+ reviewersRequested: string[];
95
+ }>;
96
+ export {};
97
+ //# sourceMappingURL=feedback-round.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-round.d.ts","sourceRoot":"","sources":["../../src/run/feedback-round.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ // packages/core/src/run/feedback-round.ts — a feedback round on a factory PR: collect unhandled trusted feedback, triage it, rework or re-plan, then answer each item and resolve what was fixed (#3910)
2
+ import { z } from 'zod';
3
+ import { parseReworkCommand } from '../queue/comment-rework-trigger.js';
4
+ import { extractJsonObject } from '../readiness/decompose.js';
5
+ import { UNTRUSTED_REVIEW_FEEDBACK_NOTICE, wrapUntrustedReviewFeedback } from '../utils/untrusted-input.js';
6
+ import { ReviewReworkError } from './review-rework.js';
7
+ const DispositionSchema = z.object({
8
+ id: z.number(),
9
+ kind: z.enum(['review', 'inline', 'comment']),
10
+ verdict: z.enum(['actionable', 'question', 'out-of-scope']),
11
+ changesSpec: z.boolean().default(false),
12
+ summary: z.string().default(''),
13
+ answer: z.string().optional(),
14
+ reason: z.string().optional(),
15
+ followUpIssue: z.number().optional(),
16
+ });
17
+ const MARKER_RE = /<!-- factory:feedback-handled (review|inline|comment):(\d+) -->/g;
18
+ const FEEDBACK_MAX_CHARS = 20_000;
19
+ const REVISED_SPEC_OPEN = '<!-- factory:revised-spec -->';
20
+ const REVISED_SPEC_CLOSE = '<!-- /factory:revised-spec -->';
21
+ const errorMessage = (err) => (err instanceof Error ? err.message : String(err));
22
+ const itemKey = (item) => `${item.kind}:${item.id}`;
23
+ export function feedbackHandledMarker(item) {
24
+ return `<!-- factory:feedback-handled ${itemKey(item)} -->`;
25
+ }
26
+ function handledKeys(bodies) {
27
+ const handled = new Set();
28
+ for (const body of bodies) {
29
+ for (const m of body.matchAll(MARKER_RE))
30
+ handled.add(`${m[1]}:${m[2]}`);
31
+ }
32
+ return handled;
33
+ }
34
+ /** Trusted, unhandled feedback on the PR, oldest id first. Factory-authored, empty and marker-handled items are dropped. */
35
+ export async function collectFeedbackItems(opts) {
36
+ const { github, prNumber, isTrusted } = opts;
37
+ const viewer = (await github.viewerLogin()).toLowerCase();
38
+ const [reviews, inline, comments, threads] = await Promise.all([
39
+ github.listReviews(prNumber),
40
+ github.listReviewComments(prNumber),
41
+ github.listIssueComments(prNumber),
42
+ github.listReviewThreads(prNumber),
43
+ ]);
44
+ const isViewer = (login) => login.toLowerCase() === viewer;
45
+ const handled = handledKeys([
46
+ ...comments.filter((c) => isViewer(c.login)).map((c) => c.body),
47
+ ...inline.filter((c) => isViewer(c.login)).map((c) => c.body),
48
+ ]);
49
+ const threadOf = (commentId) => threads.find((t) => t.commentIds.includes(commentId))?.threadId;
50
+ const candidates = [
51
+ ...reviews.map((r) => ({ kind: 'review', id: r.id, author: r.login, body: r.body, url: r.htmlUrl })),
52
+ ...inline.map((c) => ({
53
+ kind: 'inline',
54
+ id: c.id,
55
+ author: c.login,
56
+ body: c.body,
57
+ url: c.htmlUrl,
58
+ path: c.path,
59
+ ...(c.line === undefined ? {} : { line: c.line }),
60
+ ...(threadOf(c.id) === undefined ? {} : { threadId: threadOf(c.id) }),
61
+ ...(c.inReplyTo === undefined ? {} : { inReplyTo: c.inReplyTo }),
62
+ })),
63
+ ...comments.map((c) => {
64
+ const command = parseReworkCommand(c.body);
65
+ return { kind: 'comment', id: c.id, author: c.login, body: command ?? c.body, url: c.htmlUrl };
66
+ }),
67
+ ];
68
+ const trust = new Map();
69
+ const items = [];
70
+ for (const item of candidates) {
71
+ if (isViewer(item.author) || item.body.trim() === '' || handled.has(itemKey(item)))
72
+ continue;
73
+ let trusted = trust.get(item.author);
74
+ if (trusted === undefined) {
75
+ trusted = await isTrusted(item.author);
76
+ trust.set(item.author, trusted);
77
+ }
78
+ if (trusted)
79
+ items.push(item);
80
+ }
81
+ return items.sort((a, b) => a.id - b.id);
82
+ }
83
+ const failClosed = (item) => ({
84
+ id: item.id,
85
+ kind: item.kind,
86
+ verdict: 'actionable',
87
+ changesSpec: false,
88
+ summary: '',
89
+ });
90
+ function renderItem(item) {
91
+ const where = item.path === undefined ? '' : `${item.path}${item.line === undefined ? '' : `:${item.line}`} `;
92
+ return `- ${item.kind} ${item.id} ${where}(@${item.author}):\n ${item.body}`;
93
+ }
94
+ /** One model call over every item; any parse failure, or a missing or unknown id, falls back to actionable. */
95
+ export async function triageFeedback(opts) {
96
+ const { items, spec, run } = opts;
97
+ if (items.length === 0)
98
+ return [];
99
+ const prompt = [
100
+ 'You triage review feedback on a pull request the factory opened. Judge each item against the frozen spec below.',
101
+ 'For every item answer with a verdict:',
102
+ '- "actionable": it asks for a code or doc change in scope of this PR.',
103
+ '- "question": it asks something to answer; put the reply in "answer".',
104
+ '- "out-of-scope": it asks for work outside this PR; put the reason in "reason".',
105
+ 'Set "changesSpec" to true only when an actionable item changes the PR\'s goal, scope or acceptance criteria.',
106
+ 'Put a one-line description of the change (actionable) in "summary".',
107
+ 'Reply with one JSON object: {"items":[{"id":<number>,"kind":"review"|"inline"|"comment","verdict":...,"changesSpec":<boolean>,"summary":"...","answer":"...","reason":"..."}]} and nothing else.',
108
+ '',
109
+ '## Frozen spec',
110
+ spec,
111
+ '',
112
+ '## Feedback items',
113
+ UNTRUSTED_REVIEW_FEEDBACK_NOTICE,
114
+ ...items.map((item) => wrapUntrustedReviewFeedback(renderItem(item))),
115
+ ].join('\n');
116
+ const byKey = new Map();
117
+ try {
118
+ const { output } = await run(prompt);
119
+ const json = extractJsonObject(output);
120
+ const parsed = json === undefined ? undefined : JSON.parse(json);
121
+ const raw = typeof parsed === 'object' && parsed !== null && 'items' in parsed ? parsed.items : undefined;
122
+ for (const entry of Array.isArray(raw) ? raw : []) {
123
+ const d = DispositionSchema.safeParse(entry);
124
+ if (d.success)
125
+ byKey.set(itemKey(d.data), d.data);
126
+ }
127
+ }
128
+ catch {
129
+ // unparsable or failed triage reads as no dispositions, so every item fails closed
130
+ }
131
+ return items.map((item) => byKey.get(itemKey(item)) ?? failClosed(item));
132
+ }
133
+ const dispositionFor = (dispositions, item) => dispositions.find((d) => d.kind === item.kind && d.id === item.id);
134
+ /** The actionable items as a one-result CheckSummary for the rework worker; undefined when nothing is actionable. */
135
+ export function feedbackReworkSummary(items, dispositions) {
136
+ const actionable = items.filter((i) => dispositionFor(dispositions, i)?.verdict === 'actionable');
137
+ if (actionable.length === 0)
138
+ return undefined;
139
+ let inner = ['Feedback to address on the open PR:', ...actionable.map(renderItem)].join('\n');
140
+ if (inner.length > FEEDBACK_MAX_CHARS)
141
+ inner = `${inner.slice(0, FEEDBACK_MAX_CHARS)}\n… (feedback truncated)`;
142
+ return {
143
+ failures: 1,
144
+ passes: 0,
145
+ skips: 0,
146
+ total: 1,
147
+ results: [
148
+ {
149
+ checker: 'review_feedback',
150
+ result: 'FAIL',
151
+ details: `${UNTRUSTED_REVIEW_FEEDBACK_NOTICE}\n${wrapUntrustedReviewFeedback(inner)}`,
152
+ },
153
+ ],
154
+ };
155
+ }
156
+ /** Reads, triages and plans one round; throws ReviewReworkError unless the PR is open. */
157
+ export async function prepareFeedbackRound(opts) {
158
+ const { github, target, spec, isTrusted, run, log } = opts;
159
+ const pull = await github.getPull(target.prNumber);
160
+ if (pull.state !== 'open') {
161
+ throw new ReviewReworkError(`PR #${target.prNumber} must be open for a feedback round; found ${pull.state}`);
162
+ }
163
+ const items = await collectFeedbackItems({ github, prNumber: target.prNumber, isTrusted });
164
+ const dispositions = await triageFeedback({ items, spec, run });
165
+ const count = (verdict) => dispositions.filter((d) => d.verdict === verdict).length;
166
+ log('feedback_round_triaged', `PR #${target.prNumber}: ${items.length} feedback item(s) — ${count('actionable')} actionable, ${count('question')} question, ${count('out-of-scope')} out-of-scope`);
167
+ const excluded = new Set([pull.author.toLowerCase(), (await github.viewerLogin()).toLowerCase()]);
168
+ const reviewers = [...new Set(items.map((i) => i.author))].filter((a) => !excluded.has(a.toLowerCase()));
169
+ return {
170
+ prNumber: target.prNumber,
171
+ items,
172
+ dispositions,
173
+ replan: dispositions.some((d) => d.verdict === 'actionable' && d.changesSpec),
174
+ reviewers,
175
+ summary: feedbackReworkSummary(items, dispositions),
176
+ };
177
+ }
178
+ /** The reply posted where the item was left, ending in the handled marker. */
179
+ export function renderFeedbackReply(item, disposition, ctx) {
180
+ let text;
181
+ if (disposition.verdict === 'actionable') {
182
+ const fixed = ctx.headSha === undefined
183
+ ? 'Fixed in the latest push'
184
+ : `Fixed in [\`${ctx.headSha.slice(0, 7)}\`](https://github.com/${ctx.repo}/commit/${ctx.headSha})`;
185
+ text = disposition.summary === '' ? fixed : `${fixed}: ${disposition.summary}`;
186
+ }
187
+ else if (disposition.verdict === 'question') {
188
+ text =
189
+ disposition.answer ?? 'Thanks for the question; see the PR description for the reasoning behind this change.';
190
+ }
191
+ else {
192
+ text = `Not changed: ${disposition.reason ?? 'this is outside the scope of this PR.'}`;
193
+ if (disposition.followUpIssue !== undefined)
194
+ text += `\n\nFollow-up: #${disposition.followUpIssue}`;
195
+ }
196
+ const quote = item.kind === 'inline' ? [] : [`> [@${item.author}](${item.url})`, ''];
197
+ return [...quote, text, '', feedbackHandledMarker(item)].join('\n');
198
+ }
199
+ function withRevisedSpec(body, summary) {
200
+ const block = `${REVISED_SPEC_OPEN}\n## Revised spec\n\n${summary}\n${REVISED_SPEC_CLOSE}`;
201
+ const start = body.indexOf(REVISED_SPEC_OPEN);
202
+ const end = body.indexOf(REVISED_SPEC_CLOSE);
203
+ if (start >= 0 && end > start)
204
+ return `${body.slice(0, start)}${block}${body.slice(end + REVISED_SPEC_CLOSE.length)}`;
205
+ return body === '' ? block : `${body}\n\n${block}`;
206
+ }
207
+ /** Replies to every item, records a revised spec, resolves fixed threads and re-requests review; GitHub errors warn and continue. */
208
+ export async function publishFeedbackRound(opts) {
209
+ const { github, plan, repo, headSha, revisedSpecSummary, log } = opts;
210
+ const warn = (what, err) => log('rework', `feedback round: ${what} failed — ${errorMessage(err)}`);
211
+ const replied = new Set();
212
+ for (const item of plan.items) {
213
+ const disposition = dispositionFor(plan.dispositions, item) ?? failClosed(item);
214
+ const body = renderFeedbackReply(item, disposition, { repo, headSha });
215
+ try {
216
+ if (item.kind === 'inline')
217
+ await github.replyToReviewComment(plan.prNumber, item.inReplyTo ?? item.id, body);
218
+ else
219
+ await github.postIssueComment(plan.prNumber, body);
220
+ replied.add(itemKey(item));
221
+ }
222
+ catch (err) {
223
+ warn(`reply to ${itemKey(item)}`, err);
224
+ }
225
+ }
226
+ if (revisedSpecSummary !== undefined) {
227
+ try {
228
+ const pull = await github.getPull(plan.prNumber);
229
+ await github.updatePullBody(plan.prNumber, withRevisedSpec(pull.body, revisedSpecSummary));
230
+ }
231
+ catch (err) {
232
+ warn('revised-spec update of the PR body', err);
233
+ }
234
+ }
235
+ const toResolve = new Set();
236
+ for (const item of plan.items) {
237
+ const verdict = dispositionFor(plan.dispositions, item)?.verdict ?? 'actionable';
238
+ if (item.kind === 'inline' && verdict === 'actionable' && item.threadId && replied.has(itemKey(item))) {
239
+ toResolve.add(item.threadId);
240
+ }
241
+ }
242
+ let resolved = 0;
243
+ if (toResolve.size > 0) {
244
+ try {
245
+ const open = new Set((await github.listReviewThreads(plan.prNumber)).filter((t) => !t.isResolved).map((t) => t.threadId));
246
+ for (const threadId of toResolve) {
247
+ if (!open.has(threadId))
248
+ continue;
249
+ try {
250
+ await github.resolveThread(threadId);
251
+ resolved++;
252
+ }
253
+ catch (err) {
254
+ warn(`resolving thread ${threadId}`, err);
255
+ }
256
+ }
257
+ }
258
+ catch (err) {
259
+ warn('listing review threads', err);
260
+ }
261
+ }
262
+ let reviewersRequested = [];
263
+ if (plan.reviewers.length > 0) {
264
+ try {
265
+ await github.requestReviewers(plan.prNumber, plan.reviewers);
266
+ reviewersRequested = [...plan.reviewers];
267
+ }
268
+ catch (err) {
269
+ warn('re-requesting review', err);
270
+ }
271
+ }
272
+ log('feedback_round_replied', `PR #${plan.prNumber}: replied to ${replied.size}/${plan.items.length} item(s), resolved ${resolved} thread(s), re-requested review from ${reviewersRequested.length} reviewer(s)`);
273
+ return { replied: replied.size, resolved, reviewersRequested };
274
+ }
275
+ //# sourceMappingURL=feedback-round.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-round.js","sourceRoot":"","sources":["../../src/run/feedback-round.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ export function countReviewReworkRuns(store, issue) {
12
12
  }
13
13
  export function reviewReworkCapMessage(input) {
14
14
  const { issue, pr, cap, count, reviewIds } = input;
15
- const what = input.source === 'comment' ? 'comment' : 'review';
15
+ const what = input.source === 'comment' ? 'comment' : input.source === 'feedback' ? 'feedback round' : 'review';
16
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}\`.`;
17
17
  }
18
18
  export async function parkAtReviewReworkCap(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,KAOtC;IACC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/D,OAAO,IAAI,KAAK,YAAY,KAAK,4BAA4B,GAAG,wCAAwC,EAAE,IAAI,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,8EAA8E,KAAK,KAAK,CAAC;AACrO,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAa3C;IACC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACpF,IAAI,MAAM;QAAE,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG;QACZ,KAAK;QACL,MAAM,EAAE,UAAmB;QAC3B,OAAO,EAAE,sBAAsB,CAAC,IAAI,CAAC;QACrC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;IACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACtH,CAAC"}
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,KAOtC;IACC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChH,OAAO,IAAI,KAAK,YAAY,KAAK,4BAA4B,GAAG,wCAAwC,EAAE,IAAI,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,8EAA8E,KAAK,KAAK,CAAC;AACrO,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAa3C;IACC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACpF,IAAI,MAAM;QAAE,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG;QACZ,KAAK;QACL,MAAM,EAAE,UAAmB;QAC3B,OAAO,EAAE,sBAAsB,CAAC,IAAI,CAAC;QACrC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;IACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACtH,CAAC"}
@@ -1,6 +1,7 @@
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;
@@ -21,6 +22,10 @@ export interface ReworkRequestFields {
21
22
  reviewRework?: ReviewReworkTarget;
22
23
  /** #3625: a /factory iterate comment — skip PLAN/BUILD and re-run CHECK/rework on the PR branch. */
23
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[];
24
29
  }
25
30
  export interface ReviewFeedback {
26
31
  prNumber: number;
@@ -58,7 +63,7 @@ export declare function renderReviewFeedback(feedback: ReviewFeedback): string;
58
63
  /** The review as a one-result CheckSummary, the same shape ciReworkSummary gives the rework worker. */
59
64
  export declare function reviewReworkSummary(feedback: ReviewFeedback): CheckSummary;
60
65
  /** A synthetic CHECK resume: skips PLAN and BUILD for a review-rework run. */
61
- 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;
62
67
  export declare function runReviewReworkBuild(opts: {
63
68
  target: ReviewReworkTarget;
64
69
  repo: string;
@@ -70,5 +75,5 @@ export declare function runReviewReworkBuild(opts: {
70
75
  feedback: ReviewFeedback;
71
76
  }>;
72
77
  /** runIssue's hook before the first CHECK: reworks the requested review unless a CHECK resume was asked for. */
73
- 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>;
74
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":"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"}
1
+ {"version":3,"file":"review-rework.d.ts","sourceRoot":"","sources":["../../src/run/review-rework.ts"],"names":[],"mappings":"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"}