summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/metrics/place.test.ts12
-rw-r--r--src/core/metrics/place.ts17
2 files changed, 25 insertions, 4 deletions
diff --git a/src/core/metrics/place.test.ts b/src/core/metrics/place.test.ts
index d91f1ab..22f8639 100644
--- a/src/core/metrics/place.test.ts
+++ b/src/core/metrics/place.test.ts
@@ -391,7 +391,7 @@ describe("interleaveTurnMetrics", () => {
expectTurnMetricsAt(rows, 4, "t1");
});
- it("more metrics than segments: only T entries placed (extra ignored)", () => {
+ it("more metrics than segments: unmatched entry emits standalone turn-metrics", () => {
const g1 = userGroup(1, "q1");
const g2 = toolCallGroup(2, "s1", "c1");
const step1 = makeStep("s1", 100, 50);
@@ -401,9 +401,13 @@ describe("interleaveTurnMetrics", () => {
[makeEntry("t1", 100, 50, [step1]), makeEntry("t2", 200, 80, [step2])],
);
- expect(rows).toHaveLength(4);
- expectStepMetricsAt(rows, 2, "s1", 0);
- expectTurnMetricsAt(rows, 3, "t1");
+ // Unmatched entry (t2) emits a standalone turn-metrics row at the top.
+ expect(rows).toHaveLength(5);
+ expectTurnMetricsAt(rows, 0, "t2");
+ expectGroupAt(rows, 1, g1);
+ expectGroupAt(rows, 2, g2);
+ expectStepMetricsAt(rows, 3, "s1", 0);
+ expectTurnMetricsAt(rows, 4, "t1");
});
it("turn with no steps emits only turn-metrics (no step-metrics)", () => {
diff --git a/src/core/metrics/place.ts b/src/core/metrics/place.ts
index 1009b15..b60c675 100644
--- a/src/core/metrics/place.ts
+++ b/src/core/metrics/place.ts
@@ -154,6 +154,23 @@ export function interleaveTurnMetrics(
const rows: MetricsRow[] = [];
const firstUserIdx = segmentStarts[0] ?? 0;
+
+ // Emit turn-metrics rows for entries that weren't matched to any segment
+ // (fully trimmed turns — their content was unloaded by the chat limit, but
+ // their aggregate metrics still show so the user knows what was trimmed).
+ for (let i = 0; i < entries.length; i++) {
+ if (usedEntries.has(i)) continue;
+ const e = entries[i];
+ if (e === undefined || e.total === null) continue;
+ rows.push({
+ kind: "turn-metrics",
+ turn: e.total,
+ turnNumber: i + 1,
+ cumulativeUsage: cumulativeByEntry[i] ?? e.total.usage,
+ prevTurnUsage: prevUsageByEntry[i] ?? null,
+ });
+ }
+
for (let i = 0; i < firstUserIdx; i++) {
const g = groups[i];
if (g !== undefined) {