@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.
- package/README.md +54 -19
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +2 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/copilot.d.ts.map +1 -1
- package/dist/lib/copilot.js +105 -18
- package/dist/lib/copilot.js.map +1 -1
- package/dist/lib/entries.d.ts +23 -3
- package/dist/lib/entries.d.ts.map +1 -1
- package/dist/lib/entries.js +6 -1
- package/dist/lib/entries.js.map +1 -1
- package/dist/lib/firmware.d.ts +2 -17
- package/dist/lib/firmware.d.ts.map +1 -1
- package/dist/lib/firmware.js +12 -80
- package/dist/lib/firmware.js.map +1 -1
- package/dist/lib/format-utils.d.ts +1 -0
- package/dist/lib/format-utils.d.ts.map +1 -1
- package/dist/lib/format-utils.js +5 -0
- package/dist/lib/format-utils.js.map +1 -1
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +34 -2
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/modelsdev-pricing.d.ts +6 -0
- package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
- package/dist/lib/modelsdev-pricing.js +35 -0
- package/dist/lib/modelsdev-pricing.js.map +1 -1
- package/dist/lib/opencode-auth.d.ts +9 -0
- package/dist/lib/opencode-auth.d.ts.map +1 -1
- package/dist/lib/opencode-auth.js +38 -0
- package/dist/lib/opencode-auth.js.map +1 -1
- package/dist/lib/opencode-sqlite.d.ts +7 -0
- package/dist/lib/opencode-sqlite.d.ts.map +1 -0
- package/dist/lib/opencode-sqlite.js +44 -0
- package/dist/lib/opencode-sqlite.js.map +1 -0
- package/dist/lib/opencode-storage.d.ts +14 -18
- package/dist/lib/opencode-storage.d.ts.map +1 -1
- package/dist/lib/opencode-storage.js +183 -134
- package/dist/lib/opencode-storage.js.map +1 -1
- package/dist/lib/quota-command-format.d.ts.map +1 -1
- package/dist/lib/quota-command-format.js +6 -1
- package/dist/lib/quota-command-format.js.map +1 -1
- package/dist/lib/quota-stats-format.d.ts.map +1 -1
- package/dist/lib/quota-stats-format.js +77 -22
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-stats.d.ts +14 -0
- package/dist/lib/quota-stats.d.ts.map +1 -1
- package/dist/lib/quota-stats.js +80 -1
- package/dist/lib/quota-stats.js.map +1 -1
- package/dist/lib/quota-status.d.ts.map +1 -1
- package/dist/lib/quota-status.js +180 -29
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/qwen-local-quota.d.ts +35 -0
- package/dist/lib/qwen-local-quota.d.ts.map +1 -0
- package/dist/lib/qwen-local-quota.js +162 -0
- package/dist/lib/qwen-local-quota.js.map +1 -0
- package/dist/lib/toast-format-grouped.d.ts.map +1 -1
- package/dist/lib/toast-format-grouped.js +31 -1
- package/dist/lib/toast-format-grouped.js.map +1 -1
- package/dist/lib/types.d.ts +8 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +163 -89
- package/dist/plugin.js.map +1 -1
- package/dist/providers/firmware.d.ts.map +1 -1
- package/dist/providers/firmware.js +10 -40
- package/dist/providers/firmware.js.map +1 -1
- package/dist/providers/qwen-code.d.ts +3 -0
- package/dist/providers/qwen-code.d.ts.map +1 -0
- package/dist/providers/qwen-code.js +66 -0
- package/dist/providers/qwen-code.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -0
- package/dist/providers/registry.js.map +1 -1
- 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
|
|
7
|
+
* Error thrown when a session is not found.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
|
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
|
|
31
|
-
return getOpenCodeDataDirCandidates().map((d) => join(d, "
|
|
32
|
+
export function getOpenCodeDbPathCandidates() {
|
|
33
|
+
return getOpenCodeDataDirCandidates().map((d) => join(d, "opencode.db"));
|
|
32
34
|
}
|
|
33
|
-
export function
|
|
34
|
-
return pickFirstExistingPath(
|
|
35
|
+
export function getOpenCodeDbPath() {
|
|
36
|
+
return pickFirstExistingPath(getOpenCodeDbPathCandidates());
|
|
35
37
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
function safeJsonParse(raw) {
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
38
45
|
}
|
|
39
|
-
|
|
40
|
-
return
|
|
46
|
+
function normalizeNumber(n) {
|
|
47
|
+
return typeof n === "number" && Number.isFinite(n) ? n : undefined;
|
|
41
48
|
}
|
|
42
|
-
|
|
43
|
-
return
|
|
49
|
+
function normalizeString(s) {
|
|
50
|
+
return typeof s === "string" ? s : undefined;
|
|
44
51
|
}
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
|
51
|
-
return
|
|
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
|
|
121
|
+
return false;
|
|
55
122
|
}
|
|
56
123
|
}
|
|
57
|
-
export async function
|
|
58
|
-
const
|
|
59
|
-
if (!
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
.
|
|
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
|
-
|
|
69
|
-
|
|
158
|
+
finally {
|
|
159
|
+
conn.close();
|
|
70
160
|
}
|
|
71
161
|
}
|
|
72
162
|
export async function iterAssistantMessages(params) {
|
|
73
|
-
const
|
|
74
|
-
if (!
|
|
163
|
+
const db = openDbOrNull();
|
|
164
|
+
if (!db)
|
|
75
165
|
return [];
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
190
|
+
validateSessionIdOrThrow(sessionID);
|
|
191
|
+
const db = openDbOrNull();
|
|
192
|
+
if (!db) {
|
|
193
|
+
throw new SessionNotFoundError(sessionID, getOpenCodeDbPath());
|
|
123
194
|
}
|
|
124
|
-
const
|
|
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
|
-
|
|
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
|
|
221
|
+
const db = openDbOrNull();
|
|
160
222
|
const idx = {};
|
|
161
|
-
if (!
|
|
223
|
+
if (!db)
|
|
162
224
|
return idx;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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":"AAAA,OAAO,EAAE,
|
|
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;
|
|
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,
|
|
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) + "
|
|
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 ||
|
|
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 (
|
|
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
|
-
"
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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: ["", "
|
|
232
|
-
aligns: ["left", "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:
|
|
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
|
|
314
|
+
lines.push(`Run /quota_status to see the full pricing diagnostics report.`);
|
|
260
315
|
}
|
|
261
316
|
return lines.join("\n");
|
|
262
317
|
}
|