@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.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +526 -0
  3. package/dist/tokenscope-lib/analyzer.d.ts +29 -0
  4. package/dist/tokenscope-lib/analyzer.d.ts.map +1 -0
  5. package/dist/tokenscope-lib/analyzer.js +321 -0
  6. package/dist/tokenscope-lib/analyzer.js.map +1 -0
  7. package/dist/tokenscope-lib/config.d.ts +10 -0
  8. package/dist/tokenscope-lib/config.d.ts.map +1 -0
  9. package/dist/tokenscope-lib/config.js +102 -0
  10. package/dist/tokenscope-lib/config.js.map +1 -0
  11. package/dist/tokenscope-lib/context.d.ts +81 -0
  12. package/dist/tokenscope-lib/context.d.ts.map +1 -0
  13. package/dist/tokenscope-lib/context.js +453 -0
  14. package/dist/tokenscope-lib/context.js.map +1 -0
  15. package/dist/tokenscope-lib/cost.d.ts +9 -0
  16. package/dist/tokenscope-lib/cost.d.ts.map +1 -0
  17. package/dist/tokenscope-lib/cost.js +51 -0
  18. package/dist/tokenscope-lib/cost.js.map +1 -0
  19. package/dist/tokenscope-lib/formatter.d.ts +26 -0
  20. package/dist/tokenscope-lib/formatter.d.ts.map +1 -0
  21. package/dist/tokenscope-lib/formatter.js +415 -0
  22. package/dist/tokenscope-lib/formatter.js.map +1 -0
  23. package/dist/tokenscope-lib/subagent.d.ts +13 -0
  24. package/dist/tokenscope-lib/subagent.d.ts.map +1 -0
  25. package/dist/tokenscope-lib/subagent.js +134 -0
  26. package/dist/tokenscope-lib/subagent.js.map +1 -0
  27. package/dist/tokenscope-lib/tokenizer.d.ts +17 -0
  28. package/dist/tokenscope-lib/tokenizer.d.ts.map +1 -0
  29. package/dist/tokenscope-lib/tokenizer.js +117 -0
  30. package/dist/tokenscope-lib/tokenizer.js.map +1 -0
  31. package/dist/tokenscope-lib/types.d.ts +252 -0
  32. package/dist/tokenscope-lib/types.d.ts.map +1 -0
  33. package/dist/tokenscope-lib/types.js +12 -0
  34. package/dist/tokenscope-lib/types.js.map +1 -0
  35. package/dist/tokenscope.d.ts +4 -0
  36. package/dist/tokenscope.d.ts.map +1 -0
  37. package/dist/tokenscope.js +98 -0
  38. package/dist/tokenscope.js.map +1 -0
  39. package/models.json +290 -0
  40. package/package.json +54 -0
  41. package/tokenscope-config.json +6 -0
@@ -0,0 +1,321 @@
1
+ // Analysis classes - ModelResolver, ContentCollector, TokenAnalysisEngine
2
+ import { isToolPart as toolGuard, isReasoningPart as reasoningGuard, isTextPart as textGuard } from "./types";
3
+ import { OPENAI_MODEL_MAP, TRANSFORMERS_MODEL_MAP, PROVIDER_DEFAULTS } from "./config";
4
+ // Model Resolution
5
+ export class ModelResolver {
6
+ resolveTokenModel(messages) {
7
+ for (const message of [...messages].reverse()) {
8
+ const modelID = this.canonicalize(message.info.modelID);
9
+ const providerID = this.canonicalize(message.info.providerID);
10
+ const openaiModel = this.resolveOpenAIModel(modelID, providerID);
11
+ if (openaiModel)
12
+ return openaiModel;
13
+ const transformerModel = this.resolveTransformersModel(modelID, providerID);
14
+ if (transformerModel)
15
+ return transformerModel;
16
+ }
17
+ return { name: "approx", spec: { kind: "approx" } };
18
+ }
19
+ resolveOpenAIModel(modelID, providerID) {
20
+ if (providerID === "openai" || providerID === "opencode" || providerID === "azure") {
21
+ const mapped = this.mapOpenAI(modelID);
22
+ return { name: modelID ?? mapped, spec: { kind: "tiktoken", model: mapped } };
23
+ }
24
+ if (modelID && OPENAI_MODEL_MAP[modelID]) {
25
+ return { name: modelID, spec: { kind: "tiktoken", model: OPENAI_MODEL_MAP[modelID] } };
26
+ }
27
+ return undefined;
28
+ }
29
+ resolveTransformersModel(modelID, providerID) {
30
+ if (modelID && TRANSFORMERS_MODEL_MAP[modelID]) {
31
+ return { name: modelID, spec: { kind: "transformers", hub: TRANSFORMERS_MODEL_MAP[modelID] } };
32
+ }
33
+ if (providerID && PROVIDER_DEFAULTS[providerID]) {
34
+ return { name: modelID ?? providerID, spec: PROVIDER_DEFAULTS[providerID] };
35
+ }
36
+ // Prefix-based fallbacks
37
+ if (modelID?.startsWith("claude")) {
38
+ return { name: modelID, spec: { kind: "transformers", hub: "Xenova/claude-tokenizer" } };
39
+ }
40
+ if (modelID?.startsWith("llama")) {
41
+ return {
42
+ name: modelID,
43
+ spec: { kind: "transformers", hub: TRANSFORMERS_MODEL_MAP[modelID] ?? "Xenova/Meta-Llama-3.1-Tokenizer" },
44
+ };
45
+ }
46
+ if (modelID?.startsWith("mistral")) {
47
+ return { name: modelID, spec: { kind: "transformers", hub: "Xenova/mistral-tokenizer-v3" } };
48
+ }
49
+ if (modelID?.startsWith("deepseek")) {
50
+ return { name: modelID, spec: { kind: "transformers", hub: "deepseek-ai/DeepSeek-V3" } };
51
+ }
52
+ return undefined;
53
+ }
54
+ mapOpenAI(modelID) {
55
+ if (!modelID)
56
+ return "cl100k_base";
57
+ return OPENAI_MODEL_MAP[modelID] ?? modelID;
58
+ }
59
+ canonicalize(value) {
60
+ return value?.split("/").pop()?.toLowerCase().trim();
61
+ }
62
+ }
63
+ // Content Collection
64
+ export class ContentCollector {
65
+ collectSystemPrompts(messages) {
66
+ const prompts = new Map();
67
+ for (const message of messages) {
68
+ if (message.info.role === "system") {
69
+ const content = this.extractText(message.parts);
70
+ if (content)
71
+ prompts.set(content, content);
72
+ }
73
+ if (message.info.role === "assistant") {
74
+ for (const prompt of message.info.system ?? []) {
75
+ const trimmed = (prompt ?? "").trim();
76
+ if (trimmed)
77
+ prompts.set(trimmed, trimmed);
78
+ }
79
+ }
80
+ }
81
+ return Array.from(prompts.values()).map((content, index) => ({
82
+ label: this.identifySystemPrompt(content, index + 1),
83
+ content,
84
+ }));
85
+ }
86
+ collectMessageTexts(messages, role) {
87
+ const results = [];
88
+ let index = 0;
89
+ for (const message of messages) {
90
+ if (message.info.role !== role)
91
+ continue;
92
+ const content = this.extractText(message.parts);
93
+ if (!content)
94
+ continue;
95
+ index += 1;
96
+ results.push({ label: `${this.capitalize(role)}#${index}`, content });
97
+ }
98
+ return results;
99
+ }
100
+ collectToolOutputs(messages) {
101
+ const toolOutputs = new Map();
102
+ for (const message of messages) {
103
+ for (const part of message.parts) {
104
+ if (!toolGuard(part))
105
+ continue;
106
+ if (part.state.status !== "completed")
107
+ continue;
108
+ const output = (part.state.output ?? "").toString().trim();
109
+ if (!output)
110
+ continue;
111
+ const toolName = part.tool || "tool";
112
+ const existing = toolOutputs.get(toolName) || "";
113
+ toolOutputs.set(toolName, existing + (existing ? "\n\n" : "") + output);
114
+ }
115
+ }
116
+ return Array.from(toolOutputs.entries()).map(([toolName, content]) => ({
117
+ label: toolName,
118
+ content,
119
+ }));
120
+ }
121
+ collectToolCallCounts(messages) {
122
+ const toolCounts = new Map();
123
+ for (const message of messages) {
124
+ for (const part of message.parts) {
125
+ if (!toolGuard(part))
126
+ continue;
127
+ const toolName = part.tool || "tool";
128
+ if (toolName) {
129
+ toolCounts.set(toolName, (toolCounts.get(toolName) || 0) + 1);
130
+ }
131
+ }
132
+ }
133
+ return toolCounts;
134
+ }
135
+ collectAllToolsCalled(messages) {
136
+ return Array.from(this.collectToolCallCounts(messages).keys()).sort();
137
+ }
138
+ collectReasoningTexts(messages) {
139
+ const results = [];
140
+ let index = 0;
141
+ for (const message of messages) {
142
+ for (const part of message.parts) {
143
+ if (!reasoningGuard(part))
144
+ continue;
145
+ const text = (part.text ?? "").toString().trim();
146
+ if (!text)
147
+ continue;
148
+ index += 1;
149
+ results.push({ label: `Reasoning#${index}`, content: text });
150
+ }
151
+ }
152
+ return results;
153
+ }
154
+ extractText(parts) {
155
+ return parts
156
+ .filter(textGuard)
157
+ .map((part) => part.text ?? "")
158
+ .map((text) => text.trim())
159
+ .filter(Boolean)
160
+ .join("\n\n");
161
+ }
162
+ identifySystemPrompt(content, index) {
163
+ const lower = content.toLowerCase();
164
+ if (lower.includes("opencode") && lower.includes("cli") && content.length > 500)
165
+ return "System#MainPrompt";
166
+ if (lower.includes("opencode") && lower.includes("cli") && content.length <= 500)
167
+ return "System#ShortPrompt";
168
+ if (lower.includes("agent") && lower.includes("mode"))
169
+ return "System#AgentMode";
170
+ if (lower.includes("permission") || lower.includes("allowed") || lower.includes("deny"))
171
+ return "System#Permissions";
172
+ if (lower.includes("tool") && (lower.includes("rule") || lower.includes("guideline")))
173
+ return "System#ToolRules";
174
+ if (lower.includes("format") || lower.includes("style") || lower.includes("concise"))
175
+ return "System#Formatting";
176
+ if (lower.includes("project") || lower.includes("repository") || lower.includes("codebase"))
177
+ return "System#ProjectContext";
178
+ if (lower.includes("session") || lower.includes("context") || lower.includes("memory"))
179
+ return "System#SessionMgmt";
180
+ if (content.includes("@") && (content.includes(".md") || content.includes(".txt")))
181
+ return "System#FileRefs";
182
+ if (content.includes("name:") && content.includes("description:"))
183
+ return "System#AgentDef";
184
+ if (lower.includes("code") && (lower.includes("convention") || lower.includes("standard")))
185
+ return "System#CodeGuidelines";
186
+ return `System#${index}`;
187
+ }
188
+ capitalize(value) {
189
+ if (!value)
190
+ return value;
191
+ return value[0].toUpperCase() + value.slice(1);
192
+ }
193
+ }
194
+ // Token Analysis Engine
195
+ export class TokenAnalysisEngine {
196
+ tokenizerManager;
197
+ contentCollector;
198
+ constructor(tokenizerManager, contentCollector) {
199
+ this.tokenizerManager = tokenizerManager;
200
+ this.contentCollector = contentCollector;
201
+ }
202
+ async analyze(sessionID, messages, tokenModel, entryLimit) {
203
+ const systemPrompts = this.contentCollector.collectSystemPrompts(messages);
204
+ const userTexts = this.contentCollector.collectMessageTexts(messages, "user");
205
+ const assistantTexts = this.contentCollector.collectMessageTexts(messages, "assistant");
206
+ const toolOutputs = this.contentCollector.collectToolOutputs(messages);
207
+ const reasoningTraces = this.contentCollector.collectReasoningTexts(messages);
208
+ const allToolsCalled = this.contentCollector.collectAllToolsCalled(messages);
209
+ const toolCallCounts = this.contentCollector.collectToolCallCounts(messages);
210
+ const [system, user, assistant, tools, reasoning] = await Promise.all([
211
+ this.buildCategory("system", systemPrompts, tokenModel, entryLimit),
212
+ this.buildCategory("user", userTexts, tokenModel, entryLimit),
213
+ this.buildCategory("assistant", assistantTexts, tokenModel, entryLimit),
214
+ this.buildCategory("tools", toolOutputs, tokenModel, entryLimit),
215
+ this.buildCategory("reasoning", reasoningTraces, tokenModel, entryLimit),
216
+ ]);
217
+ const analysis = {
218
+ sessionID,
219
+ model: tokenModel,
220
+ categories: { system, user, assistant, tools, reasoning },
221
+ totalTokens: system.totalTokens + user.totalTokens + assistant.totalTokens + tools.totalTokens + reasoning.totalTokens,
222
+ inputTokens: 0,
223
+ outputTokens: 0,
224
+ reasoningTokens: 0,
225
+ cacheReadTokens: 0,
226
+ cacheWriteTokens: 0,
227
+ assistantMessageCount: 0,
228
+ mostRecentInput: 0,
229
+ mostRecentOutput: 0,
230
+ mostRecentReasoning: 0,
231
+ mostRecentCacheRead: 0,
232
+ mostRecentCacheWrite: 0,
233
+ sessionCost: 0,
234
+ mostRecentCost: 0,
235
+ allToolsCalled,
236
+ toolCallCounts,
237
+ };
238
+ this.applyTelemetryAdjustments(analysis, messages);
239
+ return analysis;
240
+ }
241
+ async buildCategory(label, sources, model, entryLimit) {
242
+ const entries = [];
243
+ for (const source of sources) {
244
+ const tokens = await this.tokenizerManager.countTokens(source.content, model);
245
+ if (tokens > 0) {
246
+ entries.push({ label: source.label, tokens });
247
+ }
248
+ }
249
+ entries.sort((a, b) => b.tokens - a.tokens);
250
+ const limited = entries.slice(0, entryLimit);
251
+ const totalTokens = entries.reduce((sum, entry) => sum + entry.tokens, 0);
252
+ return { label, totalTokens, entries: limited, allEntries: entries };
253
+ }
254
+ applyTelemetryAdjustments(analysis, messages) {
255
+ const assistants = messages
256
+ .filter((m) => m.info.role === "assistant" && (m.info?.tokens || m.info?.cost !== undefined))
257
+ .map((m) => ({ msg: m, tokens: m.info.tokens, cost: m.info.cost ?? 0 }));
258
+ let totalInput = 0, totalOutput = 0, totalReasoning = 0;
259
+ let totalCacheRead = 0, totalCacheWrite = 0, totalCost = 0;
260
+ for (const { tokens, cost } of assistants) {
261
+ if (tokens) {
262
+ totalInput += Number(tokens.input) || 0;
263
+ totalOutput += Number(tokens.output) || 0;
264
+ totalReasoning += Number(tokens.reasoning) || 0;
265
+ totalCacheRead += Number(tokens.cache?.read) || 0;
266
+ totalCacheWrite += Number(tokens.cache?.write) || 0;
267
+ }
268
+ totalCost += Number(cost) || 0;
269
+ }
270
+ const mostRecentWithUsage = [...assistants]
271
+ .reverse()
272
+ .find(({ tokens }) => tokens &&
273
+ (Number(tokens.input) || 0) +
274
+ (Number(tokens.output) || 0) +
275
+ (Number(tokens.reasoning) || 0) +
276
+ (Number(tokens.cache?.read) || 0) +
277
+ (Number(tokens.cache?.write) || 0) >
278
+ 0) ?? assistants[assistants.length - 1];
279
+ let mostRecentInput = 0, mostRecentOutput = 0, mostRecentReasoning = 0;
280
+ let mostRecentCacheRead = 0, mostRecentCacheWrite = 0, mostRecentCost = 0;
281
+ if (mostRecentWithUsage) {
282
+ const t = mostRecentWithUsage.tokens;
283
+ if (t) {
284
+ mostRecentInput = Number(t.input) || 0;
285
+ mostRecentOutput = Number(t.output) || 0;
286
+ mostRecentReasoning = Number(t.reasoning) || 0;
287
+ mostRecentCacheRead = Number(t.cache?.read) || 0;
288
+ mostRecentCacheWrite = Number(t.cache?.write) || 0;
289
+ }
290
+ mostRecentCost = Number(mostRecentWithUsage.cost) || 0;
291
+ }
292
+ analysis.inputTokens = totalInput;
293
+ analysis.outputTokens = totalOutput;
294
+ analysis.reasoningTokens = totalReasoning;
295
+ analysis.cacheReadTokens = totalCacheRead;
296
+ analysis.cacheWriteTokens = totalCacheWrite;
297
+ analysis.assistantMessageCount = assistants.length;
298
+ analysis.sessionCost = totalCost;
299
+ analysis.mostRecentCost = mostRecentCost;
300
+ analysis.mostRecentInput = mostRecentInput;
301
+ analysis.mostRecentOutput = mostRecentOutput;
302
+ analysis.mostRecentReasoning = mostRecentReasoning;
303
+ analysis.mostRecentCacheRead = mostRecentCacheRead;
304
+ analysis.mostRecentCacheWrite = mostRecentCacheWrite;
305
+ const recentApiInputTotal = mostRecentInput + mostRecentCacheRead;
306
+ const localUserAndTools = analysis.categories.user.totalTokens + analysis.categories.tools.totalTokens;
307
+ const inferredSystemTokens = Math.max(0, recentApiInputTotal - localUserAndTools);
308
+ if (inferredSystemTokens > 0 && analysis.categories.system.totalTokens === 0) {
309
+ analysis.categories.system.totalTokens = inferredSystemTokens;
310
+ analysis.categories.system.entries = [{ label: "System (inferred from API)", tokens: inferredSystemTokens }];
311
+ analysis.categories.system.allEntries = analysis.categories.system.entries;
312
+ }
313
+ analysis.totalTokens =
314
+ analysis.categories.system.totalTokens +
315
+ analysis.categories.user.totalTokens +
316
+ analysis.categories.assistant.totalTokens +
317
+ analysis.categories.tools.totalTokens +
318
+ analysis.categories.reasoning.totalTokens;
319
+ }
320
+ }
321
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../tokenscope-lib/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TokenizerSpec, ModelPricing, TokenscopeConfig } from "./types";
2
+ export declare const DEFAULT_ENTRY_LIMIT = 3;
3
+ export declare const VENDOR_ROOT: string;
4
+ export declare function loadModelPricing(): Promise<Record<string, ModelPricing>>;
5
+ export declare const DEFAULT_TOKENSCOPE_CONFIG: TokenscopeConfig;
6
+ export declare function loadTokenscopeConfig(): Promise<TokenscopeConfig>;
7
+ export declare const OPENAI_MODEL_MAP: Record<string, string>;
8
+ export declare const TRANSFORMERS_MODEL_MAP: Record<string, string>;
9
+ export declare const PROVIDER_DEFAULTS: Record<string, TokenizerSpec>;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE5E,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,WAAW,QAA0F,CAAA;AAKlH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAY9E;AAID,eAAO,MAAM,yBAAyB,EAAE,gBAKvC,CAAA;AAID,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAatE;AAGD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBnD,CAAA;AAGD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2BzD,CAAA;AAGD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAM3D,CAAA"}
@@ -0,0 +1,102 @@
1
+ // Configuration constants, model maps, and pricing loader
2
+ import path from "path";
3
+ import fs from "fs/promises";
4
+ import { fileURLToPath } from "url";
5
+ export const DEFAULT_ENTRY_LIMIT = 3;
6
+ export const VENDOR_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "vendor", "node_modules");
7
+ // Pricing cache
8
+ let PRICING_CACHE = null;
9
+ export async function loadModelPricing() {
10
+ if (PRICING_CACHE)
11
+ return PRICING_CACHE;
12
+ try {
13
+ const modelsPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "models.json");
14
+ const data = await fs.readFile(modelsPath, "utf8");
15
+ PRICING_CACHE = JSON.parse(data);
16
+ return PRICING_CACHE;
17
+ }
18
+ catch {
19
+ PRICING_CACHE = { default: { input: 1, output: 3, cacheWrite: 0, cacheRead: 0 } };
20
+ return PRICING_CACHE;
21
+ }
22
+ }
23
+ // Tokenscope config defaults and loader
24
+ export const DEFAULT_TOKENSCOPE_CONFIG = {
25
+ enableContextBreakdown: true,
26
+ enableToolSchemaEstimation: true,
27
+ enableCacheEfficiency: true,
28
+ enableSubagentAnalysis: true,
29
+ };
30
+ let TOKENSCOPE_CONFIG_CACHE = null;
31
+ export async function loadTokenscopeConfig() {
32
+ if (TOKENSCOPE_CONFIG_CACHE)
33
+ return TOKENSCOPE_CONFIG_CACHE;
34
+ try {
35
+ const configPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "tokenscope-config.json");
36
+ const data = await fs.readFile(configPath, "utf8");
37
+ const config = { ...DEFAULT_TOKENSCOPE_CONFIG, ...JSON.parse(data) };
38
+ TOKENSCOPE_CONFIG_CACHE = config;
39
+ return config;
40
+ }
41
+ catch {
42
+ TOKENSCOPE_CONFIG_CACHE = DEFAULT_TOKENSCOPE_CONFIG;
43
+ return DEFAULT_TOKENSCOPE_CONFIG;
44
+ }
45
+ }
46
+ // OpenAI model mapping for tiktoken
47
+ export const OPENAI_MODEL_MAP = {
48
+ "gpt-5": "gpt-4o",
49
+ "o4-mini": "gpt-4o",
50
+ "o3": "gpt-4o",
51
+ "o3-mini": "gpt-4o",
52
+ "o1": "gpt-4o",
53
+ "o1-pro": "gpt-4o",
54
+ "gpt-4.1": "gpt-4o",
55
+ "gpt-4.1-mini": "gpt-4o",
56
+ "gpt-4o": "gpt-4o",
57
+ "gpt-4o-mini": "gpt-4o-mini",
58
+ "gpt-4-turbo": "gpt-4",
59
+ "gpt-4": "gpt-4",
60
+ "gpt-3.5-turbo": "gpt-3.5-turbo",
61
+ "text-embedding-3-large": "text-embedding-3-large",
62
+ "text-embedding-3-small": "text-embedding-3-small",
63
+ "text-embedding-ada-002": "text-embedding-ada-002",
64
+ };
65
+ // Transformers model mapping for HuggingFace tokenizers
66
+ export const TRANSFORMERS_MODEL_MAP = {
67
+ "claude-opus-4": "Xenova/claude-tokenizer",
68
+ "claude-sonnet-4": "Xenova/claude-tokenizer",
69
+ "claude-3.7-sonnet": "Xenova/claude-tokenizer",
70
+ "claude-3.5-sonnet": "Xenova/claude-tokenizer",
71
+ "claude-3.5-haiku": "Xenova/claude-tokenizer",
72
+ "claude-3-opus": "Xenova/claude-tokenizer",
73
+ "claude-3-sonnet": "Xenova/claude-tokenizer",
74
+ "claude-3-haiku": "Xenova/claude-tokenizer",
75
+ "claude-2.1": "Xenova/claude-tokenizer",
76
+ "claude-2.0": "Xenova/claude-tokenizer",
77
+ "claude-instant-1.2": "Xenova/claude-tokenizer",
78
+ "llama-4": "Xenova/llama4-tokenizer",
79
+ "llama-3.3": "unsloth/Llama-3.3-70B-Instruct",
80
+ "llama-3.2": "Xenova/Llama-3.2-Tokenizer",
81
+ "llama-3.1": "Xenova/Meta-Llama-3.1-Tokenizer",
82
+ "llama-3": "Xenova/llama3-tokenizer-new",
83
+ "llama-2": "Xenova/llama2-tokenizer",
84
+ "code-llama": "Xenova/llama-code-tokenizer",
85
+ "deepseek-r1": "deepseek-ai/DeepSeek-R1",
86
+ "deepseek-v3": "deepseek-ai/DeepSeek-V3",
87
+ "deepseek-v2": "deepseek-ai/DeepSeek-V2",
88
+ "mistral-large": "Xenova/mistral-tokenizer-v3",
89
+ "mistral-small": "Xenova/mistral-tokenizer-v3",
90
+ "mistral-nemo": "Xenova/Mistral-Nemo-Instruct-Tokenizer",
91
+ "devstral-small": "Xenova/Mistral-Nemo-Instruct-Tokenizer",
92
+ "codestral": "Xenova/mistral-tokenizer-v3",
93
+ };
94
+ // Provider default tokenizers
95
+ export const PROVIDER_DEFAULTS = {
96
+ anthropic: { kind: "transformers", hub: "Xenova/claude-tokenizer" },
97
+ meta: { kind: "transformers", hub: "Xenova/Meta-Llama-3.1-Tokenizer" },
98
+ mistral: { kind: "transformers", hub: "Xenova/mistral-tokenizer-v3" },
99
+ deepseek: { kind: "transformers", hub: "deepseek-ai/DeepSeek-V3" },
100
+ google: { kind: "transformers", hub: "google/gemma-2-9b-it" },
101
+ };
102
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../tokenscope-lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { TokenscopeConfig, ModelPricing, TokenModel, ContextAnalysisResult } from "./types";
2
+ import { TokenizerManager } from "./tokenizer";
3
+ export declare class ContextAnalyzer {
4
+ private tokenizerManager;
5
+ constructor(tokenizerManager: TokenizerManager);
6
+ /**
7
+ * Main entry point - analyzes a session using opencode export
8
+ */
9
+ analyze(sessionID: string, tokenModel: TokenModel, pricing: ModelPricing, config: TokenscopeConfig): Promise<ContextAnalysisResult>;
10
+ /**
11
+ * Execute opencode export and parse the JSON output
12
+ */
13
+ private runExport;
14
+ /**
15
+ * Analyze context breakdown from cache_write tokens.
16
+ *
17
+ * Note: OpenCode's `opencode export` command doesn't include system prompt content
18
+ * in the output, so we estimate the breakdown from the first cache_write token count
19
+ * which represents the total cached context size.
20
+ *
21
+ * If system prompts become available in future versions, we can enhance this
22
+ * to tokenize the actual content for more accurate breakdowns.
23
+ */
24
+ private analyzeContextBreakdown;
25
+ /**
26
+ * Analyze actual system prompt content (for when opencode export includes it)
27
+ */
28
+ private analyzeSystemPromptContent;
29
+ /**
30
+ * Extract system prompts from exported session
31
+ */
32
+ private extractSystemPrompts;
33
+ /**
34
+ * Estimate context breakdown from cache token counts when system prompts aren't available.
35
+ *
36
+ * Based on typical OpenCode system prompt structure:
37
+ * - Base System Prompt: ~1,500-2,000 tokens
38
+ * - Tool Definitions: ~350 tokens per tool (typically 12-15 tools = ~4,500-5,500)
39
+ * - Environment Context: ~100-200 tokens
40
+ * - Project Tree: ~300-800 tokens (varies by project)
41
+ * - Custom Instructions: ~100-500 tokens
42
+ *
43
+ * We use the first cache_write value as an estimate of total cached context.
44
+ */
45
+ private estimateContextFromCacheTokens;
46
+ /**
47
+ * Check if content looks like a file tree
48
+ */
49
+ private looksLikeFileTree;
50
+ /**
51
+ * Estimate tool schema tokens from tool calls in the session
52
+ */
53
+ private estimateToolSchemas;
54
+ /**
55
+ * Extract enabled tools from user messages
56
+ */
57
+ private extractEnabledTools;
58
+ /**
59
+ * Extract tool call argument data for inference
60
+ */
61
+ private extractToolCallData;
62
+ /**
63
+ * Infer argument types from values
64
+ */
65
+ private inferArgTypes;
66
+ /**
67
+ * Estimate tokens for a tool schema based on call data
68
+ *
69
+ * Formula from plan:
70
+ * base_tokens = 200 (description + schema overhead)
71
+ * per_simple_arg = 30
72
+ * per_complex_arg = 60 (arrays, objects)
73
+ * description_bonus = 80 (simple) or 120 (complex)
74
+ */
75
+ private estimateToolTokens;
76
+ /**
77
+ * Calculate cache efficiency metrics
78
+ */
79
+ private calculateCacheEfficiency;
80
+ }
81
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,qBAAa,eAAe;IAC1B,OAAO,CAAC,gBAAgB,CAAkB;gBAE9B,gBAAgB,EAAE,gBAAgB;IAI9C;;OAEG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,qBAAqB,CAAC;IAyBjC;;OAEG;YACW,SAAS;IAsBvB;;;;;;;;;OASG;YACW,uBAAuB;IAyBrC;;OAEG;YACW,0BAA0B;IAqIxC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,8BAA8B;IAgDtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA6C1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;CA6CjC"}