opencode-usage 0.2.1 → 0.2.3

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/README.md CHANGED
@@ -14,10 +14,10 @@ CLI tool for tracking [OpenCode](https://github.com/sst/opencode) AI coding assi
14
14
  ## Installation
15
15
 
16
16
  ```bash
17
- # Run directly with bunx (recommended, faster)
17
+ # Run directly with bunx (recommended, fastest)
18
18
  bunx opencode-usage
19
19
 
20
- # Or with npx
20
+ # Or with npx (Node.js fallback)
21
21
  npx opencode-usage
22
22
 
23
23
  # Or install globally
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env bun
2
+ // @bun
2
3
 
3
4
  // src/cli.ts
4
- import { parseArgs as nodeParseArgs } from "node:util";
5
+ import { parseArgs as nodeParseArgs } from "util";
5
6
  function getArgs() {
6
7
  if (typeof globalThis.Bun !== "undefined") {
7
8
  return Bun.argv.slice(2);
@@ -96,43 +97,51 @@ Examples:
96
97
  }
97
98
 
98
99
  // src/loader.ts
99
- import { readFileSync, readdirSync, statSync } from "node:fs";
100
- import { homedir } from "node:os";
101
- import { join } from "node:path";
100
+ import { readdir, stat, readFile } from "fs/promises";
101
+ import { homedir } from "os";
102
+ import { join } from "path";
102
103
  var isBun = typeof globalThis.Bun !== "undefined";
104
+ var BATCH_SIZE = 1e4;
103
105
  function getOpenCodeStoragePath() {
104
106
  const xdgDataHome = process.env.XDG_DATA_HOME ?? join(homedir(), ".local", "share");
105
107
  return join(xdgDataHome, "opencode", "storage");
106
108
  }
107
109
  async function readJsonFile(filePath) {
108
- if (isBun) {
109
- return Bun.file(filePath).json();
110
- }
111
- const content = readFileSync(filePath, "utf-8");
110
+ const content = isBun ? await Bun.file(filePath).text() : await readFile(filePath, "utf-8");
112
111
  return JSON.parse(content);
113
112
  }
113
+ async function collectFilePaths(messagesDir) {
114
+ const sessionDirs = await readdir(messagesDir);
115
+ const pathArrays = await Promise.all(sessionDirs.map(async (sessionDir) => {
116
+ const sessionPath = join(messagesDir, sessionDir);
117
+ const st = await stat(sessionPath);
118
+ if (!st.isDirectory())
119
+ return [];
120
+ const files = await readdir(sessionPath);
121
+ return files.filter((f) => f.endsWith(".json")).map((f) => join(sessionPath, f));
122
+ }));
123
+ return pathArrays.flat();
124
+ }
125
+ async function processInBatches(items, fn, batchSize) {
126
+ const results = [];
127
+ for (let i = 0;i < items.length; i += batchSize) {
128
+ const batch = items.slice(i, i + batchSize);
129
+ const batchResults = await Promise.all(batch.map(fn));
130
+ results.push(...batchResults);
131
+ }
132
+ return results;
133
+ }
114
134
  async function loadMessages(storagePath, providerFilter) {
115
135
  const messagesDir = join(storagePath, "message");
116
136
  try {
117
- const sessionDirs = readdirSync(messagesDir);
118
- const filePaths = [];
119
- for (const sessionDir of sessionDirs) {
120
- const sessionPath = join(messagesDir, sessionDir);
121
- const stat = statSync(sessionPath);
122
- if (!stat.isDirectory())
123
- continue;
124
- const messageFiles = readdirSync(sessionPath).filter((f) => f.endsWith(".json"));
125
- for (const messageFile of messageFiles) {
126
- filePaths.push(join(sessionPath, messageFile));
127
- }
128
- }
129
- const results = await Promise.all(filePaths.map(async (filePath) => {
137
+ const filePaths = await collectFilePaths(messagesDir);
138
+ const results = await processInBatches(filePaths, async (filePath) => {
130
139
  try {
131
140
  return await readJsonFile(filePath);
132
141
  } catch {
133
142
  return null;
134
143
  }
135
- }));
144
+ }, BATCH_SIZE);
136
145
  return results.filter((msg) => {
137
146
  if (!msg)
138
147
  return false;
@@ -551,17 +560,17 @@ No usage data found.
551
560
  const colOutput = 14;
552
561
  const colTotal = 16;
553
562
  const colCost = 12;
554
- const h = "";
555
- const v = "";
556
- const tl = "";
557
- const tr = "";
558
- const bl = "";
559
- const br = "";
560
- const ml = "";
561
- const mr = "";
562
- const mt = "";
563
- const mb = "";
564
- const mm = "";
563
+ const h = "\u2500";
564
+ const v = "\u2502";
565
+ const tl = "\u250C";
566
+ const tr = "\u2510";
567
+ const bl = "\u2514";
568
+ const br = "\u2518";
569
+ const ml = "\u251C";
570
+ const mr = "\u2524";
571
+ const mt = "\u252C";
572
+ const mb = "\u2534";
573
+ const mm = "\u253C";
565
574
  const topLine = tl + h.repeat(colDate) + mt + h.repeat(colModels) + mt + h.repeat(colInput) + mt + h.repeat(colOutput) + mt + h.repeat(colTotal) + mt + h.repeat(colCost) + tr;
566
575
  const midLine = ml + h.repeat(colDate) + mm + h.repeat(colModels) + mm + h.repeat(colInput) + mm + h.repeat(colOutput) + mm + h.repeat(colTotal) + mm + h.repeat(colCost) + mr;
567
576
  const bottomLine = bl + h.repeat(colDate) + mb + h.repeat(colModels) + mb + h.repeat(colInput) + mb + h.repeat(colOutput) + mb + h.repeat(colTotal) + mb + h.repeat(colCost) + br;
@@ -645,5 +654,5 @@ Loading OpenCode usage data from: ${storagePath}`);
645
654
  }
646
655
  main().catch(console.error);
647
656
 
648
- //# debugId=CFEB06924236C7EF64756E2164756E21
657
+ //# debugId=7C3502176104518264756E2164756E21
649
658
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -3,13 +3,13 @@
3
3
  "sources": ["../src/cli.ts", "../src/loader.ts", "../src/pricing.ts", "../src/aggregator.ts", "../src/renderer.ts", "../src/index.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * CLI argument parser using Node.js parseArgs (works with both Bun and Node.js)\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\n\nexport type CliArgs = {\n provider?: string;\n days?: number;\n since?: string;\n until?: string;\n json?: boolean;\n monthly?: boolean;\n};\n\n// Get CLI args - works with both Bun and Node.js\nfunction getArgs(): string[] {\n if (typeof globalThis.Bun !== \"undefined\") {\n return Bun.argv.slice(2);\n }\n return process.argv.slice(2);\n}\n\n/**\n * Parse date string in formats: YYYYMMDD, YYYY-MM-DD, or relative like \"7d\", \"1w\", \"1m\"\n */\nfunction parseDate(value: string): string | undefined {\n if (!value) return undefined;\n\n // Relative date: 7d, 1w, 1m\n const relativeMatch = value.match(/^(\\d+)([dwm])$/);\n if (relativeMatch) {\n const num = parseInt(relativeMatch[1], 10);\n const unit = relativeMatch[2];\n const date = new Date();\n if (unit === \"d\") date.setDate(date.getDate() - num);\n else if (unit === \"w\") date.setDate(date.getDate() - num * 7);\n else if (unit === \"m\") date.setMonth(date.getMonth() - num);\n return date.toISOString().split(\"T\")[0];\n }\n\n // YYYYMMDD format\n if (/^\\d{8}$/.test(value)) {\n return `${value.slice(0, 4)}-${value.slice(4, 6)}-${value.slice(6, 8)}`;\n }\n\n // YYYY-MM-DD format\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n return value;\n }\n\n console.error(\n `Invalid date format: ${value}. Use YYYYMMDD, YYYY-MM-DD, or relative (7d, 1w, 1m)`\n );\n process.exit(1);\n}\n\nexport function parseArgs(): CliArgs {\n try {\n const { values } = nodeParseArgs({\n args: getArgs(),\n options: {\n provider: { type: \"string\", short: \"p\" },\n days: { type: \"string\", short: \"d\" },\n since: { type: \"string\", short: \"s\" },\n until: { type: \"string\", short: \"u\" },\n json: { type: \"boolean\", short: \"j\" },\n monthly: { type: \"boolean\", short: \"m\" },\n help: { type: \"boolean\", short: \"h\" },\n },\n strict: true,\n });\n\n if (values.help) {\n printHelp();\n process.exit(0);\n }\n\n return {\n provider: values.provider?.toLowerCase(),\n days: values.days ? parseInt(values.days, 10) : undefined,\n since: parseDate(values.since ?? \"\"),\n until: parseDate(values.until ?? \"\"),\n json: values.json,\n monthly: values.monthly,\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Unknown option\")) {\n console.error(`Error: ${error.message}`);\n printHelp();\n process.exit(1);\n }\n throw error;\n }\n}\n\nfunction printHelp(): void {\n console.log(`\nopencode-usage - Track OpenCode AI coding assistant usage and costs\n\nUsage:\n bunx opencode-usage [options]\n\nOptions:\n -p, --provider <name> Filter by provider (anthropic, openai, google, opencode)\n -d, --days <n> Show only last N days\n -s, --since <date> Start date (YYYYMMDD, YYYY-MM-DD, or 7d/1w/1m)\n -u, --until <date> End date (YYYYMMDD, YYYY-MM-DD, or 7d/1w/1m)\n -j, --json Output as JSON\n -m, --monthly Aggregate by month instead of day\n -h, --help Show this help message\n\nExamples:\n bunx opencode-usage\n bunx opencode-usage --provider anthropic\n bunx opencode-usage -p openai -d 30\n bunx opencode-usage --since 20251201 --until 20251231\n bunx opencode-usage --since 7d\n bunx opencode-usage --monthly --json\n`);\n}\n",
6
- "/**\n * OpenCode storage data loader - works with both Bun and Node.js\n */\n\nimport { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { MessageJson } from \"./types.js\";\n\n// Runtime detection\nconst isBun = typeof globalThis.Bun !== \"undefined\";\n\nexport function getOpenCodeStoragePath(): string {\n const xdgDataHome =\n process.env.XDG_DATA_HOME ?? join(homedir(), \".local\", \"share\");\n return join(xdgDataHome, \"opencode\", \"storage\");\n}\n\nasync function readJsonFile(filePath: string): Promise<MessageJson> {\n if (isBun) {\n return Bun.file(filePath).json() as Promise<MessageJson>;\n }\n const content = readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as MessageJson;\n}\n\nexport async function loadMessages(\n storagePath: string,\n providerFilter?: string\n): Promise<MessageJson[]> {\n const messagesDir = join(storagePath, \"message\");\n\n try {\n const sessionDirs = readdirSync(messagesDir);\n\n const filePaths: string[] = [];\n for (const sessionDir of sessionDirs) {\n const sessionPath = join(messagesDir, sessionDir);\n const stat = statSync(sessionPath);\n\n if (!stat.isDirectory()) continue;\n\n const messageFiles = readdirSync(sessionPath).filter((f) =>\n f.endsWith(\".json\")\n );\n\n for (const messageFile of messageFiles) {\n filePaths.push(join(sessionPath, messageFile));\n }\n }\n\n const results = await Promise.all(\n filePaths.map(async (filePath) => {\n try {\n return await readJsonFile(filePath);\n } catch {\n return null; // Skip invalid JSON files\n }\n })\n );\n\n return results.filter((msg): msg is MessageJson => {\n if (!msg) return false;\n if (msg.role === \"user\") return false;\n if (!msg.tokens) return false;\n\n if (providerFilter) {\n const providerId = msg.model?.providerID ?? msg.providerID ?? \"unknown\";\n if (providerId.toLowerCase() !== providerFilter) return false;\n }\n\n return true;\n });\n } catch (err) {\n console.error(`Error reading messages directory: ${err}`);\n return [];\n }\n}\n",
6
+ "import { readdir, stat, readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { MessageJson } from \"./types.js\";\n\nconst isBun = typeof globalThis.Bun !== \"undefined\";\nconst BATCH_SIZE = 10000;\n\nexport function getOpenCodeStoragePath(): string {\n const xdgDataHome =\n process.env.XDG_DATA_HOME ?? join(homedir(), \".local\", \"share\");\n return join(xdgDataHome, \"opencode\", \"storage\");\n}\n\nasync function readJsonFile(filePath: string): Promise<MessageJson> {\n const content = isBun\n ? await Bun.file(filePath).text()\n : await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as MessageJson;\n}\n\nasync function collectFilePaths(messagesDir: string): Promise<string[]> {\n const sessionDirs = await readdir(messagesDir);\n\n const pathArrays = await Promise.all(\n sessionDirs.map(async (sessionDir) => {\n const sessionPath = join(messagesDir, sessionDir);\n const st = await stat(sessionPath);\n if (!st.isDirectory()) return [];\n\n const files = await readdir(sessionPath);\n return files\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => join(sessionPath, f));\n })\n );\n\n return pathArrays.flat();\n}\n\nasync function processInBatches<T, R>(\n items: T[],\n fn: (item: T) => Promise<R>,\n batchSize: number\n): Promise<R[]> {\n const results: R[] = [];\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n const batchResults = await Promise.all(batch.map(fn));\n results.push(...batchResults);\n }\n return results;\n}\n\nexport async function loadMessages(\n storagePath: string,\n providerFilter?: string\n): Promise<MessageJson[]> {\n const messagesDir = join(storagePath, \"message\");\n\n try {\n const filePaths = await collectFilePaths(messagesDir);\n\n const results = await processInBatches(\n filePaths,\n async (filePath) => {\n try {\n return await readJsonFile(filePath);\n } catch {\n return null;\n }\n },\n BATCH_SIZE\n );\n\n return results.filter((msg): msg is MessageJson => {\n if (!msg) return false;\n if (msg.role === \"user\") return false;\n if (!msg.tokens) return false;\n\n if (providerFilter) {\n const providerId = msg.model?.providerID ?? msg.providerID ?? \"unknown\";\n if (providerId.toLowerCase() !== providerFilter) return false;\n }\n\n return true;\n });\n } catch (err) {\n console.error(`Error reading messages directory: ${err}`);\n return [];\n }\n}\n",
7
7
  "/**\n * Model pricing configuration (per million tokens)\n */\n\nimport type { ModelPricing, TokenUsage } from \"./types\";\n\nexport const MODEL_PRICING: Record<string, ModelPricing> = {\n // Anthropic - Current Models\n \"claude-opus-4-5\": {\n input: 5,\n output: 25,\n cacheWrite: 6.25,\n cacheRead: 0.5,\n },\n \"claude-sonnet-4-5\": {\n input: 3,\n output: 15,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n \"claude-haiku-4-5\": {\n input: 1,\n output: 5,\n cacheWrite: 1.25,\n cacheRead: 0.1,\n },\n \"claude-opus-4\": {\n input: 15,\n output: 75,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n \"claude-sonnet-4\": {\n input: 3,\n output: 15,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n \"claude-opus-4-1\": {\n input: 15,\n output: 75,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n \"claude-opus-3\": {\n input: 15,\n output: 75,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n \"claude-haiku-3\": {\n input: 0.25,\n output: 1.25,\n cacheWrite: 0.3,\n cacheRead: 0.03,\n },\n\n // OpenAI Models\n \"gpt-4o\": {\n input: 2.5,\n output: 10,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gpt-4o-mini\": {\n input: 0.15,\n output: 0.6,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gpt-4-turbo\": {\n input: 10,\n output: 30,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gpt-5\": {\n input: 5,\n output: 15,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gpt-5.2\": {\n input: 5,\n output: 15,\n cacheWrite: 0,\n cacheRead: 0,\n },\n o1: {\n input: 15,\n output: 60,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"o1-mini\": {\n input: 3,\n output: 12,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"o1-pro\": {\n input: 150,\n output: 600,\n cacheWrite: 0,\n cacheRead: 0,\n },\n o3: {\n input: 10,\n output: 40,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"o3-mini\": {\n input: 1.1,\n output: 4.4,\n cacheWrite: 0,\n cacheRead: 0,\n },\n\n // Google Models\n \"gemini-2.0-flash\": {\n input: 0.1,\n output: 0.4,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gemini-2.5-pro\": {\n input: 1.25,\n output: 10,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gemini-2.5-flash\": {\n input: 0.15,\n output: 0.6,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"gemini-3-flash-preview\": {\n input: 0.15,\n output: 0.6,\n cacheWrite: 0,\n cacheRead: 0,\n },\n\n // Free/OpenCode hosted models\n \"qwen3-coder\": {\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"glm-4.7-free\": {\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n },\n \"minimax-m2.1-free\": {\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n },\n};\n\nconst DEFAULT_PRICING: ModelPricing = {\n input: 3,\n output: 15,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n};\n\nexport function getModelPricing(modelId: string): ModelPricing {\n const normalized = modelId.toLowerCase().replace(/_/g, \"-\");\n\n if (MODEL_PRICING[normalized]) {\n return MODEL_PRICING[normalized];\n }\n\n for (const [key, pricing] of Object.entries(MODEL_PRICING)) {\n if (normalized.includes(key) || key.includes(normalized)) {\n return pricing;\n }\n }\n\n return DEFAULT_PRICING;\n}\n\nexport function calculateCost(tokens: TokenUsage, modelId: string): number {\n const pricing = getModelPricing(modelId);\n\n const inputCost = (tokens.input / 1_000_000) * pricing.input;\n const outputCost = (tokens.output / 1_000_000) * pricing.output;\n const cacheWriteCost = (tokens.cache.write / 1_000_000) * pricing.cacheWrite;\n const cacheReadCost = (tokens.cache.read / 1_000_000) * pricing.cacheRead;\n const reasoningCost = (tokens.reasoning / 1_000_000) * pricing.output;\n\n return (\n inputCost + outputCost + cacheWriteCost + cacheReadCost + reasoningCost\n );\n}\n",
8
8
  "/**\n * Data aggregation functions\n */\n\nimport type { DailyStats, MessageJson } from \"./types.js\";\nimport { calculateCost } from \"./pricing\";\n\nfunction timestampToDate(timestamp: number): string {\n return new Date(timestamp).toISOString().split(\"T\")[0];\n}\n\nexport function aggregateByDate(\n messages: MessageJson[]\n): Map<string, DailyStats> {\n const dailyStats = new Map<string, DailyStats>();\n\n for (const msg of messages) {\n const timestamp = msg.time?.created ?? msg.time?.completed;\n if (!timestamp) continue;\n\n const date = timestampToDate(timestamp);\n const modelId = msg.model?.modelID ?? msg.modelID ?? \"unknown\";\n const providerId = msg.model?.providerID ?? msg.providerID ?? \"unknown\";\n const tokens = msg.tokens!;\n const msgCost = calculateCost(tokens, modelId);\n\n let stats = dailyStats.get(date);\n if (!stats) {\n stats = {\n date,\n models: new Set(),\n providers: new Set(),\n providerStats: new Map(),\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n reasoning: 0,\n cost: 0,\n };\n dailyStats.set(date, stats);\n }\n\n // Update daily totals\n stats.models.add(modelId);\n stats.providers.add(providerId);\n stats.input += tokens.input ?? 0;\n stats.output += tokens.output ?? 0;\n stats.cacheWrite += tokens.cache?.write ?? 0;\n stats.cacheRead += tokens.cache?.read ?? 0;\n stats.reasoning += tokens.reasoning ?? 0;\n stats.cost += msgCost;\n\n // Update provider-specific stats\n let providerStat = stats.providerStats.get(providerId);\n if (!providerStat) {\n providerStat = {\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n reasoning: 0,\n cost: 0,\n models: new Set(),\n };\n stats.providerStats.set(providerId, providerStat);\n }\n providerStat.models.add(modelId);\n providerStat.input += tokens.input ?? 0;\n providerStat.output += tokens.output ?? 0;\n providerStat.cacheWrite += tokens.cache?.write ?? 0;\n providerStat.cacheRead += tokens.cache?.read ?? 0;\n providerStat.reasoning += tokens.reasoning ?? 0;\n providerStat.cost += msgCost;\n }\n\n return dailyStats;\n}\n\nexport function filterByDays(\n dailyStats: Map<string, DailyStats>,\n days: number\n): Map<string, DailyStats> {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - days);\n const cutoffStr = cutoffDate.toISOString().split(\"T\")[0];\n\n const filtered = new Map<string, DailyStats>();\n for (const [date, stats] of dailyStats) {\n if (date >= cutoffStr) {\n filtered.set(date, stats);\n }\n }\n return filtered;\n}\n\nexport function filterByDateRange(\n dailyStats: Map<string, DailyStats>,\n since?: string,\n until?: string\n): Map<string, DailyStats> {\n const filtered = new Map<string, DailyStats>();\n for (const [date, stats] of dailyStats) {\n if (since && date < since) continue;\n if (until && date > until) continue;\n filtered.set(date, stats);\n }\n return filtered;\n}\n\nfunction dateToMonth(date: string): string {\n return date.slice(0, 7); // YYYY-MM\n}\n\nexport function aggregateByMonth(\n dailyStats: Map<string, DailyStats>\n): Map<string, DailyStats> {\n const monthlyStats = new Map<string, DailyStats>();\n\n for (const [date, stats] of dailyStats) {\n const month = dateToMonth(date);\n\n let monthStats = monthlyStats.get(month);\n if (!monthStats) {\n monthStats = {\n date: month,\n models: new Set(),\n providers: new Set(),\n providerStats: new Map(),\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n reasoning: 0,\n cost: 0,\n };\n monthlyStats.set(month, monthStats);\n }\n\n // Merge models and providers\n for (const model of stats.models) monthStats.models.add(model);\n for (const provider of stats.providers) monthStats.providers.add(provider);\n\n // Sum totals\n monthStats.input += stats.input;\n monthStats.output += stats.output;\n monthStats.cacheWrite += stats.cacheWrite;\n monthStats.cacheRead += stats.cacheRead;\n monthStats.reasoning += stats.reasoning;\n monthStats.cost += stats.cost;\n\n // Merge provider stats\n for (const [providerId, providerStat] of stats.providerStats) {\n let monthProviderStat = monthStats.providerStats.get(providerId);\n if (!monthProviderStat) {\n monthProviderStat = {\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n reasoning: 0,\n cost: 0,\n models: new Set(),\n };\n monthStats.providerStats.set(providerId, monthProviderStat);\n }\n for (const model of providerStat.models)\n monthProviderStat.models.add(model);\n monthProviderStat.input += providerStat.input;\n monthProviderStat.output += providerStat.output;\n monthProviderStat.cacheWrite += providerStat.cacheWrite;\n monthProviderStat.cacheRead += providerStat.cacheRead;\n monthProviderStat.reasoning += providerStat.reasoning;\n monthProviderStat.cost += providerStat.cost;\n }\n }\n\n return monthlyStats;\n}\n",
9
9
  "/**\n * Terminal table renderer\n */\n\nimport type { DailyStats } from \"./types\";\n\nfunction formatNumber(num: number): string {\n return num.toLocaleString(\"en-US\");\n}\n\nfunction formatCost(cost: number): string {\n return `$${cost.toFixed(2)}`;\n}\n\nfunction padRight(str: string, len: number): string {\n return str.padEnd(len);\n}\n\nfunction padLeft(str: string, len: number): string {\n return str.padStart(len);\n}\n\nexport type JsonOutput = {\n periods: Array<{\n date: string;\n models: string[];\n providers: Array<{\n id: string;\n models: string[];\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n reasoning: number;\n cost: number;\n }>;\n totals: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n reasoning: number;\n cost: number;\n };\n }>;\n totals: {\n input: number;\n output: number;\n cost: number;\n };\n};\n\nexport function renderJson(dailyStats: Map<string, DailyStats>): void {\n const sortedDates = Array.from(dailyStats.keys()).sort((a, b) =>\n a.localeCompare(b)\n );\n\n let totalInput = 0;\n let totalOutput = 0;\n let totalCost = 0;\n\n const periods = sortedDates.map((date) => {\n const stats = dailyStats.get(date)!;\n const combinedInput = stats.input + stats.cacheRead + stats.cacheWrite;\n\n totalInput += combinedInput;\n totalOutput += stats.output;\n totalCost += stats.cost;\n\n const providers = Array.from(stats.providerStats.entries())\n .sort((a, b) => b[1].cost - a[1].cost)\n .map(([id, ps]) => ({\n id,\n models: Array.from(ps.models).sort(),\n input: ps.input,\n output: ps.output,\n cacheRead: ps.cacheRead,\n cacheWrite: ps.cacheWrite,\n reasoning: ps.reasoning,\n cost: Math.round(ps.cost * 100) / 100,\n }));\n\n return {\n date,\n models: Array.from(stats.models).sort(),\n providers,\n totals: {\n input: stats.input,\n output: stats.output,\n cacheRead: stats.cacheRead,\n cacheWrite: stats.cacheWrite,\n reasoning: stats.reasoning,\n cost: Math.round(stats.cost * 100) / 100,\n },\n };\n });\n\n const output: JsonOutput = {\n periods,\n totals: {\n input: totalInput,\n output: totalOutput,\n cost: Math.round(totalCost * 100) / 100,\n },\n };\n\n console.log(JSON.stringify(output, null, 2));\n}\n\nexport function renderTable(dailyStats: Map<string, DailyStats>): void {\n const sortedDates = Array.from(dailyStats.keys()).sort((a, b) =>\n a.localeCompare(b)\n );\n\n if (sortedDates.length === 0) {\n console.log(\"\\nNo usage data found.\\n\");\n return;\n }\n\n // Column widths\n const colDate = 12;\n const colModels = 35;\n const colInput = 16;\n const colOutput = 14;\n const colTotal = 16;\n const colCost = 12;\n\n // Border characters\n const h = \"\\u2500\";\n const v = \"\\u2502\";\n const tl = \"\\u250C\";\n const tr = \"\\u2510\";\n const bl = \"\\u2514\";\n const br = \"\\u2518\";\n const ml = \"\\u251C\";\n const mr = \"\\u2524\";\n const mt = \"\\u252C\";\n const mb = \"\\u2534\";\n const mm = \"\\u253C\";\n\n const topLine =\n tl +\n h.repeat(colDate) +\n mt +\n h.repeat(colModels) +\n mt +\n h.repeat(colInput) +\n mt +\n h.repeat(colOutput) +\n mt +\n h.repeat(colTotal) +\n mt +\n h.repeat(colCost) +\n tr;\n\n const midLine =\n ml +\n h.repeat(colDate) +\n mm +\n h.repeat(colModels) +\n mm +\n h.repeat(colInput) +\n mm +\n h.repeat(colOutput) +\n mm +\n h.repeat(colTotal) +\n mm +\n h.repeat(colCost) +\n mr;\n\n const bottomLine =\n bl +\n h.repeat(colDate) +\n mb +\n h.repeat(colModels) +\n mb +\n h.repeat(colInput) +\n mb +\n h.repeat(colOutput) +\n mb +\n h.repeat(colTotal) +\n mb +\n h.repeat(colCost) +\n br;\n\n const header =\n v +\n padRight(\" Date\", colDate) +\n v +\n padRight(\" Models\", colModels) +\n v +\n padLeft(\"Input \", colInput) +\n v +\n padLeft(\"Output \", colOutput) +\n v +\n padLeft(\"Total Tokens \", colTotal) +\n v +\n padLeft(\"Cost \", colCost) +\n v;\n\n console.log(\"\\n\" + topLine);\n console.log(header);\n console.log(midLine);\n\n let totalInput = 0;\n let totalOutput = 0;\n let totalCost = 0;\n\n for (const date of sortedDates) {\n const stats = dailyStats.get(date)!;\n const models = Array.from(stats.models).sort();\n\n const combinedInput = stats.input + stats.cacheRead + stats.cacheWrite;\n const totalTokens = combinedInput + stats.output;\n\n totalInput += combinedInput;\n totalOutput += stats.output;\n totalCost += stats.cost;\n\n const firstModel = models[0] ? `- ${models[0]}` : \"\";\n console.log(\n v +\n padRight(` ${date}`, colDate) +\n v +\n padRight(` ${firstModel}`, colModels) +\n v +\n padLeft(`${formatNumber(combinedInput)} `, colInput) +\n v +\n padLeft(`${formatNumber(stats.output)} `, colOutput) +\n v +\n padLeft(`${formatNumber(totalTokens)} `, colTotal) +\n v +\n padLeft(`${formatCost(stats.cost)} `, colCost) +\n v\n );\n\n for (let i = 1; i < models.length; i++) {\n console.log(\n v +\n \" \".repeat(colDate) +\n v +\n padRight(` - ${models[i]}`, colModels) +\n v +\n \" \".repeat(colInput) +\n v +\n \" \".repeat(colOutput) +\n v +\n \" \".repeat(colTotal) +\n v +\n \" \".repeat(colCost) +\n v\n );\n }\n\n const providers = Array.from(stats.providerStats.entries()).sort(\n (a, b) => b[1].cost - a[1].cost\n );\n\n for (const [providerId, providerStat] of providers) {\n const providerInput =\n providerStat.input + providerStat.cacheRead + providerStat.cacheWrite;\n const providerTokens = providerInput + providerStat.output;\n console.log(\n v +\n \" \".repeat(colDate) +\n v +\n padRight(` [${providerId}]`, colModels) +\n v +\n padLeft(`${formatNumber(providerInput)} `, colInput) +\n v +\n padLeft(`${formatNumber(providerStat.output)} `, colOutput) +\n v +\n padLeft(`${formatNumber(providerTokens)} `, colTotal) +\n v +\n padLeft(`${formatCost(providerStat.cost)} `, colCost) +\n v\n );\n }\n\n console.log(midLine);\n }\n\n const grandTotal = totalInput + totalOutput;\n console.log(\n v +\n padRight(\" Total\", colDate) +\n v +\n \" \".repeat(colModels) +\n v +\n padLeft(`${formatNumber(totalInput)} `, colInput) +\n v +\n padLeft(`${formatNumber(totalOutput)} `, colOutput) +\n v +\n padLeft(`${formatNumber(grandTotal)} `, colTotal) +\n v +\n padLeft(`${formatCost(totalCost)} `, colCost) +\n v\n );\n console.log(bottomLine);\n console.log();\n}\n",
10
10
  "#!/usr/bin/env node\n/**\n * OpenCode Usage - CLI tool for tracking OpenCode AI usage and costs\n *\n * Usage:\n * bunx opencode-usage\n * bunx opencode-usage --provider anthropic\n * bunx opencode-usage --days 30\n * bunx opencode-usage --since 20251201 --until 20251231\n * bunx opencode-usage --monthly --json\n */\n\nimport { parseArgs } from \"./cli.js\";\nimport { getOpenCodeStoragePath, loadMessages } from \"./loader.js\";\nimport {\n aggregateByDate,\n aggregateByMonth,\n filterByDays,\n filterByDateRange,\n} from \"./aggregator.js\";\nimport { renderTable, renderJson } from \"./renderer.js\";\n\nasync function main(): Promise<void> {\n const { provider, days, since, until, json, monthly } = parseArgs();\n const storagePath = getOpenCodeStoragePath();\n\n if (!json) {\n console.log(`\\nLoading OpenCode usage data from: ${storagePath}`);\n if (provider) {\n console.log(`Filtering: ${provider} provider only`);\n }\n }\n\n const messages = await loadMessages(storagePath, provider);\n\n if (!json) {\n console.log(`Found ${messages.length} assistant messages with token data`);\n }\n\n let stats = aggregateByDate(messages);\n\n // Apply date filters\n if (days) {\n stats = filterByDays(stats, days);\n if (!json) console.log(`Showing last ${days} days`);\n }\n\n if (since || until) {\n stats = filterByDateRange(stats, since, until);\n if (!json) {\n if (since && until) console.log(`Date range: ${since} to ${until}`);\n else if (since) console.log(`From: ${since}`);\n else if (until) console.log(`Until: ${until}`);\n }\n }\n\n // Aggregate by month if requested\n if (monthly) {\n stats = aggregateByMonth(stats);\n if (!json) console.log(`Aggregated by month`);\n }\n\n // Render output\n if (json) {\n renderJson(stats);\n } else {\n renderTable(stats);\n }\n}\n\nmain().catch(console.error);\n"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "CFEB06924236C7EF64756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "7C3502176104518264756E2164756E21",
14
14
  "names": []
15
15
  }
package/dist/loader.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * OpenCode storage data loader - works with both Bun and Node.js
3
- */
4
1
  import type { MessageJson } from "./types.js";
5
2
  export declare function getOpenCodeStoragePath(): string;
6
3
  export declare function loadMessages(storagePath: string, providerFilter?: string): Promise<MessageJson[]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-usage",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "CLI tool for tracking OpenCode AI coding assistant usage and costs",
5
5
  "keywords": [
6
6
  "ai",
@@ -43,7 +43,8 @@
43
43
  }
44
44
  },
45
45
  "scripts": {
46
- "build": "bun build ./src/index.ts --outdir ./dist --target node --format esm --sourcemap && bun run build:types",
46
+ "build": "bun build ./src/index.ts --outdir ./dist --target bun --format esm --sourcemap && bun run build:shebang && bun run build:types",
47
+ "build:shebang": "bun -e \"const f='dist/index.js';Bun.write(f,(await Bun.file(f).text()).replace('#!/usr/bin/env node','#!/usr/bin/env bun'))\"",
47
48
  "build:types": "tsc --emitDeclarationOnly --declaration --outDir dist",
48
49
  "check": "bun check.ts",
49
50
  "check:ci": "bun check.ts ci",