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

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 (81) hide show
  1. package/dist/config/index.d.ts +1 -0
  2. package/dist/config/index.d.ts.map +1 -1
  3. package/dist/config/index.js +8 -1
  4. package/dist/config/index.js.map +1 -1
  5. package/dist/events/queue-traits.d.ts +1 -1
  6. package/dist/events/queue-traits.d.ts.map +1 -1
  7. package/dist/events/queue-traits.js +4 -1
  8. package/dist/events/queue-traits.js.map +1 -1
  9. package/dist/fakes/octokit.d.ts +13 -1
  10. package/dist/fakes/octokit.d.ts.map +1 -1
  11. package/dist/fakes/octokit.js +13 -0
  12. package/dist/fakes/octokit.js.map +1 -1
  13. package/dist/internal.d.ts +3 -0
  14. package/dist/internal.d.ts.map +1 -1
  15. package/dist/internal.js +4 -0
  16. package/dist/internal.js.map +1 -1
  17. package/dist/kpis/phase.d.ts.map +1 -1
  18. package/dist/kpis/phase.js +1 -0
  19. package/dist/kpis/phase.js.map +1 -1
  20. package/dist/phases/ship-open-pr.d.ts.map +1 -1
  21. package/dist/phases/ship-open-pr.js +2 -2
  22. package/dist/phases/ship-open-pr.js.map +1 -1
  23. package/dist/phases/ship-options.d.ts +3 -0
  24. package/dist/phases/ship-options.d.ts.map +1 -1
  25. package/dist/phases/ship-options.js.map +1 -1
  26. package/dist/phases/stack-order.d.ts +9 -0
  27. package/dist/phases/stack-order.d.ts.map +1 -1
  28. package/dist/phases/stack-order.js +13 -0
  29. package/dist/phases/stack-order.js.map +1 -1
  30. package/dist/queue/github-queue.d.ts +4 -2
  31. package/dist/queue/github-queue.d.ts.map +1 -1
  32. package/dist/queue/github-queue.js.map +1 -1
  33. package/dist/queue/internal-exports.d.ts +1 -0
  34. package/dist/queue/internal-exports.d.ts.map +1 -1
  35. package/dist/queue/internal-exports.js +1 -0
  36. package/dist/queue/internal-exports.js.map +1 -1
  37. package/dist/queue/prerequisite-stack.d.ts +47 -0
  38. package/dist/queue/prerequisite-stack.d.ts.map +1 -0
  39. package/dist/queue/prerequisite-stack.js +41 -0
  40. package/dist/queue/prerequisite-stack.js.map +1 -0
  41. package/dist/queue/review-rework-trigger.d.ts +2 -2
  42. package/dist/queue/review-rework-trigger.d.ts.map +1 -1
  43. package/dist/queue/review-rework-trigger.js +6 -2
  44. package/dist/queue/review-rework-trigger.js.map +1 -1
  45. package/dist/run/ci-rework-loop.d.ts.map +1 -1
  46. package/dist/run/ci-rework-loop.js +4 -1
  47. package/dist/run/ci-rework-loop.js.map +1 -1
  48. package/dist/run/feedback-github.d.ts +50 -0
  49. package/dist/run/feedback-github.d.ts.map +1 -0
  50. package/dist/run/feedback-github.js +87 -0
  51. package/dist/run/feedback-github.js.map +1 -0
  52. package/dist/run/feedback-round-hooks.d.ts +19 -0
  53. package/dist/run/feedback-round-hooks.d.ts.map +1 -0
  54. package/dist/run/feedback-round-hooks.js +106 -0
  55. package/dist/run/feedback-round-hooks.js.map +1 -0
  56. package/dist/run/feedback-round.d.ts +97 -0
  57. package/dist/run/feedback-round.d.ts.map +1 -0
  58. package/dist/run/feedback-round.js +275 -0
  59. package/dist/run/feedback-round.js.map +1 -0
  60. package/dist/run/prerequisite-restack.d.ts +39 -0
  61. package/dist/run/prerequisite-restack.d.ts.map +1 -0
  62. package/dist/run/prerequisite-restack.js +79 -0
  63. package/dist/run/prerequisite-restack.js.map +1 -0
  64. package/dist/run/review-rework-cap.js +1 -1
  65. package/dist/run/review-rework-cap.js.map +1 -1
  66. package/dist/run/review-rework.d.ts +7 -2
  67. package/dist/run/review-rework.d.ts.map +1 -1
  68. package/dist/run/review-rework.js +66 -30
  69. package/dist/run/review-rework.js.map +1 -1
  70. package/dist/run/run-issue.d.ts +3 -0
  71. package/dist/run/run-issue.d.ts.map +1 -1
  72. package/dist/run/run-issue.js +13 -7
  73. package/dist/run/run-issue.js.map +1 -1
  74. package/dist/run/stack-rebase.d.ts +28 -0
  75. package/dist/run/stack-rebase.d.ts.map +1 -0
  76. package/dist/run/stack-rebase.js +79 -0
  77. package/dist/run/stack-rebase.js.map +1 -0
  78. package/dist/run/stack-restack.d.ts.map +1 -1
  79. package/dist/run/stack-restack.js +21 -49
  80. package/dist/run/stack-restack.js.map +1 -1
  81. package/package.json +5 -5
@@ -0,0 +1,50 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ export interface FeedbackPull {
3
+ state: string;
4
+ headRef: string;
5
+ author: string;
6
+ body: string;
7
+ }
8
+ export interface FeedbackReview {
9
+ id: number;
10
+ login: string;
11
+ state: string;
12
+ body: string;
13
+ htmlUrl: string;
14
+ }
15
+ export interface FeedbackReviewComment {
16
+ id: number;
17
+ reviewId: number;
18
+ inReplyTo?: number;
19
+ login: string;
20
+ path: string;
21
+ line?: number;
22
+ body: string;
23
+ htmlUrl: string;
24
+ }
25
+ export interface FeedbackIssueComment {
26
+ id: number;
27
+ login: string;
28
+ body: string;
29
+ htmlUrl: string;
30
+ }
31
+ export interface FeedbackReviewThread {
32
+ threadId: string;
33
+ isResolved: boolean;
34
+ commentIds: number[];
35
+ }
36
+ export interface FeedbackRoundGitHub {
37
+ getPull(pr: number): Promise<FeedbackPull>;
38
+ listReviews(pr: number): Promise<FeedbackReview[]>;
39
+ listReviewComments(pr: number): Promise<FeedbackReviewComment[]>;
40
+ listIssueComments(pr: number): Promise<FeedbackIssueComment[]>;
41
+ listReviewThreads(pr: number): Promise<FeedbackReviewThread[]>;
42
+ viewerLogin(): Promise<string>;
43
+ replyToReviewComment(pr: number, commentId: number, body: string): Promise<void>;
44
+ postIssueComment(pr: number, body: string): Promise<void>;
45
+ resolveThread(threadId: string): Promise<void>;
46
+ requestReviewers(pr: number, logins: readonly string[]): Promise<void>;
47
+ updatePullBody(pr: number, body: string): Promise<void>;
48
+ }
49
+ export declare function createOctokitFeedbackRoundGitHub(octokit: Octokit, owner: string, repo: string): FeedbackRoundGitHub;
50
+ //# sourceMappingURL=feedback-github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-github.d.ts","sourceRoot":"","sources":["../../src/run/feedback-github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACjE,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/D,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC/D,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AA0BD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAwEnH"}
@@ -0,0 +1,87 @@
1
+ const THREADS_QUERY = `query($owner: String!, $repo: String!, $pr: Int!) {
2
+ repository(owner: $owner, name: $repo) {
3
+ pullRequest(number: $pr) {
4
+ reviewThreads(first: 100) {
5
+ nodes { id isResolved comments(first: 100) { nodes { databaseId } } }
6
+ }
7
+ }
8
+ }
9
+ }`;
10
+ const RESOLVE_MUTATION = `mutation($threadId: ID!) {
11
+ resolveReviewThread(input: { threadId: $threadId }) { thread { id isResolved } }
12
+ }`;
13
+ export function createOctokitFeedbackRoundGitHub(octokit, owner, repo) {
14
+ const base = (pr) => ({ owner, repo, pull_number: pr });
15
+ return {
16
+ async getPull(pr) {
17
+ const { data } = await octokit.rest.pulls.get(base(pr));
18
+ return { state: data.state, headRef: data.head.ref, author: data.user?.login ?? '', body: data.body ?? '' };
19
+ },
20
+ async listReviews(pr) {
21
+ const rows = await octokit.paginate(octokit.rest.pulls.listReviews, { ...base(pr), per_page: 100 });
22
+ return rows.map((r) => ({
23
+ id: r.id,
24
+ login: r.user?.login ?? '',
25
+ state: r.state,
26
+ body: r.body ?? '',
27
+ htmlUrl: r.html_url,
28
+ }));
29
+ },
30
+ async listReviewComments(pr) {
31
+ const rows = await octokit.paginate(octokit.rest.pulls.listReviewComments, { ...base(pr), per_page: 100 });
32
+ return rows.map((c) => ({
33
+ id: c.id,
34
+ reviewId: c.pull_request_review_id ?? 0,
35
+ ...(c.in_reply_to_id === undefined ? {} : { inReplyTo: c.in_reply_to_id }),
36
+ login: c.user?.login ?? '',
37
+ path: c.path,
38
+ ...((c.line ?? c.original_line) == null ? {} : { line: c.line ?? c.original_line ?? undefined }),
39
+ body: c.body,
40
+ htmlUrl: c.html_url,
41
+ }));
42
+ },
43
+ async listIssueComments(pr) {
44
+ const rows = await octokit.paginate(octokit.rest.issues.listComments, {
45
+ owner,
46
+ repo,
47
+ issue_number: pr,
48
+ per_page: 100,
49
+ });
50
+ return rows.map((c) => ({ id: c.id, login: c.user?.login ?? '', body: c.body ?? '', htmlUrl: c.html_url }));
51
+ },
52
+ async listReviewThreads(pr) {
53
+ const res = await octokit.graphql(THREADS_QUERY, { owner, repo, pr });
54
+ const nodes = res.repository?.pullRequest?.reviewThreads?.nodes ?? [];
55
+ return nodes.map((t) => ({
56
+ threadId: t.id,
57
+ isResolved: t.isResolved,
58
+ commentIds: (t.comments?.nodes ?? []).flatMap((c) => (typeof c.databaseId === 'number' ? [c.databaseId] : [])),
59
+ }));
60
+ },
61
+ async viewerLogin() {
62
+ const { data } = await octokit.rest.users.getAuthenticated();
63
+ return data.login;
64
+ },
65
+ async replyToReviewComment(pr, commentId, body) {
66
+ await octokit.rest.pulls.createReplyForReviewComment({ ...base(pr), comment_id: commentId, body });
67
+ },
68
+ async postIssueComment(pr, body) {
69
+ await octokit.rest.issues.createComment({ owner, repo, issue_number: pr, body });
70
+ },
71
+ async resolveThread(threadId) {
72
+ await octokit.graphql(RESOLVE_MUTATION, { threadId });
73
+ },
74
+ async requestReviewers(pr, logins) {
75
+ const { data } = await octokit.rest.pulls.get(base(pr));
76
+ const author = (data.user?.login ?? '').toLowerCase();
77
+ const reviewers = logins.filter((l) => l.toLowerCase() !== author);
78
+ if (reviewers.length === 0)
79
+ return;
80
+ await octokit.rest.pulls.requestReviewers({ ...base(pr), reviewers });
81
+ },
82
+ async updatePullBody(pr, body) {
83
+ await octokit.rest.pulls.update({ ...base(pr), body });
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=feedback-github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-github.js","sourceRoot":"","sources":["../../src/run/feedback-github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type FeedbackRoundPlan } from './feedback-round.js';
2
+ import type { BuildRoute, RunOutcome } from './outcome.js';
3
+ import type { RunLogFn } from './attribution.js';
4
+ import type { RunPorts, RunRequest } from './run-issue.js';
5
+ type HookRequest = Pick<RunRequest, 'feedbackRound' | 'resumeFrom' | 'repo' | 'specPath' | 'work' | 'timeouts' | 'trustedApprovers'>;
6
+ type HookPorts = Pick<RunPorts, 'octokit' | 'router' | 'workspace' | 'gitExec'>;
7
+ type HookLog = RunLogFn;
8
+ /** Reads and triages the PR's unhandled trusted feedback; undefined when this run is not a fresh feedback round. */
9
+ export declare function prepareFeedbackForRun(request: HookRequest, ports: HookPorts, log: HookLog): Promise<FeedbackRoundPlan | undefined>;
10
+ /** The actionable feedback, appended to PLAN's previous-attempt note on a re-plan. */
11
+ export declare function feedbackReplanNote(previous: string, plan: FeedbackRoundPlan | undefined): string;
12
+ /** The new spec's goal and acceptance sections, for the PR body's revised-spec block. */
13
+ export declare function revisedSpecSummary(specPath: string): string | undefined;
14
+ /** Answers every item of the round; GitHub failures warn inside publishFeedbackRound and never fail the run. */
15
+ export declare function publishFeedbackForRun(request: Pick<RunRequest, 'repo' | 'specPath'>, ports: Pick<RunPorts, 'octokit' | 'workspace' | 'gitExec'>, plan: FeedbackRoundPlan | undefined, headSha: string | undefined, log: HookLog): Promise<void>;
16
+ /** With nothing actionable the round only answers its items; the run then ends without CHECK or SHIP. */
17
+ export declare function idleFeedbackRound(plan: FeedbackRoundPlan | undefined, request: Pick<RunRequest, 'repo' | 'specPath' | 'branch'>, ports: Pick<RunPorts, 'octokit' | 'workspace' | 'gitExec'>, route: BuildRoute | undefined, log: HookLog): Promise<RunOutcome | undefined>;
18
+ export {};
19
+ //# sourceMappingURL=feedback-round-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-round-hooks.d.ts","sourceRoot":"","sources":["../../src/run/feedback-round-hooks.ts"],"names":[],"mappings":"AAMA,OAAO,EAA8C,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE3D,KAAK,WAAW,GAAG,IAAI,CACrB,UAAU,EACV,eAAe,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,kBAAkB,CAChG,CAAC;AACF,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC,CAAC;AAChF,KAAK,OAAO,GAAG,QAAQ,CAAC;AAexB,oHAAoH;AACpH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAqBxC;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAIhG;AAeD,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASvE;AAED,gHAAgH;AAChH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAAC,EAC9C,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,EAC1D,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,yGAAyG;AACzG,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC,EACzD,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,EAC1D,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAIjC"}
@@ -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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"}