@ramtinj95/opencode-tokenscope 1.4.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.
- package/LICENSE +21 -0
- package/README.md +526 -0
- package/dist/tokenscope-lib/analyzer.d.ts +29 -0
- package/dist/tokenscope-lib/analyzer.d.ts.map +1 -0
- package/dist/tokenscope-lib/analyzer.js +321 -0
- package/dist/tokenscope-lib/analyzer.js.map +1 -0
- package/dist/tokenscope-lib/config.d.ts +10 -0
- package/dist/tokenscope-lib/config.d.ts.map +1 -0
- package/dist/tokenscope-lib/config.js +102 -0
- package/dist/tokenscope-lib/config.js.map +1 -0
- package/dist/tokenscope-lib/context.d.ts +81 -0
- package/dist/tokenscope-lib/context.d.ts.map +1 -0
- package/dist/tokenscope-lib/context.js +453 -0
- package/dist/tokenscope-lib/context.js.map +1 -0
- package/dist/tokenscope-lib/cost.d.ts +9 -0
- package/dist/tokenscope-lib/cost.d.ts.map +1 -0
- package/dist/tokenscope-lib/cost.js +51 -0
- package/dist/tokenscope-lib/cost.js.map +1 -0
- package/dist/tokenscope-lib/formatter.d.ts +26 -0
- package/dist/tokenscope-lib/formatter.d.ts.map +1 -0
- package/dist/tokenscope-lib/formatter.js +415 -0
- package/dist/tokenscope-lib/formatter.js.map +1 -0
- package/dist/tokenscope-lib/subagent.d.ts +13 -0
- package/dist/tokenscope-lib/subagent.d.ts.map +1 -0
- package/dist/tokenscope-lib/subagent.js +134 -0
- package/dist/tokenscope-lib/subagent.js.map +1 -0
- package/dist/tokenscope-lib/tokenizer.d.ts +17 -0
- package/dist/tokenscope-lib/tokenizer.d.ts.map +1 -0
- package/dist/tokenscope-lib/tokenizer.js +117 -0
- package/dist/tokenscope-lib/tokenizer.js.map +1 -0
- package/dist/tokenscope-lib/types.d.ts +252 -0
- package/dist/tokenscope-lib/types.d.ts.map +1 -0
- package/dist/tokenscope-lib/types.js +12 -0
- package/dist/tokenscope-lib/types.js.map +1 -0
- package/dist/tokenscope.d.ts +4 -0
- package/dist/tokenscope.d.ts.map +1 -0
- package/dist/tokenscope.js +98 -0
- package/dist/tokenscope.js.map +1 -0
- package/models.json +290 -0
- package/package.json +54 -0
- package/tokenscope-config.json +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../tokenscope-lib/subagent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TokenModel } from "./types";
|
|
2
|
+
export declare class TokenizerManager {
|
|
3
|
+
private tiktokenCache;
|
|
4
|
+
private transformerCache;
|
|
5
|
+
private tiktokenModule?;
|
|
6
|
+
private transformersModule?;
|
|
7
|
+
countTokens(content: string, model: TokenModel): Promise<number>;
|
|
8
|
+
private approximateTokenCount;
|
|
9
|
+
private countWithTiktoken;
|
|
10
|
+
private countWithTransformers;
|
|
11
|
+
private loadTiktokenEncoder;
|
|
12
|
+
private loadTiktokenModule;
|
|
13
|
+
private loadTransformersTokenizer;
|
|
14
|
+
private loadTransformersModule;
|
|
15
|
+
private importFromVendor;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=tokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/tokenizer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGzC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,cAAc,CAAC,CAAc;IACrC,OAAO,CAAC,kBAAkB,CAAC,CAAc;IAEnC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBtE,OAAO,CAAC,qBAAqB;YAIf,iBAAiB;YASjB,qBAAqB;YAcrB,mBAAmB;YAwBnB,kBAAkB;YAOlB,yBAAyB;YAgBzB,sBAAsB;YAOtB,gBAAgB;CAiB/B"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// TokenizerManager - handles token counting with multiple backends
|
|
2
|
+
import path from "path";
|
|
3
|
+
import fs from "fs/promises";
|
|
4
|
+
import { pathToFileURL } from "url";
|
|
5
|
+
import { VENDOR_ROOT } from "./config";
|
|
6
|
+
export class TokenizerManager {
|
|
7
|
+
tiktokenCache = new Map();
|
|
8
|
+
transformerCache = new Map();
|
|
9
|
+
tiktokenModule;
|
|
10
|
+
transformersModule;
|
|
11
|
+
async countTokens(content, model) {
|
|
12
|
+
if (!content.trim())
|
|
13
|
+
return 0;
|
|
14
|
+
try {
|
|
15
|
+
switch (model.spec.kind) {
|
|
16
|
+
case "approx":
|
|
17
|
+
return this.approximateTokenCount(content);
|
|
18
|
+
case "tiktoken":
|
|
19
|
+
return await this.countWithTiktoken(content, model.spec.model);
|
|
20
|
+
case "transformers":
|
|
21
|
+
return await this.countWithTransformers(content, model.spec.hub);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error(`Token counting error for ${model.name}:`, error);
|
|
26
|
+
return this.approximateTokenCount(content);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
approximateTokenCount(content) {
|
|
30
|
+
return Math.ceil(content.length / 4);
|
|
31
|
+
}
|
|
32
|
+
async countWithTiktoken(content, model) {
|
|
33
|
+
const encoder = await this.loadTiktokenEncoder(model);
|
|
34
|
+
try {
|
|
35
|
+
return encoder.encode(content).length;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return this.approximateTokenCount(content);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async countWithTransformers(content, hub) {
|
|
42
|
+
const tokenizer = await this.loadTransformersTokenizer(hub);
|
|
43
|
+
if (!tokenizer || typeof tokenizer.encode !== "function") {
|
|
44
|
+
return this.approximateTokenCount(content);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const encoding = await tokenizer.encode(content);
|
|
48
|
+
return Array.isArray(encoding) ? encoding.length : (encoding?.length ?? this.approximateTokenCount(content));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return this.approximateTokenCount(content);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async loadTiktokenEncoder(model) {
|
|
55
|
+
if (this.tiktokenCache.has(model)) {
|
|
56
|
+
return this.tiktokenCache.get(model);
|
|
57
|
+
}
|
|
58
|
+
const mod = await this.loadTiktokenModule();
|
|
59
|
+
const encodingForModel = mod.encodingForModel ?? mod.default?.encodingForModel;
|
|
60
|
+
const getEncoding = mod.getEncoding ?? mod.default?.getEncoding;
|
|
61
|
+
if (typeof getEncoding !== "function") {
|
|
62
|
+
return { encode: (text) => ({ length: Math.ceil(text.length / 4) }) };
|
|
63
|
+
}
|
|
64
|
+
let encoder;
|
|
65
|
+
try {
|
|
66
|
+
encoder = encodingForModel(model);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
encoder = getEncoding("cl100k_base");
|
|
70
|
+
}
|
|
71
|
+
this.tiktokenCache.set(model, encoder);
|
|
72
|
+
return encoder;
|
|
73
|
+
}
|
|
74
|
+
async loadTiktokenModule() {
|
|
75
|
+
if (!this.tiktokenModule) {
|
|
76
|
+
this.tiktokenModule = this.importFromVendor("js-tiktoken");
|
|
77
|
+
}
|
|
78
|
+
return this.tiktokenModule;
|
|
79
|
+
}
|
|
80
|
+
async loadTransformersTokenizer(hub) {
|
|
81
|
+
if (this.transformerCache.has(hub)) {
|
|
82
|
+
return this.transformerCache.get(hub);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const { AutoTokenizer } = await this.loadTransformersModule();
|
|
86
|
+
const tokenizer = await AutoTokenizer.from_pretrained(hub);
|
|
87
|
+
this.transformerCache.set(hub, tokenizer);
|
|
88
|
+
return tokenizer;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
this.transformerCache.set(hub, null);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async loadTransformersModule() {
|
|
96
|
+
if (!this.transformersModule) {
|
|
97
|
+
this.transformersModule = this.importFromVendor("@huggingface/transformers");
|
|
98
|
+
}
|
|
99
|
+
return this.transformersModule;
|
|
100
|
+
}
|
|
101
|
+
async importFromVendor(pkg) {
|
|
102
|
+
const pkgJsonPath = path.join(VENDOR_ROOT, pkg, "package.json");
|
|
103
|
+
let data;
|
|
104
|
+
try {
|
|
105
|
+
data = await fs.readFile(pkgJsonPath, "utf8");
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw new Error(`Token analyzer dependencies missing. Run the install.sh script to install vendor tokenizers.\n` +
|
|
109
|
+
`Expected path: ${pkgJsonPath}`);
|
|
110
|
+
}
|
|
111
|
+
const manifest = JSON.parse(data);
|
|
112
|
+
const entry = manifest.module ?? manifest.main ?? "index.js";
|
|
113
|
+
const entryPath = path.join(VENDOR_ROOT, pkg, entry);
|
|
114
|
+
return import(pathToFileURL(entryPath).href);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../tokenscope-lib/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
export interface SessionMessage {
|
|
2
|
+
info: SessionMessageInfo;
|
|
3
|
+
parts: SessionMessagePart[];
|
|
4
|
+
}
|
|
5
|
+
export interface SessionMessageInfo {
|
|
6
|
+
id: string;
|
|
7
|
+
role: string;
|
|
8
|
+
modelID?: string;
|
|
9
|
+
providerID?: string;
|
|
10
|
+
system?: string[];
|
|
11
|
+
tokens?: TokenUsage;
|
|
12
|
+
cost?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TokenUsage {
|
|
15
|
+
input?: number;
|
|
16
|
+
output?: number;
|
|
17
|
+
reasoning?: number;
|
|
18
|
+
cache?: {
|
|
19
|
+
read?: number;
|
|
20
|
+
write?: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export type SessionMessagePart = {
|
|
24
|
+
type: "text";
|
|
25
|
+
text: string;
|
|
26
|
+
synthetic?: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
type: "reasoning";
|
|
29
|
+
text: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: "tool";
|
|
32
|
+
tool: string;
|
|
33
|
+
state: ToolState;
|
|
34
|
+
} | {
|
|
35
|
+
type: string;
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
};
|
|
38
|
+
export interface ToolState {
|
|
39
|
+
status: "pending" | "running" | "completed" | "error";
|
|
40
|
+
output?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface CategoryEntry {
|
|
43
|
+
label: string;
|
|
44
|
+
tokens: number;
|
|
45
|
+
}
|
|
46
|
+
export interface CategorySummary {
|
|
47
|
+
label: string;
|
|
48
|
+
totalTokens: number;
|
|
49
|
+
entries: CategoryEntry[];
|
|
50
|
+
allEntries: CategoryEntry[];
|
|
51
|
+
}
|
|
52
|
+
export interface TokenAnalysis {
|
|
53
|
+
sessionID: string;
|
|
54
|
+
model: TokenModel;
|
|
55
|
+
categories: {
|
|
56
|
+
system: CategorySummary;
|
|
57
|
+
user: CategorySummary;
|
|
58
|
+
assistant: CategorySummary;
|
|
59
|
+
tools: CategorySummary;
|
|
60
|
+
reasoning: CategorySummary;
|
|
61
|
+
};
|
|
62
|
+
totalTokens: number;
|
|
63
|
+
inputTokens: number;
|
|
64
|
+
outputTokens: number;
|
|
65
|
+
reasoningTokens: number;
|
|
66
|
+
cacheReadTokens: number;
|
|
67
|
+
cacheWriteTokens: number;
|
|
68
|
+
assistantMessageCount: number;
|
|
69
|
+
mostRecentInput: number;
|
|
70
|
+
mostRecentOutput: number;
|
|
71
|
+
mostRecentReasoning: number;
|
|
72
|
+
mostRecentCacheRead: number;
|
|
73
|
+
mostRecentCacheWrite: number;
|
|
74
|
+
sessionCost: number;
|
|
75
|
+
mostRecentCost: number;
|
|
76
|
+
allToolsCalled: string[];
|
|
77
|
+
toolCallCounts: Map<string, number>;
|
|
78
|
+
subagentAnalysis?: SubagentAnalysis;
|
|
79
|
+
contextBreakdown?: ContextBreakdown;
|
|
80
|
+
toolEstimates?: ToolSchemaEstimate[];
|
|
81
|
+
cacheEfficiency?: CacheEfficiency;
|
|
82
|
+
}
|
|
83
|
+
export interface TokenModel {
|
|
84
|
+
name: string;
|
|
85
|
+
spec: TokenizerSpec;
|
|
86
|
+
}
|
|
87
|
+
export type TokenizerSpec = {
|
|
88
|
+
kind: "tiktoken";
|
|
89
|
+
model: string;
|
|
90
|
+
} | {
|
|
91
|
+
kind: "transformers";
|
|
92
|
+
hub: string;
|
|
93
|
+
} | {
|
|
94
|
+
kind: "approx";
|
|
95
|
+
};
|
|
96
|
+
export interface CategoryEntrySource {
|
|
97
|
+
label: string;
|
|
98
|
+
content: string;
|
|
99
|
+
}
|
|
100
|
+
export interface CostEstimate {
|
|
101
|
+
isSubscription: boolean;
|
|
102
|
+
apiSessionCost: number;
|
|
103
|
+
apiMostRecentCost: number;
|
|
104
|
+
estimatedSessionCost: number;
|
|
105
|
+
estimatedInputCost: number;
|
|
106
|
+
estimatedOutputCost: number;
|
|
107
|
+
estimatedCacheReadCost: number;
|
|
108
|
+
estimatedCacheWriteCost: number;
|
|
109
|
+
pricePerMillionInput: number;
|
|
110
|
+
pricePerMillionOutput: number;
|
|
111
|
+
pricePerMillionCacheRead: number;
|
|
112
|
+
pricePerMillionCacheWrite: number;
|
|
113
|
+
inputTokens: number;
|
|
114
|
+
outputTokens: number;
|
|
115
|
+
reasoningTokens: number;
|
|
116
|
+
cacheReadTokens: number;
|
|
117
|
+
cacheWriteTokens: number;
|
|
118
|
+
}
|
|
119
|
+
export interface SubagentSummary {
|
|
120
|
+
sessionID: string;
|
|
121
|
+
title: string;
|
|
122
|
+
agentType: string;
|
|
123
|
+
inputTokens: number;
|
|
124
|
+
outputTokens: number;
|
|
125
|
+
reasoningTokens: number;
|
|
126
|
+
cacheReadTokens: number;
|
|
127
|
+
cacheWriteTokens: number;
|
|
128
|
+
totalTokens: number;
|
|
129
|
+
apiCost: number;
|
|
130
|
+
estimatedCost: number;
|
|
131
|
+
assistantMessageCount: number;
|
|
132
|
+
}
|
|
133
|
+
export interface SubagentAnalysis {
|
|
134
|
+
subagents: SubagentSummary[];
|
|
135
|
+
totalInputTokens: number;
|
|
136
|
+
totalOutputTokens: number;
|
|
137
|
+
totalReasoningTokens: number;
|
|
138
|
+
totalCacheReadTokens: number;
|
|
139
|
+
totalCacheWriteTokens: number;
|
|
140
|
+
totalTokens: number;
|
|
141
|
+
totalApiCost: number;
|
|
142
|
+
totalEstimatedCost: number;
|
|
143
|
+
totalApiCalls: number;
|
|
144
|
+
}
|
|
145
|
+
export interface ContextComponent {
|
|
146
|
+
tokens: number;
|
|
147
|
+
identified: boolean;
|
|
148
|
+
}
|
|
149
|
+
export interface ContextBreakdown {
|
|
150
|
+
baseSystemPrompt: ContextComponent;
|
|
151
|
+
toolDefinitions: ContextComponent & {
|
|
152
|
+
toolCount: number;
|
|
153
|
+
};
|
|
154
|
+
environmentContext: ContextComponent & {
|
|
155
|
+
components: string[];
|
|
156
|
+
};
|
|
157
|
+
projectTree: ContextComponent & {
|
|
158
|
+
fileCount: number;
|
|
159
|
+
};
|
|
160
|
+
customInstructions: ContextComponent & {
|
|
161
|
+
sources: string[];
|
|
162
|
+
};
|
|
163
|
+
totalCachedContext: number;
|
|
164
|
+
}
|
|
165
|
+
export interface ToolSchemaEstimate {
|
|
166
|
+
name: string;
|
|
167
|
+
enabled: boolean;
|
|
168
|
+
estimatedTokens: number;
|
|
169
|
+
argumentCount: number;
|
|
170
|
+
hasComplexArgs: boolean;
|
|
171
|
+
}
|
|
172
|
+
export interface CacheEfficiency {
|
|
173
|
+
cacheReadTokens: number;
|
|
174
|
+
freshInputTokens: number;
|
|
175
|
+
cacheWriteTokens: number;
|
|
176
|
+
totalInputTokens: number;
|
|
177
|
+
cacheHitRate: number;
|
|
178
|
+
costWithoutCaching: number;
|
|
179
|
+
costWithCaching: number;
|
|
180
|
+
costSavings: number;
|
|
181
|
+
savingsPercent: number;
|
|
182
|
+
effectiveRate: number;
|
|
183
|
+
standardRate: number;
|
|
184
|
+
}
|
|
185
|
+
export interface ExportedSession {
|
|
186
|
+
info: ExportedSessionInfo;
|
|
187
|
+
messages: ExportedMessage[];
|
|
188
|
+
}
|
|
189
|
+
export interface ExportedSessionInfo {
|
|
190
|
+
id: string;
|
|
191
|
+
title: string;
|
|
192
|
+
parentID?: string;
|
|
193
|
+
}
|
|
194
|
+
export interface ExportedMessage {
|
|
195
|
+
info: ExportedMessageInfo;
|
|
196
|
+
parts: ExportedPart[];
|
|
197
|
+
}
|
|
198
|
+
export interface ExportedMessageInfo {
|
|
199
|
+
id: string;
|
|
200
|
+
role: "user" | "assistant";
|
|
201
|
+
system?: string[];
|
|
202
|
+
tools?: Record<string, boolean>;
|
|
203
|
+
tokens?: TokenUsage;
|
|
204
|
+
cost?: number;
|
|
205
|
+
modelID?: string;
|
|
206
|
+
providerID?: string;
|
|
207
|
+
}
|
|
208
|
+
export interface ExportedPart {
|
|
209
|
+
type: string;
|
|
210
|
+
tool?: string;
|
|
211
|
+
state?: {
|
|
212
|
+
status: string;
|
|
213
|
+
input?: Record<string, unknown>;
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
export interface TokenscopeConfig {
|
|
217
|
+
enableContextBreakdown: boolean;
|
|
218
|
+
enableToolSchemaEstimation: boolean;
|
|
219
|
+
enableCacheEfficiency: boolean;
|
|
220
|
+
enableSubagentAnalysis: boolean;
|
|
221
|
+
}
|
|
222
|
+
export interface ContextAnalysisResult {
|
|
223
|
+
contextBreakdown?: ContextBreakdown;
|
|
224
|
+
toolEstimates?: ToolSchemaEstimate[];
|
|
225
|
+
cacheEfficiency?: CacheEfficiency;
|
|
226
|
+
}
|
|
227
|
+
export interface ModelPricing {
|
|
228
|
+
input: number;
|
|
229
|
+
output: number;
|
|
230
|
+
cacheWrite: number;
|
|
231
|
+
cacheRead: number;
|
|
232
|
+
}
|
|
233
|
+
export interface ChildSession {
|
|
234
|
+
id: string;
|
|
235
|
+
title: string;
|
|
236
|
+
parentID?: string;
|
|
237
|
+
}
|
|
238
|
+
export declare function isToolPart(part: SessionMessagePart): part is {
|
|
239
|
+
type: "tool";
|
|
240
|
+
tool: string;
|
|
241
|
+
state: ToolState;
|
|
242
|
+
};
|
|
243
|
+
export declare function isReasoningPart(part: SessionMessagePart): part is {
|
|
244
|
+
type: "reasoning";
|
|
245
|
+
text: string;
|
|
246
|
+
};
|
|
247
|
+
export declare function isTextPart(part: SessionMessagePart): part is {
|
|
248
|
+
type: "text";
|
|
249
|
+
text: string;
|
|
250
|
+
synthetic?: boolean;
|
|
251
|
+
};
|
|
252
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Types and interfaces for the tokenscope plugin
|
|
2
|
+
// Type guards
|
|
3
|
+
export function isToolPart(part) {
|
|
4
|
+
return part.type === "tool";
|
|
5
|
+
}
|
|
6
|
+
export function isReasoningPart(part) {
|
|
7
|
+
return part.type === "reasoning";
|
|
8
|
+
}
|
|
9
|
+
export function isTextPart(part) {
|
|
10
|
+
return part.type === "text";
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../tokenscope-lib/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAgQjD,cAAc;AAEd,MAAM,UAAU,UAAU,CAAC,IAAwB;IACjD,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAwB;IACjD,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenscope.d.ts","sourceRoot":"","sources":["../tokenscope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAcjD,eAAO,MAAM,mBAAmB,EAAE,MAyGjC,CAAA;AAGD,eAAe,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// OpenCode Token Analyzer Plugin - Main Entry Point
|
|
2
|
+
import { tool } from "@opencode-ai/plugin";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import fs from "fs/promises";
|
|
5
|
+
import { DEFAULT_ENTRY_LIMIT, loadModelPricing, loadTokenscopeConfig } from "./tokenscope-lib/config";
|
|
6
|
+
import { TokenizerManager } from "./tokenscope-lib/tokenizer";
|
|
7
|
+
import { ModelResolver, ContentCollector, TokenAnalysisEngine } from "./tokenscope-lib/analyzer";
|
|
8
|
+
import { CostCalculator } from "./tokenscope-lib/cost";
|
|
9
|
+
import { SubagentAnalyzer } from "./tokenscope-lib/subagent";
|
|
10
|
+
import { OutputFormatter } from "./tokenscope-lib/formatter";
|
|
11
|
+
import { ContextAnalyzer } from "./tokenscope-lib/context";
|
|
12
|
+
export const TokenAnalyzerPlugin = async ({ client }) => {
|
|
13
|
+
const pricingData = await loadModelPricing();
|
|
14
|
+
const config = await loadTokenscopeConfig();
|
|
15
|
+
const tokenizerManager = new TokenizerManager();
|
|
16
|
+
const modelResolver = new ModelResolver();
|
|
17
|
+
const contentCollector = new ContentCollector();
|
|
18
|
+
const analysisEngine = new TokenAnalysisEngine(tokenizerManager, contentCollector);
|
|
19
|
+
const costCalculator = new CostCalculator(pricingData);
|
|
20
|
+
const subagentAnalyzer = new SubagentAnalyzer(client, costCalculator, pricingData);
|
|
21
|
+
const contextAnalyzer = new ContextAnalyzer(tokenizerManager);
|
|
22
|
+
const formatter = new OutputFormatter(costCalculator);
|
|
23
|
+
// Set config on formatter to control section rendering
|
|
24
|
+
formatter.setConfig(config);
|
|
25
|
+
return {
|
|
26
|
+
tool: {
|
|
27
|
+
tokenscope: tool({
|
|
28
|
+
description: "Analyze token usage across the current session with detailed breakdowns by category (system, user, assistant, tools, reasoning). " +
|
|
29
|
+
"Provides visual charts, identifies top token consumers, and includes costs from subagent (Task tool) child sessions.",
|
|
30
|
+
args: {
|
|
31
|
+
sessionID: tool.schema.string().optional(),
|
|
32
|
+
limitMessages: tool.schema.number().int().min(1).max(10).optional(),
|
|
33
|
+
includeSubagents: tool.schema
|
|
34
|
+
.boolean()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Include token costs from subagent child sessions (default: true)"),
|
|
37
|
+
},
|
|
38
|
+
async execute(args, context) {
|
|
39
|
+
const sessionID = args.sessionID ?? context.sessionID;
|
|
40
|
+
if (!sessionID) {
|
|
41
|
+
throw new Error("No session ID available for token analysis");
|
|
42
|
+
}
|
|
43
|
+
const response = await client.session.messages({ path: { id: sessionID } });
|
|
44
|
+
const messages = (response?.data ?? response ?? []);
|
|
45
|
+
if (!Array.isArray(messages) || messages.length === 0) {
|
|
46
|
+
return `Session ${sessionID} has no messages yet.`;
|
|
47
|
+
}
|
|
48
|
+
const tokenModel = modelResolver.resolveTokenModel(messages);
|
|
49
|
+
const analysis = await analysisEngine.analyze(sessionID, messages, tokenModel, args.limitMessages ?? DEFAULT_ENTRY_LIMIT);
|
|
50
|
+
// Subagent analysis (respects config)
|
|
51
|
+
const shouldIncludeSubagents = args.includeSubagents !== false && config.enableSubagentAnalysis;
|
|
52
|
+
if (shouldIncludeSubagents) {
|
|
53
|
+
analysis.subagentAnalysis = await subagentAnalyzer.analyzeChildSessions(sessionID);
|
|
54
|
+
}
|
|
55
|
+
// Context analysis (context breakdown, tool estimates, cache efficiency)
|
|
56
|
+
const pricing = costCalculator.getPricing(tokenModel.name);
|
|
57
|
+
const contextResult = await contextAnalyzer.analyze(sessionID, tokenModel, pricing, config);
|
|
58
|
+
// Merge context analysis results into main analysis
|
|
59
|
+
if (contextResult.contextBreakdown) {
|
|
60
|
+
analysis.contextBreakdown = contextResult.contextBreakdown;
|
|
61
|
+
}
|
|
62
|
+
if (contextResult.toolEstimates) {
|
|
63
|
+
analysis.toolEstimates = contextResult.toolEstimates;
|
|
64
|
+
}
|
|
65
|
+
if (contextResult.cacheEfficiency) {
|
|
66
|
+
analysis.cacheEfficiency = contextResult.cacheEfficiency;
|
|
67
|
+
}
|
|
68
|
+
const output = formatter.format(analysis);
|
|
69
|
+
const outputPath = path.join(process.cwd(), "token-usage-output.txt");
|
|
70
|
+
try {
|
|
71
|
+
try {
|
|
72
|
+
await fs.unlink(outputPath);
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
await fs.writeFile(outputPath, output, { encoding: "utf8", flag: "w" });
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new Error(`Failed to write token analysis to ${outputPath}: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
const timestamp = new Date().toISOString();
|
|
81
|
+
const formattedTotal = new Intl.NumberFormat("en-US").format(analysis.totalTokens);
|
|
82
|
+
let summaryMsg = `Token analysis complete! Full report saved to: ${outputPath}\n\nTimestamp: ${timestamp}\nMain session tokens: ${formattedTotal}`;
|
|
83
|
+
if (analysis.subagentAnalysis && analysis.subagentAnalysis.subagents.length > 0) {
|
|
84
|
+
const subagentTokens = new Intl.NumberFormat("en-US").format(analysis.subagentAnalysis.totalTokens);
|
|
85
|
+
const grandTotal = new Intl.NumberFormat("en-US").format(analysis.totalTokens + analysis.subagentAnalysis.totalTokens);
|
|
86
|
+
summaryMsg += `\nSubagent sessions: ${analysis.subagentAnalysis.subagents.length} (${subagentTokens} tokens)`;
|
|
87
|
+
summaryMsg += `\nGrand total: ${grandTotal} tokens`;
|
|
88
|
+
}
|
|
89
|
+
summaryMsg += `\n\nUse: cat token-usage-output.txt (or read the file) to view the complete analysis.`;
|
|
90
|
+
return summaryMsg;
|
|
91
|
+
},
|
|
92
|
+
}),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
// Default export for convenience
|
|
97
|
+
export default TokenAnalyzerPlugin;
|
|
98
|
+
//# sourceMappingURL=tokenscope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenscope.js","sourceRoot":"","sources":["../tokenscope.ts"],"names":[],"mappings":"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"}
|