@ramtinj95/opencode-tokenscope 1.5.1 → 1.6.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 (48) hide show
  1. package/README.md +38 -12
  2. package/dist/tokenscope-lib/analyzer.d.ts +2 -0
  3. package/dist/tokenscope-lib/analyzer.d.ts.map +1 -1
  4. package/dist/tokenscope-lib/analyzer.js +68 -23
  5. package/dist/tokenscope-lib/analyzer.js.map +1 -1
  6. package/dist/tokenscope-lib/config.d.ts.map +1 -1
  7. package/dist/tokenscope-lib/config.js +21 -11
  8. package/dist/tokenscope-lib/config.js.map +1 -1
  9. package/dist/tokenscope-lib/context.d.ts +4 -5
  10. package/dist/tokenscope-lib/context.d.ts.map +1 -1
  11. package/dist/tokenscope-lib/context.js +47 -42
  12. package/dist/tokenscope-lib/context.js.map +1 -1
  13. package/dist/tokenscope-lib/cost.d.ts +4 -0
  14. package/dist/tokenscope-lib/cost.d.ts.map +1 -1
  15. package/dist/tokenscope-lib/cost.js +38 -8
  16. package/dist/tokenscope-lib/cost.js.map +1 -1
  17. package/dist/tokenscope-lib/formatter.d.ts +3 -0
  18. package/dist/tokenscope-lib/formatter.d.ts.map +1 -1
  19. package/dist/tokenscope-lib/formatter.js +91 -21
  20. package/dist/tokenscope-lib/formatter.js.map +1 -1
  21. package/dist/tokenscope-lib/opencode.d.ts +4 -0
  22. package/dist/tokenscope-lib/opencode.d.ts.map +1 -0
  23. package/dist/tokenscope-lib/opencode.js +25 -0
  24. package/dist/tokenscope-lib/opencode.js.map +1 -0
  25. package/dist/tokenscope-lib/skill.d.ts +43 -5
  26. package/dist/tokenscope-lib/skill.d.ts.map +1 -1
  27. package/dist/tokenscope-lib/skill.js +435 -50
  28. package/dist/tokenscope-lib/skill.js.map +1 -1
  29. package/dist/tokenscope-lib/subagent.d.ts +4 -4
  30. package/dist/tokenscope-lib/subagent.d.ts.map +1 -1
  31. package/dist/tokenscope-lib/subagent.js +29 -24
  32. package/dist/tokenscope-lib/subagent.js.map +1 -1
  33. package/dist/tokenscope-lib/tokenizer.d.ts +3 -0
  34. package/dist/tokenscope-lib/tokenizer.d.ts.map +1 -1
  35. package/dist/tokenscope-lib/tokenizer.js +8 -2
  36. package/dist/tokenscope-lib/tokenizer.js.map +1 -1
  37. package/dist/tokenscope-lib/types.d.ts +30 -2
  38. package/dist/tokenscope-lib/types.d.ts.map +1 -1
  39. package/dist/tokenscope-lib/types.js.map +1 -1
  40. package/dist/tokenscope-lib/warnings.d.ts +8 -0
  41. package/dist/tokenscope-lib/warnings.d.ts.map +1 -0
  42. package/dist/tokenscope-lib/warnings.js +31 -0
  43. package/dist/tokenscope-lib/warnings.js.map +1 -0
  44. package/dist/tokenscope.d.ts.map +1 -1
  45. package/dist/tokenscope.js +125 -57
  46. package/dist/tokenscope.js.map +1 -1
  47. package/models.json +30922 -232
  48. package/package.json +1 -1
@@ -1,7 +1,10 @@
1
1
  // ContextAnalyzer - analyzes context breakdown from opencode export
2
+ import { formatErrorMessage } from "./warnings";
2
3
  export class ContextAnalyzer {
4
+ warnings;
3
5
  tokenizerManager;
4
- constructor(tokenizerManager) {
6
+ constructor(tokenizerManager, warnings) {
7
+ this.warnings = warnings;
5
8
  this.tokenizerManager = tokenizerManager;
6
9
  }
7
10
  /**
@@ -24,7 +27,7 @@ export class ContextAnalyzer {
24
27
  }
25
28
  }
26
29
  catch (error) {
27
- console.error(`Context analysis failed for session ${sessionID}:`, error);
30
+ this.warnings?.add(`Context analysis was skipped for session ${sessionID}: ${formatErrorMessage(error)}`, `context-analysis:${sessionID}`);
28
31
  }
29
32
  return result;
30
33
  }
@@ -39,13 +42,13 @@ export class ContextAnalyzer {
39
42
  const { stdout } = await $ `opencode export ${sessionID}`.quiet();
40
43
  const result = stdout.toString();
41
44
  if (!result.trim()) {
42
- console.error(`No output from opencode export for session ${sessionID}`);
45
+ this.warnings?.add(`OpenCode export returned no data for session ${sessionID}. Context sections were skipped.`, `export-empty:${sessionID}`);
43
46
  return null;
44
47
  }
45
48
  return JSON.parse(result);
46
49
  }
47
50
  catch (error) {
48
- console.error(`Failed to run opencode export for session ${sessionID}:`, error);
51
+ this.warnings?.add(`OpenCode export failed for session ${sessionID}. Context sections were skipped: ${formatErrorMessage(error)}`, `export-failed:${sessionID}`);
49
52
  return null;
50
53
  }
51
54
  }
@@ -108,24 +111,21 @@ export class ContextAnalyzer {
108
111
  }
109
112
  }
110
113
  }
111
- // Check for project tree with <files> tags
112
- if (promptLower.includes("<files>")) {
113
- const filesMatch = prompt.match(/<files>[\s\S]*?<\/files>/i);
114
- if (filesMatch) {
115
- const filesTokens = await this.tokenizerManager.countTokens(filesMatch[0], tokenModel);
114
+ // Check for project tree with modern <directories> tags
115
+ // (fallback to legacy <files> tags)
116
+ if (promptLower.includes("<directories>") || promptLower.includes("<files>")) {
117
+ const treeMatch = prompt.match(/<directories>[\s\S]*?<\/directories>/i) ?? prompt.match(/<files>[\s\S]*?<\/files>/i);
118
+ if (treeMatch) {
119
+ const filesTokens = await this.tokenizerManager.countTokens(treeMatch[0], tokenModel);
116
120
  breakdown.projectTree.tokens += filesTokens;
117
121
  breakdown.projectTree.identified = true;
118
- // Count file references
119
- const fileMatches = filesMatch[0].match(/\n\s+[\w\-\.]+\.[a-z]{1,5}/g);
120
- if (fileMatches) {
121
- breakdown.projectTree.fileCount += fileMatches.length;
122
- }
122
+ breakdown.projectTree.fileCount += this.countProjectTreeEntries(treeMatch[0]);
123
123
  }
124
124
  }
125
125
  // Check for custom instructions
126
126
  if (promptLower.includes("instructions from:") || promptLower.includes("agents.md")) {
127
127
  // Try to extract just the instructions section
128
- const instructionMatches = prompt.match(/Instructions from:[\s\S]*?(?=Instructions from:|<env>|<files>|$)/gi);
128
+ const instructionMatches = prompt.match(/Instructions from:[\s\S]*?(?=Instructions from:|<env>|<files>|<directories>|$)/gi);
129
129
  if (instructionMatches) {
130
130
  for (const match of instructionMatches) {
131
131
  const instrTokens = await this.tokenizerManager.countTokens(match, tokenModel);
@@ -170,6 +170,7 @@ export class ContextAnalyzer {
170
170
  (promptLower.includes("assistant") && promptLower.includes("software engineering"))) &&
171
171
  !promptLower.includes("<env>") &&
172
172
  !promptLower.includes("<files>") &&
173
+ !promptLower.includes("<directories>") &&
173
174
  !promptLower.includes("<functions>")) {
174
175
  breakdown.baseSystemPrompt.tokens += tokens;
175
176
  breakdown.baseSystemPrompt.identified = true;
@@ -178,6 +179,7 @@ export class ContextAnalyzer {
178
179
  else if (prompt.length > 500 &&
179
180
  !promptLower.includes("<env>") &&
180
181
  !promptLower.includes("<files>") &&
182
+ !promptLower.includes("<directories>") &&
181
183
  !promptLower.includes("<functions>") &&
182
184
  !promptLower.includes("instructions from:")) {
183
185
  breakdown.baseSystemPrompt.tokens += tokens;
@@ -196,18 +198,35 @@ export class ContextAnalyzer {
196
198
  */
197
199
  extractSystemPrompts(exported) {
198
200
  const prompts = new Set();
199
- for (const message of exported.messages) {
200
- // Assistant messages contain system[] in info
201
- if (message.info.role === "assistant" && message.info.system) {
202
- for (const prompt of message.info.system) {
203
- if (prompt && prompt.trim()) {
204
- prompts.add(prompt.trim());
201
+ const addPrompt = (value) => {
202
+ if (Array.isArray(value)) {
203
+ for (const prompt of value) {
204
+ const trimmed = (prompt ?? "").trim();
205
+ if (trimmed) {
206
+ prompts.add(trimmed);
205
207
  }
206
208
  }
209
+ return;
210
+ }
211
+ const trimmed = (value ?? "").trim();
212
+ if (trimmed) {
213
+ prompts.add(trimmed);
214
+ }
215
+ };
216
+ for (const message of exported.messages) {
217
+ if (message.info.role === "user" || message.info.role === "assistant") {
218
+ addPrompt(message.info.system);
207
219
  }
208
220
  }
209
221
  return Array.from(prompts);
210
222
  }
223
+ countProjectTreeEntries(section) {
224
+ return section
225
+ .split(/\r?\n/)
226
+ .map((line) => line.trim())
227
+ .filter((line) => line.length > 0)
228
+ .filter((line) => !/^<\/?(files|directories)>$/i.test(line)).length;
229
+ }
211
230
  /**
212
231
  * Estimate context breakdown from cache token counts when system prompts aren't available.
213
232
  *
@@ -255,23 +274,6 @@ export class ContextAnalyzer {
255
274
  breakdown.totalCachedContext = totalCachedTokens;
256
275
  return breakdown;
257
276
  }
258
- /**
259
- * Check if content looks like a file tree
260
- */
261
- looksLikeFileTree(content) {
262
- const lines = content.split("\n");
263
- let indentedLines = 0;
264
- let filePatternLines = 0;
265
- for (const line of lines) {
266
- if (/^\s{2,}[\w\-\.]+/.test(line)) {
267
- indentedLines++;
268
- }
269
- if (/\.(ts|js|md|json|py|go|rs|java|c|cpp|h|css|html|tsx|jsx)$/i.test(line)) {
270
- filePatternLines++;
271
- }
272
- }
273
- return indentedLines > 5 && filePatternLines > 3;
274
- }
275
277
  /**
276
278
  * Estimate tool schema tokens from tool calls in the session
277
279
  */
@@ -422,12 +424,15 @@ export class ContextAnalyzer {
422
424
  totalCacheWrite += Number(tokens.cache?.write) || 0;
423
425
  }
424
426
  }
425
- const totalInputTokens = totalCacheRead + totalFreshInput;
426
- // Cache hit rate
427
- const cacheHitRate = totalInputTokens > 0 ? (totalCacheRead / totalInputTokens) * 100 : 0;
427
+ const totalInputTokens = totalCacheRead + totalFreshInput + totalCacheWrite;
428
+ const cacheableInputTokens = totalCacheRead + totalFreshInput;
429
+ // Cache hit rate (read-hit ratio over cacheable input)
430
+ const cacheHitRate = cacheableInputTokens > 0 ? (totalCacheRead / cacheableInputTokens) * 100 : 0;
428
431
  // Cost calculations
429
432
  const costWithoutCaching = (totalInputTokens / 1_000_000) * pricing.input;
430
- const costWithCaching = (totalFreshInput / 1_000_000) * pricing.input + (totalCacheRead / 1_000_000) * pricing.cacheRead;
433
+ const costWithCaching = (totalFreshInput / 1_000_000) * pricing.input +
434
+ (totalCacheRead / 1_000_000) * pricing.cacheRead +
435
+ (totalCacheWrite / 1_000_000) * pricing.cacheWrite;
431
436
  const costSavings = costWithoutCaching - costWithCaching;
432
437
  const savingsPercent = costWithoutCaching > 0 ? (costSavings / costWithoutCaching) * 100 : 0;
433
438
  // Effective rate (what you're actually paying per token)
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../tokenscope-lib/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../tokenscope-lib/context.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,11 @@ export declare class CostCalculator {
3
3
  private pricingData;
4
4
  constructor(pricingData: Record<string, ModelPricing>);
5
5
  calculateCost(analysis: TokenAnalysis): CostEstimate;
6
+ buildLookupKey(providerID?: string, modelID?: string): string;
6
7
  getPricing(modelName: string): ModelPricing;
8
+ hasPricing(modelName: string): boolean;
9
+ private findPricing;
10
+ private findLongestPrefixMatch;
7
11
  private normalizeModelName;
8
12
  }
9
13
  //# sourceMappingURL=cost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/cost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAExE,qBAAa,cAAc;IACb,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAE7D,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY;IAiCpD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAa3C,OAAO,CAAC,kBAAkB;CAG3B"}
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/cost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAExE,qBAAa,cAAc;IACb,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAE7D,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY;IAiCpD,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAc7D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAI3C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -5,8 +5,8 @@ export class CostCalculator {
5
5
  this.pricingData = pricingData;
6
6
  }
7
7
  calculateCost(analysis) {
8
- const pricing = this.getPricing(analysis.model.name);
9
- const hasActivity = analysis.assistantMessageCount > 0 && (analysis.inputTokens > 0 || analysis.outputTokens > 0);
8
+ const pricing = this.getPricing(analysis.pricingModelName ?? analysis.model.name);
9
+ const hasActivity = analysis.apiCallCount > 0 && (analysis.inputTokens > 0 || analysis.outputTokens > 0);
10
10
  const isSubscription = hasActivity && analysis.sessionCost === 0;
11
11
  const estimatedInputCost = (analysis.inputTokens / 1_000_000) * pricing.input;
12
12
  const estimatedOutputCost = ((analysis.outputTokens + analysis.reasoningTokens) / 1_000_000) * pricing.output;
@@ -33,19 +33,49 @@ export class CostCalculator {
33
33
  cacheWriteTokens: analysis.cacheWriteTokens,
34
34
  };
35
35
  }
36
+ buildLookupKey(providerID, modelID) {
37
+ const provider = providerID?.trim();
38
+ const model = modelID?.trim();
39
+ if (!provider)
40
+ return model ?? "";
41
+ if (!model)
42
+ return provider;
43
+ const normalizedProvider = provider.toLowerCase();
44
+ const normalizedModel = model.toLowerCase();
45
+ if (normalizedModel.startsWith(`${normalizedProvider}/`))
46
+ return model;
47
+ return `${provider}/${model}`;
48
+ }
36
49
  getPricing(modelName) {
37
- const normalizedName = this.normalizeModelName(modelName);
50
+ return this.findPricing(modelName) ?? this.pricingData["default"] ?? { input: 1, output: 3, cacheWrite: 0, cacheRead: 0 };
51
+ }
52
+ hasPricing(modelName) {
53
+ return this.findPricing(modelName) !== undefined;
54
+ }
55
+ findPricing(modelName) {
56
+ const rawName = modelName.trim().toLowerCase();
57
+ if (!rawName)
58
+ return undefined;
59
+ if (this.pricingData[rawName])
60
+ return this.pricingData[rawName];
61
+ const normalizedName = this.normalizeModelName(rawName);
38
62
  if (this.pricingData[normalizedName])
39
63
  return this.pricingData[normalizedName];
40
- const lowerModel = normalizedName.toLowerCase();
64
+ return this.findLongestPrefixMatch(rawName) ?? this.findLongestPrefixMatch(normalizedName);
65
+ }
66
+ findLongestPrefixMatch(modelName) {
67
+ let bestMatchLength = -1;
68
+ let bestPricing;
41
69
  for (const [key, pricing] of Object.entries(this.pricingData)) {
42
- if (lowerModel.startsWith(key.toLowerCase()))
43
- return pricing;
70
+ if (modelName.startsWith(key.toLowerCase()) && key.length > bestMatchLength) {
71
+ bestMatchLength = key.length;
72
+ bestPricing = pricing;
73
+ }
44
74
  }
45
- return this.pricingData["default"] || { input: 1, output: 3, cacheWrite: 0, cacheRead: 0 };
75
+ return bestPricing;
46
76
  }
47
77
  normalizeModelName(modelName) {
48
- return modelName.includes("/") ? modelName.split("/").pop() || modelName : modelName;
78
+ return modelName.includes("/") ? modelName.split("/").pop()?.trim().toLowerCase() || modelName : modelName.trim().toLowerCase();
49
79
  }
50
80
  }
51
81
  //# sourceMappingURL=cost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../tokenscope-lib/cost.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAIxD,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,WAAyC;QAAzC,gBAAW,GAAX,WAAW,CAA8B;IAAG,CAAC;IAEjE,aAAa,CAAC,QAAuB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;QACjH,MAAM,cAAc,GAAG,WAAW,IAAI,QAAQ,CAAC,WAAW,KAAK,CAAC,CAAA;QAEhE,MAAM,kBAAkB,GAAG,CAAC,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;QAC7E,MAAM,mBAAmB,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;QAC7G,MAAM,sBAAsB,GAAG,CAAC,QAAQ,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAA;QACzF,MAAM,uBAAuB,GAAG,CAAC,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,UAAU,CAAA;QAC5F,MAAM,oBAAoB,GACxB,kBAAkB,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,uBAAuB,CAAA;QAE7F,OAAO;YACL,cAAc;YACd,cAAc,EAAE,QAAQ,CAAC,WAAW;YACpC,iBAAiB,EAAE,QAAQ,CAAC,cAAc;YAC1C,oBAAoB;YACpB,kBAAkB;YAClB,mBAAmB;YACnB,sBAAsB;YACtB,uBAAuB;YACvB,oBAAoB,EAAE,OAAO,CAAC,KAAK;YACnC,qBAAqB,EAAE,OAAO,CAAC,MAAM;YACrC,wBAAwB,EAAE,OAAO,CAAC,SAAS;YAC3C,yBAAyB,EAAE,OAAO,CAAC,UAAU;YAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;SAC5C,CAAA;IACH,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAEzD,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;QAE7E,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE,CAAA;QAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9D,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAA;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IAC5F,CAAC;IAEO,kBAAkB,CAAC,SAAiB;QAC1C,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;IACtF,CAAC;CACF"}
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../tokenscope-lib/cost.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ export declare class OutputFormatter {
11
11
  private readonly TOOL_ESTIMATE_LABEL_WIDTH;
12
12
  private readonly SKILL_NAME_WIDTH;
13
13
  private readonly SKILL_DESC_WIDTH;
14
+ private readonly SUBAGENT_NAME_WIDTH;
15
+ private readonly SUBAGENT_DESC_WIDTH;
14
16
  private config;
15
17
  constructor(costCalculator: CostCalculator);
16
18
  setConfig(config: TokenscopeConfig): void;
@@ -24,6 +26,7 @@ export declare class OutputFormatter {
24
26
  private formatEfficiencyBar;
25
27
  private formatAvailableSkills;
26
28
  private formatLoadedSkills;
29
+ private formatAvailableSubagents;
27
30
  private collectTopEntries;
28
31
  private formatNumber;
29
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAOb,gBAAgB,EAEjB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAEvC,qBAAa,eAAe;IAad,OAAO,CAAC,cAAc;IAZlC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAK;IACnC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAI;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IACtC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAK;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAK;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAEtC,OAAO,CAAC,MAAM,CAAgC;gBAE1B,cAAc,EAAE,cAAc;IAElD,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzC,OAAO,CAAC,iBAAiB;IA2BzB,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM;IAsDvC,OAAO,CAAC,kBAAkB;IA4R1B,OAAO,CAAC,sBAAsB;IAwE9B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,qBAAqB;IA4C7B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,kBAAkB;IAwC1B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../tokenscope-lib/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAOb,gBAAgB,EAEjB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAEvC,qBAAa,eAAe;IAed,OAAO,CAAC,cAAc;IAdlC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAK;IACnC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAI;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IACtC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAK;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAK;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAEzC,OAAO,CAAC,MAAM,CAAgC;gBAE1B,cAAc,EAAE,cAAc;IAElD,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzC,OAAO,CAAC,iBAAiB;IA2BzB,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM;IA4DvC,OAAO,CAAC,kBAAkB;IAmT1B,OAAO,CAAC,sBAAsB;IAwE9B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,qBAAqB;IAoD7B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,qBAAqB;IA8D7B,OAAO,CAAC,kBAAkB;IAwC1B,OAAO,CAAC,wBAAwB;IA+ChC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,YAAY;CAGrB"}
@@ -10,6 +10,8 @@ export class OutputFormatter {
10
10
  TOOL_ESTIMATE_LABEL_WIDTH = 18;
11
11
  SKILL_NAME_WIDTH = 22;
12
12
  SKILL_DESC_WIDTH = 45;
13
+ SUBAGENT_NAME_WIDTH = 22;
14
+ SUBAGENT_DESC_WIDTH = 50;
13
15
  config = null;
14
16
  constructor(costCalculator) {
15
17
  this.costCalculator = costCalculator;
@@ -46,6 +48,7 @@ export class OutputFormatter {
46
48
  { label: "REASONING", tokens: analysis.categories.reasoning.totalTokens },
47
49
  ];
48
50
  const topEntries = this.collectTopEntries(analysis, 5);
51
+ const hasInferredSystemEstimate = analysis.categories.system.entries.some((entry) => entry.label.toLowerCase().includes("inferred"));
49
52
  const toolStats = new Map();
50
53
  for (const [toolName, calls] of analysis.toolCallCounts.entries()) {
51
54
  toolStats.set(toolName, { tokens: 0, calls });
@@ -58,9 +61,9 @@ export class OutputFormatter {
58
61
  .map(([label, stats]) => ({ label, tokens: stats.tokens, calls: stats.calls }))
59
62
  .sort((a, b) => b.tokens - a.tokens);
60
63
  const costEstimate = this.costCalculator.calculateCost(analysis);
61
- return this.formatVisualOutput(analysis.sessionID, analysis.model.name, analysis.totalTokens, analysis.inputTokens, analysis.outputTokens, analysis.reasoningTokens, analysis.cacheReadTokens, analysis.cacheWriteTokens, analysis.assistantMessageCount, analysis.mostRecentInput, analysis.mostRecentOutput, analysis.mostRecentReasoning, analysis.mostRecentCacheRead, analysis.mostRecentCacheWrite, inputCategories, outputCategories, topEntries, toolEntries, costEstimate, analysis.subagentAnalysis, analysis.contextBreakdown, analysis.toolEstimates, analysis.cacheEfficiency, analysis.skillAnalysis);
64
+ return this.formatVisualOutput(analysis.sessionID, analysis.model.name, analysis.warnings, analysis.totalTokens, analysis.inputTokens, analysis.outputTokens, analysis.reasoningTokens, analysis.cacheReadTokens, analysis.cacheWriteTokens, analysis.assistantMessageCount, analysis.apiCallCount, analysis.mostRecentInput, analysis.mostRecentOutput, analysis.mostRecentReasoning, analysis.mostRecentCacheRead, analysis.mostRecentCacheWrite, inputCategories, outputCategories, topEntries, toolEntries, hasInferredSystemEstimate, costEstimate, analysis.subagentAnalysis, analysis.contextBreakdown, analysis.toolEstimates, analysis.cacheEfficiency, analysis.skillAnalysis);
62
65
  }
63
- formatVisualOutput(sessionID, modelName, totalTokens, inputTokens, outputTokens, reasoningTokens, cacheReadTokens, cacheWriteTokens, assistantMessageCount, mostRecentInput, mostRecentOutput, mostRecentReasoning, mostRecentCacheRead, mostRecentCacheWrite, inputCategories, outputCategories, topEntries, toolEntries, cost, subagentAnalysis, contextBreakdown, toolEstimates, cacheEfficiency, skillAnalysis) {
66
+ formatVisualOutput(sessionID, modelName, warnings, totalTokens, inputTokens, outputTokens, reasoningTokens, cacheReadTokens, cacheWriteTokens, assistantMessageCount, apiCallCount, mostRecentInput, mostRecentOutput, mostRecentReasoning, mostRecentCacheRead, mostRecentCacheWrite, inputCategories, outputCategories, topEntries, toolEntries, hasInferredSystemEstimate, cost, subagentAnalysis, contextBreakdown, toolEstimates, cacheEfficiency, skillAnalysis) {
64
67
  const lines = [];
65
68
  const sessionTotal = inputTokens + cacheReadTokens + cacheWriteTokens + outputTokens + reasoningTokens;
66
69
  const mainCost = cost.isSubscription ? cost.estimatedSessionCost : cost.apiSessionCost;
@@ -70,6 +73,14 @@ export class OutputFormatter {
70
73
  lines.push(`Model: ${modelName}`);
71
74
  lines.push(`\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`);
72
75
  lines.push(``);
76
+ if (warnings.length > 0) {
77
+ lines.push(`WARNINGS`);
78
+ lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
79
+ for (const warning of warnings) {
80
+ lines.push(`- ${warning}`);
81
+ }
82
+ lines.push(``);
83
+ }
73
84
  // 1. TOKEN BREAKDOWN BY CATEGORY
74
85
  lines.push(`TOKEN BREAKDOWN BY CATEGORY`);
75
86
  lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
@@ -84,6 +95,9 @@ export class OutputFormatter {
84
95
  }
85
96
  lines.push(``);
86
97
  lines.push(` Subtotal: ${this.formatNumber(inputTotal)} estimated input tokens`);
98
+ if (hasInferredSystemEstimate) {
99
+ lines.push(` Note: inferred system/overhead values are heuristic estimates from API telemetry.`);
100
+ }
87
101
  lines.push(``);
88
102
  const outputTotal = outputCategories.reduce((sum, cat) => sum + cat.tokens, 0);
89
103
  lines.push(`Output Categories:`);
@@ -143,9 +157,13 @@ export class OutputFormatter {
143
157
  // 5. SESSION TOTALS
144
158
  lines.push(``);
145
159
  lines.push(`\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`);
146
- lines.push(`SESSION TOTALS (All ${assistantMessageCount} API calls)`);
160
+ lines.push(`SESSION TOTALS (All ${apiCallCount} API calls)`);
147
161
  lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
148
162
  lines.push(``);
163
+ if (assistantMessageCount !== apiCallCount) {
164
+ lines.push(`Assistant messages observed: ${assistantMessageCount} (structural count)`);
165
+ lines.push(``);
166
+ }
149
167
  lines.push(`Total tokens processed across the entire session (for cost calculation):`);
150
168
  lines.push(``);
151
169
  lines.push(` Input tokens: ${this.formatNumber(inputTokens).padStart(10)} (fresh tokens across all calls)`);
@@ -218,6 +236,9 @@ export class OutputFormatter {
218
236
  if (skillAnalysis.availableSkills.length > 0) {
219
237
  lines.push(...this.formatAvailableSkills(skillAnalysis));
220
238
  }
239
+ if (skillAnalysis.availableSubagents.length > 0) {
240
+ lines.push(...this.formatAvailableSubagents(skillAnalysis));
241
+ }
221
242
  if (skillAnalysis.loadedSkills.length > 0) {
222
243
  lines.push(...this.formatLoadedSkills(skillAnalysis));
223
244
  }
@@ -246,7 +267,7 @@ export class OutputFormatter {
246
267
  const costStr = cost.isSubscription
247
268
  ? `$${subagent.estimatedCost.toFixed(4)}`
248
269
  : `$${subagent.apiCost.toFixed(4)}`;
249
- const tokensStr = `(${this.formatNumber(subagent.totalTokens)} tokens, ${subagent.assistantMessageCount} calls)`;
270
+ const tokensStr = `(${this.formatNumber(subagent.totalTokens)} tokens, ${subagent.apiCallCount} calls)`;
250
271
  lines.push(` ${label} ${costStr.padStart(10)} ${tokensStr}`);
251
272
  }
252
273
  lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
@@ -265,14 +286,14 @@ export class OutputFormatter {
265
286
  : subagentAnalysis.totalApiCost;
266
287
  const grandTotalCost = mainCost + subagentTotalCost;
267
288
  const grandTotalTokens = sessionTotal + subagentAnalysis.totalTokens;
268
- const grandTotalApiCalls = assistantMessageCount + subagentAnalysis.totalApiCalls;
269
- lines.push(` Main session: $${mainCost.toFixed(4).padStart(10)} ${this.formatNumber(sessionTotal).padStart(10)} ${assistantMessageCount.toString().padStart(5)}`);
289
+ const grandTotalApiCalls = apiCallCount + subagentAnalysis.totalApiCalls;
290
+ lines.push(` Main session: $${mainCost.toFixed(4).padStart(10)} ${this.formatNumber(sessionTotal).padStart(10)} ${apiCallCount.toString().padStart(5)}`);
270
291
  lines.push(` Subagents: $${subagentTotalCost.toFixed(4).padStart(10)} ${this.formatNumber(subagentAnalysis.totalTokens).padStart(10)} ${subagentAnalysis.totalApiCalls.toString().padStart(5)}`);
271
292
  lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
272
293
  lines.push(` TOTAL: $${grandTotalCost.toFixed(4).padStart(10)} ${this.formatNumber(grandTotalTokens).padStart(10)} ${grandTotalApiCalls.toString().padStart(5)}`);
273
294
  }
274
295
  else {
275
- lines.push(` Session: $${mainCost.toFixed(4).padStart(10)} ${this.formatNumber(sessionTotal).padStart(10)} ${assistantMessageCount.toString().padStart(5)}`);
296
+ lines.push(` Session: $${mainCost.toFixed(4).padStart(10)} ${this.formatNumber(sessionTotal).padStart(10)} ${apiCallCount.toString().padStart(5)}`);
276
297
  }
277
298
  lines.push(``);
278
299
  lines.push(`\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`);
@@ -390,13 +411,18 @@ export class OutputFormatter {
390
411
  const freshPct = total > 0 ? ((efficiency.freshInputTokens / total) * 100).toFixed(1) : "0.0";
391
412
  const freshBar = this.formatEfficiencyBar(efficiency.freshInputTokens, total);
392
413
  lines.push(` Fresh Input: ${this.formatNumber(efficiency.freshInputTokens).padStart(10)} tokens ${freshBar} ${freshPct}%`);
414
+ if (efficiency.cacheWriteTokens > 0) {
415
+ const cacheWritePct = total > 0 ? ((efficiency.cacheWriteTokens / total) * 100).toFixed(1) : "0.0";
416
+ const cacheWriteBar = this.formatEfficiencyBar(efficiency.cacheWriteTokens, total);
417
+ lines.push(` Cache Write: ${this.formatNumber(efficiency.cacheWriteTokens).padStart(10)} tokens ${cacheWriteBar} ${cacheWritePct}%`);
418
+ }
393
419
  lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
394
- lines.push(` Cache Hit Rate: ${efficiency.cacheHitRate.toFixed(1)}%`);
420
+ lines.push(` Cache Hit Rate: ${efficiency.cacheHitRate.toFixed(1)}% (cache read / (cache read + fresh input))`);
395
421
  lines.push(``);
396
422
  // Cost analysis
397
- lines.push(` Cost Analysis (${modelName} @ $${cost.pricePerMillionInput.toFixed(2)}/M input, $${cost.pricePerMillionCacheRead.toFixed(2)}/M cache read):`);
423
+ lines.push(` Cost Analysis (${modelName} @ $${cost.pricePerMillionInput.toFixed(2)}/M input, $${cost.pricePerMillionCacheRead.toFixed(2)}/M cache read, $${cost.pricePerMillionCacheWrite.toFixed(2)}/M cache write):`);
398
424
  lines.push(` Without caching: $${efficiency.costWithoutCaching.toFixed(4)} (${this.formatNumber(total)} tokens x $${cost.pricePerMillionInput.toFixed(2)}/M)`);
399
- lines.push(` With caching: $${efficiency.costWithCaching.toFixed(4)} (fresh x $${cost.pricePerMillionInput.toFixed(2)}/M + cached x $${cost.pricePerMillionCacheRead.toFixed(2)}/M)`);
425
+ lines.push(` With caching: $${efficiency.costWithCaching.toFixed(4)} (fresh x $${cost.pricePerMillionInput.toFixed(2)}/M + cache read x $${cost.pricePerMillionCacheRead.toFixed(2)}/M + cache write x $${cost.pricePerMillionCacheWrite.toFixed(2)}/M)`);
400
426
  lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
401
427
  lines.push(` Cost Savings: $${efficiency.costSavings.toFixed(4)} (${efficiency.savingsPercent.toFixed(1)}% reduction)`);
402
428
  lines.push(` Effective Rate: $${efficiency.effectiveRate.toFixed(2)}/M tokens (vs. $${efficiency.standardRate.toFixed(2)}/M standard)`);
@@ -410,34 +436,47 @@ export class OutputFormatter {
410
436
  formatAvailableSkills(analysis) {
411
437
  const lines = [];
412
438
  const total = analysis.totalAvailableTokens;
439
+ const hasSystemPromptCatalog = analysis.availableSkillsContextTokens > 0;
413
440
  lines.push(``);
414
- lines.push(`\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`);
415
- lines.push(`AVAILABLE SKILLS (in tool definitions)`);
416
- lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
441
+ lines.push(`══════════════════════════════════════════════════════════════════════════`);
442
+ lines.push(`AVAILABLE SKILLS (always-available context)`);
443
+ lines.push(`─────────────────────────────────────────────────────────────────────────`);
417
444
  lines.push(``);
418
- lines.push(`These skills are listed in the skill tool description and consume tokens on every API call.`);
445
+ if (hasSystemPromptCatalog) {
446
+ lines.push(`OpenCode currently includes a verbose skill catalog in the system prompt on every API call.`);
447
+ lines.push(`The rows below estimate the per-skill XML entries inside that shared catalog.`);
448
+ }
449
+ else {
450
+ lines.push(`These skills were recovered from the skill tool metadata available to this session.`);
451
+ }
419
452
  lines.push(``);
420
- // Header
421
453
  const nameHeader = "Skill".padEnd(this.SKILL_NAME_WIDTH);
422
454
  const descHeader = "Description".padEnd(this.SKILL_DESC_WIDTH);
423
455
  lines.push(` ${nameHeader} ${descHeader} Tokens`);
424
- lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
425
- // Sort by tokens descending
456
+ lines.push(` ───────────────────────────────────────────────────────────────────────`);
426
457
  const sortedSkills = [...analysis.availableSkills].sort((a, b) => b.tokens - a.tokens);
427
458
  for (const skill of sortedSkills) {
428
459
  const name = skill.name.length > this.SKILL_NAME_WIDTH
429
- ? skill.name.substring(0, this.SKILL_NAME_WIDTH - 1) + "\u2026"
460
+ ? skill.name.substring(0, this.SKILL_NAME_WIDTH - 1) + ""
430
461
  : skill.name.padEnd(this.SKILL_NAME_WIDTH);
431
462
  const desc = skill.description.length > this.SKILL_DESC_WIDTH
432
- ? skill.description.substring(0, this.SKILL_DESC_WIDTH - 1) + "\u2026"
463
+ ? skill.description.substring(0, this.SKILL_DESC_WIDTH - 1) + ""
433
464
  : skill.description.padEnd(this.SKILL_DESC_WIDTH);
434
465
  const tokens = `~${this.formatNumber(skill.tokens)}`.padStart(7);
435
466
  lines.push(` ${name} ${desc} ${tokens}`);
436
467
  }
437
- lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
468
+ lines.push(` ───────────────────────────────────────────────────────────────────────`);
438
469
  lines.push(` Total: ~${this.formatNumber(total)} tokens (${analysis.availableSkills.length} skills available)`);
439
470
  lines.push(``);
440
- lines.push(` Note: Full skill tool description is ~${this.formatNumber(analysis.skillToolDescriptionTokens)} tokens (includes boilerplate).`);
471
+ if (hasSystemPromptCatalog) {
472
+ lines.push(` Note: Full system-prompt skill catalog is ~${this.formatNumber(analysis.availableSkillsContextTokens)} tokens (includes shared wrapper/preamble).`);
473
+ if (analysis.skillToolDescriptionTokens > 0) {
474
+ lines.push(` Compact skill tool description adds ~${this.formatNumber(analysis.skillToolDescriptionTokens)} tokens more.`);
475
+ }
476
+ }
477
+ else if (analysis.skillToolDescriptionTokens > 0) {
478
+ lines.push(` Note: Full skill tool description is ~${this.formatNumber(analysis.skillToolDescriptionTokens)} tokens (includes boilerplate).`);
479
+ }
441
480
  return lines;
442
481
  }
443
482
  formatLoadedSkills(analysis) {
@@ -469,6 +508,37 @@ export class OutputFormatter {
469
508
  lines.push(` Note: Loaded skill content stays in context (protected from pruning).`);
470
509
  return lines;
471
510
  }
511
+ formatAvailableSubagents(analysis) {
512
+ const lines = [];
513
+ const total = analysis.totalAvailableSubagentTokens;
514
+ lines.push(``);
515
+ lines.push(`\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`);
516
+ lines.push(`AVAILABLE SUBAGENTS (in task tool definition)`);
517
+ lines.push(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
518
+ lines.push(``);
519
+ lines.push(`These subagents are embedded in the task tool description and consume tokens on every API call.`);
520
+ lines.push(``);
521
+ const nameHeader = "Subagent".padEnd(this.SUBAGENT_NAME_WIDTH);
522
+ const descHeader = "Description".padEnd(this.SUBAGENT_DESC_WIDTH);
523
+ lines.push(` ${nameHeader} ${descHeader} Tokens`);
524
+ lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
525
+ const sortedSubagents = [...analysis.availableSubagents].sort((a, b) => b.tokens - a.tokens);
526
+ for (const subagent of sortedSubagents) {
527
+ const name = subagent.name.length > this.SUBAGENT_NAME_WIDTH
528
+ ? subagent.name.substring(0, this.SUBAGENT_NAME_WIDTH - 1) + "\u2026"
529
+ : subagent.name.padEnd(this.SUBAGENT_NAME_WIDTH);
530
+ const desc = subagent.description.length > this.SUBAGENT_DESC_WIDTH
531
+ ? subagent.description.substring(0, this.SUBAGENT_DESC_WIDTH - 1) + "\u2026"
532
+ : subagent.description.padEnd(this.SUBAGENT_DESC_WIDTH);
533
+ const tokens = `~${this.formatNumber(subagent.tokens)}`.padStart(7);
534
+ lines.push(` ${name} ${desc} ${tokens}`);
535
+ }
536
+ lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
537
+ lines.push(` Total: ~${this.formatNumber(total)} tokens (${analysis.availableSubagents.length} subagents available)`);
538
+ lines.push(``);
539
+ lines.push(` Note: Full task tool description is ~${this.formatNumber(analysis.taskToolDescriptionTokens)} tokens (includes instructions/examples).`);
540
+ return lines;
541
+ }
472
542
  collectTopEntries(analysis, limit) {
473
543
  const pool = [
474
544
  ...analysis.categories.system.allEntries,