@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,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":"AAAA,0EAA0E;AAc1E,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,eAAe,IAAI,cAAc,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,SAAS,CAAA;AAC7G,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAGtF,mBAAmB;AAEnB,MAAM,OAAO,aAAa;IACxB,iBAAiB,CAAC,QAA0B;QAC1C,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAE7D,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAChE,IAAI,WAAW;gBAAE,OAAO,WAAW,CAAA;YAEnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAC3E,IAAI,gBAAgB;gBAAE,OAAO,gBAAgB,CAAA;QAC/C,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAA;IACrD,CAAC;IAEO,kBAAkB,CAAC,OAAgB,EAAE,UAAmB;QAC9D,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACtC,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAA;QAC/E,CAAC;QAED,IAAI,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,CAAA;QACxF,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,wBAAwB,CAAC,OAAgB,EAAE,UAAmB;QACpE,IAAI,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE,EAAE,CAAA;QAChG,CAAC;QAED,IAAI,UAAU,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,UAAU,EAAE,IAAI,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAA;QAC7E,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,yBAAyB,EAAE,EAAE,CAAA;QAC1F,CAAC;QAED,IAAI,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,sBAAsB,CAAC,OAAO,CAAC,IAAI,iCAAiC,EAAE;aAC1G,CAAA;QACH,CAAC;QAED,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,6BAA6B,EAAE,EAAE,CAAA;QAC9F,CAAC;QAED,IAAI,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,yBAAyB,EAAE,EAAE,CAAA;QAC1F,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,SAAS,CAAC,OAAgB;QAChC,IAAI,CAAC,OAAO;YAAE,OAAO,aAAa,CAAA;QAClC,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAA;IAC7C,CAAC;IAEO,YAAY,CAAC,KAAc;QACjC,OAAO,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;IACtD,CAAC;CACF;AAED,qBAAqB;AAErB,MAAM,OAAO,gBAAgB;IAC3B,oBAAoB,CAAC,QAA0B;QAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;QAEzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC/C,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5C,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBAC/C,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;oBACrC,IAAI,OAAO;wBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3D,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC;YACpD,OAAO;SACR,CAAC,CAAC,CAAA;IACL,CAAC;IAED,mBAAmB,CAAC,QAA0B,EAAE,IAA0B;QACxE,MAAM,OAAO,GAA0B,EAAE,CAAA;QACzC,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,SAAQ;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,CAAC,OAAO;gBAAE,SAAQ;YAEtB,KAAK,IAAI,CAAC,CAAA;YACV,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,kBAAkB,CAAC,QAA0B;QAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAA;QAE7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBAE9B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW;oBAAE,SAAQ;gBAE/C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;gBAC1D,IAAI,CAAC,MAAM;oBAAE,SAAQ;gBAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAA;gBACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;gBAChD,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACrE,KAAK,EAAE,QAAQ;YACf,OAAO;SACR,CAAC,CAAC,CAAA;IACL,CAAC;IAED,qBAAqB,CAAC,QAA0B;QAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;QAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAA;gBACpC,IAAI,QAAQ,EAAE,CAAC;oBACb,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,qBAAqB,CAAC,QAA0B;QAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACvE,CAAC;IAED,qBAAqB,CAAC,QAA0B;QAC9C,MAAM,OAAO,GAA0B,EAAE,CAAA;QACzC,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBAEnC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;gBAChD,IAAI,CAAC,IAAI;oBAAE,SAAQ;gBAEnB,KAAK,IAAI,CAAC,CAAA;gBACV,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,WAAW,CAAC,KAA2B;QAC7C,OAAO,KAAK;aACT,MAAM,CAAC,SAAS,CAAC;aACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,MAAM,CAAC,CAAA;IACjB,CAAC;IAEO,oBAAoB,CAAC,OAAe,EAAE,KAAa;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAEnC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,mBAAmB,CAAA;QAC3G,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO,oBAAoB,CAAA;QAC7G,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,kBAAkB,CAAA;QAChF,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,oBAAoB,CAAA;QACpH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAAE,OAAO,kBAAkB,CAAA;QAChH,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,mBAAmB,CAAA;QAChH,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzF,OAAO,uBAAuB,CAAA;QAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,oBAAoB,CAAA;QACnH,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,iBAAiB,CAAA;QAC5G,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,iBAAiB,CAAA;QAC3F,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxF,OAAO,uBAAuB,CAAA;QAEhC,OAAO,UAAU,KAAK,EAAE,CAAA;IAC1B,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QACxB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;CACF;AAED,wBAAwB;AAExB,MAAM,OAAO,mBAAmB;IAEpB;IACA;IAFV,YACU,gBAAkC,EAClC,gBAAkC;QADlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,qBAAgB,GAAhB,gBAAgB,CAAkB;IACzC,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,QAA0B,EAC1B,UAAsB,EACtB,UAAkB;QAElB,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QACvF,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QACtE,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAE5E,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;YACnE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC;YAC7D,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC;YAChE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC;SACzE,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAkB;YAC9B,SAAS;YACT,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;YACzD,WAAW,EACT,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW;YAC3G,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,CAAC;YAClB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;YACnB,qBAAqB,EAAE,CAAC;YACxB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;YACnB,mBAAmB,EAAE,CAAC;YACtB,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;YACvB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,cAAc;YACd,cAAc;SACf,CAAA;QAED,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAElD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,KAAa,EACb,OAA8B,EAC9B,KAAiB,EACjB,UAAkB;QAElB,MAAM,OAAO,GAAoB,EAAE,CAAA;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC7E,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAEzE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;IACtE,CAAC;IAEO,yBAAyB,CAAC,QAAuB,EAAE,QAA0B;QACnF,MAAM,UAAU,GAAG,QAAQ;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC;aAC5F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAE1E,IAAI,UAAU,GAAG,CAAC,EAChB,WAAW,GAAG,CAAC,EACf,cAAc,GAAG,CAAC,CAAA;QACpB,IAAI,cAAc,GAAG,CAAC,EACpB,eAAe,GAAG,CAAC,EACnB,SAAS,GAAG,CAAC,CAAA;QAEf,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;YAC1C,IAAI,MAAM,EAAE,CAAC;gBACX,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACvC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzC,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC/C,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBACjD,eAAe,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;YACD,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QAED,MAAM,mBAAmB,GAAG,CAAC,GAAG,UAAU,CAAC;aACxC,OAAO,EAAE;aACT,IAAI,CACH,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CACb,MAAM;YACN,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC,CACN,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAExC,IAAI,eAAe,GAAG,CAAC,EACrB,gBAAgB,GAAG,CAAC,EACpB,mBAAmB,GAAG,CAAC,CAAA;QACzB,IAAI,mBAAmB,GAAG,CAAC,EACzB,oBAAoB,GAAG,CAAC,EACxB,cAAc,GAAG,CAAC,CAAA;QAEpB,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAA;YACpC,IAAI,CAAC,EAAE,CAAC;gBACN,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACtC,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACxC,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC9C,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBAChD,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACpD,CAAC;YACD,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;QAED,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAA;QACjC,QAAQ,CAAC,YAAY,GAAG,WAAW,CAAA;QACnC,QAAQ,CAAC,eAAe,GAAG,cAAc,CAAA;QACzC,QAAQ,CAAC,eAAe,GAAG,cAAc,CAAA;QACzC,QAAQ,CAAC,gBAAgB,GAAG,eAAe,CAAA;QAC3C,QAAQ,CAAC,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAA;QAClD,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAA;QAChC,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAA;QACxC,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAA;QAC1C,QAAQ,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QAC5C,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAA;QAClD,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAA;QAClD,QAAQ,CAAC,oBAAoB,GAAG,oBAAoB,CAAA;QAEpD,MAAM,mBAAmB,GAAG,eAAe,GAAG,mBAAmB,CAAA;QACjE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAA;QACtG,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,CAAA;QAEjF,IAAI,oBAAoB,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7E,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,GAAG,oBAAoB,CAAA;YAC7D,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAA;YAC5G,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAA;QAC5E,CAAC;QAED,QAAQ,CAAC,WAAW;YAClB,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW;gBACtC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW;gBACpC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW;gBACzC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW;gBACrC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAA;IAC7C,CAAC;CACF"}
|
|
@@ -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"}
|