@code-yeongyu/senpi-codemode 2026.8.18 → 2026.8.20

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/CHANGELOG.md CHANGED
@@ -12,6 +12,58 @@
12
12
 
13
13
  ### Removed
14
14
 
15
+ ## [2026.8.20] - 2026-08-20
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ ### Removed
26
+
27
+ ## [2026.8.19] - 2026-08-19
28
+
29
+ ### Breaking Changes
30
+
31
+ ### Added
32
+
33
+ ### Changed
34
+
35
+ ### Fixed
36
+
37
+ ### Removed
38
+
39
+ ## [2026.8.18-3] - 2026-08-18
40
+
41
+ ### Breaking Changes
42
+
43
+ ### Added
44
+
45
+ ### Changed
46
+
47
+ ### Fixed
48
+
49
+ - Eval cells that initiated no tool calls no longer render a `0 calls · 0.00 calls/s`
50
+ throughput badge; the footer shows only the elapsed time. Positive call counts are
51
+ unchanged.
52
+
53
+ ### Removed
54
+
55
+ ## [2026.8.18-2] - 2026-08-18
56
+
57
+ ### Breaking Changes
58
+
59
+ ### Added
60
+
61
+ ### Changed
62
+
63
+ ### Fixed
64
+
65
+ ### Removed
66
+
15
67
  ## [2026.8.18] - 2026-08-18
16
68
 
17
69
  ### Breaking Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.8.18",
3
+ "version": "2026.8.20",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -30,14 +30,14 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@babel/parser": "8.0.4",
33
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.18",
33
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.20",
34
34
  "typebox": "1.3.8"
35
35
  },
36
36
  "peerDependencies": {
37
- "@code-yeongyu/senpi": "2026.8.18"
37
+ "@code-yeongyu/senpi": "2026.8.20"
38
38
  },
39
39
  "devDependencies": {
40
- "@code-yeongyu/senpi": "2026.8.18"
40
+ "@code-yeongyu/senpi": "2026.8.20"
41
41
  },
42
42
  "keywords": [
43
43
  "senpi",
@@ -262,7 +262,8 @@ function renderPrefixed(text: string, environment: RenderEnvironment, prefixStyl
262
262
  function cellHeader(cell: EvalCellResult, environment: RenderEnvironment, badges: CellBadges): string {
263
263
  const presentation = cellPresentation(cell.status, environment.spinnerFrame);
264
264
  let header = `eval ${cell.language} ${presentation.label} ${presentation.icon}`;
265
- if (badges.throughput !== undefined) header += ` · ${formatThroughputBadge(badges.throughput)}`;
265
+ const throughputBadge = badges.throughput === undefined ? undefined : formatThroughputBadge(badges.throughput);
266
+ if (throughputBadge !== undefined) header += ` · ${throughputBadge}`;
266
267
  const elapsedMs = badges.throughput?.wallDurationMs ?? cell.durationMs;
267
268
  if (elapsedMs !== undefined) header += ` · ${formatDuration(elapsedMs)}`;
268
269
  if (badges.reset) header += " · reset";
@@ -293,11 +294,14 @@ function plural(count: number, singular: string, pluralNoun: string): string {
293
294
 
294
295
  function formatCallsPerSecond(calls: number, wallDurationMs: number | undefined): string {
295
296
  const seconds = typeof wallDurationMs === "number" && Number.isFinite(wallDurationMs) ? wallDurationMs / 1_000 : 0;
296
- if (seconds <= 0) return calls === 0 ? "0.00 calls/s" : "n/a calls/s";
297
+ if (seconds <= 0) return "n/a calls/s";
297
298
  return `${(calls / seconds).toFixed(2)} calls/s`;
298
299
  }
299
300
 
300
- function formatThroughputBadge(throughput: CellThroughput): string {
301
+ // A cell that issued no tool calls has no throughput to report: emitting
302
+ // "0 calls · 0.00 calls/s" is noise, so the whole badge is dropped instead.
303
+ function formatThroughputBadge(throughput: CellThroughput): string | undefined {
304
+ if (throughput.calls <= 0) return undefined;
301
305
  return `${plural(throughput.calls, "call", "calls")} · ${formatCallsPerSecond(
302
306
  throughput.calls,
303
307
  throughput.wallDurationMs,
@@ -789,8 +793,10 @@ function resultMetadata(
789
793
  if (details?.phase) metadata.push(`phase ${details.phase}`);
790
794
  const elapsedMs = details?.wallDurationMs ?? details?.durationMs;
791
795
  if (!options.isPartial && typeof elapsedMs === "number") metadata.push(`took ${formatDuration(elapsedMs)}`);
792
- if (status === "done" && typeof details?.toolCallCount === "number")
793
- metadata.push(formatThroughputBadge({ calls: details.toolCallCount, wallDurationMs: details.wallDurationMs }));
796
+ if (status === "done" && typeof details?.toolCallCount === "number") {
797
+ const badge = formatThroughputBadge({ calls: details.toolCallCount, wallDurationMs: details.wallDurationMs });
798
+ if (badge !== undefined) metadata.push(badge);
799
+ }
794
800
  if (metadata.length === 0) return [];
795
801
  return [{ kind: "text", text: style(theme, "muted", metadata.join(" | ")) }];
796
802
  }