pi-rtk 0.1.1 → 0.1.2

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 (3) hide show
  1. package/index.ts +2 -9
  2. package/metrics.ts +37 -15
  3. package/package.json +1 -1
package/index.ts CHANGED
@@ -119,12 +119,7 @@ export default function (pi: ExtensionAPI) {
119
119
  const record = trackSavings(originalText, filteredText, "bash", technique);
120
120
  processedCount++;
121
121
 
122
- if (config.logSavings && processedCount % config.showUpdateEvery === 0) {
123
- ctx.ui.notify(
124
- `RTK: ${record.savingsPercent.toFixed(1)}% saved (${record.originalChars} → ${record.filteredChars} chars)`,
125
- "info"
126
- );
127
- }
122
+
128
123
 
129
124
  return {
130
125
  content: content.map((c) =>
@@ -162,9 +157,7 @@ export default function (pi: ExtensionAPI) {
162
157
  const record = trackSavings(originalText, filteredText, "read", technique);
163
158
  processedCount++;
164
159
 
165
- if (config.logSavings && processedCount % config.showUpdateEvery === 0) {
166
- ctx.ui.notify(`RTK: ${record.savingsPercent.toFixed(1)}% saved on ${filePath}`, "info");
167
- }
160
+
168
161
 
169
162
  return {
170
163
  content: content.map((c) =>
package/metrics.ts CHANGED
@@ -43,6 +43,16 @@ export function clearMetrics(): void {
43
43
  sessionMetrics.length = 0;
44
44
  }
45
45
 
46
+ function progressBar(percent: number, width = 24): string {
47
+ const filled = Math.round((percent / 100) * width);
48
+ const empty = width - filled;
49
+ return `[${"█".repeat(filled)}${"░".repeat(empty)}] ${percent.toFixed(1)}%`;
50
+ }
51
+
52
+ function col(s: string, width: number): string {
53
+ return s.length >= width ? s.slice(0, width) : s + " ".repeat(width - s.length);
54
+ }
55
+
46
56
  export function getMetricsSummary(): string {
47
57
  if (sessionMetrics.length === 0) {
48
58
  return "No metrics recorded yet";
@@ -50,32 +60,44 @@ export function getMetricsSummary(): string {
50
60
 
51
61
  const totalOriginal = sessionMetrics.reduce((sum, m) => sum + m.originalChars, 0);
52
62
  const totalFiltered = sessionMetrics.reduce((sum, m) => sum + m.filteredChars, 0);
53
- const avgSavings =
54
- sessionMetrics.reduce((sum, m) => sum + m.savingsPercent, 0) /
55
- sessionMetrics.length;
63
+ const totalSaved = totalOriginal - totalFiltered;
64
+ const overallPct = totalOriginal > 0 ? (totalSaved / totalOriginal) * 100 : 0;
56
65
 
57
66
  const byTool = sessionMetrics.reduce((acc, m) => {
58
67
  if (!acc[m.tool]) {
59
- acc[m.tool] = { count: 0, savings: 0 };
68
+ acc[m.tool] = { count: 0, originalChars: 0, filteredChars: 0 };
60
69
  }
61
70
  acc[m.tool].count++;
62
- acc[m.tool].savings += m.savingsPercent;
71
+ acc[m.tool].originalChars += m.originalChars;
72
+ acc[m.tool].filteredChars += m.filteredChars;
63
73
  return acc;
64
- }, {} as Record<string, { count: number; savings: number }>);
74
+ }, {} as Record<string, { count: number; originalChars: number; filteredChars: number }>);
75
+
76
+ const W = 54;
77
+ const bar = "─".repeat(W);
65
78
 
66
- let summary = `RTK Token Savings Summary\n`;
67
- summary += `═══════════════════════\n`;
68
- summary += `Total calls: ${sessionMetrics.length}\n`;
69
- summary += `Original chars: ${totalOriginal.toLocaleString()}\n`;
70
- summary += `Filtered chars: ${totalFiltered.toLocaleString()}\n`;
71
- summary += `Space saved: ${(totalOriginal - totalFiltered).toLocaleString()} chars (${avgSavings.toFixed(1)}%)\n\n`;
79
+ let s = `\n`;
80
+ s += ` RTK Token Savings\n`;
81
+ s += ` ${"═".repeat(W)}\n`;
82
+ s += ` Overall ${progressBar(overallPct, 28)}\n`;
83
+ s += ` ${bar}\n`;
84
+ s += ` ${col("Metric", 22)} ${col("Value", 16)} Notes\n`;
85
+ s += ` ${bar}\n`;
86
+ s += ` ${col("Total calls", 22)} ${col(sessionMetrics.length.toString(), 16)}\n`;
87
+ s += ` ${col("Original chars", 22)} ${col(totalOriginal.toLocaleString(), 16)}\n`;
88
+ s += ` ${col("Filtered chars", 22)} ${col(totalFiltered.toLocaleString(), 16)} ${totalSaved.toLocaleString()} saved\n`;
89
+ s += ` ${bar}\n`;
72
90
 
73
- summary += `By tool:\n`;
91
+ s += `\n By tool:\n`;
92
+ s += ` ${col("Tool", 10)} ${col("Calls", 8)} ${col("Original", 12)} ${col("Filtered", 12)} Savings\n`;
93
+ s += ` ${"─".repeat(62)}\n`;
74
94
  for (const [tool, data] of Object.entries(byTool)) {
75
- summary += ` ${tool}: ${data.count} calls (${(data.savings / data.count).toFixed(1)}% avg savings)\n`;
95
+ const pct = data.originalChars > 0 ? (1 - data.filteredChars / data.originalChars) * 100 : 0;
96
+ s += ` ${col(tool, 10)} ${col(data.count.toString(), 8)} ${col(data.originalChars.toLocaleString(), 12)} ${col(data.filteredChars.toLocaleString(), 12)} ${progressBar(pct, 16)}\n`;
76
97
  }
98
+ s += ` ${"─".repeat(62)}\n`;
77
99
 
78
- return summary;
100
+ return s;
79
101
  }
80
102
 
81
103
  export function getLastMetrics(n: number): MetricRecord[] {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-rtk",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "RTK token reduction extension for pi-coding-agent - reduces LLM token consumption 60-90% by intelligently filtering tool output",
5
5
  "type": "module",
6
6
  "main": "index.ts",