@slkiser/opencode-quota 2.12.0 → 2.14.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 (40) hide show
  1. package/README.md +35 -9
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/minimax-auth.d.ts +29 -0
  6. package/dist/lib/minimax-auth.d.ts.map +1 -0
  7. package/dist/lib/minimax-auth.js +61 -0
  8. package/dist/lib/minimax-auth.js.map +1 -0
  9. package/dist/lib/opencode-storage.d.ts +8 -0
  10. package/dist/lib/opencode-storage.d.ts.map +1 -1
  11. package/dist/lib/opencode-storage.js +86 -19
  12. package/dist/lib/opencode-storage.js.map +1 -1
  13. package/dist/lib/provider-metadata.d.ts.map +1 -1
  14. package/dist/lib/provider-metadata.js +2 -0
  15. package/dist/lib/provider-metadata.js.map +1 -1
  16. package/dist/lib/quota-stats-format.d.ts +8 -1
  17. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  18. package/dist/lib/quota-stats-format.js +64 -6
  19. package/dist/lib/quota-stats-format.js.map +1 -1
  20. package/dist/lib/quota-stats.d.ts +8 -0
  21. package/dist/lib/quota-stats.d.ts.map +1 -1
  22. package/dist/lib/quota-stats.js +84 -16
  23. package/dist/lib/quota-stats.js.map +1 -1
  24. package/dist/lib/quota-status.d.ts.map +1 -1
  25. package/dist/lib/quota-status.js +35 -0
  26. package/dist/lib/quota-status.js.map +1 -1
  27. package/dist/lib/types.d.ts +20 -0
  28. package/dist/lib/types.d.ts.map +1 -1
  29. package/dist/lib/types.js.map +1 -1
  30. package/dist/plugin.d.ts.map +1 -1
  31. package/dist/plugin.js +93 -42
  32. package/dist/plugin.js.map +1 -1
  33. package/dist/providers/minimax-coding-plan.d.ts +19 -0
  34. package/dist/providers/minimax-coding-plan.d.ts.map +1 -0
  35. package/dist/providers/minimax-coding-plan.js +219 -0
  36. package/dist/providers/minimax-coding-plan.js.map +1 -0
  37. package/dist/providers/registry.d.ts.map +1 -1
  38. package/dist/providers/registry.js +2 -0
  39. package/dist/providers/registry.js.map +1 -1
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  - Automatic quota toasts after assistant responses
6
6
  - Manual `/quota`, `/pricing_refresh`, and `/tokens_*` commands for deeper local reporting with zero context window pollution
7
7
 
8
- **Quota providers**: Anthropic (Claude), GitHub Copilot, OpenAI (Plus/Pro), Cursor, Qwen Code, Alibaba Coding Plan, Chutes AI, Firmware AI, Google Antigravity, Z.ai coding plan, and NanoGPT.
8
+ **Quota providers**: Anthropic (Claude), GitHub Copilot, OpenAI (Plus/Pro), Cursor, Qwen Code, Alibaba Coding Plan, MiniMax Coding Plan, Chutes AI, Firmware AI, Google Antigravity, Z.ai coding plan, and NanoGPT.
9
9
 
10
10
  **Token reports**: All models and providers in [models.dev](https://models.dev), plus deterministic local pricing for Cursor Auto/Composer and Cursor model aliases that are not on models.dev.
11
11
 
@@ -16,10 +16,10 @@
16
16
  </tr>
17
17
  <tr>
18
18
  <td width="50%">
19
- <img src="https://github.com/slkiser/opencode-quota/blob/main/toasts.webp" alt="Image of opencode-quota toast" />
19
+ <img src="https://shawnkiser.com/opencode-quota/toasts.webp" alt="Image of opencode-quota toast" />
20
20
  </td>
21
21
  <td width="50%">
22
- <img src="https://github.com/slkiser/opencode-quota/blob/main/tokens.webp" alt="Image of opencode-quota /tokens_weekly output" />
22
+ <img src="https://shawnkiser.com/opencode-quota/tokens.webp" alt="Image of opencode-quota /tokens_weekly output" />
23
23
  </td>
24
24
  </tr>
25
25
  </table>
@@ -84,11 +84,12 @@ That is enough for most installs. Providers are auto-detected from your existing
84
84
  | **Cursor** | Needs [quick setup](#cursor-quick-setup) | Companion auth plugin + `provider.cursor`. |
85
85
  | **Qwen Code** | Needs [quick setup](#qwen-code-quick-setup) | Companion auth plugin. |
86
86
  | **Alibaba Coding Plan** | Yes | OpenCode auth + local request estimation. |
87
- | **Firmware AI** | Usually | User/global OpenCode config or env. |
88
- | **Chutes AI** | Usually | User/global OpenCode config or env. |
89
- | **NanoGPT** | Usually | User/global OpenCode config, env, or auth.json. |
87
+ | **Firmware AI** | Usually | OpenCode auth, OpenCode config, or env. |
88
+ | **Chutes AI** | Usually | OpenCode auth, OpenCode config, or env. |
89
+ | **NanoGPT** | Usually | OpenCode auth, OpenCode config, or env. |
90
90
  | **Google Antigravity** | Needs [quick setup](#google-antigravity-quick-setup) | Companion auth plugin. |
91
91
  | **Z.ai** | Yes | OpenCode auth. |
92
+ | **MiniMax Coding Plan** | Yes | OpenCode auth, OpenCode config, or env. |
92
93
 
93
94
  <a id="anthropic-quick-setup"></a>
94
95
  <details>
@@ -189,10 +190,12 @@ For behavior details and troubleshooting, see [Qwen Code notes](#qwen-code-notes
189
190
  | `/tokens_weekly` | Tokens used in the last 7 days |
190
191
  | `/tokens_monthly` | Tokens used in the last 30 days, including pricing sections |
191
192
  | `/tokens_all` | Tokens used across all local history |
192
- | `/tokens_session` | Tokens used in the current session |
193
+ | `/tokens_session` | Tokens used in the current session only |
194
+ | `/tokens_session_all` | Tokens used in the current session plus all descendant child/subagent sessions |
193
195
  | `/tokens_between` | Tokens used between two dates: `YYYY-MM-DD YYYY-MM-DD` |
194
196
 
195
197
  There is no `/token` command. The reporting commands are the `/tokens_*` family.
198
+ Use `/tokens_session` for strict per-session accounting, and `/tokens_session_all` when you want the selected parent session plus every nested child session linked by `parent_id`.
196
199
 
197
200
  ## Provider-Specific Notes
198
201
 
@@ -317,6 +320,31 @@ Example fallback tier:
317
320
 
318
321
  </details>
319
322
 
323
+
324
+ <a id="minimax-coding-plan-notes"></a>
325
+ <details>
326
+ <summary><strong>MiniMax Coding Plan</strong></summary>
327
+
328
+ If OpenCode is already configured with the `minimax-coding-plan` provider and your `auth.json` has a `minimax-coding-plan` entry, quota detection works automatically. No additional plugin is required.
329
+
330
+ The plugin reads `key` first and falls back to `access` from that auth entry. Quota is fetched from the MiniMax API using those stored credentials.
331
+
332
+ Example `auth.json` entry:
333
+
334
+ ```json
335
+ {
336
+ "minimax-coding-plan": {
337
+ "type": "api",
338
+ "key": "YOUR_MINIMAX_API_KEY"
339
+ }
340
+ }
341
+ ```
342
+
343
+ - `MiniMax-M*` models — rolling 5-hour interval + weekly
344
+ - `/quota_status` shows auth detection, API-key diagnostics, live quota state, and endpoint errors
345
+
346
+ </details>
347
+
320
348
  <a id="firmware-ai-notes"></a>
321
349
  <details>
322
350
  <summary><strong>Firmware AI</strong></summary>
@@ -482,8 +510,6 @@ MIT
482
510
 
483
511
  OpenCode Quota is not built by the OpenCode team and is not affiliated with OpenCode or any provider listed above.
484
512
 
485
- Anthropic quota detection is delegated to the local Claude CLI/runtime. OpenCode Anthropic API-key usage is unaffected, but this plugin only surfaces Anthropic quota rows when the local Claude CLI exposes them.
486
-
487
513
  ## Star History
488
514
 
489
515
  <a href="https://www.star-history.com/?repos=slkiser%2Fopencode-quota&type=date&legend=bottom-right">
package/dist/index.d.ts CHANGED
@@ -6,5 +6,5 @@
6
6
  * @packageDocumentation
7
7
  */
8
8
  export { QuotaToastPlugin } from "./plugin.js";
9
- export type { QuotaToastConfig, GoogleModelId, PricingSnapshotSource, CopilotEnterpriseUsageResult, CopilotOrganizationUsageResult, CopilotQuotaResult, GoogleQuotaResult, GoogleModelQuota, } from "./lib/types.js";
9
+ export type { QuotaToastConfig, GoogleModelId, PricingSnapshotSource, CopilotEnterpriseUsageResult, CopilotOrganizationUsageResult, CopilotQuotaResult, GoogleQuotaResult, GoogleModelQuota, MiniMaxResult, MiniMaxResultEntry, } from "./lib/types.js";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAc/C,yEAAyE;AACzE,wCAAwC;AAExC,6EAA6E;AAC7E,uFAAuF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgB/C,yEAAyE;AACzE,wCAAwC;AAExC,6EAA6E;AAC7E,uFAAuF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MiniMax auth resolver
3
+ *
4
+ * Reads MiniMax credentials from OpenCode auth.json and resolves
5
+ * them into a standardized format for the MiniMax Coding Plan provider.
6
+ */
7
+ import type { AuthData } from "./types.js";
8
+ export declare const DEFAULT_MINIMAX_AUTH_CACHE_MAX_AGE_MS = 5000;
9
+ export type ResolvedMiniMaxAuth = {
10
+ state: "none";
11
+ } | {
12
+ state: "configured";
13
+ apiKey: string;
14
+ } | {
15
+ state: "invalid";
16
+ error: string;
17
+ };
18
+ /**
19
+ * Resolve MiniMax auth from the full auth data.
20
+ *
21
+ * Returns `"none"` when no minimax-coding-plan entry exists,
22
+ * `"invalid"` when the entry exists but has wrong type or empty credentials,
23
+ * and `"configured"` when a usable API key is found.
24
+ */
25
+ export declare function resolveMiniMaxAuth(auth: AuthData | null | undefined): ResolvedMiniMaxAuth;
26
+ export declare function resolveMiniMaxAuthCached(params?: {
27
+ maxAgeMs?: number;
28
+ }): Promise<ResolvedMiniMaxAuth>;
29
+ //# sourceMappingURL=minimax-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax-auth.d.ts","sourceRoot":"","sources":["../../src/lib/minimax-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAI5D,eAAO,MAAM,qCAAqC,OAAQ,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAqBxC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,mBAAmB,CA2BzF;AAED,wBAAsB,wBAAwB,CAAC,MAAM,CAAC,EAAE;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAK/B"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * MiniMax auth resolver
3
+ *
4
+ * Reads MiniMax credentials from OpenCode auth.json and resolves
5
+ * them into a standardized format for the MiniMax Coding Plan provider.
6
+ */
7
+ import { sanitizeDisplayText } from "./display-sanitize.js";
8
+ import { readAuthFileCached } from "./opencode-auth.js";
9
+ export const DEFAULT_MINIMAX_AUTH_CACHE_MAX_AGE_MS = 5_000;
10
+ function getMiniMaxAuthEntry(auth) {
11
+ return auth?.["minimax-coding-plan"];
12
+ }
13
+ function isMiniMaxAuthData(value) {
14
+ return value !== null && typeof value === "object";
15
+ }
16
+ function getMiniMaxCredential(auth) {
17
+ const key = typeof auth.key === "string" ? auth.key.trim() : "";
18
+ const access = typeof auth.access === "string" ? auth.access.trim() : "";
19
+ return key || access || "";
20
+ }
21
+ function sanitizeMiniMaxAuthValue(value) {
22
+ const sanitized = sanitizeDisplayText(value).replace(/\s+/g, " ").trim();
23
+ return (sanitized || "unknown").slice(0, 120);
24
+ }
25
+ /**
26
+ * Resolve MiniMax auth from the full auth data.
27
+ *
28
+ * Returns `"none"` when no minimax-coding-plan entry exists,
29
+ * `"invalid"` when the entry exists but has wrong type or empty credentials,
30
+ * and `"configured"` when a usable API key is found.
31
+ */
32
+ export function resolveMiniMaxAuth(auth) {
33
+ const minimax = getMiniMaxAuthEntry(auth);
34
+ if (minimax === null || minimax === undefined) {
35
+ return { state: "none" };
36
+ }
37
+ if (!isMiniMaxAuthData(minimax)) {
38
+ return { state: "invalid", error: "MiniMax auth entry has invalid shape" };
39
+ }
40
+ if (typeof minimax.type !== "string") {
41
+ return { state: "invalid", error: "MiniMax auth entry present but type is missing or invalid" };
42
+ }
43
+ if (minimax.type !== "api") {
44
+ return {
45
+ state: "invalid",
46
+ error: `Unsupported MiniMax auth type: "${sanitizeMiniMaxAuthValue(minimax.type)}"`,
47
+ };
48
+ }
49
+ const credential = getMiniMaxCredential(minimax);
50
+ if (!credential) {
51
+ return { state: "invalid", error: "MiniMax auth entry present but credentials are empty" };
52
+ }
53
+ return { state: "configured", apiKey: credential };
54
+ }
55
+ export async function resolveMiniMaxAuthCached(params) {
56
+ const auth = await readAuthFileCached({
57
+ maxAgeMs: Math.max(0, params?.maxAgeMs ?? DEFAULT_MINIMAX_AUTH_CACHE_MAX_AGE_MS),
58
+ });
59
+ return resolveMiniMaxAuth(auth);
60
+ }
61
+ //# sourceMappingURL=minimax-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax-auth.js","sourceRoot":"","sources":["../../src/lib/minimax-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,CAAC,MAAM,qCAAqC,GAAG,KAAK,CAAC;AAO3D,SAAS,mBAAmB,CAAC,IAAiC;IAC5D,OAAO,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAqB;IACjD,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,OAAO,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa;IAC7C,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IAClE,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,2DAA2D,EAAE,CAAC;IAClG,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,mCAAmC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;SACpF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;IAC7F,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAE9C;IACC,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC;QACpC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,IAAI,qCAAqC,CAAC;KACjF,CAAC,CAAC;IACH,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -68,5 +68,13 @@ export declare function iterAssistantMessagesForSession(params: {
68
68
  sinceMs?: number;
69
69
  untilMs?: number;
70
70
  }): Promise<OpenCodeMessage[]>;
71
+ /**
72
+ * Read assistant messages for a specific set of sessions.
73
+ */
74
+ export declare function iterAssistantMessagesForSessions(params: {
75
+ sessionIDs: string[];
76
+ sinceMs?: number;
77
+ untilMs?: number;
78
+ }): Promise<OpenCodeMessage[]>;
71
79
  export declare function readAllSessionsIndex(): Promise<Record<string, OpenCodeSessionInfo>>;
72
80
  //# sourceMappingURL=opencode-storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-storage.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;gBADnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;CAKtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAuHD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAuCnE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB7B;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgC7B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CA4BzF"}
1
+ {"version":3,"file":"opencode-storage.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;gBADnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;CAKtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AA+KD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAuCnE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAY7B;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwB7B;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CAAC,MAAM,EAAE;IAC7D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA+B7B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CA4BzF"}
@@ -43,6 +43,9 @@ function safeJsonParse(raw) {
43
43
  return null;
44
44
  }
45
45
  }
46
+ // Stay comfortably below SQLite's default host-parameter cap once optional
47
+ // time filters are included in the query.
48
+ const SQLITE_MAX_MESSAGE_QUERY_ARGS = 900;
46
49
  function normalizeNumber(n) {
47
50
  return typeof n === "number" && Number.isFinite(n) ? n : undefined;
48
51
  }
@@ -92,13 +95,44 @@ function validateSessionIdOrThrow(sessionID) {
92
95
  throw new SessionNotFoundError(sessionID, "(invalid session ID format)");
93
96
  }
94
97
  }
98
+ function normalizeSessionIdsOrThrow(sessionIDs) {
99
+ const unique = [];
100
+ const seen = new Set();
101
+ for (const sessionID of sessionIDs) {
102
+ validateSessionIdOrThrow(sessionID);
103
+ if (seen.has(sessionID))
104
+ continue;
105
+ seen.add(sessionID);
106
+ unique.push(sessionID);
107
+ }
108
+ return unique;
109
+ }
110
+ function chunkArray(items, chunkSize) {
111
+ const chunks = [];
112
+ for (let i = 0; i < items.length; i += chunkSize) {
113
+ chunks.push(items.slice(i, i + chunkSize));
114
+ }
115
+ return chunks;
116
+ }
95
117
  function buildMessageQuery(params) {
118
+ if (params.sessionID && params.sessionIDs?.length) {
119
+ throw new Error("buildMessageQuery received both sessionID and sessionIDs");
120
+ }
96
121
  const where = [];
97
122
  const args = [];
98
123
  if (params.sessionID) {
99
124
  where.push(`session_id = ?`);
100
125
  args.push(params.sessionID);
101
126
  }
127
+ else if (params.sessionIDs) {
128
+ if (params.sessionIDs.length === 0) {
129
+ where.push(`1 = 0`);
130
+ }
131
+ else {
132
+ where.push(`session_id IN (${params.sessionIDs.map(() => "?").join(", ")})`);
133
+ args.push(...params.sessionIDs);
134
+ }
135
+ }
102
136
  if (typeof params.sinceMs === "number") {
103
137
  where.push(`time_created >= ?`);
104
138
  args.push(params.sinceMs);
@@ -121,6 +155,25 @@ async function hasJsonExtract(conn) {
121
155
  return false;
122
156
  }
123
157
  }
158
+ function mapAssistantMessages(rows) {
159
+ const out = [];
160
+ for (const row of rows) {
161
+ const msg = mapRowToOpenCodeMessage(row);
162
+ if (!msg)
163
+ continue;
164
+ if (String(msg.role).toLowerCase() !== "assistant")
165
+ continue;
166
+ out.push(msg);
167
+ }
168
+ return out;
169
+ }
170
+ function compareMessageOrder(a, b) {
171
+ const aCreated = typeof a.time?.created === "number" ? a.time.created : Number.MAX_SAFE_INTEGER;
172
+ const bCreated = typeof b.time?.created === "number" ? b.time.created : Number.MAX_SAFE_INTEGER;
173
+ if (aCreated !== bCreated)
174
+ return aCreated - bCreated;
175
+ return a.id.localeCompare(b.id);
176
+ }
124
177
  export async function getOpenCodeDbStats() {
125
178
  const db = openDbOrNull();
126
179
  if (!db) {
@@ -167,16 +220,7 @@ export async function iterAssistantMessages(params) {
167
220
  try {
168
221
  const q = buildMessageQuery({ sinceMs: params.sinceMs, untilMs: params.untilMs });
169
222
  const rows = conn.all(q.sql, q.args);
170
- const out = [];
171
- for (const row of rows) {
172
- const msg = mapRowToOpenCodeMessage(row);
173
- if (!msg)
174
- continue;
175
- if (String(msg.role).toLowerCase() !== "assistant")
176
- continue;
177
- out.push(msg);
178
- }
179
- return out;
223
+ return mapAssistantMessages(rows);
180
224
  }
181
225
  finally {
182
226
  conn.close();
@@ -202,16 +246,39 @@ export async function iterAssistantMessagesForSession(params) {
202
246
  }
203
247
  const q = buildMessageQuery({ sessionID, sinceMs, untilMs });
204
248
  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);
249
+ return mapAssistantMessages(rows);
250
+ }
251
+ finally {
252
+ conn.close();
253
+ }
254
+ }
255
+ /**
256
+ * Read assistant messages for a specific set of sessions.
257
+ */
258
+ export async function iterAssistantMessagesForSessions(params) {
259
+ const sessionIDs = normalizeSessionIdsOrThrow(params.sessionIDs);
260
+ if (sessionIDs.length === 0)
261
+ return [];
262
+ const db = openDbOrNull();
263
+ if (!db) {
264
+ throw new SessionNotFoundError(sessionIDs[0], getOpenCodeDbPath());
265
+ }
266
+ const conn = await db.open();
267
+ try {
268
+ const reservedArgs = (typeof params.sinceMs === "number" ? 1 : 0) + (typeof params.untilMs === "number" ? 1 : 0);
269
+ const maxSessionIdsPerQuery = Math.max(1, SQLITE_MAX_MESSAGE_QUERY_ARGS - reservedArgs);
270
+ const messages = [];
271
+ for (const sessionIdChunk of chunkArray(sessionIDs, maxSessionIdsPerQuery)) {
272
+ const q = buildMessageQuery({
273
+ sessionIDs: sessionIdChunk,
274
+ sinceMs: params.sinceMs,
275
+ untilMs: params.untilMs,
276
+ });
277
+ const rows = conn.all(q.sql, q.args);
278
+ messages.push(...mapAssistantMessages(rows));
213
279
  }
214
- return out;
280
+ messages.sort(compareMessageOrder);
281
+ return messages;
215
282
  }
216
283
  finally {
217
284
  conn.close();
@@ -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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B;IACA;IAFlB,YACkB,SAAiB,EACjB,WAAmB;QAEnC,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QAHzB,cAAS,GAAT,SAAS,CAAQ;QACjB,gBAAW,GAAX,WAAW,CAAQ;QAGnC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AA+CD,MAAM,UAAU,4BAA4B;IAC1C,yFAAyF;IACzF,4DAA4D;IAC5D,OAAO,+BAA+B,EAAE,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,qBAAqB,CAAC,4BAA4B,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,4BAA4B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,2BAA2B,EAAE,CAAC,CAAC;AAC9D,CAAC;AAkBD,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,0CAA0C;AAC1C,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAE1C,SAAS,eAAe,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAe;IAC9C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClF,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEzD,MAAM,IAAI,GAAG,eAAe,CAAE,OAAe,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;IAEjE,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,IAAI;QACJ,UAAU,EAAE,eAAe,CAAE,OAAe,CAAC,UAAU,CAAC;QACxD,OAAO,EAAE,eAAe,CAAE,OAAe,CAAC,OAAO,CAAC;QAClD,MAAM,EAAG,OAAe,CAAC,MAAM;QAC/B,IAAI,EAAE,eAAe,CAAE,OAAe,CAAC,IAAI,CAAC;QAC5C,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,SAAS,EAAE,eAAe,CAAE,OAAe,CAAC,IAAI,EAAE,SAAS,CAAC;SAC7D;QACD,KAAK,EAAE,eAAe,CAAE,OAAe,CAAC,KAAK,CAAC;QAC9C,IAAI,EAAE,eAAe,CAAE,OAAe,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO;QACL,MAAM;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,SAAiB;IACjD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,UAA6B;IAC/D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAI,KAAmB,EAAE,SAAiB;IAC3D,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAK1B;IACC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAc,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;SAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7E,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,GAAG,GACP,wEAAwE;QACxE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,oCAAoC,CAAC;IAEvC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAqE;IACjG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,gEAAgE,CACjE,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,KAAK,WAAW,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAkB;IAC9C,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW;YAAE,SAAS;QAC7D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAkB,EAAE,CAAkB;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAChG,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAChG,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,GAAG,QAAQ,CAAC;IACtD,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO;YACL,MAAM,EAAE,iBAAiB,EAAE;YAC3B,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,qBAAqB,EAAE,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAgB,qCAAqC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAgB,qCAAqC,CAAC,CAAC;QAElF,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAChB,sFAAsF,CACvF,CAAC;YACF,cAAc,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAmB,4BAA4B,CAAC,CAAC;YACtE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,OAAO,IAAK,OAAe,CAAC,IAAI,KAAK,WAAW;oBAAE,cAAc,IAAI,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,YAAY,EAAE,OAAO,UAAU,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,YAAY,EAAE,OAAO,UAAU,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,qBAAqB,EAAE,cAAc;SACtC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAG3C;IACC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAEnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAa,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,MAIrD;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC/C,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAiB,oDAAoD,EAAE;YAC5F,SAAS;SACV,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAa,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,MAItD;IACC,MAAM,UAAU,GAAG,0BAA0B,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,YAAY,GAChB,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,6BAA6B,GAAG,YAAY,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,KAAK,MAAM,cAAc,IAAI,UAAU,CAAC,UAAU,EAAE,qBAAqB,CAAC,EAAE,CAAC;YAC3E,MAAM,CAAC,GAAG,iBAAiB,CAAC;gBAC1B,UAAU,EAAE,cAAc;gBAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAa,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAwC,EAAE,CAAC;IACpD,IAAI,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;IAEpB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,0GAA0G,CAC3G,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC/E,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG;gBACZ,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAChF,QAAQ,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBACvE,IAAI,EAAE;oBACJ,OAAO,EAAE,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;oBAC5E,OAAO,EAAE,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;iBAC7E;aACF,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYlE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvE,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/D"}
1
+ {"version":3,"file":"provider-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAalE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAavE,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -10,6 +10,7 @@ export const QUOTA_PROVIDER_LABELS = {
10
10
  "alibaba-coding-plan": "Alibaba Coding Plan",
11
11
  zai: "Z.ai",
12
12
  nanogpt: "NanoGPT",
13
+ "minimax-coding-plan": "MiniMax Coding Plan",
13
14
  };
14
15
  export const QUOTA_PROVIDER_ID_SYNONYMS = {
15
16
  "github-copilot": "copilot",
@@ -23,6 +24,7 @@ export const QUOTA_PROVIDER_ID_SYNONYMS = {
23
24
  qwen: "qwen-code",
24
25
  alibaba: "alibaba-coding-plan",
25
26
  "nano-gpt": "nanogpt",
27
+ minimax: "minimax-coding-plan",
26
28
  };
27
29
  export function normalizeQuotaProviderId(id) {
28
30
  const normalized = id.trim().toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"provider-metadata.js","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAqC;IACrE,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,QAAQ;IAC9B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,MAAM;IACnB,qBAAqB,EAAE,qBAAqB;IAC5C,GAAG,EAAE,MAAM;IACX,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAChC,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,WAAW;IAC1B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,SAAS;CACtB,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,OAAO,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"provider-metadata.js","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAqC;IACrE,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,QAAQ;IAC9B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,MAAM;IACnB,qBAAqB,EAAE,qBAAqB;IAC5C,GAAG,EAAE,MAAM;IACX,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAChC,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,WAAW;IAC1B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,qBAAqB;CAC/B,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,OAAO,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
@@ -1,4 +1,5 @@
1
- import type { AggregateResult } from "./quota-stats.js";
1
+ import type { AggregateResult, SessionTreeNode } from "./quota-stats.js";
2
+ type QuotaStatsReportKind = "standard" | "session" | "session_tree";
2
3
  export declare function formatQuotaStatsReport(params: {
3
4
  title: string;
4
5
  result: AggregateResult;
@@ -7,6 +8,12 @@ export declare function formatQuotaStatsReport(params: {
7
8
  focusSessionID?: string;
8
9
  /** When true, hides Window/Sessions columns and Top Sessions section (for session-only reports) */
9
10
  sessionOnly?: boolean;
11
+ reportKind?: QuotaStatsReportKind;
12
+ sessionTree?: {
13
+ rootSessionID: string;
14
+ nodes: SessionTreeNode[];
15
+ };
10
16
  generatedAtMs?: number;
11
17
  }): string;
18
+ export {};
12
19
  //# sourceMappingURL=quota-stats-format.d.ts.map
@@ -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;AAuHtE,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;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAwOT"}
1
+ {"version":3,"file":"quota-stats-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-stats-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAC;AAqBvF,KAAK,oBAAoB,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;AA8GpE,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;IACtB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,WAAW,CAAC,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,eAAe,EAAE,CAAC;KAC1B,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAyRT"}
@@ -7,6 +7,9 @@ function fmtUsd(n) {
7
7
  return "$0.00";
8
8
  return `$${n.toFixed(2)}`;
9
9
  }
10
+ function emptyBuckets() {
11
+ return { input: 0, output: 0, reasoning: 0, cache_read: 0, cache_write: 0 };
12
+ }
10
13
  function totalTokens(t) {
11
14
  return t.input + t.output + t.reasoning + t.cache_read + t.cache_write;
12
15
  }
@@ -23,6 +26,15 @@ function appendSessionRow(sessionRows, row, current = "") {
23
26
  truncateTitle(row.title),
24
27
  ]);
25
28
  }
29
+ function treeRelationLabel(depth) {
30
+ if (depth <= 0)
31
+ return "current";
32
+ if (depth === 1)
33
+ return "child";
34
+ if (depth === 2)
35
+ return "grandchild";
36
+ return `descendant(${depth})`;
37
+ }
26
38
  function missingFocusSessionLabel(hasRawFocus) {
27
39
  return hasRawFocus
28
40
  ? "(current session has no token usage in selected window)"
@@ -123,14 +135,21 @@ export function formatQuotaStatsReport(params) {
123
135
  const topModels = params.topModels ?? 12;
124
136
  const topSessions = params.topSessions ?? 8;
125
137
  const r = params.result;
126
- const sessionOnly = params.sessionOnly ?? false;
138
+ const reportKind = params.reportKind ?? (params.sessionOnly ? "session" : "standard");
139
+ const sessionOnly = reportKind === "session";
140
+ const sessionTreeMode = reportKind === "session_tree";
141
+ const sessionTree = params.sessionTree;
142
+ if (sessionTreeMode && !sessionTree) {
143
+ throw new Error("formatQuotaStatsReport requires sessionTree for session_tree reports");
144
+ }
145
+ const combinedTokens = totalTokens(r.totals.priced) + totalTokens(r.totals.unknown) + totalTokens(r.totals.unpriced);
127
146
  const lines = [];
128
147
  lines.push(renderCommandHeading({
129
148
  title: params.title,
130
149
  generatedAtMs: params.generatedAtMs,
131
150
  }));
132
151
  lines.push("");
133
- // For session-only reports, show a simpler summary without Window/Sessions columns
152
+ // Session-scoped reports use a compact summary without the time window column.
134
153
  if (sessionOnly) {
135
154
  lines.push(renderMarkdownTable({
136
155
  headers: ["Messages", "Tokens", "Cost"],
@@ -139,7 +158,22 @@ export function formatQuotaStatsReport(params) {
139
158
  rows: [
140
159
  [
141
160
  fmtCompact(r.totals.messageCount),
142
- fmtCompact(totalTokens(r.totals.priced) + totalTokens(r.totals.unknown) + totalTokens(r.totals.unpriced)),
161
+ fmtCompact(combinedTokens),
162
+ fmtUsd(r.totals.costUsd),
163
+ ],
164
+ ],
165
+ }));
166
+ }
167
+ else if (sessionTreeMode) {
168
+ lines.push(renderMarkdownTable({
169
+ headers: ["Messages", "Sessions", "Tokens", "Cost"],
170
+ aligns: ["right", "right", "right", "right"],
171
+ widthMode: TABLE_WIDTH_MODE,
172
+ rows: [
173
+ [
174
+ fmtCompact(r.totals.messageCount),
175
+ fmtCompact(sessionTree.nodes.length),
176
+ fmtCompact(combinedTokens),
143
177
  fmtUsd(r.totals.costUsd),
144
178
  ],
145
179
  ],
@@ -155,7 +189,7 @@ export function formatQuotaStatsReport(params) {
155
189
  fmtWindow(r.window),
156
190
  fmtCompact(r.totals.messageCount),
157
191
  fmtCompact(r.totals.sessionCount),
158
- fmtCompact(totalTokens(r.totals.priced) + totalTokens(r.totals.unknown) + totalTokens(r.totals.unpriced)),
192
+ fmtCompact(combinedTokens),
159
193
  fmtUsd(r.totals.costUsd),
160
194
  ],
161
195
  ],
@@ -219,8 +253,32 @@ export function formatQuotaStatsReport(params) {
219
253
  lines.push("");
220
254
  lines.push(renderMarkdownTable({ headers, rows, aligns, widthMode: TABLE_WIDTH_MODE }));
221
255
  }
222
- // Skip Top Sessions for session-only reports (e.g., /tokens_session)
223
- if (!sessionOnly) {
256
+ if (sessionTreeMode) {
257
+ lines.push("");
258
+ lines.push(`## Session Tree`);
259
+ lines.push("");
260
+ const sessionUsageByID = new Map(r.bySession.map((row) => [row.sessionID, row]));
261
+ const sessionTreeRows = sessionTree.nodes.map((node) => {
262
+ const usage = sessionUsageByID.get(node.sessionID);
263
+ return [
264
+ treeRelationLabel(node.depth),
265
+ node.parentID ?? "-",
266
+ node.sessionID,
267
+ fmtUsd(usage?.costUsd ?? 0),
268
+ fmtCompact(totalTokens(usage?.tokens ?? emptyBuckets())),
269
+ fmtCompact(usage?.messageCount ?? 0),
270
+ truncateTitle(node.title ?? usage?.title),
271
+ ];
272
+ });
273
+ lines.push(renderMarkdownTable({
274
+ headers: ["Relation", "Parent", "Session", "Cost", "Tokens", "Msgs", "Title"],
275
+ aligns: ["left", "left", "left", "right", "right", "right", "left"],
276
+ widthMode: TABLE_WIDTH_MODE,
277
+ rows: sessionTreeRows,
278
+ }));
279
+ }
280
+ // Skip Top Sessions for session-scoped reports (e.g., /tokens_session, /tokens_session_all).
281
+ if (reportKind === "standard") {
224
282
  lines.push("");
225
283
  lines.push(`## Top Sessions`);
226
284
  lines.push("");