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.
- package/agent-trace.cjs +75 -6
- 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
|
|
28550
|
-
if (
|
|
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:
|
|
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,
|