opencode-tps-meter 0.1.0

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.
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Token Counter Module for OpenCode TPS Meter
3
+ *
4
+ * Provides token counting implementations using heuristics.
5
+ * No external dependencies - pure JavaScript implementation.
6
+ *
7
+ * @module tokenCounter
8
+ */
9
+ import type { TokenCounter } from "./types.js";
10
+ /** Type for token counting algorithms */
11
+ export type TokenizerAlgorithm = "heuristic" | "word" | "code";
12
+ /**
13
+ * Create a fast heuristic token counter.
14
+ * Uses a simple approximation: Math.ceil(text.length / 4).
15
+ *
16
+ * This is useful for fast approximate token counting.
17
+ *
18
+ * Accuracy: ~75% for English text (tokens ≈ characters / 4)
19
+ *
20
+ * @returns {TokenCounter} - TokenCounter implementation
21
+ * @deprecated Use createTokenizer('heuristic') instead
22
+ */
23
+ export declare function createHeuristicCounter(): TokenCounter;
24
+ /**
25
+ * Create a word-based heuristic token counter.
26
+ * Uses approximation: Math.ceil(wordCount / 0.75).
27
+ *
28
+ * Better for English prose than character-based heuristics.
29
+ *
30
+ * Accuracy: ~80% for English prose
31
+ *
32
+ * @returns {TokenCounter} - TokenCounter implementation
33
+ * @deprecated Use createTokenizer('word') instead
34
+ */
35
+ export declare function createWordHeuristicCounter(): TokenCounter;
36
+ /**
37
+ * Create a code-optimized heuristic token counter.
38
+ * Uses approximation: Math.ceil(text.length / 3).
39
+ *
40
+ * Code typically has more tokens per character than prose.
41
+ *
42
+ * @returns {TokenCounter} - TokenCounter implementation
43
+ * @deprecated Use createTokenizer('code') instead
44
+ */
45
+ export declare function createCodeHeuristicCounter(): TokenCounter;
46
+ /**
47
+ * Factory function to create a token counter instance.
48
+ *
49
+ * @param {'heuristic' | 'word' | 'code'} [preferred='heuristic'] - The preferred tokenizer type
50
+ * - 'heuristic': Use char/4 approximation (default, recommended)
51
+ * - 'word': Use word/0.75 approximation, better for prose
52
+ * - 'code': Use char/3 approximation, better for code
53
+ * @returns {TokenCounter} - An instance of the requested token counter
54
+ *
55
+ * @example
56
+ * // Create default heuristic tokenizer
57
+ * const tokenizer = createTokenizer();
58
+ * const count = tokenizer.count("Hello, world!");
59
+ *
60
+ * @example
61
+ * // Create word-based tokenizer for prose
62
+ * const wordTokenizer = createTokenizer('word');
63
+ * const approxCount = wordTokenizer.count("Hello, world!");
64
+ */
65
+ export declare function createTokenizer(algorithm?: TokenizerAlgorithm): TokenCounter;
66
+ /**
67
+ * Convenience export for direct token counting using the default tokenizer.
68
+ *
69
+ * @param {string} text - The text to count tokens for
70
+ * @returns {number} - The number of tokens
71
+ *
72
+ * @example
73
+ * import { countTokens } from './tokenCounter';
74
+ * const tokenCount = countTokens("Hello, world!");
75
+ */
76
+ export declare function countTokens(text: string): number;
77
+ /**
78
+ * Simple text encoding function (returns empty array - placeholder for compatibility)
79
+ *
80
+ * @param {string} text - The text to encode
81
+ * @returns {number[]} - Array of token IDs (always empty in this implementation)
82
+ */
83
+ export declare function encodeText(text: string): number[];
84
+ export type { TokenCounter } from "./types.js";
85
+ //# sourceMappingURL=tokenCounter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenCounter.d.ts","sourceRoot":"","sources":["../src/tokenCounter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAqD/D;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,CAErD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,IAAI,YAAY,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,IAAI,YAAY,CAEzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,SAAS,GAAE,kBAAgC,GAAG,YAAY,CAEzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGjD;AAGD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Token tracking logic for OpenCode TPS Meter Plugin
3
+ * Implements a TPS tracker with a configurable rolling window using a ring buffer
4
+ */
5
+ import type { TPSTrackerOptions, TPSTracker } from "./types.js";
6
+ /**
7
+ * Creates a TPSTracker instance - Tracks tokens per second with a rolling window
8
+ *
9
+ * Uses a ring buffer to efficiently track token counts over time.
10
+ * Maximum buffer size of 100 entries with automatic pruning of entries
11
+ * older than the configured window duration.
12
+ *
13
+ * @param options - Optional configuration including sessionId
14
+ * @returns TPSTracker instance with methods to track and calculate TPS
15
+ */
16
+ export declare function createTracker(options?: TPSTrackerOptions): TPSTracker;
17
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAe,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7E;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA6KzE"}
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Type definitions for OpenCode TPS Meter Plugin
3
+ *
4
+ * @module types
5
+ */
6
+ /**
7
+ * Configuration options for the TPS Meter plugin
8
+ * Controls behavior, display, and performance characteristics
9
+ *
10
+ * @interface Config
11
+ */
12
+ export interface Config {
13
+ /** Whether the plugin is enabled (default: true) */
14
+ enabled: boolean;
15
+ /** Display update interval in milliseconds (default: 50) */
16
+ updateIntervalMs: number;
17
+ /** Rolling window duration for TPS calculation in milliseconds (default: 1000) */
18
+ rollingWindowMs: number;
19
+ /** Whether to show average TPS (default: true) */
20
+ showAverage: boolean;
21
+ /** Whether to show instantaneous TPS (default: true) */
22
+ showInstant: boolean;
23
+ /** Whether to show total token count (default: true) */
24
+ showTotalTokens: boolean;
25
+ /** Whether to show elapsed time (default: false) */
26
+ showElapsed: boolean;
27
+ /** Display format style (default: 'compact') */
28
+ format: 'compact' | 'verbose' | 'minimal';
29
+ /** Minimum TPS value to display (default: 0) */
30
+ minVisibleTPS: number;
31
+ /** Fallback token counting heuristic when tokenizer unavailable (default: 'chars_div_4') */
32
+ fallbackTokenHeuristic: 'chars_div_4' | 'chars_div_3' | 'words_div_0_75';
33
+ /** Enable TPS-based color coding for visual feedback (default: false) */
34
+ enableColorCoding: boolean;
35
+ /** TPS threshold for "slow" (red) - below this is slow (default: 10) */
36
+ slowTpsThreshold: number;
37
+ /** TPS threshold for "fast" (green) - above this is fast (default: 50) */
38
+ fastTpsThreshold: number;
39
+ }
40
+ /**
41
+ * Plugin context provided by OpenCode framework
42
+ * Contains client and other framework-provided utilities
43
+ *
44
+ * @interface PluginContext
45
+ */
46
+ export interface PluginContext {
47
+ /** OpenCode client for TUI, toast, and other interactions */
48
+ client: OpenCodeClient;
49
+ /** Plugin metadata and utilities */
50
+ plugin: {
51
+ /** Unique plugin identifier */
52
+ id: string;
53
+ /** Plugin name */
54
+ name: string;
55
+ /** Plugin version */
56
+ version: string;
57
+ };
58
+ /** Logger instance */
59
+ logger: Logger;
60
+ }
61
+ /**
62
+ * OpenCode client interface for TUI and toast interactions
63
+ *
64
+ * @interface OpenCodeClient
65
+ */
66
+ export interface OpenCodeClient {
67
+ /** TUI (Terminal User Interface) methods */
68
+ tui?: {
69
+ /** Set status bar message (if supported) */
70
+ setStatus?: (message: string) => void;
71
+ /** Show a toast notification */
72
+ showToast?: (options: {
73
+ body?: {
74
+ title?: string;
75
+ message: string;
76
+ variant: "info" | "success" | "warning" | "error";
77
+ duration?: number;
78
+ };
79
+ query?: {
80
+ directory?: string;
81
+ };
82
+ }) => Promise<unknown> | void;
83
+ /** Publish a TUI event */
84
+ publish?: (options: {
85
+ body?: {
86
+ type: "tui.toast.show" | "tui.prompt.append" | "tui.command.execute" | "tui.status.set" | "tui.status.clear";
87
+ properties: {
88
+ title?: string;
89
+ message?: string;
90
+ variant?: "info" | "success" | "warning" | "error" | "default";
91
+ duration?: number;
92
+ text?: string;
93
+ command?: string;
94
+ pluginId?: string;
95
+ rightText?: string;
96
+ priority?: number;
97
+ };
98
+ };
99
+ query?: {
100
+ directory?: string;
101
+ };
102
+ }) => Promise<unknown> | void;
103
+ };
104
+ /** Toast notification methods */
105
+ toast?: {
106
+ /** Show info toast */
107
+ info: (message: string, options?: {
108
+ duration?: number;
109
+ }) => void;
110
+ /** Show success toast */
111
+ success: (message: string, options?: {
112
+ duration?: number;
113
+ }) => void;
114
+ };
115
+ }
116
+ /**
117
+ * Tool state structures for tool parts
118
+ */
119
+ export interface ToolStateBase {
120
+ status: string;
121
+ input?: Record<string, unknown>;
122
+ raw?: string;
123
+ title?: string;
124
+ metadata?: Record<string, unknown>;
125
+ time?: {
126
+ start: number;
127
+ end?: number;
128
+ };
129
+ output?: string;
130
+ error?: string;
131
+ }
132
+ export interface ToolStateCompleted extends ToolStateBase {
133
+ status: "completed";
134
+ output: string;
135
+ }
136
+ export interface ToolStateError extends ToolStateBase {
137
+ status: "error";
138
+ error: string;
139
+ }
140
+ export type ToolState = ToolStateBase | ToolStateCompleted | ToolStateError;
141
+ export interface FilePartSourceText {
142
+ value: string;
143
+ start: number;
144
+ end: number;
145
+ }
146
+ export interface FilePartSource {
147
+ type: "file" | "symbol" | "resource";
148
+ text?: FilePartSourceText;
149
+ path?: string;
150
+ name?: string;
151
+ uri?: string;
152
+ }
153
+ export interface Part {
154
+ id: string;
155
+ sessionID: string;
156
+ messageID: string;
157
+ type: string;
158
+ text?: string;
159
+ prompt?: string;
160
+ description?: string;
161
+ command?: string;
162
+ source?: FilePartSource;
163
+ filename?: string;
164
+ url?: string;
165
+ state?: ToolState;
166
+ snapshot?: string;
167
+ reason?: string;
168
+ files?: Array<string>;
169
+ name?: string;
170
+ error?: unknown;
171
+ auto?: boolean;
172
+ }
173
+ /**
174
+ * Logger interface for plugin logging
175
+ *
176
+ * @interface Logger
177
+ */
178
+ export interface Logger {
179
+ /** Log debug message */
180
+ debug: (message: string, ...args: unknown[]) => void;
181
+ /** Log info message */
182
+ info: (message: string, ...args: unknown[]) => void;
183
+ /** Log warning message */
184
+ warn: (message: string, ...args: unknown[]) => void;
185
+ /** Log error message */
186
+ error: (message: string, ...args: unknown[]) => void;
187
+ }
188
+ /**
189
+ * Event data structure for message events
190
+ *
191
+ * @interface MessageEvent
192
+ */
193
+ export interface MessageEvent {
194
+ /** Event type identifier */
195
+ type: "message.part.updated" | "message.updated" | "session.idle";
196
+ /** Event payload */
197
+ properties: {
198
+ part?: Part;
199
+ delta?: string;
200
+ info?: {
201
+ id: string;
202
+ sessionID: string;
203
+ role: "user" | "assistant" | "system";
204
+ time?: {
205
+ created: number;
206
+ completed?: number;
207
+ };
208
+ tokens?: {
209
+ input: number;
210
+ output: number;
211
+ reasoning?: number;
212
+ cache?: {
213
+ read: number;
214
+ write: number;
215
+ };
216
+ };
217
+ finish?: string;
218
+ error?: unknown;
219
+ };
220
+ sessionID?: string;
221
+ };
222
+ }
223
+ /**
224
+ * Plugin event handler return type
225
+ *
226
+ * @interface PluginHandlers
227
+ */
228
+ export interface PluginHandlers {
229
+ /** Event handler for plugin events */
230
+ event: (args: {
231
+ event: MessageEvent;
232
+ }) => Promise<void> | void;
233
+ }
234
+ /**
235
+ * Token counting interface
236
+ *
237
+ * @interface TokenCounter
238
+ */
239
+ export interface TokenCounter {
240
+ /** Count tokens in the given text */
241
+ count(text: string): number;
242
+ }
243
+ /**
244
+ * Display state for UI updates
245
+ *
246
+ * @interface DisplayState
247
+ */
248
+ export interface DisplayState {
249
+ /** Instantaneous TPS value */
250
+ instantTps: number;
251
+ /** Average TPS value */
252
+ avgTps: number;
253
+ /** Total token count */
254
+ totalTokens: number;
255
+ /** Elapsed time in milliseconds */
256
+ elapsedMs: number;
257
+ }
258
+ /**
259
+ * TPS Tracker options
260
+ *
261
+ * @interface TPSTrackerOptions
262
+ */
263
+ export interface TPSTrackerOptions {
264
+ /** Optional session identifier */
265
+ sessionId?: string;
266
+ /** Optional rolling window duration in milliseconds */
267
+ rollingWindowMs?: number;
268
+ }
269
+ /**
270
+ * Buffer entry for TPS tracking
271
+ *
272
+ * @interface BufferEntry
273
+ */
274
+ export interface BufferEntry {
275
+ /** Timestamp in milliseconds */
276
+ timestamp: number;
277
+ /** Token count at this timestamp */
278
+ count: number;
279
+ }
280
+ /**
281
+ * TPSTracker interface for tracking tokens per second
282
+ *
283
+ * @interface TPSTracker
284
+ */
285
+ export interface TPSTracker {
286
+ /** Records a token count at the specified time */
287
+ recordTokens(count: number, timestamp?: number): void;
288
+ /** Calculates the instantaneous TPS over the last 2-second rolling window */
289
+ getInstantTPS(): number;
290
+ /** Calculates the average TPS over the entire session */
291
+ getAverageTPS(): number;
292
+ /** Gets the total number of tokens recorded */
293
+ getTotalTokens(): number;
294
+ /** Gets the elapsed time since tracking began */
295
+ getElapsedMs(): number;
296
+ /** Gets the optional session ID */
297
+ getSessionId(): string | undefined;
298
+ /** Resets all tracking data */
299
+ reset(): void;
300
+ /** Gets the current number of entries in the buffer */
301
+ getBufferSize(): number;
302
+ /** Gets the maximum buffer size */
303
+ getMaxBufferSize(): number;
304
+ /** Gets the rolling window duration in milliseconds */
305
+ getWindowMs(): number;
306
+ }
307
+ /**
308
+ * UIManager interface for managing TPS display
309
+ *
310
+ * @interface UIManager
311
+ */
312
+ export interface UIManager {
313
+ /** Updates the display with current TPS statistics */
314
+ updateDisplay(instantTps: number, avgTps: number, totalTokens: number, elapsedMs: number): void;
315
+ /** Displays final statistics immediately */
316
+ showFinalStats(totalTokens: number, avgTps: number, elapsedMs: number): void;
317
+ /** Clears the display and cleans up resources */
318
+ clear(): void;
319
+ /** Changes the update interval for display throttling */
320
+ setUpdateInterval(ms: number): void;
321
+ }
322
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * UI Manager for OpenCode TPS Meter Extension
3
+ * Handles display of token processing statistics with throttling and dual-mode support
4
+ */
5
+ import type { Config, OpenCodeClient, UIManager as IUIManager } from "./types.js";
6
+ /**
7
+ * Creates a UIManager instance
8
+ *
9
+ * Handles display of token processing statistics with throttling and dual-mode support
10
+ * (status bar primary, toast fallback)
11
+ *
12
+ * @param client - OpenCode client object with TUI and toast capabilities
13
+ * @param config - Configuration options
14
+ * @returns UIManager instance
15
+ */
16
+ export declare function createUIManager(client: OpenCodeClient, config: Config): IUIManager;
17
+ export default createUIManager;
18
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAgB,SAAS,IAAI,UAAU,EAAE,MAAM,YAAY,CAAC;AAGhG;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,UAAU,CAwSZ;AAED,eAAe,eAAe,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "opencode-tps-meter",
3
+ "version": "0.1.0",
4
+ "description": "Live tokens-per-second meter for OpenCode",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": { "types": "./dist/index.d.ts", "default": "./dist/index.mjs" },
12
+ "require": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }
13
+ }
14
+ },
15
+ "files": ["dist", "README.md", "LICENSE"],
16
+ "scripts": {
17
+ "build": "bun run build.ts",
18
+ "test": "bun test",
19
+ "prepublishOnly": "bun run build"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/ChiR24/opencode-tps-meter.git"
24
+ },
25
+ "homepage": "https://github.com/ChiR24/opencode-tps-meter#readme",
26
+ "bugs": "https://github.com/ChiR24/opencode-tps-meter/issues",
27
+ "dependencies": {
28
+ "@opencode-ai/plugin": "^1.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.0.0",
32
+ "@types/node": "^20.0.0"
33
+ },
34
+ "keywords": ["opencode", "opencode-plugin", "ai", "tokens"],
35
+ "license": "MIT"
36
+ }