From 1fd2fe1b06984176c042f3d9888cb9c987b125a5 Mon Sep 17 00:00:00 2001 From: eValor Date: Sun, 22 Feb 2026 00:21:12 +0800 Subject: [PATCH] v1.0.5 - Auto-detect plan tier, add screenshots and API docs --- .vscode/launch.json | 30 +++ .vscode/tasks.json | 27 ++ changelog.md | 14 + docs/API-DOCUMENTATION.md | 460 ++++++++++++++++++++++++++++++++ package-lock.json | 4 +- package.json | 22 +- readme.md | 116 ++++---- screenshot.jpg | Bin 0 -> 149586 bytes src/api/zaiService.ts | 244 ++++++++++++----- src/config/configuration.ts | 12 - src/extension.ts | 65 +---- src/statusBar/usageIndicator.ts | 294 +++++++++++++++----- 12 files changed, 1022 insertions(+), 266 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 docs/API-DOCUMENTATION.md create mode 100644 screenshot.jpg diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..20f8408 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,30 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/test/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..3b611b4 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,27 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "compile", + "problemMatcher": "$tsc", + "presentation": { + "reveal": "silent" + }, + "group": "build" + } + ] +} diff --git a/changelog.md b/changelog.md index 5f3cd0a..ec32395 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,19 @@ # Changelog +## [1.0.5] - 2026-02-22 + +### Changed +- **Auto-detect Plan Tier**: Removed manual plan tier configuration - extension now automatically detects your account level (Lite/Pro/Max) from API response +- **Improved API Response Parsing**: Enhanced quota window detection and display logic + +### Added +- **Screenshots Section**: Added UI screenshots to README for better visual preview of the extension +- **API Documentation**: Added comprehensive API documentation in `docs/API-DOCUMENTATION.md` +- **Debug Configuration**: Added `.vscode/launch.json` and `.vscode/tasks.json` for easier debugging + +### Fixed +- **Status Bar Display**: Fixed status bar display issues and improved tooltip rendering + ## [1.0.4] - 2026-01-03 ### Changed diff --git a/docs/API-DOCUMENTATION.md b/docs/API-DOCUMENTATION.md new file mode 100644 index 0000000..58790c9 --- /dev/null +++ b/docs/API-DOCUMENTATION.md @@ -0,0 +1,460 @@ +# Z.AI Usage Monitoring API Documentation + +> **Status**: ✅ Verified (2026-02-21) +> **Base URL**: `https://api.z.ai` +> **API Type**: Internal/Private (from zai-org/zai-coding-plugins) + +## Authentication + +All endpoints require Bearer token authentication via the `Authorization` header: + +```http +Authorization: your-api-key-here +``` + +## Common Headers + +```http +Authorization: {API_KEY} +Content-Type: application/json +Accept-Language: en-US,en +``` + +--- + +## 1. Model Usage Query + +Query model call counts and token usage over a time range. + +### Endpoint + +``` +GET /api/monitor/usage/model-usage +``` + +### Query Parameters + +| Parameter | Type | Required | Format | Description | +| ----------- | ------ | -------- | --------------------- | ------------------------- | +| `startTime` | string | Yes | `yyyy-MM-dd HH:mm:ss` | Start time of query range | +| `endTime` | string | Yes | `yyyy-MM-dd HH:mm:ss` | End time of query range | + +### Example Request + +```http +GET /api/monitor/usage/model-usage?startTime=2026-02-20%2020%3A00%3A00&endTime=2026-02-21%2020%3A59%3A59 +Authorization: your-api-key-here +Accept-Language: en-US,en +``` + +### Example Response + +```json +{ + "code": 200, + "msg": "Operation successful", + "data": { + "x_time": [ + "2026-02-20 20:00", + "2026-02-20 21:00", + "2026-02-20 22:00" + ], + "modelCallCount": [ + 137, + 36, + 79 + ], + "tokensUsage": [ + 4689148, + 1343019, + 3506363 + ], + "totalUsage": { + "totalModelCallCount": 1227, + "totalTokensUsage": 45867924 + } + }, + "success": true +} +``` + +### Response Fields + +| Field | Type | Description | +| ------------------------------------- | ---------------- | -------------------------------------- | +| `code` | number | HTTP status code | +| `msg` | string | Response message | +| `success` | boolean | Whether the request succeeded | +| `data.x_time` | string[] | Array of hourly timestamps | +| `data.modelCallCount` | (number\|null)[] | Model calls per hour (null if no data) | +| `data.tokensUsage` | (number\|null)[] | Tokens used per hour (null if no data) | +| `data.totalUsage.totalModelCallCount` | number | Total model calls in time range | +| `data.totalUsage.totalTokensUsage` | number | Total tokens used in time range | + +--- + +## 2. Tool Usage Query + +Query MCP tool usage (network search, web reader, zread) over a time range. + +### Endpoint + +``` +GET /api/monitor/usage/tool-usage +``` + +### Query Parameters + +| Parameter | Type | Required | Format | Description | +| ----------- | ------ | -------- | --------------------- | ------------------------- | +| `startTime` | string | Yes | `yyyy-MM-dd HH:mm:ss` | Start time of query range | +| `endTime` | string | Yes | `yyyy-MM-dd HH:mm:ss` | End time of query range | + +### Example Request + +```http +GET /api/monitor/usage/tool-usage?startTime=2026-02-20%2020%3A00%3A00&endTime=2026-02-21%2020%3A59%3A59 +Authorization: your-api-key-here +Accept-Language: en-US,en +``` + +### Example Response + +```json +{ + "code": 200, + "msg": "Operation successful", + "data": { + "x_time": [ + "2026-02-20 20:00", + "2026-02-20 21:00", + "2026-02-20 22:00" + ], + "networkSearchCount": [null, null, null], + "webReadMcpCount": [null, null, null], + "zreadMcpCount": [null, null, null], + "totalUsage": { + "totalNetworkSearchCount": 0, + "totalWebReadMcpCount": 0, + "totalZreadMcpCount": 0, + "totalSearchMcpCount": 0, + "toolDetails": [] + } + }, + "success": true +} +``` + +### Response Fields + +| Field | Type | Description | +| ----------------------------------------- | ---------------- | ----------------------------- | +| `code` | number | HTTP status code | +| `msg` | string | Response message | +| `success` | boolean | Whether the request succeeded | +| `data.x_time` | string[] | Array of hourly timestamps | +| `data.networkSearchCount` | (number\|null)[] | Network search calls per hour | +| `data.webReadMcpCount` | (number\|null)[] | Web reader MCP calls per hour | +| `data.zreadMcpCount` | (number\|null)[] | Zread MCP calls per hour | +| `data.totalUsage.totalNetworkSearchCount` | number | Total network search calls | +| `data.totalUsage.totalWebReadMcpCount` | number | Total web reader calls | +| `data.totalUsage.totalZreadMcpCount` | number | Total zread calls | +| `data.totalUsage.totalSearchMcpCount` | number | Total search MCP calls | +| `data.totalUsage.toolDetails` | array | Detailed tool usage breakdown | + +--- + +## 3. Quota Limit Query + +Query account quota limits and current usage percentages. This endpoint does not require time parameters. + +### Endpoint + +``` +GET /api/monitor/usage/quota/limit +``` + +### Query Parameters + +None required. + +### Example Request + +```http +GET /api/monitor/usage/quota/limit +Authorization: your-api-key-here +Accept-Language: en-US,en +``` + +### Example Response + +```json +{ + "code": 200, + "msg": "Operation successful", + "data": { + "limits": [ + { + "type": "TOKENS_LIMIT", + "unit": 3, + "number": 5, + "percentage": 0 + }, + { + "type": "TOKENS_LIMIT", + "unit": 6, + "number": 1, + "percentage": 21, + "nextResetTime": 1772192697998 + }, + { + "type": "TIME_LIMIT", + "unit": 5, + "number": 1, + "usage": 1000, + "currentValue": 0, + "remaining": 1000, + "percentage": 0, + "nextResetTime": 1774007097985, + "usageDetails": [ + { + "modelCode": "search-prime", + "usage": 0 + }, + { + "modelCode": "web-reader", + "usage": 0 + }, + { + "modelCode": "zread", + "usage": 0 + } + ] + } + ], + "level": "pro" + }, + "success": true +} +``` + +### Response Fields + +| Field | Type | Description | +| ------------- | ------- | ----------------------------- | +| `code` | number | HTTP status code | +| `msg` | string | Response message | +| `success` | boolean | Whether the request succeeded | +| `data.limits` | array | Array of quota limit objects | +| `data.level` | string | Account level (e.g., "pro") | + +### Limit Object Fields + +| Field | Type | Description | +| --------------- | ------ | ---------------------------------------------------------------------- | +| `type` | string | Limit type: `TOKENS_LIMIT` or `TIME_LIMIT` | +| `unit` | number | Time unit code: `3` = hour(s), `5` = month(s), `6` = week(s) | +| `number` | number | Quantity of the time unit (e.g., unit=3, number=5 means 5-hour window) | +| `percentage` | number | Usage percentage (0-100) | +| `nextResetTime` | number | Unix timestamp (ms) when quota resets | +| `usage` | number | Total quota allowed (TIME_LIMIT only) | +| `currentValue` | number | Current usage count (TIME_LIMIT only) | +| `remaining` | number | Remaining quota (TIME_LIMIT only) | +| `usageDetails` | array | Per-model usage breakdown (TIME_LIMIT only) | + +### Unit Type Mapping + +| Unit Code | Time Unit | Example | +| --------- | --------- | ------------------------------------------ | +| `3` | Hour(s) | `unit=3, number=5` → 5-hour rolling window | +| `5` | Month(s) | `unit=5, number=1` → 1-month quota | +| `6` | Week(s) | `unit=6, number=1` → 1-week quota | + +### Limit Type Explanation + +- **TOKENS_LIMIT**: Token usage quota with rolling time windows. The `unit` field defines the time unit (hour/week/month), and `number` specifies the quantity (e.g., unit=3/number=5 means a 5-hour rolling window, unit=6/number=1 means a 1-week window). +- **TIME_LIMIT**: MCP tool usage quota with fixed reset periods (e.g., monthly limit with 1000 calls). + +--- + +## Error Handling + +All endpoints return consistent error responses: + +```json +{ + "code": 400, + "msg": "Error description", + "success": false +} +``` + +### Common HTTP Status Codes + +| Code | Description | +| ---- | -------------------------------- | +| 200 | Success | +| 400 | Bad Request (invalid parameters) | +| 401 | Unauthorized (invalid API key) | +| 500 | Internal Server Error | + +--- + +## Usage Notes + +### Time Range Recommendations + +1. **Model Usage & Tool Usage**: + - Recommended range: 24-48 hours + - Data is returned in hourly buckets + - Future hours may return `null` values + +2. **Quota Limit**: + - No time parameters needed + - Returns current quota status and reset times + +### Rate Limiting + +No official rate limits documented, but recommended approach: +- Cache quota limit data (updates infrequently) +- Poll model/tool usage every 5-30 minutes +- Avoid excessive queries (< 1 request/second) + +### Date Formatting + +Always use URL-encoded format for time parameters: +``` +startTime=2026-02-20%2020%3A00%3A00 +``` + +JavaScript example: +```javascript +const startTime = '2026-02-20 20:00:00'; +const encoded = encodeURIComponent(startTime); +``` + +--- + +## Integration Example + +### Node.js with HTTPS + +```javascript +import https from 'https'; + +const API_KEY = 'your-api-key-here'; +const BASE_URL = 'https://api.z.ai'; + +function queryQuotaLimit() { + return new Promise((resolve, reject) => { + const url = new URL(`${BASE_URL}/api/monitor/usage/quota/limit`); + + const options = { + hostname: url.hostname, + port: 443, + path: url.pathname, + method: 'GET', + headers: { + 'Authorization': API_KEY, + 'Accept-Language': 'en-US,en', + 'Content-Type': 'application/json' + } + }; + + const req = https.request(options, (res) => { + let data = ''; + res.on('data', (chunk) => { data += chunk; }); + res.on('end', () => { + if (res.statusCode === 200) { + resolve(JSON.parse(data)); + } else { + reject(new Error(`HTTP ${res.statusCode}: ${data}`)); + } + }); + }); + + req.on('error', reject); + req.end(); + }); +} +``` + +### TypeScript Interfaces + +```typescript +// Model Usage Response +interface ModelUsageResponse { + code: number; + msg: string; + success: boolean; + data: { + x_time: string[]; + modelCallCount: (number | null)[]; + tokensUsage: (number | null)[]; + totalUsage: { + totalModelCallCount: number; + totalTokensUsage: number; + }; + }; +} + +// Tool Usage Response +interface ToolUsageResponse { + code: number; + msg: string; + success: boolean; + data: { + x_time: string[]; + networkSearchCount: (number | null)[]; + webReadMcpCount: (number | null)[]; + zreadMcpCount: (number | null)[]; + totalUsage: { + totalNetworkSearchCount: number; + totalWebReadMcpCount: number; + totalZreadMcpCount: number; + totalSearchMcpCount: number; + toolDetails: any[]; + }; + }; +} + +// Quota Limit Response +interface QuotaLimitResponse { + code: number; + msg: string; + success: boolean; + data: { + limits: Array<{ + type: 'TOKENS_LIMIT' | 'TIME_LIMIT'; + unit: number; + number: number; + percentage: number; + nextResetTime?: number; + usage?: number; + currentValue?: number; + remaining?: number; + usageDetails?: Array<{ + modelCode: string; + usage: number; + }>; + }>; + level: string; + }; +} +``` + +--- + +## Version History + +- **2026-02-21**: Initial documentation based on `zai-org/zai-coding-plugins` v1.x +- Verified with API Key: `62e19ef7...` (redacted) +- All 3 endpoints tested and confirmed working + +--- + +## References + +- Official Plugin: https://github.com/zai-org/zai-coding-plugins +- Plugin: `glm-plan-usage` (usage query functionality) +- Source: `plugins/glm-plan-usage/skills/usage-query-skill/scripts/query-usage.mjs` diff --git a/package-lock.json b/package-lock.json index 477954e..faaca76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "zai-usage-tracker", - "version": "0.0.5", + "version": "1.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "zai-usage-tracker", - "version": "0.0.5", + "version": "1.0.4", "license": "MIT", "devDependencies": { "@types/node": "^18.0.0", diff --git a/package.json b/package.json index 3330af6..41e4a00 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "zai-usage-tracker", "displayName": "Z.ai GLM Usage Tracker", "description": "Track your Z.ai GLM Coding Plan usage in the status bar", - "version": "1.0.4", + "version": "1.0.5", "publisher": "melon-hub", "icon": "icon.png", "license": "MIT", @@ -56,28 +56,12 @@ "configuration": { "title": "Z.ai Usage Tracker", "properties": { - "zaiUsage.planTier": { - "type": "string", - "enum": [ - "lite", - "pro", - "max" - ], - "default": "lite", - "description": "Your GLM Coding Plan tier", - "enumDescriptions": [ - "Lite Plan: ~120 prompts every 5 hours", - "Pro Plan: ~600 prompts every 5 hours", - "Max Plan: ~2400 prompts every 5 hours" - ], - "order": 1 - }, "zaiUsage.refreshInterval": { "type": "number", "default": 5, "minimum": 1, "description": "Refresh interval in minutes", - "order": 2 + "order": 1 } } } @@ -99,4 +83,4 @@ "eslint": "^8.45.0", "typescript": "^5.1.0" } -} +} \ No newline at end of file diff --git a/readme.md b/readme.md index e9bfa25..1c8cfd5 100644 --- a/readme.md +++ b/readme.md @@ -6,25 +6,42 @@ A VS Code extension that tracks your Z.ai GLM Coding Plan usage and displays it in the status bar. Also works with Windsurf, VSCodium, and other VS Code forks. +## Screenshots + +Plugin Screenshot + ## Features -- **Real-time Usage Display**: See your 5-hour token quota directly in the status bar - - Shows percentage used and current tokens - - Example: `✓ ⚡ 1% • 14.6K tokens` - -- **Detailed Tooltip**: Hover to see comprehensive usage stats: - - 5-hour token quota with progress bar - - 7-day usage (prompts + tokens) - - 30-day usage (prompts + tokens) - - Connection status and last update time - -- **Quick Pick Menu**: Click status bar for detailed stats and actions - - View all usage metrics - - Refresh usage data - - Configure settings - +- **Dynamic Quota Windows**: Automatically fetches all token quota windows from API + - 5-hour rolling window + - 1-week quota + - 1-month quota + - Displays the most relevant quota in status bar (prioritizes longest time window) + +- **Rich Tooltip Display**: Hover to see comprehensive usage stats with Markdown formatting: + - All token quota windows with progress bars and reset times + - MCP tool usage quotas (network search, web reader, zread) + - Today / 7-day / 30-day usage statistics + - Account plan level (auto-detected from API) + - Estimated token limits based on usage percentage + +- **Smart Status Bar**: Modern display with VS Code Codicon icons + - Example: `⚡ GLM: 21% · 45.8M / 220M Tokens` + - Warning background when usage ≥ 80% + +- **Auto-detected Plan Tier**: No manual configuration needed + - API automatically returns your account level (free/pro/enterprise) + - Displays plan tier in tooltip + +- **Precise Reset Times**: Shows exact time until quota resets + - Short periods: "in 2h 30m" + - Long periods: full date/time "2026-02-28 14:30" + +- **Debug Mode**: View raw API responses for troubleshooting + - Command: `Z.ai Usage Tracker: Debug: Show Raw API Responses` + - **Automatic Refresh**: Configurable refresh interval (default: 5 minutes) - + - **Secure API Key Storage**: Uses VS Code's encrypted SecretStorage ## Installation @@ -64,20 +81,6 @@ You need a Z.ai API key to use this extension: 4. Select "Update API Key" and paste your key 5. Your key is stored securely in VS Code's encrypted storage -### Plan Tier - -Set your GLM Coding Plan tier: - -```json -{ - "zaiUsage.planTier": "lite" // Options: "lite", "pro", "max" -} -``` - -- **Lite**: ~120 prompts every 5 hours -- **Pro**: ~600 prompts every 5 hours -- **Max**: ~2400 prompts every 5 hours - ### Refresh Interval Set how often to fetch usage data (in minutes): @@ -90,36 +93,43 @@ Set how often to fetch usage data (in minutes): Minimum: 1 minute, Default: 5 minutes +### Automatic Plan Detection + +Your GLM Coding Plan tier is automatically detected from the API - no manual configuration needed. The extension displays your account level (Lite/Pro/Max) in the tooltip. + ## Usage Once configured, the extension will: 1. Automatically activate when VS Code/Cursor starts -2. Display usage in the status bar: `✓ ⚡ 1% • 14.6K tokens` +2. Display usage in the status bar: `⚡ GLM: 21% · 45.8M / 220M Tokens` 3. Update periodically based on your refresh interval -4. Show detailed tooltip on hover -5. Provide quick actions on click +4. Show detailed tooltip with Markdown formatting on hover +5. Provide quick actions on click (refresh, configure settings) ## Commands - `zaiUsage.refresh`: Manually refresh usage data -- `zaiUsage.configure`: Open configuration menu -- `zaiUsage.showMenu`: Show quick actions menu +- `zaiUsage.configure`: Open configuration menu (API key and refresh interval) +- `zaiUsage.debug`: Debug - Show raw API responses in output channel ## Status Bar Display The status bar shows: -- **Connection Status**: ✓ (connected) or ⚠ (offline/error) -- **Icon**: Lightning bolt ⚡ -- **Percentage**: 5-hour token quota percentage (e.g., 1%) -- **Tokens**: Current tokens used (e.g., 14.6K tokens) +- **Icon**: Lightning bolt ⚡ (Codicon) +- **Label**: "GLM:" +- **Connection Status**: Empty (connected) or warning icon (error) +- **Percentage**: Usage percentage of the longest time window quota (e.g., 21%) +- **Tokens**: Actual tokens used / estimated limit (e.g., 45.8M / 220M Tokens) -Example: `✓ ⚡ 1% • 14.6K tokens` +Example: `⚡ GLM: 21% · 45.8M / 220M Tokens` Background color indicates usage level: - Normal background: < 80% quota used - Warning background: ≥ 80% quota used +The extension automatically selects the longest time window quota (Month > Week > Hour) for display in the status bar. + ## Development ```bash @@ -132,23 +142,27 @@ See [CLAUDE.md](./CLAUDE.md) for full development and publishing workflow. ## How It Works -1. **API Service**: Attempts to fetch usage data from Z.ai's API endpoints -2. **Fallback**: If no API endpoint is available, uses local tracking -3. **Configuration**: Stores API key and settings in VS Code configuration -4. **Display**: Updates status bar with current usage and progress +1. **API Service**: Fetches usage data from Z.ai's official monitor API endpoints +2. **Dynamic Quotas**: Retrieves all token quota windows (5-hour, 1-week, 1-month) and MCP tool limits +3. **Auto-detection**: Plan tier is automatically detected from API response +4. **Display**: Updates status bar with current usage, progress bars, and reset times 5. **Refresh**: Periodically fetches updated data (configurable interval) ## API Endpoints The extension uses the official Z.ai monitor API endpoints: -- `https://api.z.ai/api/monitor/usage/quota/limit` - 5-hour token quota -- `https://api.z.ai/api/monitor/usage/model-usage` - Model usage stats (with time range) +- `https://api.z.ai/api/monitor/usage/quota/limit` - Quota limits and usage percentages (returns multiple time windows) +- `https://api.z.ai/api/monitor/usage/model-usage` - Model usage stats (prompts + tokens) +- `https://api.z.ai/api/monitor/usage/tool-usage` - MCP tool usage stats + +See [API Documentation](./docs/API-DOCUMENTATION.md) for detailed API reference. ### Debugging Run the debug command to see raw API responses: - Command: `Z.ai Usage Tracker: Debug: Show Raw API Responses` +- Output appears in "Z.ai API Debug" output channel ## Privacy @@ -168,8 +182,14 @@ Run the debug command to see raw API responses: - Check your internet connection - Verify your API key is valid at [z.ai/manage-apikey](https://z.ai/manage-apikey/apikey-list) -- Try clicking "Retry" in the error message -- Run the debug command to see raw API responses +- Try clicking "Refresh Usage" +- Run the debug command: `Z.ai Usage Tracker: Debug: Show Raw API Responses` + +### Quota shows 0% or no data + +- This is normal for new accounts or after quota reset +- The 5-hour quota resets every 5 hours +- Wait a few minutes and refresh again ## License diff --git a/screenshot.jpg b/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4698f08d7c078323ad2580847815612fbd451d9 GIT binary patch literal 149586 zcmeFZby${5_b_@tL3ej|cS?7+NOyNjNvCvoBZwdpQi4c#gOVyp3n~I4Ajo;x;gQ9kz8cVX}x45oGR zcD9GXr!W}T+1lI_0HCPXcrR;9I~dFfgHb(nw4`CM2mm0W+WrJv`~-Vh`@-x50BKh@ zKM#9bJ1K<}Q8!@N1v1xd7~I-%`Sy z%+Dpn&(Frq4s-vH@{f%_sQwwa9@}3jjx>K6GZ6mRAGkkw|G>GH0)XHbm~WE*z**z~ zKuaV55H9_Jqb&vij0gZ|p8Tml_}B4b=jG)l%)xQ@?p=0!YfJWPhyE!4mEZ^E-vdAC zW53q-!*`T2);8wePF|GPPPKG(a`pD0^mH?~w5DYHa}fV8GyY`OPj;|sS=(59Si8Vf z>B6GS-o+L++%8u3UiPjol=d!vH^TpmY(Lp>4gMO}FaW3gJAiA-4q#5=0+0`502BuW zfEX3RT0lR>O$A98xSn};D7Jr%dl(FB|K<0_4>$={1$)}tQeLB_wR9*gy*+%cVc49w z{(%FK0So{aAOgq%8h{aC1GoVJ;1(bO$O1}$I-mpS115kaU8575C{dLfH)u- z$N+MIBA^_o0&0N;6qo{D0?WWEunFt|2fzvN4Fm!qfY3lVAR-V2hz`U8 z;syzV#6Yqj6_6H4A7loy1-XE{L4lxfP#h=~lnW{WRe|b3ZJ=(@FlZXI2wDT}f(}9F zUFlnr_dssOzW zwS>AugP`%yTD1thIIf55L6haO{ z4Z;hA8H7!QQ$!R*3Pf&1IYa|Q7sN2cOvFcsorp7t+lb$gFp=nxgpt&dtdRVWl90-g zo*_*lZ6bX`#zJO57Dd)Uc0dkA&PJ|9?nhohK0-l3p+*rx(L}LF2|>w5sY4k;SwlHP z#YSaDl}0r}^+ruZtwilYT|_-XLqnrSlRz^-^Fm8Rt3vBVdxLh0j)TsQu83}h9*mxc z-i$tj{t*KSgAPLy!vw=0BNL+$V-jN@6A6@w_L>~$On4h@bpjwMbwPB~6L&L%EAE(5M2t^;ly?ql2u z+ygvpJYGCqJYT##yytkU_z--0d_{aG{3QGa{8#wr1Y`t~1l9zx1hoV+1YZeB2qg%u z3GWj=A$&=APDDv0OXNtDLexU^nixvVOsq+Km$;C)pLm}Hm*f_SCCPn~29hOGFex*s z7HI%!8R;157cz1(c``S$9I{@reR6zq333PWbn;H}T?!luF$#N%bcz=g?3+Q< zb0_uAsvd{lJ-tzVVtsr4Rs#eBU4sgPFNU&)8HSrid`3}5uZ$UteT|1rh)tYKo||Hr znwvJ7!I|ALdt`QDu5Mmx{>4JkBH!Y`Qra@ha?eV_D&1<=TGTq#dfP_SCe>!gR@64l zcGphaF4Jz`UfMp_{oz0xvT(DgnUHV+fU431r-B{eB z+*aL%-80+|Jd`~uJVBnuo~>TEuw-h?o6$Scd(B78C(q~fuI}ANUo2l2-!VUCzgWL* ze>wjL0nh-;fSy3Az|g?8dy@A`fUM6a$U1kC}+&iOq@qe&6c;NE~NeX52-*W&B72S3-8e zRiaJeL=t~eVKRKOOY*A}@sx+DSgHQ0>uIWK&FPfs_tTFvOf!Zvc{7W$kh8qARB>RRUF2k4PUSRfDU&t9NURYNj5`JZ`OJt1Wqg z|0J#ssPnFSUvF0bszJG-r%|x6_9@-d{3e{H`^}(czvhD$yOz~f{nqI=rM8}Dx1Ke% zv$t1vP<7-z$9taCiQE~{dG*5o#g{I(uKjM??)4tip5

-nl-_zKMS2{-FW6f!;yM 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�|OJDC+O6@%Q~S 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 +} + export interface UsageData { - // 5-hour rolling window quota (token-based) - current5HourTokens: number; // Tokens used in 5-hour window - limit5HourTokens: number; // Token limit (e.g., 800M) - percentage5Hour: number; // Percentage used - quotaResetTime?: Date; + // Dynamic token quota windows from API + tokenQuotas: TokenQuota[]; // All TOKENS_LIMIT items returned by API + // MCP tool limits from API + timeLimits: TimeLimit[]; // All TIME_LIMIT items returned by API + // Today stats + todayPrompts: number; + todayTokens: number; // 7-day stats sevenDayPrompts: number; sevenDayTokens: number; @@ -13,6 +45,8 @@ export interface UsageData { // Metadata lastUpdated: Date; connectionStatus: 'connected' | 'disconnected' | 'error'; + // Plan level from quota limit API + planLevel?: string; // e.g., "free", "pro", "enterprise" } export interface FetchResult { @@ -23,13 +57,18 @@ export interface FetchResult { interface QuotaLimitResponse { limits?: Array<{ - type: string; + type: 'TOKENS_LIMIT' | 'TIME_LIMIT'; + unit: number; // 3=hour(s), 5=month(s), 6=week(s) + number: number; // Quantity of the time unit percentage: number; - currentValue?: number; + nextResetTime?: number; + // TIME_LIMIT specific fields usage?: number; - limit?: number; - usageDetails?: any; + currentValue?: number; + remaining?: number; + usageDetails?: any[]; }>; + level?: string; } interface ModelUsageResponse { @@ -42,12 +81,10 @@ interface ModelUsageResponse { export class ZaiService { private apiKey: string; - private planLimit: number; private baseUrl = 'https://api.z.ai'; - constructor(apiKey: string, planLimit: number) { + constructor(apiKey: string) { this.apiKey = apiKey; - this.planLimit = planLimit; } /** @@ -64,58 +101,122 @@ export class ZaiService { try { const now = new Date(); - const formatDateTime = (date: Date): string => { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; - }; - // Time windows for different stats const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999); + const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0); const start7d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7, 0, 0, 0, 0); const start30d = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate(), 0, 0, 0, 0); - const queryParams7d = `?startTime=${encodeURIComponent(formatDateTime(start7d))}&endTime=${encodeURIComponent(formatDateTime(end))}`; - const queryParams30d = `?startTime=${encodeURIComponent(formatDateTime(start30d))}&endTime=${encodeURIComponent(formatDateTime(end))}`; + const queryParamsToday = `?startTime=${encodeURIComponent(this.formatDateTime(startToday))}&endTime=${encodeURIComponent(this.formatDateTime(end))}`; + const queryParams7d = `?startTime=${encodeURIComponent(this.formatDateTime(start7d))}&endTime=${encodeURIComponent(this.formatDateTime(end))}`; + const queryParams30d = `?startTime=${encodeURIComponent(this.formatDateTime(start30d))}&endTime=${encodeURIComponent(this.formatDateTime(end))}`; // Fetch all endpoints in parallel - const [quotaLimitResult, modelUsage7dResult, modelUsage30dResult] = await Promise.allSettled([ + const [quotaLimitResult, modelUsageTodayResult, modelUsage7dResult, modelUsage30dResult] = await Promise.allSettled([ this.fetchEndpoint(`${this.baseUrl}/api/monitor/usage/quota/limit`, 'Quota limit'), + this.fetchEndpoint(`${this.baseUrl}/api/monitor/usage/model-usage${queryParamsToday}`, 'Today usage'), this.fetchEndpoint(`${this.baseUrl}/api/monitor/usage/model-usage${queryParams7d}`, '7-day usage'), this.fetchEndpoint(`${this.baseUrl}/api/monitor/usage/model-usage${queryParams30d}`, '30-day usage') ]); // Initialize values - let current5HourTokens = 0; - let limit5HourTokens = 800000000; // 800M default - let percentage5Hour = 0; + const tokenQuotas: TokenQuota[] = []; + const timeLimits: TimeLimit[] = []; + let todayPrompts = 0; + let todayTokens = 0; let sevenDayPrompts = 0; let sevenDayTokens = 0; let thirtyDayPrompts = 0; let thirtyDayTokens = 0; - // Process quota limit response (5-hour token quota) - if (quotaLimitResult.status === 'fulfilled' && quotaLimitResult.value) { - const quotaData = quotaLimitResult.value as QuotaLimitResponse; - if (quotaData.limits) { - for (const limit of quotaData.limits) { + // Process quota limit response - collect all TOKENS_LIMIT and TIME_LIMIT windows dynamically + const quotaLimitResponse = quotaLimitResult.status === 'fulfilled' ? quotaLimitResult.value as QuotaLimitResponse : null; + let planLevel: string | undefined; + + if (quotaLimitResponse) { + planLevel = quotaLimitResponse.level; + if (quotaLimitResponse.limits) { + for (const limit of quotaLimitResponse.limits) { if (limit.type === 'TOKENS_LIMIT') { - percentage5Hour = limit.percentage || 0; - if (limit.currentValue !== undefined) { - current5HourTokens = limit.currentValue; - } - if (limit.usage !== undefined) { - limit5HourTokens = limit.usage; - } + tokenQuotas.push({ + windowName: this.formatWindowName(limit.unit, limit.number), + unit: limit.unit, + number: limit.number, + percentage: limit.percentage || 0, + nextResetTime: limit.nextResetTime, + actualTokens: undefined // Will be filled below + }); + } else if (limit.type === 'TIME_LIMIT') { + timeLimits.push({ + windowName: this.formatWindowName(limit.unit, limit.number) + ' MCP Tools', + unit: limit.unit, + number: limit.number, + percentage: limit.percentage || 0, + usage: limit.usage || 0, + currentValue: limit.currentValue || 0, + remaining: limit.remaining || 0, + nextResetTime: limit.nextResetTime, + usageDetails: limit.usageDetails + }); } } } } + // Fetch actual usage for each token quota window based on its reset time + const quotaUsageRequests = tokenQuotas.map(async (quota) => { + if (!quota.nextResetTime || quota.percentage === 0) { + return null; + } + + try { + // Calculate the start time of this quota window + const resetDate = new Date(quota.nextResetTime); + let startDate: Date; + + // Calculate window start based on unit and number + if (quota.unit === 3) { + // Hours + startDate = new Date(resetDate.getTime() - quota.number * 3600000); + } else if (quota.unit === 6) { + // Weeks + startDate = new Date(resetDate.getTime() - quota.number * 7 * 86400000); + } else if (quota.unit === 5) { + // Months (approximate as 30 days) + startDate = new Date(resetDate.getTime() - quota.number * 30 * 86400000); + } else { + return null; + } + + const queryParams = `?startTime=${encodeURIComponent(this.formatDateTime(startDate))}&endTime=${encodeURIComponent(this.formatDateTime(now))}`; + const result = await this.fetchEndpoint( + `${this.baseUrl}/api/monitor/usage/model-usage${queryParams}`, + `${quota.windowName} usage` + ); + + if (result && (result as ModelUsageResponse).totalUsage) { + const modelData = result as ModelUsageResponse; + quota.actualTokens = modelData.totalUsage?.totalTokensUsage || 0; + } + } catch (error) { + console.error(`Failed to fetch usage for ${quota.windowName}:`, error); + } + + return null; + }); + + // Wait for all quota usage requests to complete + await Promise.allSettled(quotaUsageRequests); + + // Process today model usage + if (modelUsageTodayResult.status === 'fulfilled' && modelUsageTodayResult.value) { + const modelData = modelUsageTodayResult.value as ModelUsageResponse; + if (modelData.totalUsage) { + todayPrompts = modelData.totalUsage.totalModelCallCount || 0; + todayTokens = modelData.totalUsage.totalTokensUsage || 0; + } + } + // Process 7-day model usage if (modelUsage7dResult.status === 'fulfilled' && modelUsage7dResult.value) { const modelData = modelUsage7dResult.value as ModelUsageResponse; @@ -137,15 +238,17 @@ export class ZaiService { return { success: true, data: { - current5HourTokens, - limit5HourTokens, - percentage5Hour, + tokenQuotas, + timeLimits, + todayPrompts, + todayTokens, sevenDayPrompts, sevenDayTokens, thirtyDayPrompts, thirtyDayTokens, lastUpdated: new Date(), - connectionStatus: 'connected' + connectionStatus: 'connected', + planLevel } }; } catch (error) { @@ -158,6 +261,38 @@ export class ZaiService { } } + /** + * Format date to API datetime string format + * @param date Date to format + * @returns Formatted string like "2024-02-21 14:30:45" + */ + private formatDateTime(date: Date): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + } + + /** + * Format a human-readable window name from unit and number + * @param unit 3=hour(s), 5=month(s), 6=week(s) + * @param number Quantity of the time unit + * @returns Formatted string like "5-Hour", "1-Week", "1-Month" + */ + private formatWindowName(unit: number, number: number): string { + const unitNames: { [key: number]: string } = { + 3: 'Hour', + 5: 'Month', + 6: 'Week' + }; + const unitName = unitNames[unit] || 'Unknown'; + const plural = number > 1 ? 's' : ''; + return `${number}-${unitName}${plural}`; + } + /** * Fetch data from a specific endpoint * Tries both Bearer and direct token formats @@ -210,13 +345,6 @@ export class ZaiService { this.apiKey = apiKey; } - /** - * Update plan limit - */ - updatePlanLimit(planLimit: number): void { - this.planLimit = planLimit; - } - /** * Debug: Fetch and return raw API responses to see what data is available */ @@ -231,18 +359,8 @@ export class ZaiService { const start7d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7, 0, 0, 0, 0); const end7d = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999); - const formatDateTime = (date: Date): string => { - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; - }; - - const queryParams24h = `?startTime=${encodeURIComponent(formatDateTime(start24h))}&endTime=${encodeURIComponent(formatDateTime(end24h))}`; - const queryParams7d = `?startTime=${encodeURIComponent(formatDateTime(start7d))}&endTime=${encodeURIComponent(formatDateTime(end7d))}`; + const queryParams24h = `?startTime=${encodeURIComponent(this.formatDateTime(start24h))}&endTime=${encodeURIComponent(this.formatDateTime(end24h))}`; + const queryParams7d = `?startTime=${encodeURIComponent(this.formatDateTime(start7d))}&endTime=${encodeURIComponent(this.formatDateTime(end7d))}`; const results = { quotaLimit: null as any, diff --git a/src/config/configuration.ts b/src/config/configuration.ts index 1a2abac..775fd64 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -3,31 +3,19 @@ import * as vscode from 'vscode'; export interface ZaiConfiguration { /** @deprecated API key is now stored in SecretStorage. This field is only for migration. */ apiKey: string; - planTier: 'lite' | 'pro' | 'max'; refreshInterval: number; } -export const PLAN_LIMITS: Record = { - lite: 120, - pro: 600, - max: 2400 -}; - export function getConfiguration(): ZaiConfiguration { const config = vscode.workspace.getConfiguration('zaiUsage'); return { // Note: apiKey is deprecated - only read for migration from old versions // New keys are stored in VS Code SecretStorage apiKey: config.get('apiKey', ''), - planTier: config.get<'lite' | 'pro' | 'max'>('planTier', 'lite'), refreshInterval: config.get('refreshInterval', 5) }; } -export function getPlanLimit(tier: 'lite' | 'pro' | 'max'): number { - return PLAN_LIMITS[tier] || PLAN_LIMITS.lite; -} - export async function updateConfiguration(key: string, value: any): Promise { const config = vscode.workspace.getConfiguration('zaiUsage'); await config.update(key, value, vscode.ConfigurationTarget.Global); diff --git a/src/extension.ts b/src/extension.ts index fd76aa5..bfe502e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; import { ZaiService, UsageData } from './api/zaiService'; import { UsageIndicator } from './statusBar/usageIndicator'; -import { getConfiguration, getPlanLimit } from './config/configuration'; +import { getConfiguration } from './config/configuration'; let zaiService: ZaiService | null = null; let usageIndicator: UsageIndicator | null = null; @@ -13,7 +13,7 @@ export function activate(context: vscode.ExtensionContext) { // Create status bar indicator immediately (always visible) if (!usageIndicator) { - zaiService = new ZaiService('', getPlanLimit('lite')); + zaiService = new ZaiService(''); usageIndicator = new UsageIndicator(zaiService); usageIndicator.showNotConfigured(); } @@ -150,14 +150,11 @@ async function initializeService(context: vscode.ExtensionContext, apiKey?: stri return; } - const planLimit = getPlanLimit(config.planTier); - // Update existing service or create new one if (zaiService) { zaiService.updateApiKey(effectiveApiKey); - zaiService.updatePlanLimit(planLimit); } else { - zaiService = new ZaiService(effectiveApiKey, planLimit); + zaiService = new ZaiService(effectiveApiKey); } // Update indicator @@ -257,11 +254,6 @@ async function configureSettings(context: vscode.ExtensionContext): Promise { - if (selection === 'Configure Plan Tier') { - await promptPlanTier(context); - } else if (selection === 'Test Connection') { + if (selection === 'Test Connection') { await initializeService(context); refreshUsage(); } @@ -339,25 +328,6 @@ async function configureSettings(context: vscode.ExtensionContext): Promise { } } -/** - * Prompt user to select plan tier - */ -async function promptPlanTier(context: vscode.ExtensionContext): Promise { - const config = getConfiguration(); - - const tier = await vscode.window.showQuickPick([ - { label: 'Lite', description: '~120 prompts every 5 hours' }, - { label: 'Pro', description: '~600 prompts every 5 hours' }, - { label: 'Max', description: '~2400 prompts every 5 hours' } - ], { - placeHolder: 'Select your GLM Coding Plan tier', - canPickMany: false - }); - - if (tier) { - await vscode.workspace.getConfiguration('zaiUsage').update( - 'planTier', - tier.label.toLowerCase(), - vscode.ConfigurationTarget.Global - ); - vscode.window.showWarningMessage(`✓ Plan tier set to ${tier.label}!`); - await initializeService(context); - refreshUsage(); - } -} - export function deactivate() { console.log('Z.ai Usage Tracker extension is now deactivated'); diff --git a/src/statusBar/usageIndicator.ts b/src/statusBar/usageIndicator.ts index 67e88dc..b4b4bd6 100644 --- a/src/statusBar/usageIndicator.ts +++ b/src/statusBar/usageIndicator.ts @@ -23,16 +23,40 @@ export class UsageIndicator { this.currentError = null; // Determine connection status icon - const connectionIcon = usage.connectionStatus === 'connected' ? '✓' : '⚠'; + const connectionIcon = usage.connectionStatus === 'connected' ? '' : '$(warning)'; + + // Find the quota with the longest time window to display in status bar + // Only consider token quotas (TOKENS_LIMIT type), not tool limits (TIME_LIMIT) + // Priority: Month (5) > Week (6) > Hour (3), then compare number + const tokenQuotas = usage.tokenQuotas; + let displayQuota = tokenQuotas.length > 0 ? tokenQuotas[0] : null; + if (tokenQuotas.length > 1) { + displayQuota = tokenQuotas.reduce((max, quota) => { + const maxPriority = this.getTimeWindowPriority(max.unit, max.number); + const quotaPriority = this.getTimeWindowPriority(quota.unit, quota.number); + return quotaPriority > maxPriority ? quota : max; + }); + } + + // Format the display text + let text: string; + if (displayQuota) { + let usageInfo = ''; + if (displayQuota.actualTokens && displayQuota.percentage > 0) { + const estimatedLimit = Math.round(displayQuota.actualTokens / (displayQuota.percentage / 100)); + usageInfo = ` · ${this.formatNumber(displayQuota.actualTokens)} / ${this.formatNumber(estimatedLimit)} Tokens`; + } + text = `$(zap) GLM: ${connectionIcon} ${displayQuota.percentage}%${usageInfo}`; + } else { + text = `$(zap) GLM: ${connectionIcon} No quota data`; + } - // Format the display text: show 5-hour token quota percentage and current tokens - const tokenDisplay = this.formatNumber(usage.current5HourTokens); - const text = `${connectionIcon} $(zap) ${usage.percentage5Hour}% • ${tokenDisplay} tokens`; this.statusBarItem.text = text; this.statusBarItem.tooltip = this.getTooltip(); - // Set background color based on usage - if (usage.percentage5Hour >= 80) { + // Set background color based on highest usage + const maxPercentage = displayQuota?.percentage || 0; + if (maxPercentage >= 80) { this.statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground'); } else { this.statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.prominentBackground'); @@ -45,7 +69,15 @@ export class UsageIndicator { showError(error: string): void { this.currentError = error; this.statusBarItem.text = `$(error) Error`; - this.statusBarItem.tooltip = `Error fetching Z.ai usage: ${error}\nClick to refresh`; + + const md = new vscode.MarkdownString(); + md.isTrusted = true; + md.supportThemeIcons = true; // Enable Codicon icons + md.appendMarkdown('## $(error) Error Fetching Usage\n\n'); + md.appendMarkdown(`**Error**: \`${error}\`\n\n`); + md.appendMarkdown('[$(refresh) Click to Refresh](command:zaiUsage.refresh)'); + + this.statusBarItem.tooltip = md; this.statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground'); } @@ -76,11 +108,21 @@ export class UsageIndicator { /** * Get simple tooltip for status bar hover */ - private getSimpleTooltip(): string { - if (!this.currentUsage) { + private getSimpleTooltip(): vscode.MarkdownString | string { + if (!this.currentUsage || this.currentUsage.tokenQuotas.length === 0) { return 'Click to view Z.ai usage details'; } - return `Z.ai Usage: ${this.currentUsage.percentage5Hour}% of 5-hour quota\nClick to view details`; + const md = new vscode.MarkdownString(); + md.isTrusted = true; + md.supportHtml = true; + md.supportThemeIcons = true; // Enable Codicon icons + + const quotaSummary = this.currentUsage.tokenQuotas + .map(q => `**${q.windowName}**: \`${q.percentage}%\``) + .join(' • '); + md.appendMarkdown(`$(zap) **Z.ai Usage**: ${quotaSummary}\n\n`); + md.appendMarkdown('*Click to view details*'); + return md; } /** @@ -93,42 +135,132 @@ export class UsageIndicator { /** * Get tooltip with detailed information */ - private getTooltip(): string { + private getTooltip(): vscode.MarkdownString | string { if (!this.currentUsage) { return 'Click for options'; } const lastUpdated = this.formatDate(this.currentUsage.lastUpdated); + const md = new vscode.MarkdownString(); + md.isTrusted = true; + md.supportHtml = true; + md.supportThemeIcons = true; // Enable Codicon icons - let tooltip = '⚡ Z.ai GLM Usage\n'; - tooltip += '─────────────────\n\n'; - - // 5-Hour Token Quota - tooltip += `📊 5-Hour Quota (${this.currentUsage.percentage5Hour}%)\n`; - tooltip += ` ${this.formatNumber(this.currentUsage.current5HourTokens)} / ${this.formatNumber(this.currentUsage.limit5HourTokens)} tokens\n`; - tooltip += ` ${this.getProgressBar(this.currentUsage.percentage5Hour)}\n\n`; - - // 7-Day Stats - tooltip += `📅 Last 7 Days\n`; - tooltip += ` ${this.currentUsage.sevenDayPrompts} prompts • ${this.formatNumber(this.currentUsage.sevenDayTokens)} tokens\n\n`; - - // 30-Day Stats (All Time) - tooltip += `📆 Last 30 Days\n`; - tooltip += ` ${this.currentUsage.thirtyDayPrompts} prompts • ${this.formatNumber(this.currentUsage.thirtyDayTokens)} tokens\n\n`; + // Header + md.appendMarkdown('#### $(zap) Z.AI GLM Coding Plan Usage\n'); // Connection status + let statusIcon = ''; + let statusText = ''; if (this.currentUsage.connectionStatus === 'connected') { - tooltip += `✓ Connected`; + statusIcon = '$(check)'; + statusText = 'Connected'; } else if (this.currentUsage.connectionStatus === 'disconnected') { - tooltip += `⚠ Offline`; + statusIcon = '$(warning)'; + statusText = 'Offline'; } else { - tooltip += `✗ Error`; + statusIcon = '$(error)'; + statusText = 'Error'; } - tooltip += ` • Updated ${lastUpdated}\n\n`; - tooltip += 'Click for more options'; + // Build status line with plan level + let statusLine = `${statusIcon} *${statusText}*   $(clock) Updated *${lastUpdated}*`; + if (this.currentUsage.planLevel) { + const planLevelDisplay = `GLM Coding Plan **${this.currentUsage.planLevel.charAt(0).toUpperCase() + this.currentUsage.planLevel.slice(1)}**`; + statusLine += `   $(star) *${planLevelDisplay}*`; + } + md.appendMarkdown(`${statusLine}\n\n`); + + md.appendMarkdown('---\n'); + md.appendMarkdown('$(graph) *Plan Quotas*\n\n'); + md.appendMarkdown('---\n'); + + // Token Quota Windows (dynamic - display all from API) + if (this.currentUsage.tokenQuotas.length > 0) { + + // Build compact Markdown table (4 columns, no header) + md.appendMarkdown('| | | | |\n'); + md.appendMarkdown('|:--------|------:|:--------:|:----------|\n'); + + for (const quota of this.currentUsage.tokenQuotas) { + const resetInfo = quota.nextResetTime + ? `Reset ${this.formatResetTime(quota.nextResetTime)}` + : 'No reset time'; + const progressBar = this.getProgressBar(quota.percentage); + const quotaLabel = `${quota.windowName}`; + const percentageText = `${quota.percentage}%`; + + md.appendMarkdown(`| ${quotaLabel} | ${percentageText} | ${progressBar} | *${resetInfo}* |\n`); + } + + // Show estimated token limits based on usage data + const estimatedLimits = this.calculateEstimatedLimits(); + if (estimatedLimits) { + md.appendMarkdown('\n'); + md.appendMarkdown(`$(info) *Estimated limits: ${estimatedLimits}*\n\n`); + md.appendMarkdown('$(warning) *Note: Estimated based on usage % and used tokens, not official limits*\n\n'); + } + } else { + md.appendMarkdown('$(info) *No Quota Data Available*\n\n'); + } - return tooltip; + md.appendMarkdown('---\n\n'); + + // Usage Stats Table + md.appendMarkdown('$(graph) *Usage Statistics*\n\n'); + md.appendMarkdown('---\n'); + md.appendMarkdown('| | | | | |\n'); + md.appendMarkdown('|:-------|--------:|:--------:|--------:|:--------:|\n'); + md.appendMarkdown(`| $(calendar) Today  | **${this.currentUsage.todayPrompts}** | Prompts  | **${this.formatNumber(this.currentUsage.todayTokens)}** | Tokens |\n`); + md.appendMarkdown(`| $(calendar) Weeks  | **${this.currentUsage.sevenDayPrompts}** | Prompts  | **${this.formatNumber(this.currentUsage.sevenDayTokens)}** | Tokens |\n`); + md.appendMarkdown(`| $(calendar) Months  | **${this.currentUsage.thirtyDayPrompts}** | Prompts  | **${this.formatNumber(this.currentUsage.thirtyDayTokens)}** | Tokens |\n`); + md.appendMarkdown('\n'); + md.appendMarkdown('$(info) *Prompts = Model invocations (each user prompt may trigger 10-20+ calls)*\n\n'); + + // MCP Tool Limits + if (this.currentUsage.timeLimits.length > 0) { + md.appendMarkdown('---\n'); + md.appendMarkdown('$(tools) *MCP Tool Quotas*\n\n'); + md.appendMarkdown('---\n'); + md.appendMarkdown('| | | |\n'); + md.appendMarkdown('|------:|:--------:|:----------:|\n'); + + for (const timeLimit of this.currentUsage.timeLimits) { + const resetInfo = timeLimit.nextResetTime + ? `Reset ${this.formatResetTime(timeLimit.nextResetTime)}` + : 'No reset time'; + const progressBar = this.getProgressBar(timeLimit.percentage); + const usageText = `${timeLimit.currentValue}/${timeLimit.usage}`; + + md.appendMarkdown(`| ${usageText} | ${progressBar} | *${resetInfo}* |\n`); + } + + } + + md.appendMarkdown('---\n\n'); + + // Action links + md.appendMarkdown('[$(refresh) Refresh](command:zaiUsage.refresh "Fetch latest usage data")  '); + md.appendMarkdown('[$(gear) Settings](command:zaiUsage.configure "Configure API key and settings")'); + + return md; + } + + /** + * Get priority for time window comparison + * Higher priority = longer time period + * @param unit 3=hour(s), 5=month(s), 6=week(s) + * @param number Quantity of the time unit + * @returns Priority value (higher = longer period) + */ + private getTimeWindowPriority(unit: number, number: number): number { + // Priority: Month > Week > Hour + const unitPriorities: { [key: number]: number } = { + 5: 100000, // Month + 6: 10000, // Week + 3: 1000 // Hour + }; + return (unitPriorities[unit] || 0) + number; } /** @@ -145,7 +277,7 @@ export class UsageIndicator { } /** - * Format date for display + * Format date for display (for past times) */ private formatDate(date: Date): string { const now = new Date(); @@ -163,47 +295,87 @@ export class UsageIndicator { } } + /** + * Format reset time for display (for future times) + * Shows precise time with minutes for quota windows (e.g., 5-hour, 7-day limits) + */ + private formatResetTime(timestamp: number): string { + const resetDate = new Date(timestamp); + const now = new Date(); + const diffMs = resetDate.getTime() - now.getTime(); + + // Calculate time components + const diffMins = Math.floor(diffMs / 60000); + const diffHours = Math.floor(diffMs / 3600000); + const diffDays = Math.floor(diffMs / 86400000); + + // Remaining minutes after removing full hours + const remainingMins = diffMins % 60; + // Remaining hours after removing full days + const remainingHours = diffHours % 24; + + if (diffMins < 1) { + return 'Soon'; + } else if (diffMins < 60) { + // Less than 1 hour: show minutes only + return `in ${diffMins}m`; + } else if (diffHours < 24) { + // Less than 1 day: show hours + minutes + return `in ${diffHours}h ${remainingMins}m`; + } else if (diffDays < 7) { + // Less than 1 week: show days + hours + minutes + return `in ${diffDays}d ${remainingHours}h ${remainingMins}m`; + } else { + // For longer periods, show the actual date and time in numeric format + const year = resetDate.getFullYear(); + const month = String(resetDate.getMonth() + 1).padStart(2, '0'); + const day = String(resetDate.getDate()).padStart(2, '0'); + const hours = String(resetDate.getHours()).padStart(2, '0'); + const minutes = String(resetDate.getMinutes()).padStart(2, '0'); + return `${year}-${month}-${day} ${hours}:${minutes}`; + } + } + /** * Get text progress bar */ private getProgressBar(percentage: number): string { const totalBars = 20; const filledBars = Math.round((percentage / 100) * totalBars); - return '█'.repeat(filledBars) + '░'.repeat(totalBars - filledBars); + return '' + '█'.repeat(filledBars) + '░'.repeat(totalBars - filledBars) + ''; } /** - * Show quick pick menu with stats and actions + * Calculate estimated token limits based on usage percentage and actual usage */ - async showQuickPick(): Promise { - const options: vscode.QuickPickItem[] = []; - - // Add stats section if we have usage data - if (this.currentUsage) { - options.push({ - label: `$(graph) 5-Hour Quota: ${this.currentUsage.percentage5Hour}%`, - description: `${this.formatNumber(this.currentUsage.current5HourTokens)} / ${this.formatNumber(this.currentUsage.limit5HourTokens)} tokens`, - kind: vscode.QuickPickItemKind.Default - }); + private calculateEstimatedLimits(): string | null { + if (!this.currentUsage || this.currentUsage.tokenQuotas.length === 0) { + return null; + } - options.push({ - label: `$(calendar) Last 7 Days`, - description: `${this.currentUsage.sevenDayPrompts} prompts • ${this.formatNumber(this.currentUsage.sevenDayTokens)} tokens` - }); + const estimates: string[] = []; - options.push({ - label: `$(history) Last 30 Days`, - description: `${this.currentUsage.thirtyDayPrompts} prompts • ${this.formatNumber(this.currentUsage.thirtyDayTokens)} tokens` - }); + for (const quota of this.currentUsage.tokenQuotas) { + // Skip if percentage is 0 to avoid division by zero, or if we don't have actual tokens + if (quota.percentage === 0 || !quota.actualTokens || quota.actualTokens === 0) { + continue; + } - // Separator - options.push({ - label: '', - kind: vscode.QuickPickItemKind.Separator - }); + // Calculate estimated total limit: actual / (percentage / 100) + const estimatedLimit = Math.round(quota.actualTokens / (quota.percentage / 100)); + estimates.push(`${quota.windowName}: ${this.formatNumber(quota.actualTokens)}/${this.formatNumber(estimatedLimit)}`); } - // Action items + return estimates.length > 0 ? estimates.join(' • ') : null; + } + + /** + * Show quick pick menu with stats and actions + */ + async showQuickPick(): Promise { + const options: vscode.QuickPickItem[] = []; + + // Action items only - detailed stats are in the tooltip options.push({ label: '$(refresh) Refresh Usage', description: 'Fetch latest usage data' @@ -211,11 +383,11 @@ export class UsageIndicator { options.push({ label: '$(settings-gear) Configure Settings', - description: 'Update API key and plan tier' + description: 'Update API key and refresh interval' }); const selected = await vscode.window.showQuickPick(options, { - placeHolder: 'Z.ai Usage Tracker' + placeHolder: 'Z.ai Usage Tracker - Select an action' }); if (selected?.label.includes('Refresh')) {