@cat-factory/orchestration 0.315.0 → 0.317.0

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 (28) hide show
  1. package/dist/container/dependencies.d.ts +18 -1
  2. package/dist/container/dependencies.d.ts.map +1 -1
  3. package/dist/container/engine-collaborators.d.ts.map +1 -1
  4. package/dist/container/engine-collaborators.js +2 -0
  5. package/dist/container/engine-collaborators.js.map +1 -1
  6. package/dist/container/guided-review-module.d.ts +14 -0
  7. package/dist/container/guided-review-module.d.ts.map +1 -0
  8. package/dist/container/guided-review-module.js +27 -0
  9. package/dist/container/guided-review-module.js.map +1 -0
  10. package/dist/container.d.ts +4 -0
  11. package/dist/container.d.ts.map +1 -1
  12. package/dist/container.js.map +1 -1
  13. package/dist/index.d.ts +2 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/modules/guidedReview/GuidedReviewService.d.ts +119 -0
  17. package/dist/modules/guidedReview/GuidedReviewService.d.ts.map +1 -0
  18. package/dist/modules/guidedReview/GuidedReviewService.js +543 -0
  19. package/dist/modules/guidedReview/GuidedReviewService.js.map +1 -0
  20. package/dist/modules/guidedReview/PrExplorer.d.ts +41 -0
  21. package/dist/modules/guidedReview/PrExplorer.d.ts.map +1 -0
  22. package/dist/modules/guidedReview/PrExplorer.js +129 -0
  23. package/dist/modules/guidedReview/PrExplorer.js.map +1 -0
  24. package/dist/modules/guidedReview/guidedReview.logic.d.ts +78 -0
  25. package/dist/modules/guidedReview/guidedReview.logic.d.ts.map +1 -0
  26. package/dist/modules/guidedReview/guidedReview.logic.js +226 -0
  27. package/dist/modules/guidedReview/guidedReview.logic.js.map +1 -0
  28. package/package.json +11 -11
@@ -0,0 +1,129 @@
1
+ import { getErrorMessage, redactSecrets } from '@cat-factory/kernel';
2
+ export const DEFAULT_PR_EXPLORER_LIMITS = {
3
+ maxReads: 40,
4
+ maxFileLines: 400,
5
+ maxChars: 40_000,
6
+ };
7
+ /**
8
+ * Reads one pull request for a guided-review model call, pinned to the reviewed head. Every
9
+ * answer is text the model reads directly: the content, or the sentence saying why there is
10
+ * none, so an unreadable file is a stated fact rather than an aborted generation. Content is
11
+ * scrubbed of secrets before the model sees it, since answers are stored and shown.
12
+ */
13
+ export class PrExplorer {
14
+ repo;
15
+ target;
16
+ files;
17
+ limits;
18
+ reads = 0;
19
+ byPath;
20
+ constructor(repo, target, files, limits = DEFAULT_PR_EXPLORER_LIMITS) {
21
+ this.repo = repo;
22
+ this.target = target;
23
+ this.files = files;
24
+ this.limits = limits;
25
+ this.byPath = new Map(files.map((f) => [f.path, f]));
26
+ }
27
+ /** Reads this job has spent, for the caller's telemetry. */
28
+ get readsUsed() {
29
+ return this.reads;
30
+ }
31
+ async listChangedFiles() {
32
+ return this.charge(async () => {
33
+ if (this.files.length === 0)
34
+ return 'The pull request changes no files.';
35
+ return this.files
36
+ .map((f) => {
37
+ const stats = f.additions === null && f.deletions === null
38
+ ? ''
39
+ : ` (+${f.additions ?? '?'} -${f.deletions ?? '?'})`;
40
+ const from = f.previousPath && f.previousPath !== f.path ? ` from ${f.previousPath}` : '';
41
+ return `${f.status} ${f.path}${from}${stats}`;
42
+ })
43
+ .join('\n');
44
+ });
45
+ }
46
+ async readDiff(path) {
47
+ return this.charge(async () => {
48
+ const file = this.byPath.get(normalizePath(path));
49
+ if (!file)
50
+ return `\`${path}\` is not a file this pull request changes.`;
51
+ if (file.patch === null) {
52
+ return (`The host returned no patch for \`${path}\` (a binary file, or a diff too large to ` +
53
+ 'inline). Read the file itself with `read_file` on each side instead.');
54
+ }
55
+ return this.bound(scrub(file.patch), `the patch of \`${path}\``);
56
+ });
57
+ }
58
+ async readFile(request) {
59
+ return this.charge(async () => {
60
+ const path = normalizePath(request.path);
61
+ const ref = request.side === 'base' ? this.target.baseRef : this.target.headSha;
62
+ const where = request.side === 'base' ? `the target branch \`${ref}\`` : 'the PR head';
63
+ let file;
64
+ try {
65
+ file = await this.repo.getFile(path, ref);
66
+ }
67
+ catch (error) {
68
+ return `Reading \`${path}\` on ${where} failed: ${getErrorMessage(error)}`;
69
+ }
70
+ if (!file)
71
+ return `There is no file \`${path}\` on ${where}.`;
72
+ if (file.lossy)
73
+ return `\`${path}\` is not a text file, so it cannot be shown.`;
74
+ return this.renderLines(path, scrub(file.content), request.startLine, request.endLine);
75
+ });
76
+ }
77
+ async listDirectory(path) {
78
+ return this.charge(async () => {
79
+ const dir = normalizePath(path);
80
+ let entries;
81
+ try {
82
+ entries = await this.repo.listDirectory(dir, this.target.headSha);
83
+ }
84
+ catch (error) {
85
+ return `Listing \`${dir || '.'}\` failed: ${getErrorMessage(error)}`;
86
+ }
87
+ if (entries.length === 0)
88
+ return `\`${dir || '.'}\` is empty or does not exist at the PR head.`;
89
+ const lines = entries.map((e) => `${e.type === 'dir' ? 'dir ' : 'file'} ${e.path}`);
90
+ return this.bound(lines.join('\n'), `the listing of \`${dir || '.'}\``);
91
+ });
92
+ }
93
+ async charge(read) {
94
+ if (this.reads >= this.limits.maxReads) {
95
+ return (`The read budget for this reply is spent (${this.limits.maxReads} reads). Answer from ` +
96
+ 'what you have read, and say what you could not check.');
97
+ }
98
+ this.reads += 1;
99
+ return read();
100
+ }
101
+ renderLines(path, content, startLine, endLine) {
102
+ const lines = content.split('\n');
103
+ const first = Math.min(Math.max(startLine ?? 1, 1), Math.max(lines.length, 1));
104
+ const requestedLast = Math.min(endLine ?? lines.length, lines.length);
105
+ const last = Math.min(requestedLast, first + this.limits.maxFileLines - 1);
106
+ const numbered = lines
107
+ .slice(first - 1, last)
108
+ .map((line, i) => `${first + i}: ${line}`)
109
+ .join('\n');
110
+ const header = `\`${path}\` lines ${first}-${last} of ${lines.length}`;
111
+ const rest = last < requestedLast
112
+ ? `\n(Truncated at ${this.limits.maxFileLines} lines; read from line ${last + 1} for more.)`
113
+ : '';
114
+ return this.bound(`${header}\n${numbered}${rest}`, header);
115
+ }
116
+ bound(text, what) {
117
+ if (text.length <= this.limits.maxChars)
118
+ return text;
119
+ return (`${text.slice(0, this.limits.maxChars)}\n(${what} was cut at ${this.limits.maxChars} ` +
120
+ `characters; ${text.length - this.limits.maxChars} more were not shown. Read a narrower range.)`);
121
+ }
122
+ }
123
+ function normalizePath(path) {
124
+ return path.trim().replace(/^\.?\/+/, '');
125
+ }
126
+ function scrub(text) {
127
+ return redactSecrets(text) ?? '';
128
+ }
129
+ //# sourceMappingURL=PrExplorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrExplorer.js","sourceRoot":"","sources":["../../../src/modules/guidedReview/PrExplorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { type GuidedReviewAnchor, type GuidedReviewDiffSide, type GuidedReviewDraftReport, type GuidedReviewMessage, type GuidedReviewOverviewContent } from '@cat-factory/contracts';
2
+ import type { GuidedReviewTurn } from '@cat-factory/agents';
3
+ import type { GitHubChangedFile } from '@cat-factory/kernel';
4
+ /** How long a claimed job may run before another driver may take it over. */
5
+ export declare const GUIDED_REVIEW_LEASE_MS: number;
6
+ /** One model loop ends inside the lease, so a sweeper never takes over a live generation. */
7
+ export declare const GUIDED_REVIEW_GENERATION_TIMEOUT_MS: number;
8
+ /** Prompt budgets: how much PR material and thread history one call is handed up front. */
9
+ export declare const OVERVIEW_INLINE_PATCH_CHARS = 60000;
10
+ export declare const THREAD_HISTORY_CHARS = 40000;
11
+ /** Model-loop bounds per job kind. The final step forbids tools so the loop ends on a reply. */
12
+ export declare const GUIDED_REVIEW_MAX_STEPS: {
13
+ readonly overview: 24;
14
+ readonly answer: 16;
15
+ readonly drafts: 16;
16
+ };
17
+ /** A proposal the drafting model returned, before anchoring. */
18
+ export interface DraftProposal {
19
+ path: string;
20
+ line: number;
21
+ startLine: number | null;
22
+ side: GuidedReviewDiffSide;
23
+ body: string;
24
+ rationale: string;
25
+ }
26
+ /** Split the changed files' patches into the ones inlined in a prompt and the ones left out. */
27
+ export declare function partitionPatches(files: GitHubChangedFile[], budgetChars: number): {
28
+ inline: {
29
+ path: string;
30
+ patch: string;
31
+ }[];
32
+ omitted: string[];
33
+ };
34
+ /**
35
+ * The thread as the model is shown it: settled messages only, newest kept when the budget binds.
36
+ * A failed or still-pending assistant message is left out, since it holds no answer.
37
+ */
38
+ export declare function threadHistory(messages: GuidedReviewMessage[], budgetChars: number): {
39
+ history: GuidedReviewTurn[];
40
+ omittedTurns: number;
41
+ };
42
+ /** A thread title from its first question: the first line, cut to the title limit. */
43
+ export declare function threadTitleFrom(question: string): string;
44
+ /**
45
+ * The overview the model returned, lenient on shape: entries missing their essentials are dropped,
46
+ * lists are capped, and suggested questions get the ids a client posts back. Null when nothing
47
+ * usable came back.
48
+ */
49
+ export declare function coerceOverview(raw: unknown, newQuestionId: () => string): GuidedReviewOverviewContent | null;
50
+ /** An answer reply: markdown plus the spans it rests on. Null when there is no answer text. */
51
+ export declare function coerceAnswer(raw: unknown): {
52
+ content: string;
53
+ citations: GuidedReviewAnchor[];
54
+ } | null;
55
+ /** The drafting reply's proposals, before anchoring. Incomplete entries are kept for the report. */
56
+ export declare function coerceDraftProposals(raw: unknown): {
57
+ proposals: DraftProposal[];
58
+ incomplete: {
59
+ path: string;
60
+ line: number | null;
61
+ side: GuidedReviewDiffSide;
62
+ }[];
63
+ };
64
+ /**
65
+ * Keep the proposals a host would accept: the path is a file the PR changes and the line sits
66
+ * inside a hunk on that side. A multi-line span that leaves its hunk is narrowed to its last line
67
+ * rather than dropped, since the host refuses a span crossing hunks. Everything refused is named
68
+ * in the report.
69
+ */
70
+ export declare function anchorDrafts(proposals: DraftProposal[], incomplete: {
71
+ path: string;
72
+ line: number | null;
73
+ side: GuidedReviewDiffSide;
74
+ }[], files: GitHubChangedFile[]): {
75
+ kept: DraftProposal[];
76
+ report: GuidedReviewDraftReport;
77
+ };
78
+ //# sourceMappingURL=guidedReview.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidedReview.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/guidedReview/guidedReview.logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAEjC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAI5D,6EAA6E;AAC7E,eAAO,MAAM,sBAAsB,QAAc,CAAA;AAEjD,6FAA6F;AAC7F,eAAO,MAAM,mCAAmC,QAAsC,CAAA;AAEtF,2FAA2F;AAC3F,eAAO,MAAM,2BAA2B,QAAS,CAAA;AACjD,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAE1C,gGAAgG;AAChG,eAAO,MAAM,uBAAuB;aAAK,QAAQ,EAAE,EAAE;aAAE,MAAM,EAAE,EAAE;aAAE,MAAM,EAAE,EAAE;CAAW,CAAA;AAKxF,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,oBAAoB,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAelE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAavD;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxD;AAyCD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,MAAM,MAAM,GAC1B,2BAA2B,GAAG,IAAI,CA+CpC;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAC1B,GAAG,EAAE,OAAO,GACX;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,kBAAkB,EAAE,CAAA;CAAE,GAAG,IAAI,CAQ7D;AAED,oGAAoG;AACpG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG;IAClD,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAA;KAAE,EAAE,CAAA;CAChF,CA6BA;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,aAAa,EAAE,EAC1B,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,EAAE,EAC/E,KAAK,EAAE,iBAAiB,EAAE,GACzB;IAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,CA2B5D"}
@@ -0,0 +1,226 @@
1
+ import { GUIDED_REVIEW_ANSWER_MAX, GUIDED_REVIEW_COMMENT_MAX, GUIDED_REVIEW_LIST_MAX, GUIDED_REVIEW_PROSE_MAX, GUIDED_REVIEW_TITLE_MAX, parseGuidedReviewAnchor, parseGuidedReviewOverviewContent, } from '@cat-factory/contracts';
2
+ import { redactSecrets } from '@cat-factory/kernel';
3
+ import { computeCommentableLines } from '../execution/prReview.logic.js';
4
+ /** How long a claimed job may run before another driver may take it over. */
5
+ export const GUIDED_REVIEW_LEASE_MS = 10 * 60_000;
6
+ /** One model loop ends inside the lease, so a sweeper never takes over a live generation. */
7
+ export const GUIDED_REVIEW_GENERATION_TIMEOUT_MS = GUIDED_REVIEW_LEASE_MS - 2 * 60_000;
8
+ /** Prompt budgets: how much PR material and thread history one call is handed up front. */
9
+ export const OVERVIEW_INLINE_PATCH_CHARS = 60_000;
10
+ export const THREAD_HISTORY_CHARS = 40_000;
11
+ /** Model-loop bounds per job kind. The final step forbids tools so the loop ends on a reply. */
12
+ export const GUIDED_REVIEW_MAX_STEPS = { overview: 24, answer: 16, drafts: 16 };
13
+ const LIST_MAX = GUIDED_REVIEW_LIST_MAX;
14
+ const PROSE_MAX = GUIDED_REVIEW_PROSE_MAX;
15
+ /** Split the changed files' patches into the ones inlined in a prompt and the ones left out. */
16
+ export function partitionPatches(files, budgetChars) {
17
+ const inline = [];
18
+ const omitted = [];
19
+ let spent = 0;
20
+ for (const file of files) {
21
+ if (file.patch === null)
22
+ continue;
23
+ const patch = redactSecrets(file.patch) ?? '';
24
+ if (spent + patch.length > budgetChars) {
25
+ omitted.push(file.path);
26
+ continue;
27
+ }
28
+ spent += patch.length;
29
+ inline.push({ path: file.path, patch });
30
+ }
31
+ return { inline, omitted };
32
+ }
33
+ /**
34
+ * The thread as the model is shown it: settled messages only, newest kept when the budget binds.
35
+ * A failed or still-pending assistant message is left out, since it holds no answer.
36
+ */
37
+ export function threadHistory(messages, budgetChars) {
38
+ const turns = messages
39
+ .filter((m) => m.status === 'complete' && (m.role === 'user' || m.content.length > 0))
40
+ .map((m) => ({ role: m.role, content: m.content }));
41
+ const kept = [];
42
+ let spent = 0;
43
+ for (let i = turns.length - 1; i >= 0; i--) {
44
+ const turn = turns[i];
45
+ if (kept.length > 0 && spent + turn.content.length > budgetChars)
46
+ break;
47
+ spent += turn.content.length;
48
+ kept.unshift(turn);
49
+ }
50
+ return { history: kept, omittedTurns: turns.length - kept.length };
51
+ }
52
+ /** A thread title from its first question: the first line, cut to the title limit. */
53
+ export function threadTitleFrom(question) {
54
+ const firstLine = question.trim().split('\n')[0] ?? '';
55
+ const limit = Math.min(GUIDED_REVIEW_TITLE_MAX, 80);
56
+ return firstLine.length <= limit ? firstLine : `${firstLine.slice(0, limit - 1)}…`;
57
+ }
58
+ function str(value, max) {
59
+ return typeof value === 'string' ? value.trim().slice(0, max) : '';
60
+ }
61
+ function list(value) {
62
+ return Array.isArray(value) ? value.slice(0, LIST_MAX) : [];
63
+ }
64
+ function record(value) {
65
+ return value && typeof value === 'object' && !Array.isArray(value)
66
+ ? value
67
+ : {};
68
+ }
69
+ function severityOf(value) {
70
+ return value === 'high' || value === 'low' ? value : 'medium';
71
+ }
72
+ function paths(value) {
73
+ return list(value)
74
+ .map((p) => str(p, 1024))
75
+ .filter(Boolean);
76
+ }
77
+ function anchor(value) {
78
+ const raw = record(value);
79
+ const candidate = {
80
+ path: str(raw.path, 1024),
81
+ ...(Number.isInteger(raw.startLine) && raw.startLine >= 1
82
+ ? { startLine: raw.startLine }
83
+ : {}),
84
+ ...(Number.isInteger(raw.endLine) && raw.endLine >= 1
85
+ ? { endLine: raw.endLine }
86
+ : {}),
87
+ ...(raw.side === 'LEFT' || raw.side === 'RIGHT' ? { side: raw.side } : {}),
88
+ };
89
+ return parseGuidedReviewAnchor(candidate);
90
+ }
91
+ /**
92
+ * The overview the model returned, lenient on shape: entries missing their essentials are dropped,
93
+ * lists are capped, and suggested questions get the ids a client posts back. Null when nothing
94
+ * usable came back.
95
+ */
96
+ export function coerceOverview(raw, newQuestionId) {
97
+ const r = record(raw);
98
+ const summary = str(r.summary, PROSE_MAX);
99
+ if (!summary)
100
+ return null;
101
+ const candidate = {
102
+ summary,
103
+ intent: str(r.intent, PROSE_MAX),
104
+ meaningfulChanges: list(r.meaningfulChanges)
105
+ .map(record)
106
+ .map((c) => ({
107
+ title: str(c.title, GUIDED_REVIEW_TITLE_MAX),
108
+ detail: str(c.detail, PROSE_MAX),
109
+ paths: paths(c.paths),
110
+ }))
111
+ .filter((c) => c.title),
112
+ consequences: list(r.consequences)
113
+ .map(record)
114
+ .map((c) => ({
115
+ title: str(c.title, GUIDED_REVIEW_TITLE_MAX),
116
+ detail: str(c.detail, PROSE_MAX),
117
+ }))
118
+ .filter((c) => c.title),
119
+ risks: list(r.risks)
120
+ .map(record)
121
+ .map((c) => ({
122
+ title: str(c.title, GUIDED_REVIEW_TITLE_MAX),
123
+ detail: str(c.detail, PROSE_MAX),
124
+ severity: severityOf(c.severity),
125
+ paths: paths(c.paths),
126
+ }))
127
+ .filter((c) => c.title),
128
+ focusAreas: list(r.focusAreas)
129
+ .map(record)
130
+ .map((c) => ({
131
+ title: str(c.title, GUIDED_REVIEW_TITLE_MAX),
132
+ why: str(c.why, PROSE_MAX),
133
+ anchors: list(c.anchors)
134
+ .map(anchor)
135
+ .filter((a) => a !== null),
136
+ }))
137
+ .filter((c) => c.title),
138
+ suggestedQuestions: list(r.suggestedQuestions)
139
+ .map((q) => str(typeof q === 'string' ? q : record(q).question, 1000))
140
+ .filter(Boolean)
141
+ .map((question) => ({ id: newQuestionId(), question })),
142
+ };
143
+ return parseGuidedReviewOverviewContent(candidate);
144
+ }
145
+ /** An answer reply: markdown plus the spans it rests on. Null when there is no answer text. */
146
+ export function coerceAnswer(raw) {
147
+ const r = record(raw);
148
+ const content = str(r.answer, GUIDED_REVIEW_ANSWER_MAX);
149
+ if (!content)
150
+ return null;
151
+ const citations = list(r.citations)
152
+ .map(anchor)
153
+ .filter((a) => a !== null);
154
+ return { content: redactSecrets(content) ?? '', citations };
155
+ }
156
+ /** The drafting reply's proposals, before anchoring. Incomplete entries are kept for the report. */
157
+ export function coerceDraftProposals(raw) {
158
+ const proposals = [];
159
+ const incomplete = [];
160
+ for (const entry of list(record(raw).comments).map(record)) {
161
+ const path = str(entry.path, 1024).replace(/^\.?\/+/, '');
162
+ const side = entry.side === 'LEFT' ? 'LEFT' : 'RIGHT';
163
+ const line = Number.isInteger(entry.line) && entry.line >= 1 ? entry.line : null;
164
+ const body = str(entry.body, GUIDED_REVIEW_COMMENT_MAX);
165
+ if (!path || line === null || !body) {
166
+ incomplete.push({ path: path || '(none)', line, side });
167
+ continue;
168
+ }
169
+ const startLine = Number.isInteger(entry.startLine) &&
170
+ entry.startLine >= 1 &&
171
+ entry.startLine < line
172
+ ? entry.startLine
173
+ : null;
174
+ proposals.push({
175
+ path,
176
+ line,
177
+ startLine,
178
+ side,
179
+ body: redactSecrets(body) ?? '',
180
+ rationale: str(entry.rationale, PROSE_MAX),
181
+ });
182
+ }
183
+ return { proposals, incomplete };
184
+ }
185
+ /**
186
+ * Keep the proposals a host would accept: the path is a file the PR changes and the line sits
187
+ * inside a hunk on that side. A multi-line span that leaves its hunk is narrowed to its last line
188
+ * rather than dropped, since the host refuses a span crossing hunks. Everything refused is named
189
+ * in the report.
190
+ */
191
+ export function anchorDrafts(proposals, incomplete, files) {
192
+ const commentable = computeCommentableLines(files);
193
+ const changed = new Set(files.map((f) => f.path));
194
+ const kept = [];
195
+ const dropped = incomplete.map((d) => ({
196
+ ...d,
197
+ reason: 'incomplete',
198
+ }));
199
+ for (const p of proposals) {
200
+ if (!changed.has(p.path)) {
201
+ dropped.push({ path: p.path, line: p.line, side: p.side, reason: 'not_in_pr' });
202
+ continue;
203
+ }
204
+ const lines = commentable.get(p.path);
205
+ const sideLines = p.side === 'RIGHT' ? lines?.right : lines?.left;
206
+ if (!sideLines?.has(p.line)) {
207
+ dropped.push({ path: p.path, line: p.line, side: p.side, reason: 'outside_diff' });
208
+ continue;
209
+ }
210
+ const startLine = p.startLine !== null && spanWithinHunk(sideLines, p.startLine, p.line) ? p.startLine : null;
211
+ kept.push({ ...p, startLine });
212
+ }
213
+ return {
214
+ kept,
215
+ report: { proposed: proposals.length + incomplete.length, dropped: dropped.slice(0, LIST_MAX) },
216
+ };
217
+ }
218
+ /** Whether every line of `start..end` is commentable on one side, which holds only inside a hunk. */
219
+ function spanWithinHunk(sideLines, start, end) {
220
+ for (let line = start; line <= end; line++) {
221
+ if (!sideLines.has(line))
222
+ return false;
223
+ }
224
+ return true;
225
+ }
226
+ //# sourceMappingURL=guidedReview.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidedReview.logic.js","sourceRoot":"","sources":["../../../src/modules/guidedReview/guidedReview.logic.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/orchestration",
3
- "version": "0.315.0",
3
+ "version": "0.317.0",
4
4
  "description": "Delivery-workflow engine for the Agent Architecture Board (execution, bootstrap, pipelines, board, boardScan, requirements, and composition root).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,19 +24,19 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "@cat-factory/agents": "0.168.3",
28
- "@cat-factory/caching": "0.20.91",
29
- "@cat-factory/contracts": "0.357.0",
30
- "@cat-factory/integrations": "0.174.6",
31
- "@cat-factory/kernel": "0.352.0",
32
- "@cat-factory/prompt-fragments": "1.1.53",
33
- "@cat-factory/sandbox": "0.12.66",
34
- "@cat-factory/spend": "0.23.2",
35
- "@cat-factory/workspaces": "0.29.14",
27
+ "@cat-factory/agents": "0.169.0",
28
+ "@cat-factory/caching": "0.20.93",
29
+ "@cat-factory/contracts": "0.359.0",
30
+ "@cat-factory/integrations": "0.174.8",
31
+ "@cat-factory/kernel": "0.354.0",
32
+ "@cat-factory/prompt-fragments": "1.1.55",
33
+ "@cat-factory/sandbox": "0.12.68",
34
+ "@cat-factory/spend": "0.23.4",
35
+ "@cat-factory/workspaces": "0.29.16",
36
36
  "ai": "^7.0.120"
37
37
  },
38
38
  "devDependencies": {
39
- "@cat-factory/sandbox-fixtures": "0.8.42",
39
+ "@cat-factory/sandbox-fixtures": "0.8.44",
40
40
  "typescript": "7.0.2",
41
41
  "vitest": "^4.1.11"
42
42
  },