agent-trace 0.2.9 → 0.2.10

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 (2) hide show
  1. package/agent-trace.cjs +71 -5
  2. package/package.json +1 -1
package/agent-trace.cjs CHANGED
@@ -24122,6 +24122,10 @@ th{color:var(--text-dim);font-size:10px;text-transform:uppercase;letter-spacing:
24122
24122
  .outcome-prs{border-top:1px solid var(--panel-border);padding-top:6px;margin-top:4px}
24123
24123
  .outcome-pr{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12px}
24124
24124
  .pr-badge{font-size:10px;padding:1px 5px;border-radius:3px;font-weight:600;text-transform:uppercase;border:1px solid rgba(74,222,128,.3);color:var(--green)}
24125
+ .pr-badge.open{border-color:rgba(34,211,238,.3);color:var(--cyan)}
24126
+ .pr-badge.merged{border-color:rgba(192,132,252,.3);color:var(--purple)}
24127
+ .pr-badge.closed{border-color:rgba(248,113,113,.3);color:var(--red)}
24128
+ .pr-badge.draft{border-color:rgba(102,102,102,.3);color:var(--text-muted)}
24125
24129
  .pr-label{color:var(--cyan);font-weight:600}
24126
24130
  .pr-repo{color:var(--text-muted)}
24127
24131
  .pr-link{color:var(--text-dim);text-decoration:none;font-size:11px}
@@ -24470,7 +24474,7 @@ function renderReplay() {
24470
24474
  }
24471
24475
  if (replay.pullRequests.length > 0) {
24472
24476
  h += '<div class="outcome-prs">';
24473
- replay.pullRequests.forEach(function(pr){ h += '<div class="outcome-pr"><span class="pr-badge">' + esc(pr.state) + '</span><span class="pr-label">PR #' + pr.prNumber + '</span><span class="pr-repo">' + esc(pr.repo) + '</span>' + (pr.url ? '<a class="pr-link" href="' + esc(pr.url) + '" target="_blank" rel="noopener noreferrer">' + esc(pr.url) + '</a>' : '') + '</div>'; });
24477
+ replay.pullRequests.forEach(function(pr){ h += '<div class="outcome-pr"><span class="pr-badge ' + esc(pr.state) + '">' + esc(pr.state) + '</span><span class="pr-label">PR #' + pr.prNumber + '</span><span class="pr-repo">' + esc(pr.repo) + '</span>' + (pr.url ? '<a class="pr-link" href="' + esc(pr.url) + '" target="_blank" rel="noopener noreferrer">' + esc(pr.url) + '</a>' : '') + '</div>'; });
24474
24478
  h += '</div>';
24475
24479
  }
24476
24480
  h += '</div>';
@@ -28545,15 +28549,35 @@ function toUpdatedTrace(existing, envelope) {
28545
28549
  const prUrl = readString4(payload, ["pr_url", "prUrl"]);
28546
28550
  const prRepo = readString4(payload, ["pr_repo", "prRepo"]);
28547
28551
  const prNumberRaw = readNumber3(payload, ["pr_number", "prNumber"]);
28552
+ const prState = readString4(payload, ["pr_state", "prState"]) ?? "open";
28553
+ const prMergedAt = readString4(payload, ["pr_merged_at", "prMergedAt"]);
28548
28554
  if (prUrl !== void 0 && prRepo !== void 0 && prNumberRaw !== void 0) {
28549
- const alreadyTracked = existingPullRequests.some((pr) => pr.prNumber === prNumberRaw && pr.repo === prRepo);
28550
- if (!alreadyTracked) {
28555
+ const trackedIndex = existingPullRequests.findIndex((pr) => pr.prNumber === prNumberRaw && pr.repo === prRepo);
28556
+ if (trackedIndex === -1) {
28551
28557
  existingPullRequests.push({
28552
28558
  repo: prRepo,
28553
28559
  prNumber: prNumberRaw,
28554
- state: "open",
28555
- url: prUrl
28560
+ state: prState,
28561
+ url: prUrl,
28562
+ ...prState === "merged" && prMergedAt !== void 0 ? { mergedAt: prMergedAt } : {}
28556
28563
  });
28564
+ } else if (prState !== "open") {
28565
+ const tracked = existingPullRequests[trackedIndex];
28566
+ existingPullRequests[trackedIndex] = {
28567
+ ...tracked,
28568
+ state: prState,
28569
+ ...prState === "merged" && prMergedAt !== void 0 ? { mergedAt: prMergedAt } : {}
28570
+ };
28571
+ }
28572
+ } else if (prState !== "open" && prRepo !== void 0 && prNumberRaw !== void 0) {
28573
+ const trackedIndex = existingPullRequests.findIndex((pr) => pr.prNumber === prNumberRaw && pr.repo === prRepo);
28574
+ if (trackedIndex !== -1) {
28575
+ const tracked = existingPullRequests[trackedIndex];
28576
+ existingPullRequests[trackedIndex] = {
28577
+ ...tracked,
28578
+ state: prState,
28579
+ ...prState === "merged" && prMergedAt !== void 0 ? { mergedAt: prMergedAt } : {}
28580
+ };
28557
28581
  }
28558
28582
  }
28559
28583
  return {
@@ -29426,6 +29450,40 @@ function extractPrUrl(payload) {
29426
29450
  if (prUrlMatch !== null && prUrlMatch[0] !== void 0) return prUrlMatch[0];
29427
29451
  return void 0;
29428
29452
  }
29453
+ function extractPrState(payload) {
29454
+ const record = payload;
29455
+ const explicit = readString5(record, "pr_state") ?? readString5(record, "prState");
29456
+ if (explicit !== void 0) return explicit;
29457
+ const output = readString5(record, "tool_response") ?? readString5(record, "toolResponse") ?? readString5(record, "stdout") ?? readString5(record, "output");
29458
+ const command = pickCommand2(payload);
29459
+ const combined = [command, output].filter((s) => s !== void 0).join("\n");
29460
+ if (combined.length === 0) return void 0;
29461
+ const isGhPr = /\bgh\s+pr\b/.test(combined);
29462
+ if (!isGhPr) return void 0;
29463
+ const jsonState = combined.match(/"state"\s*:\s*"(MERGED|CLOSED|OPEN|DRAFT)"/i);
29464
+ if (jsonState?.[1] !== void 0) {
29465
+ const s = jsonState[1].toLowerCase();
29466
+ return s === "open" ? "open" : s;
29467
+ }
29468
+ const isDraft = /"isDraft"\s*:\s*true/i.test(combined);
29469
+ if (isDraft) return "draft";
29470
+ if (/\bgh\s+pr\s+merge\b/.test(combined) && output !== void 0 && !/error|failed|not merged/i.test(output)) {
29471
+ return "merged";
29472
+ }
29473
+ if (/\bMerged\b/.test(combined)) return "merged";
29474
+ if (/\bClosed\b/.test(combined)) return "closed";
29475
+ if (/\bDraft\b/.test(combined)) return "draft";
29476
+ return void 0;
29477
+ }
29478
+ function extractPrMergedAt(payload) {
29479
+ const record = payload;
29480
+ const explicit = readString5(record, "pr_merged_at") ?? readString5(record, "prMergedAt");
29481
+ if (explicit !== void 0) return explicit;
29482
+ const output = readString5(record, "tool_response") ?? readString5(record, "toolResponse") ?? readString5(record, "stdout") ?? readString5(record, "output");
29483
+ if (output === void 0) return void 0;
29484
+ const match = output.match(/"mergedAt"\s*:\s*"([^"]+)"/);
29485
+ return match?.[1] ?? void 0;
29486
+ }
29429
29487
  function parsePrFromUrl(url) {
29430
29488
  const match = url.match(/https:\/\/github\.com\/([^/]+\/[^/]+)\/pull\/(\d+)/);
29431
29489
  if (match === null || match[1] === void 0 || match[2] === void 0) return void 0;
@@ -29831,6 +29889,14 @@ function enrichHookPayloadWithGitContext(payload, provider, baselineStore, now)
29831
29889
  }
29832
29890
  }
29833
29891
  }
29892
+ const prState = extractPrState(payload);
29893
+ if (prState !== void 0) {
29894
+ patch["pr_state"] = prState;
29895
+ }
29896
+ const prMergedAt = extractPrMergedAt(payload);
29897
+ if (prMergedAt !== void 0) {
29898
+ patch["pr_merged_at"] = prMergedAt;
29899
+ }
29834
29900
  if (Object.keys(patch).length === 0) {
29835
29901
  return {
29836
29902
  payload,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-trace",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "description": "Self-hosted observability for AI coding agents. One command, zero config.",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {