@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 +52 -0
- package/package.json +4 -4
- package/src/tool/render.ts +11 -5
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.
|
|
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.
|
|
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.
|
|
37
|
+
"@code-yeongyu/senpi": "2026.8.20"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@code-yeongyu/senpi": "2026.8.
|
|
40
|
+
"@code-yeongyu/senpi": "2026.8.20"
|
|
41
41
|
},
|
|
42
42
|
"keywords": [
|
|
43
43
|
"senpi",
|
package/src/tool/render.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
297
|
+
if (seconds <= 0) return "n/a calls/s";
|
|
297
298
|
return `${(calls / seconds).toFixed(2)} calls/s`;
|
|
298
299
|
}
|
|
299
300
|
|
|
300
|
-
|
|
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
|
-
|
|
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
|
}
|