@slkiser/opencode-quota 1.4.4 → 2.1.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 (75) hide show
  1. package/README.md +54 -19
  2. package/dist/lib/config.d.ts.map +1 -1
  3. package/dist/lib/config.js +2 -0
  4. package/dist/lib/config.js.map +1 -1
  5. package/dist/lib/copilot.d.ts.map +1 -1
  6. package/dist/lib/copilot.js +105 -18
  7. package/dist/lib/copilot.js.map +1 -1
  8. package/dist/lib/entries.d.ts +23 -3
  9. package/dist/lib/entries.d.ts.map +1 -1
  10. package/dist/lib/entries.js +6 -1
  11. package/dist/lib/entries.js.map +1 -1
  12. package/dist/lib/firmware.d.ts +2 -17
  13. package/dist/lib/firmware.d.ts.map +1 -1
  14. package/dist/lib/firmware.js +12 -80
  15. package/dist/lib/firmware.js.map +1 -1
  16. package/dist/lib/format-utils.d.ts +1 -0
  17. package/dist/lib/format-utils.d.ts.map +1 -1
  18. package/dist/lib/format-utils.js +5 -0
  19. package/dist/lib/format-utils.js.map +1 -1
  20. package/dist/lib/format.d.ts.map +1 -1
  21. package/dist/lib/format.js +34 -2
  22. package/dist/lib/format.js.map +1 -1
  23. package/dist/lib/modelsdev-pricing.d.ts +6 -0
  24. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  25. package/dist/lib/modelsdev-pricing.js +35 -0
  26. package/dist/lib/modelsdev-pricing.js.map +1 -1
  27. package/dist/lib/opencode-auth.d.ts +9 -0
  28. package/dist/lib/opencode-auth.d.ts.map +1 -1
  29. package/dist/lib/opencode-auth.js +38 -0
  30. package/dist/lib/opencode-auth.js.map +1 -1
  31. package/dist/lib/opencode-sqlite.d.ts +7 -0
  32. package/dist/lib/opencode-sqlite.d.ts.map +1 -0
  33. package/dist/lib/opencode-sqlite.js +44 -0
  34. package/dist/lib/opencode-sqlite.js.map +1 -0
  35. package/dist/lib/opencode-storage.d.ts +14 -18
  36. package/dist/lib/opencode-storage.d.ts.map +1 -1
  37. package/dist/lib/opencode-storage.js +183 -134
  38. package/dist/lib/opencode-storage.js.map +1 -1
  39. package/dist/lib/quota-command-format.d.ts.map +1 -1
  40. package/dist/lib/quota-command-format.js +6 -1
  41. package/dist/lib/quota-command-format.js.map +1 -1
  42. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  43. package/dist/lib/quota-stats-format.js +77 -22
  44. package/dist/lib/quota-stats-format.js.map +1 -1
  45. package/dist/lib/quota-stats.d.ts +14 -0
  46. package/dist/lib/quota-stats.d.ts.map +1 -1
  47. package/dist/lib/quota-stats.js +80 -1
  48. package/dist/lib/quota-stats.js.map +1 -1
  49. package/dist/lib/quota-status.d.ts.map +1 -1
  50. package/dist/lib/quota-status.js +180 -29
  51. package/dist/lib/quota-status.js.map +1 -1
  52. package/dist/lib/qwen-local-quota.d.ts +35 -0
  53. package/dist/lib/qwen-local-quota.d.ts.map +1 -0
  54. package/dist/lib/qwen-local-quota.js +162 -0
  55. package/dist/lib/qwen-local-quota.js.map +1 -0
  56. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  57. package/dist/lib/toast-format-grouped.js +31 -1
  58. package/dist/lib/toast-format-grouped.js.map +1 -1
  59. package/dist/lib/types.d.ts +8 -2
  60. package/dist/lib/types.d.ts.map +1 -1
  61. package/dist/lib/types.js.map +1 -1
  62. package/dist/plugin.d.ts.map +1 -1
  63. package/dist/plugin.js +163 -89
  64. package/dist/plugin.js.map +1 -1
  65. package/dist/providers/firmware.d.ts.map +1 -1
  66. package/dist/providers/firmware.js +10 -40
  67. package/dist/providers/firmware.js.map +1 -1
  68. package/dist/providers/qwen-code.d.ts +3 -0
  69. package/dist/providers/qwen-code.d.ts.map +1 -0
  70. package/dist/providers/qwen-code.js +66 -0
  71. package/dist/providers/qwen-code.js.map +1 -0
  72. package/dist/providers/registry.d.ts.map +1 -1
  73. package/dist/providers/registry.js +2 -0
  74. package/dist/providers/registry.js.map +1 -1
  75. package/package.json +1 -1
@@ -1,19 +1,21 @@
1
- import { readdir, readFile } from "fs/promises";
2
1
  import { join } from "path";
3
2
  import { existsSync } from "fs";
4
3
  import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
5
4
  import { pickFirstExistingPath } from "./path-pick.js";
5
+ import { openOpenCodeSqliteReadOnly } from "./opencode-sqlite.js";
6
6
  /**
7
- * Error thrown when a session directory is not found.
7
+ * Error thrown when a session is not found.
8
8
  *
9
- * This is thrown by iterAssistantMessagesForSession when the session
10
- * directory doesn't exist. Callers should catch this to handle gracefully.
9
+ * With OpenCode >=1.2, sessions/messages live in SQLite (`opencode.db`).
10
+ * This is thrown by iterAssistantMessagesForSession when the database is
11
+ * missing/unreadable, the session id is invalid, or the session row does
12
+ * not exist.
11
13
  */
12
14
  export class SessionNotFoundError extends Error {
13
15
  sessionID;
14
16
  checkedPath;
15
17
  constructor(sessionID, checkedPath) {
16
- super(`Session directory not found: ${sessionID}`);
18
+ super(`Session not found: ${sessionID}`);
17
19
  this.sessionID = sessionID;
18
20
  this.checkedPath = checkedPath;
19
21
  this.name = "SessionNotFoundError";
@@ -27,172 +29,219 @@ export function getOpenCodeDataDirCandidates() {
27
29
  export function getOpenCodeDataDir() {
28
30
  return pickFirstExistingPath(getOpenCodeDataDirCandidates());
29
31
  }
30
- export function getOpenCodeStorageDirCandidates() {
31
- return getOpenCodeDataDirCandidates().map((d) => join(d, "storage"));
32
+ export function getOpenCodeDbPathCandidates() {
33
+ return getOpenCodeDataDirCandidates().map((d) => join(d, "opencode.db"));
32
34
  }
33
- export function getOpenCodeStorageDir() {
34
- return pickFirstExistingPath(getOpenCodeStorageDirCandidates());
35
+ export function getOpenCodeDbPath() {
36
+ return pickFirstExistingPath(getOpenCodeDbPathCandidates());
35
37
  }
36
- export function getOpenCodeMessageDirCandidates() {
37
- return getOpenCodeStorageDirCandidates().map((d) => join(d, "message"));
38
+ function safeJsonParse(raw) {
39
+ try {
40
+ return JSON.parse(raw);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
38
45
  }
39
- export function getOpenCodeMessageDir() {
40
- return pickFirstExistingPath(getOpenCodeMessageDirCandidates());
46
+ function normalizeNumber(n) {
47
+ return typeof n === "number" && Number.isFinite(n) ? n : undefined;
41
48
  }
42
- export function getOpenCodeSessionDirCandidates() {
43
- return getOpenCodeStorageDirCandidates().map((d) => join(d, "session"));
49
+ function normalizeString(s) {
50
+ return typeof s === "string" ? s : undefined;
44
51
  }
45
- export function getOpenCodeSessionDir() {
46
- return pickFirstExistingPath(getOpenCodeSessionDirCandidates());
52
+ function mapRowToOpenCodeMessage(row) {
53
+ if (!row || typeof row !== "object")
54
+ return null;
55
+ if (typeof row.id !== "string" || typeof row.session_id !== "string")
56
+ return null;
57
+ if (typeof row.time_created !== "number")
58
+ return null;
59
+ const payload = safeJsonParse(row.data);
60
+ if (!payload || typeof payload !== "object")
61
+ return null;
62
+ const role = normalizeString(payload.role) ?? "unknown";
63
+ return {
64
+ id: row.id,
65
+ sessionID: row.session_id,
66
+ role,
67
+ providerID: normalizeString(payload.providerID),
68
+ modelID: normalizeString(payload.modelID),
69
+ tokens: payload.tokens,
70
+ cost: normalizeNumber(payload.cost),
71
+ time: {
72
+ created: row.time_created,
73
+ completed: normalizeNumber(payload.time?.completed),
74
+ },
75
+ agent: normalizeString(payload.agent),
76
+ mode: normalizeString(payload.mode),
77
+ };
47
78
  }
48
- async function safeReadJson(path) {
79
+ function openDbOrNull() {
80
+ const dbPath = getOpenCodeDbPath();
81
+ if (!dbPath)
82
+ return null;
83
+ if (!existsSync(dbPath))
84
+ return null;
85
+ return {
86
+ dbPath,
87
+ open: () => openOpenCodeSqliteReadOnly(dbPath),
88
+ };
89
+ }
90
+ function validateSessionIdOrThrow(sessionID) {
91
+ if (!sessionID.startsWith("ses_")) {
92
+ throw new SessionNotFoundError(sessionID, "(invalid session ID format)");
93
+ }
94
+ }
95
+ function buildMessageQuery(params) {
96
+ const where = [];
97
+ const args = [];
98
+ if (params.sessionID) {
99
+ where.push(`session_id = ?`);
100
+ args.push(params.sessionID);
101
+ }
102
+ if (typeof params.sinceMs === "number") {
103
+ where.push(`time_created >= ?`);
104
+ args.push(params.sinceMs);
105
+ }
106
+ if (typeof params.untilMs === "number") {
107
+ where.push(`time_created <= ?`);
108
+ args.push(params.untilMs);
109
+ }
110
+ const sql = `SELECT id, session_id, time_created, time_updated, data FROM "message"` +
111
+ (where.length ? ` WHERE ${where.join(" AND ")}` : "") +
112
+ ` ORDER BY time_created ASC, id ASC`;
113
+ return { sql, args };
114
+ }
115
+ async function hasJsonExtract(conn) {
49
116
  try {
50
- const raw = await readFile(path, "utf-8");
51
- return JSON.parse(raw);
117
+ const row = conn.get("SELECT json_extract('{\"role\":\"assistant\"}', '$.role') as r");
118
+ return row?.r === "assistant";
52
119
  }
53
120
  catch {
54
- return null;
121
+ return false;
55
122
  }
56
123
  }
57
- export async function listSessionIDsFromMessageStorage() {
58
- const base = getOpenCodeMessageDir();
59
- if (!existsSync(base))
60
- return [];
124
+ export async function getOpenCodeDbStats() {
125
+ const db = openDbOrNull();
126
+ if (!db) {
127
+ return {
128
+ dbPath: getOpenCodeDbPath(),
129
+ sessionCount: 0,
130
+ messageCount: 0,
131
+ assistantMessageCount: 0,
132
+ };
133
+ }
134
+ const conn = await db.open();
61
135
  try {
62
- const entries = await readdir(base, { withFileTypes: true });
63
- return entries
64
- .filter((e) => e.isDirectory() && e.name.startsWith("ses_"))
65
- .map((e) => e.name)
66
- .sort();
136
+ const sessionRow = conn.get(`SELECT count(*) as c FROM "session"`);
137
+ const messageRow = conn.get(`SELECT count(*) as c FROM "message"`);
138
+ let assistantCount = 0;
139
+ if (await hasJsonExtract(conn)) {
140
+ const a = conn.get(`SELECT count(*) as c FROM "message" WHERE json_extract(data, '$.role') = 'assistant'`);
141
+ assistantCount = typeof a?.c === "number" ? a.c : 0;
142
+ }
143
+ else {
144
+ const rows = conn.all(`SELECT data FROM "message"`);
145
+ for (const r of rows) {
146
+ const payload = safeJsonParse(r.data);
147
+ if (payload && payload.role === "assistant")
148
+ assistantCount += 1;
149
+ }
150
+ }
151
+ return {
152
+ dbPath: db.dbPath,
153
+ sessionCount: typeof sessionRow?.c === "number" ? sessionRow.c : 0,
154
+ messageCount: typeof messageRow?.c === "number" ? messageRow.c : 0,
155
+ assistantMessageCount: assistantCount,
156
+ };
67
157
  }
68
- catch {
69
- return [];
158
+ finally {
159
+ conn.close();
70
160
  }
71
161
  }
72
162
  export async function iterAssistantMessages(params) {
73
- const base = getOpenCodeMessageDir();
74
- if (!existsSync(base))
163
+ const db = openDbOrNull();
164
+ if (!db)
75
165
  return [];
76
- const sessionIDs = await listSessionIDsFromMessageStorage();
77
- const out = [];
78
- for (const sessionID of sessionIDs) {
79
- const dir = join(base, sessionID);
80
- let files;
81
- try {
82
- files = (await readdir(dir)).filter((f) => f.endsWith(".json"));
83
- }
84
- catch {
85
- continue;
86
- }
87
- for (const f of files) {
88
- const p = join(dir, f);
89
- const msg = (await safeReadJson(p));
166
+ const conn = await db.open();
167
+ try {
168
+ const q = buildMessageQuery({ sinceMs: params.sinceMs, untilMs: params.untilMs });
169
+ const rows = conn.all(q.sql, q.args);
170
+ const out = [];
171
+ for (const row of rows) {
172
+ const msg = mapRowToOpenCodeMessage(row);
90
173
  if (!msg)
91
174
  continue;
92
- if (msg.role !== "assistant")
93
- continue;
94
- const created = msg.time?.created;
95
- if (typeof created !== "number")
96
- continue;
97
- if (typeof params.sinceMs === "number" && created < params.sinceMs)
98
- continue;
99
- if (typeof params.untilMs === "number" && created > params.untilMs)
175
+ if (String(msg.role).toLowerCase() !== "assistant")
100
176
  continue;
101
177
  out.push(msg);
102
178
  }
179
+ return out;
180
+ }
181
+ finally {
182
+ conn.close();
103
183
  }
104
- out.sort((a, b) => (a.time?.created ?? 0) - (b.time?.created ?? 0));
105
- return out;
106
184
  }
107
185
  /**
108
186
  * Read assistant messages for a specific session only.
109
- *
110
- * This is more efficient than iterAssistantMessages when you only need
111
- * messages from a single session, as it only reads that session's directory.
112
- *
113
- * @param params.sessionID - Session ID (must start with "ses_")
114
- * @param params.sinceMs - Optional: only messages created after this timestamp
115
- * @param params.untilMs - Optional: only messages created before this timestamp
116
- * @throws SessionNotFoundError if the session directory doesn't exist
117
187
  */
118
188
  export async function iterAssistantMessagesForSession(params) {
119
189
  const { sessionID, sinceMs, untilMs } = params;
120
- // Validate session ID format
121
- if (!sessionID.startsWith("ses_")) {
122
- throw new SessionNotFoundError(sessionID, "(invalid session ID format)");
190
+ validateSessionIdOrThrow(sessionID);
191
+ const db = openDbOrNull();
192
+ if (!db) {
193
+ throw new SessionNotFoundError(sessionID, getOpenCodeDbPath());
123
194
  }
124
- const base = getOpenCodeMessageDir();
125
- const sessionDir = join(base, sessionID);
126
- // Check if session directory exists
127
- if (!existsSync(sessionDir)) {
128
- throw new SessionNotFoundError(sessionID, sessionDir);
129
- }
130
- // Read messages from this session only
131
- let files;
195
+ const conn = await db.open();
132
196
  try {
133
- files = (await readdir(sessionDir)).filter((f) => f.endsWith(".json"));
197
+ const exists = conn.get(`SELECT 1 as ok FROM "session" WHERE id = ? LIMIT 1`, [
198
+ sessionID,
199
+ ]);
200
+ if (!exists) {
201
+ throw new SessionNotFoundError(sessionID, db.dbPath);
202
+ }
203
+ const q = buildMessageQuery({ sessionID, sinceMs, untilMs });
204
+ const rows = conn.all(q.sql, q.args);
205
+ const out = [];
206
+ for (const row of rows) {
207
+ const msg = mapRowToOpenCodeMessage(row);
208
+ if (!msg)
209
+ continue;
210
+ if (String(msg.role).toLowerCase() !== "assistant")
211
+ continue;
212
+ out.push(msg);
213
+ }
214
+ return out;
215
+ }
216
+ finally {
217
+ conn.close();
134
218
  }
135
- catch {
136
- throw new SessionNotFoundError(sessionID, sessionDir);
137
- }
138
- const out = [];
139
- for (const f of files) {
140
- const p = join(sessionDir, f);
141
- const msg = (await safeReadJson(p));
142
- if (!msg)
143
- continue;
144
- if (msg.role !== "assistant")
145
- continue;
146
- const created = msg.time?.created;
147
- if (typeof created !== "number")
148
- continue;
149
- if (typeof sinceMs === "number" && created < sinceMs)
150
- continue;
151
- if (typeof untilMs === "number" && created > untilMs)
152
- continue;
153
- out.push(msg);
154
- }
155
- out.sort((a, b) => (a.time?.created ?? 0) - (b.time?.created ?? 0));
156
- return out;
157
219
  }
158
220
  export async function readAllSessionsIndex() {
159
- const base = getOpenCodeSessionDir();
221
+ const db = openDbOrNull();
160
222
  const idx = {};
161
- if (!existsSync(base))
223
+ if (!db)
162
224
  return idx;
163
- async function visit(dir) {
164
- let entries;
165
- try {
166
- entries = await readdir(dir, { withFileTypes: true });
167
- }
168
- catch {
169
- return;
170
- }
171
- for (const e of entries) {
172
- const p = join(dir, e.name);
173
- if (e.isDirectory()) {
174
- await visit(p);
175
- }
176
- else if (e.isFile() && e.name.startsWith("ses_") && e.name.endsWith(".json")) {
177
- const data = await safeReadJson(p);
178
- if (!data || typeof data !== "object")
179
- continue;
180
- const id = data.id;
181
- if (typeof id !== "string" || !id.startsWith("ses_"))
182
- continue;
183
- idx[id] = {
184
- id,
185
- title: typeof data.title === "string" ? data.title : undefined,
186
- parentID: typeof data.parentID === "string" ? data.parentID : undefined,
187
- time: {
188
- created: typeof data.time?.created === "number" ? data.time.created : undefined,
189
- updated: typeof data.time?.updated === "number" ? data.time.updated : undefined,
190
- },
191
- };
192
- }
225
+ const conn = await db.open();
226
+ try {
227
+ const rows = conn.all(`SELECT id, title, parent_id, time_created, time_updated FROM "session" ORDER BY time_created ASC, id ASC`);
228
+ for (const row of rows) {
229
+ if (!row || typeof row.id !== "string" || !row.id.startsWith("ses_"))
230
+ continue;
231
+ idx[row.id] = {
232
+ id: row.id,
233
+ title: typeof row.title === "string" && row.title.trim() ? row.title : undefined,
234
+ parentID: typeof row.parent_id === "string" ? row.parent_id : undefined,
235
+ time: {
236
+ created: typeof row.time_created === "number" ? row.time_created : undefined,
237
+ updated: typeof row.time_updated === "number" ? row.time_updated : undefined,
238
+ },
239
+ };
193
240
  }
241
+ return idx;
242
+ }
243
+ finally {
244
+ conn.close();
194
245
  }
195
- await visit(base);
196
- return idx;
197
246
  }
198
247
  //# sourceMappingURL=opencode-storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-storage.js","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-storage.js","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quota-command-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA4DjE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,MAAM,CAsDT"}
1
+ {"version":3,"file":"quota-command-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA4DjE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,MAAM,CA4DT"}
@@ -6,6 +6,7 @@
6
6
  * - Uses one line per limit, grouped under provider headers
7
7
  * - Includes session token summary (input/output per model)
8
8
  */
9
+ import { isValueEntry } from "./entries.js";
9
10
  import { bar, clampInt, padRight } from "./format-utils.js";
10
11
  import { renderSessionTokensLines } from "./session-tokens-format.js";
11
12
  /**
@@ -94,8 +95,12 @@ export function formatQuotaCommand(params) {
94
95
  for (const row of list) {
95
96
  const label = (row.label ?? row.name).trim();
96
97
  const labelCol = padRight(label, leftCol);
97
- const pct = clampInt(row.percentRemaining, 0, 100);
98
98
  const suffix = formatResetsIn(row.resetTimeIso);
99
+ if (isValueEntry(row)) {
100
+ lines.push(` ${labelCol} ${row.value}${suffix}`);
101
+ continue;
102
+ }
103
+ const pct = clampInt(row.percentRemaining, 0, 100);
99
104
  lines.push(` ${labelCol} ${bar(pct, barWidth)} ${pct}% left${suffix}`);
100
105
  }
101
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"quota-command-format.js","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quota-command-format.js","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quota-stats-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-stats-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAC;AA+FtE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,CAoLT"}
1
+ {"version":3,"file":"quota-stats-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-stats-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAC;AA+FtE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,CAmPT"}
@@ -98,7 +98,7 @@ function truncateTitle(title) {
98
98
  if (trimmed.length <= 23)
99
99
  return trimmed;
100
100
  // first 10 + ellipsis + last 10
101
- return trimmed.slice(0, 10) + "\u2026" + trimmed.slice(-10);
101
+ return trimmed.slice(0, 10) + "..." + trimmed.slice(-10);
102
102
  }
103
103
  export function formatQuotaStatsReport(params) {
104
104
  const topModels = params.topModels ?? 12;
@@ -117,7 +117,7 @@ export function formatQuotaStatsReport(params) {
117
117
  rows: [
118
118
  [
119
119
  fmtCompact(r.totals.messageCount),
120
- fmtCompact(totalTokens(r.totals.priced) + totalTokens(r.totals.unknown)),
120
+ fmtCompact(totalTokens(r.totals.priced) + totalTokens(r.totals.unknown) + totalTokens(r.totals.unpriced)),
121
121
  fmtUsd(r.totals.costUsd),
122
122
  ],
123
123
  ],
@@ -133,13 +133,15 @@ export function formatQuotaStatsReport(params) {
133
133
  fmtWindow(r.window),
134
134
  fmtCompact(r.totals.messageCount),
135
135
  fmtCompact(r.totals.sessionCount),
136
- fmtCompact(totalTokens(r.totals.priced) + totalTokens(r.totals.unknown)),
136
+ fmtCompact(totalTokens(r.totals.priced) + totalTokens(r.totals.unknown) + totalTokens(r.totals.unpriced)),
137
137
  fmtUsd(r.totals.costUsd),
138
138
  ],
139
139
  ],
140
140
  }));
141
141
  }
142
- const hasAnyReasoning = r.totals.priced.reasoning > 0 || r.totals.unknown.reasoning > 0;
142
+ const hasAnyReasoning = r.totals.priced.reasoning > 0 ||
143
+ r.totals.unknown.reasoning > 0 ||
144
+ r.totals.unpriced.reasoning > 0;
143
145
  const headers = ["Source", "Model", "Input", "Output", "C.Read", "C.Write"];
144
146
  const aligns = ["left", "left", "right", "right", "right", "right"];
145
147
  if (hasAnyReasoning) {
@@ -196,7 +198,7 @@ export function formatQuotaStatsReport(params) {
196
198
  lines.push(renderMarkdownTable({ headers, rows, aligns, widthMode: TABLE_WIDTH_MODE }));
197
199
  }
198
200
  // Skip Top Sessions for session-only reports (e.g., /tokens_session)
199
- if (r.bySession.length > 0 && !sessionOnly) {
201
+ if (!sessionOnly) {
200
202
  lines.push("");
201
203
  lines.push(`## Top Sessions`);
202
204
  lines.push("");
@@ -206,32 +208,85 @@ export function formatQuotaStatsReport(params) {
206
208
  : undefined;
207
209
  if (focus) {
208
210
  sessionRows.push([
209
- "current",
211
+ "*",
210
212
  focus.sessionID,
211
213
  fmtUsd(focus.costUsd),
212
214
  fmtCompact(totalTokens(focus.tokens)),
213
215
  fmtCompact(focus.messageCount),
214
216
  truncateTitle(focus.title),
215
217
  ]);
218
+ // After showing the current session, show top sessions excluding it.
219
+ const rest = r.bySession.filter((s) => s.sessionID !== params.focusSessionID);
220
+ for (const row of rest.slice(0, topSessions)) {
221
+ sessionRows.push([
222
+ "",
223
+ row.sessionID,
224
+ fmtUsd(row.costUsd),
225
+ fmtCompact(totalTokens(row.tokens)),
226
+ fmtCompact(row.messageCount),
227
+ truncateTitle(row.title),
228
+ ]);
229
+ }
216
230
  }
217
- const rest = params.focusSessionID
218
- ? r.bySession.filter((s) => s.sessionID !== params.focusSessionID)
219
- : r.bySession;
220
- for (const row of rest.slice(0, topSessions)) {
221
- sessionRows.push([
222
- "",
223
- row.sessionID,
224
- fmtUsd(row.costUsd),
225
- fmtCompact(totalTokens(row.tokens)),
226
- fmtCompact(row.messageCount),
227
- truncateTitle(row.title),
228
- ]);
231
+ else if (params.focusSessionID) {
232
+ // Keep the marker column, but make the state explicit.
233
+ sessionRows.push(["", "No current session", "-", "-", "-", "-"]);
234
+ sessionRows.push(["", params.focusSessionID, "-", "-", "-", "-"]);
235
+ for (const row of r.bySession.slice(0, topSessions)) {
236
+ sessionRows.push([
237
+ "",
238
+ row.sessionID,
239
+ fmtUsd(row.costUsd),
240
+ fmtCompact(totalTokens(row.tokens)),
241
+ fmtCompact(row.messageCount),
242
+ truncateTitle(row.title),
243
+ ]);
244
+ }
245
+ }
246
+ else {
247
+ // No focus session, just list top sessions.
248
+ for (const row of r.bySession.slice(0, topSessions)) {
249
+ sessionRows.push([
250
+ "",
251
+ row.sessionID,
252
+ fmtUsd(row.costUsd),
253
+ fmtCompact(totalTokens(row.tokens)),
254
+ fmtCompact(row.messageCount),
255
+ truncateTitle(row.title),
256
+ ]);
257
+ }
258
+ }
259
+ if (sessionRows.length > 0) {
260
+ lines.push(renderMarkdownTable({
261
+ headers: ["Current", "Session", "Cost", "Tokens", "Msgs", "Title"],
262
+ aligns: ["left", "left", "right", "right", "right", "left"],
263
+ widthMode: TABLE_WIDTH_MODE,
264
+ rows: sessionRows,
265
+ }));
229
266
  }
267
+ else {
268
+ lines.push("(no sessions)");
269
+ }
270
+ }
271
+ if (r.unpriced.length > 0) {
272
+ lines.push("");
273
+ lines.push(`## Unpriced Models`);
274
+ lines.push("");
230
275
  lines.push(renderMarkdownTable({
231
- headers: ["", "Session", "Cost", "Tokens", "Msgs", "Title"],
232
- aligns: ["left", "left", "right", "right", "right", "left"],
276
+ headers: ["Source", "Model", "Mapped", "Reason", "Tokens", "Msgs"],
277
+ aligns: ["left", "left", "left", "left", "right", "right"],
233
278
  widthMode: TABLE_WIDTH_MODE,
234
- rows: sessionRows,
279
+ rows: r.unpriced.slice(0, 20).map((u) => {
280
+ const mapped = `${u.key.mappedProvider}/${u.key.mappedModel}`;
281
+ return [
282
+ normalizeSourceName(u.key.sourceProviderID),
283
+ u.key.sourceModelID,
284
+ mapped,
285
+ u.key.reason,
286
+ fmtCompact(totalTokens(u.tokens)),
287
+ fmtCompact(u.messageCount),
288
+ ];
289
+ }),
235
290
  }));
236
291
  }
237
292
  if (r.unknown.length > 0) {
@@ -256,7 +311,7 @@ export function formatQuotaStatsReport(params) {
256
311
  }),
257
312
  }));
258
313
  lines.push("");
259
- lines.push(`Run /quota_status to see the full unknown pricing report.`);
314
+ lines.push(`Run /quota_status to see the full pricing diagnostics report.`);
260
315
  }
261
316
  return lines.join("\n");
262
317
  }