@urateam/core 0.1.29 → 0.1.30

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.
@@ -0,0 +1,47 @@
1
+ import type { HandoffArtifact } from "../types.js";
2
+ import type { ReviewFeedbackComment } from "../webhook/github-handler.js";
3
+ import type { addPRComment } from "../repo/github.js";
4
+ import type { Logger } from "pino";
5
+ export interface ChangeSummaryInput {
6
+ handoff: HandoffArtifact;
7
+ run: {
8
+ id: string;
9
+ totalInputTokens: number;
10
+ totalOutputTokens: number;
11
+ };
12
+ triggeringComments: ReviewFeedbackComment[];
13
+ dashboardBaseUrl: string;
14
+ /** PR URL — used as the base for fallback comment URL construction. */
15
+ prUrl?: string;
16
+ }
17
+ /**
18
+ * Render the markdown body of the per-PR change-summary comment. Pure
19
+ * function — no I/O, no GitHub calls.
20
+ */
21
+ export declare function renderChangeSummary(input: ChangeSummaryInput): string;
22
+ /**
23
+ * Thin dispatcher called from runner.onPipelineComplete. Decides whether to
24
+ * post the change summary, builds the input, calls renderChangeSummary, and
25
+ * posts via addPRComment. Best-effort: any failure is logged at warn level
26
+ * and the function returns (no throw).
27
+ */
28
+ export interface MaybePostChangeSummaryDeps {
29
+ run: {
30
+ id: string;
31
+ runType?: string | null;
32
+ prUrl?: string | null;
33
+ feedbackContext?: string | null;
34
+ totalInputTokens: number;
35
+ totalOutputTokens: number;
36
+ };
37
+ handoff: HandoffArtifact | null | undefined;
38
+ prNumber: number | null;
39
+ owner: string;
40
+ repo: string;
41
+ octokit: Parameters<typeof addPRComment>[0];
42
+ postPRComment: typeof addPRComment;
43
+ dashboardBaseUrl: string;
44
+ logger: Pick<Logger, "info" | "warn" | "error">;
45
+ }
46
+ export declare function maybePostChangeSummary(deps: MaybePostChangeSummaryDeps): Promise<void>;
47
+ //# sourceMappingURL=pr-change-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-change-summary.d.ts","sourceRoot":"","sources":["../../src/pipeline/pr-change-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAsCnC,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,kBAAkB,EAAE,qBAAqB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CA0DrE;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,OAAO,YAAY,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACjD;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,IAAI,CAAC,CAgFf"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Markdown-special characters escaped before rendering user-controlled
3
+ * strings (author names, file paths, comment bodies). Conservative — escapes
4
+ * anything that could affect markdown rendering.
5
+ */
6
+ // `.` is omitted from the escape set: it is only markdown-special at the
7
+ // start of a line in ordered-list contexts (e.g. `1.`) — not in author
8
+ // names or file-paths rendered inline within link text.
9
+ function escapeMd(s) {
10
+ return s.replace(/[\\`*_{}\[\]()<>#+\-!|]/g, (ch) => `\\${ch}`);
11
+ }
12
+ /** Collapse all newlines (and runs of whitespace) into single spaces. */
13
+ function singleLine(s) {
14
+ return s.replace(/\s+/g, " ").trim();
15
+ }
16
+ /**
17
+ * Build a comment-URL fallback when ReviewFeedbackComment.htmlUrl is missing.
18
+ * Inline review comments (have filePath) are anchored to the Files Changed
19
+ * tab via #discussion_rNNN; general PR comments use #issuecomment-NNN.
20
+ *
21
+ * The base PR URL must be supplied via input.prUrl. If absent, returns "".
22
+ */
23
+ function buildCommentUrl(prUrl, comment) {
24
+ if (comment.htmlUrl)
25
+ return comment.htmlUrl;
26
+ if (!prUrl)
27
+ return "";
28
+ const anchor = comment.filePath
29
+ ? `#discussion_r${comment.commentId}`
30
+ : `#issuecomment-${comment.commentId}`;
31
+ return `${prUrl}${anchor}`;
32
+ }
33
+ /**
34
+ * Render the markdown body of the per-PR change-summary comment. Pure
35
+ * function — no I/O, no GitHub calls.
36
+ */
37
+ export function renderChangeSummary(input) {
38
+ const { handoff, run, triggeringComments, dashboardBaseUrl, prUrl } = input;
39
+ const summary = singleLine(handoff.summary);
40
+ const ctx = handoff.context;
41
+ const addressedById = new Map();
42
+ for (const ac of ctx.addressedComments ?? []) {
43
+ addressedById.set(ac.commentId, ac.response);
44
+ }
45
+ const responseLines = triggeringComments.map((c) => {
46
+ const url = buildCommentUrl(prUrl, c);
47
+ const linkText = c.filePath
48
+ ? `@${escapeMd(c.author)}'s comment on \`${escapeMd(c.filePath)}${c.lineNumber !== undefined ? `:${c.lineNumber}` : ""}\``
49
+ : `@${escapeMd(c.author)}'s general comment`;
50
+ const link = url ? `[${linkText}](${url})` : linkText;
51
+ const response = addressedById.get(c.commentId);
52
+ // Agent-emitted responses are interpolated raw — they are pipeline-
53
+ // controlled output (not third-party user input) and may legitimately
54
+ // contain markdown formatting (e.g. backticks for code references).
55
+ // The agent prompt instructs ≤12 words per response, limiting injection
56
+ // surface. If we ever discover prompt-injection paths from PR comments
57
+ // that survive into `response`, revisit this decision.
58
+ return response ? `- ${link} — ${response}` : `- ${link}`;
59
+ });
60
+ // Show the fallback disclaimer when there are triggering comments but none
61
+ // with a matched response.
62
+ const hasAnyResponse = Array.isArray(ctx.addressedComments) &&
63
+ ctx.addressedComments.length > 0 &&
64
+ triggeringComments.some((c) => addressedById.has(c.commentId));
65
+ const fallbackLine = triggeringComments.length > 0 && !hasAnyResponse
66
+ ? "\n_(per-comment responses unavailable; see diff)_"
67
+ : "";
68
+ const inResponseSection = triggeringComments.length > 0
69
+ ? `\n**In response to:**\n${responseLines.join("\n")}${fallbackLine}\n`
70
+ : "";
71
+ // File paths rendered inside backtick code spans — no markdown escaping needed.
72
+ const filesSection = handoff.filesChanged.length > 0
73
+ ? `\n**Files changed:**\n${handoff.filesChanged.map((f) => `- \`${f}\``).join("\n")}\n`
74
+ : "";
75
+ const runLink = dashboardBaseUrl
76
+ ? `[${run.id}](${dashboardBaseUrl}/runs/${run.id})`
77
+ : run.id;
78
+ const footer = `\n<sub>Run ${runLink} · auto-generated</sub>`;
79
+ return `## 🤖 Addressed PR feedback\n\n${summary}\n${inResponseSection}${filesSection}${footer}`;
80
+ }
81
+ export async function maybePostChangeSummary(deps) {
82
+ const { run, handoff, prNumber, owner, repo, octokit, postPRComment, dashboardBaseUrl, logger, } = deps;
83
+ if (run.runType !== "review-feedback")
84
+ return;
85
+ if (!run.prUrl || prNumber === null) {
86
+ logger.info({ runId: run.id }, "skipped change summary: no PR URL on run");
87
+ return;
88
+ }
89
+ if (!handoff) {
90
+ logger.info({ runId: run.id }, "skipped change summary: no handoff persisted");
91
+ return;
92
+ }
93
+ let triggeringComments = [];
94
+ if (run.feedbackContext) {
95
+ try {
96
+ const parsed = JSON.parse(run.feedbackContext);
97
+ if (Array.isArray(parsed))
98
+ triggeringComments = parsed;
99
+ }
100
+ catch (err) {
101
+ logger.error({
102
+ runId: run.id,
103
+ err: err instanceof Error ? err.message : String(err),
104
+ }, "failed to parse feedback_context — posting degraded change summary");
105
+ }
106
+ }
107
+ let body;
108
+ try {
109
+ body = renderChangeSummary({
110
+ handoff,
111
+ run: {
112
+ id: run.id,
113
+ totalInputTokens: run.totalInputTokens,
114
+ totalOutputTokens: run.totalOutputTokens,
115
+ },
116
+ triggeringComments,
117
+ dashboardBaseUrl,
118
+ prUrl: run.prUrl,
119
+ });
120
+ }
121
+ catch (err) {
122
+ logger.error({ runId: run.id, err: err instanceof Error ? err.message : String(err) }, "failed to render change summary — skipping post");
123
+ return;
124
+ }
125
+ try {
126
+ await postPRComment(octokit, owner, repo, prNumber, body);
127
+ logger.info({ runId: run.id, prNumber }, "posted PR change summary for review-feedback run");
128
+ }
129
+ catch (err) {
130
+ logger.warn({ runId: run.id, prNumber, err: err instanceof Error ? err.message : String(err) }, "PR change summary post failed (non-fatal)");
131
+ }
132
+ }
133
+ //# sourceMappingURL=pr-change-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-change-summary.js","sourceRoot":"","sources":["../../src/pipeline/pr-change-summary.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,QAAQ,EAGR,cAAc,EAId,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;AA8CjD,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAgC1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,EAAE,GAChC,qBAAqB,CAYvB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAY;IACzB;;2EAEuE;IACvE,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,4EAA4E;IAC5E,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,oBAAoB;IAalC,KAAK,CACT,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,OAAO,CAAC,IAAI,CAAC;IA4EV,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0MtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlC,yFAAyF;IACzF,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;;;OAQG;IACG,aAAa,CAAC,MAAM,EAAE;QAC1B,KAAK,EAAE,WAAW,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,cAAc,CAAC;QAC/B,UAAU,EAAE,UAAU,CAAC;QACvB,cAAc,EAAE,cAAc,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;QAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAoGjB;;;;OAIG;YACW,iBAAiB;YAajB,eAAe;YAorDf,YAAY;IAiF1B;;;OAGG;YACW,gBAAgB;IAoC9B;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyEvC;;;;OAIG;YACW,oBAAoB;IAIlC;;;OAGG;IACG,qBAAqB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCvD;;;;;;;;;OASG;YACW,uBAAuB;IA+TrC,OAAO,CAAC,gBAAgB;CAoBzB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ import { postFanoutCommentsToPR } from "../executor/review/post-fanout-comments.
12
12
  import { extractHandoff } from "../executor/extract-handoff.js";
13
13
  import { DEFAULT_AGENT_CLAUDE_MD } from "../executor/agent-config.js";
14
14
  import { generatePRDescription } from "./pr-description.js";
15
+ import { maybePostChangeSummary } from "./pr-change-summary.js";
15
16
  import { access, writeFile, appendFile } from "node:fs/promises";
16
17
  import { join, resolve } from "node:path";
17
18
  import { homedir } from "node:os";
@@ -388,6 +389,7 @@ export class PipelineRunner {
388
389
  const run = this.buildPipelineRun(runId, issue, pipelineKey, repoConfig, branch);
389
390
  run.prUrl = prUrl;
390
391
  run.runType = "review-feedback";
392
+ run.feedbackContext = JSON.stringify(feedbackComments);
391
393
  // Register in activeFeedbackRuns BEFORE enqueue so rate-limit check works
392
394
  this.activeFeedbackRuns.set(prUrl, runId);
393
395
  this.queue
@@ -1736,6 +1738,43 @@ export class PipelineRunner {
1736
1738
  runLog.warn({ err: err instanceof Error ? err.message : String(err) }, "BEC-175: PR cost summary post failed (non-fatal)");
1737
1739
  }
1738
1740
  }
1741
+ // PR change-summary comment for review-feedback runs. Always-on (no env
1742
+ // flag) — a review-feedback run only exists because a human asked for
1743
+ // changes, so silent shipping is a bug.
1744
+ if (run.runType === "review-feedback" &&
1745
+ prUrl &&
1746
+ repoConfig.provider !== "gitlab" &&
1747
+ this.githubConfig) {
1748
+ try {
1749
+ const summaryPrMatch = prUrl.match(/\/pull\/(\d+)/);
1750
+ const summaryPrNumber = summaryPrMatch
1751
+ ? parseInt(summaryPrMatch[1], 10)
1752
+ : null;
1753
+ const { owner: csOwner, repo: csRepo } = parseRepoUrl(repoConfig.url);
1754
+ const csOctokit = await createGitHubClient(this.githubConfig);
1755
+ await maybePostChangeSummary({
1756
+ run: {
1757
+ id: run.id,
1758
+ runType: run.runType,
1759
+ prUrl: run.prUrl,
1760
+ feedbackContext: run.feedbackContext ?? null,
1761
+ totalInputTokens: run.totalInputTokens,
1762
+ totalOutputTokens: run.totalOutputTokens,
1763
+ },
1764
+ handoff: handoff ?? null,
1765
+ prNumber: summaryPrNumber,
1766
+ owner: csOwner,
1767
+ repo: csRepo,
1768
+ octokit: csOctokit,
1769
+ postPRComment: addPRComment,
1770
+ dashboardBaseUrl: process.env.URATEAM_DASHBOARD_URL ?? "",
1771
+ logger: runLog,
1772
+ });
1773
+ }
1774
+ catch (err) {
1775
+ runLog.warn({ err: err instanceof Error ? err.message : String(err) }, "PR change summary post failed (non-fatal)");
1776
+ }
1777
+ }
1739
1778
  }
1740
1779
  catch (error) {
1741
1780
  // If failPipeline was already called inside the push queue (e.g. failOnAutoCommit