agent-trace 0.2.8 → 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 +75 -6
  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>';
@@ -25107,9 +25111,9 @@ var SqliteClient = class {
25107
25111
  this.db = new import_better_sqlite3.default(dbPath);
25108
25112
  this.db.pragma("journal_mode = WAL");
25109
25113
  this.db.pragma("synchronous = NORMAL");
25114
+ this.migrateCacheTokenColumns();
25110
25115
  this.migrateDeduplicateEvents();
25111
25116
  this.db.exec(SCHEMA_SQL);
25112
- this.migrateCacheTokenColumns();
25113
25117
  this.migrateRebuildBrokenTraces();
25114
25118
  }
25115
25119
  async insertJsonEachRow(request) {
@@ -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 {
@@ -28767,12 +28791,15 @@ var SqlitePersistence = class {
28767
28791
  }
28768
28792
  async persistAcceptedEvent(event, trace) {
28769
28793
  const eventWrite = this.eventWriter.writeEvent(event).catch((error) => {
28794
+ console.error(`[agent-trace] sqlite_events write failed: ${String(error)}`);
28770
28795
  this.writeFailures.push(`sqlite_events: ${String(error)}`);
28771
28796
  });
28772
28797
  const traceWrite = this.sessionTraceWriter.writeTrace(trace).catch((error) => {
28798
+ console.error(`[agent-trace] sqlite_traces write failed: ${String(error)}`);
28773
28799
  this.writeFailures.push(`sqlite_traces: ${String(error)}`);
28774
28800
  });
28775
28801
  const sessionWrite = this.postgresWriter.writeTrace(trace).catch((error) => {
28802
+ console.error(`[agent-trace] sqlite_sessions write failed: ${String(error)}`);
28776
28803
  this.writeFailures.push(`sqlite_sessions: ${String(error)}`);
28777
28804
  });
28778
28805
  await Promise.all([eventWrite, traceWrite, sessionWrite]);
@@ -29423,6 +29450,40 @@ function extractPrUrl(payload) {
29423
29450
  if (prUrlMatch !== null && prUrlMatch[0] !== void 0) return prUrlMatch[0];
29424
29451
  return void 0;
29425
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
+ }
29426
29487
  function parsePrFromUrl(url) {
29427
29488
  const match = url.match(/https:\/\/github\.com\/([^/]+\/[^/]+)\/pull\/(\d+)/);
29428
29489
  if (match === null || match[1] === void 0 || match[2] === void 0) return void 0;
@@ -29828,6 +29889,14 @@ function enrichHookPayloadWithGitContext(payload, provider, baselineStore, now)
29828
29889
  }
29829
29890
  }
29830
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
+ }
29831
29900
  if (Object.keys(patch).length === 0) {
29832
29901
  return {
29833
29902
  payload,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-trace",
3
- "version": "0.2.8",
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": {