opencode-usage-plugin 0.0.2-dev6 → 0.0.2-dev7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +156 -159
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -76,147 +76,6 @@ var init_logger = __esm({
|
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
// src/providers/common/files.ts
|
|
80
|
-
import { readFile } from "node:fs/promises";
|
|
81
|
-
import { homedir } from "node:os";
|
|
82
|
-
import { join } from "node:path";
|
|
83
|
-
var xdgDataHome, xdgConfigHome, xdgCacheHome, AUTH_PATHS, readJson, loadOpenCodeAuth;
|
|
84
|
-
var init_files = __esm({
|
|
85
|
-
"src/providers/common/files.ts"() {
|
|
86
|
-
"use strict";
|
|
87
|
-
xdgDataHome = () => process.env.XDG_DATA_HOME ?? join(homedir(), ".local", "share");
|
|
88
|
-
xdgConfigHome = () => process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
|
|
89
|
-
xdgCacheHome = () => process.env.XDG_CACHE_HOME ?? join(homedir(), ".cache");
|
|
90
|
-
AUTH_PATHS = {
|
|
91
|
-
opencode: () => join(xdgDataHome(), "opencode", "auth.json"),
|
|
92
|
-
openaiPlugin: () => join(homedir(), ".opencode", "auth", "openai.json"),
|
|
93
|
-
antigravityConfig: () => join(xdgConfigHome(), "opencode", "antigravity-accounts.json"),
|
|
94
|
-
antigravityData: () => join(xdgDataHome(), "opencode", "antigravity-accounts.json")
|
|
95
|
-
};
|
|
96
|
-
readJson = async (filePath, logger) => {
|
|
97
|
-
try {
|
|
98
|
-
const content = await readFile(filePath, "utf-8");
|
|
99
|
-
return JSON.parse(content);
|
|
100
|
-
} catch (error) {
|
|
101
|
-
if (logger) {
|
|
102
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
-
await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });
|
|
104
|
-
}
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
loadOpenCodeAuth = async (logger) => {
|
|
109
|
-
return readJson(AUTH_PATHS.opencode(), logger);
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// src/cache/file.ts
|
|
115
|
-
import { mkdir, readFile as readFile2, rename, unlink, writeFile } from "node:fs/promises";
|
|
116
|
-
var CACHE_DIR, CACHE_PATH, TMP_PATH, ensureCacheDir, readCache, writeCache;
|
|
117
|
-
var init_file = __esm({
|
|
118
|
-
"src/cache/file.ts"() {
|
|
119
|
-
"use strict";
|
|
120
|
-
init_files();
|
|
121
|
-
CACHE_DIR = () => `${xdgCacheHome()}/opencode/opencode-usage-plugin`;
|
|
122
|
-
CACHE_PATH = () => `${CACHE_DIR()}/usage.json`;
|
|
123
|
-
TMP_PATH = () => `${CACHE_PATH()}.tmp`;
|
|
124
|
-
ensureCacheDir = async () => {
|
|
125
|
-
try {
|
|
126
|
-
await mkdir(CACHE_DIR(), { recursive: true });
|
|
127
|
-
} catch (error) {
|
|
128
|
-
if (error instanceof Error && "code" in error && error.code !== "EEXIST") {
|
|
129
|
-
throw error;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
readCache = async (logger) => {
|
|
134
|
-
try {
|
|
135
|
-
const content = await readFile2(CACHE_PATH(), "utf-8");
|
|
136
|
-
const parsed = JSON.parse(content);
|
|
137
|
-
if (typeof parsed === "object" && parsed !== null && "schema_version" in parsed && "updated_at" in parsed && "refresh_interval_seconds" in parsed && "providers" in parsed) {
|
|
138
|
-
return parsed;
|
|
139
|
-
}
|
|
140
|
-
await logger?.warn("Invalid cache schema, returning null");
|
|
141
|
-
return null;
|
|
142
|
-
} catch (error) {
|
|
143
|
-
if (logger) {
|
|
144
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
145
|
-
await logger.debug("Cache file not found or invalid", { error: message });
|
|
146
|
-
}
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
writeCache = async (cache, logger) => {
|
|
151
|
-
try {
|
|
152
|
-
await ensureCacheDir();
|
|
153
|
-
const content = JSON.stringify(cache, null, 2);
|
|
154
|
-
await writeFile(TMP_PATH(), content, "utf-8");
|
|
155
|
-
await rename(TMP_PATH(), CACHE_PATH());
|
|
156
|
-
await logger?.debug("Cache written successfully", { path: CACHE_PATH() });
|
|
157
|
-
} catch (error) {
|
|
158
|
-
await logger?.error("Failed to write cache", {
|
|
159
|
-
error: error instanceof Error ? error.message : String(error)
|
|
160
|
-
});
|
|
161
|
-
throw error;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// src/cache/types.ts
|
|
168
|
-
var SCHEMA_VERSION, REFRESH_INTERVAL_SECONDS, STALE_THRESHOLD_MULTIPLIER;
|
|
169
|
-
var init_types = __esm({
|
|
170
|
-
"src/cache/types.ts"() {
|
|
171
|
-
"use strict";
|
|
172
|
-
SCHEMA_VERSION = 1;
|
|
173
|
-
REFRESH_INTERVAL_SECONDS = 300;
|
|
174
|
-
STALE_THRESHOLD_MULTIPLIER = 2;
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
// src/cache/reader.ts
|
|
179
|
-
var reader_exports = {};
|
|
180
|
-
__export(reader_exports, {
|
|
181
|
-
loadCacheForDisplay: () => loadCacheForDisplay
|
|
182
|
-
});
|
|
183
|
-
var loadCacheForDisplay;
|
|
184
|
-
var init_reader = __esm({
|
|
185
|
-
"src/cache/reader.ts"() {
|
|
186
|
-
"use strict";
|
|
187
|
-
init_file();
|
|
188
|
-
init_types();
|
|
189
|
-
loadCacheForDisplay = async (logger) => {
|
|
190
|
-
const cache = await readCache(logger);
|
|
191
|
-
if (!cache) {
|
|
192
|
-
await logger.warn("No cache available");
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
const updatedAt = new Date(cache.updated_at);
|
|
196
|
-
const now = /* @__PURE__ */ new Date();
|
|
197
|
-
const staleThresholdMs = REFRESH_INTERVAL_SECONDS * 1e3 * STALE_THRESHOLD_MULTIPLIER;
|
|
198
|
-
const isStale = now.getTime() - updatedAt.getTime() > staleThresholdMs;
|
|
199
|
-
if (isStale) {
|
|
200
|
-
await logger.debug("Cache is stale", {
|
|
201
|
-
updatedAt: cache.updated_at,
|
|
202
|
-
staleThresholdSeconds: REFRESH_INTERVAL_SECONDS * STALE_THRESHOLD_MULTIPLIER
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
const configuredProviders = {};
|
|
206
|
-
for (const [providerId, entry] of Object.entries(cache.providers)) {
|
|
207
|
-
if (entry.configured) {
|
|
208
|
-
configuredProviders[providerId] = entry;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return {
|
|
212
|
-
providers: configuredProviders,
|
|
213
|
-
updatedAt: cache.updated_at,
|
|
214
|
-
isStale
|
|
215
|
-
};
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
|
|
220
79
|
// src/providers/common/time.ts
|
|
221
80
|
var calculateResetAfterSeconds, formatDuration, formatResetAt;
|
|
222
81
|
var init_time = __esm({
|
|
@@ -264,6 +123,41 @@ var init_time = __esm({
|
|
|
264
123
|
}
|
|
265
124
|
});
|
|
266
125
|
|
|
126
|
+
// src/providers/common/files.ts
|
|
127
|
+
import { readFile } from "node:fs/promises";
|
|
128
|
+
import { homedir } from "node:os";
|
|
129
|
+
import { join } from "node:path";
|
|
130
|
+
var xdgDataHome, xdgConfigHome, xdgCacheHome, AUTH_PATHS, readJson, loadOpenCodeAuth;
|
|
131
|
+
var init_files = __esm({
|
|
132
|
+
"src/providers/common/files.ts"() {
|
|
133
|
+
"use strict";
|
|
134
|
+
xdgDataHome = () => process.env.XDG_DATA_HOME ?? join(homedir(), ".local", "share");
|
|
135
|
+
xdgConfigHome = () => process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
|
|
136
|
+
xdgCacheHome = () => process.env.XDG_CACHE_HOME ?? join(homedir(), ".cache");
|
|
137
|
+
AUTH_PATHS = {
|
|
138
|
+
opencode: () => join(xdgDataHome(), "opencode", "auth.json"),
|
|
139
|
+
openaiPlugin: () => join(homedir(), ".opencode", "auth", "openai.json"),
|
|
140
|
+
antigravityConfig: () => join(xdgConfigHome(), "opencode", "antigravity-accounts.json"),
|
|
141
|
+
antigravityData: () => join(xdgDataHome(), "opencode", "antigravity-accounts.json")
|
|
142
|
+
};
|
|
143
|
+
readJson = async (filePath, logger) => {
|
|
144
|
+
try {
|
|
145
|
+
const content = await readFile(filePath, "utf-8");
|
|
146
|
+
return JSON.parse(content);
|
|
147
|
+
} catch (error) {
|
|
148
|
+
if (logger) {
|
|
149
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
150
|
+
await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
loadOpenCodeAuth = async (logger) => {
|
|
156
|
+
return readJson(AUTH_PATHS.opencode(), logger);
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
267
161
|
// src/providers/common/registry.ts
|
|
268
162
|
var PROVIDER_ALIASES, getProviderAliases;
|
|
269
163
|
var init_registry = __esm({
|
|
@@ -876,7 +770,7 @@ var init_dashboard = __esm({
|
|
|
876
770
|
});
|
|
877
771
|
|
|
878
772
|
// src/types/index.ts
|
|
879
|
-
var
|
|
773
|
+
var init_types = __esm({
|
|
880
774
|
"src/types/index.ts"() {
|
|
881
775
|
"use strict";
|
|
882
776
|
init_provider();
|
|
@@ -884,6 +778,70 @@ var init_types2 = __esm({
|
|
|
884
778
|
}
|
|
885
779
|
});
|
|
886
780
|
|
|
781
|
+
// src/cache/file.ts
|
|
782
|
+
import { mkdir, readFile as readFile2, rename, unlink, writeFile } from "node:fs/promises";
|
|
783
|
+
var CACHE_DIR, CACHE_PATH, TMP_PATH, ensureCacheDir, readCache, writeCache;
|
|
784
|
+
var init_file = __esm({
|
|
785
|
+
"src/cache/file.ts"() {
|
|
786
|
+
"use strict";
|
|
787
|
+
init_files();
|
|
788
|
+
CACHE_DIR = () => `${xdgCacheHome()}/opencode/opencode-usage-plugin`;
|
|
789
|
+
CACHE_PATH = () => `${CACHE_DIR()}/usage.json`;
|
|
790
|
+
TMP_PATH = () => `${CACHE_PATH()}.tmp`;
|
|
791
|
+
ensureCacheDir = async () => {
|
|
792
|
+
try {
|
|
793
|
+
await mkdir(CACHE_DIR(), { recursive: true });
|
|
794
|
+
} catch (error) {
|
|
795
|
+
if (error instanceof Error && "code" in error && error.code !== "EEXIST") {
|
|
796
|
+
throw error;
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
};
|
|
800
|
+
readCache = async (logger) => {
|
|
801
|
+
try {
|
|
802
|
+
const content = await readFile2(CACHE_PATH(), "utf-8");
|
|
803
|
+
const parsed = JSON.parse(content);
|
|
804
|
+
if (typeof parsed === "object" && parsed !== null && "schema_version" in parsed && "updated_at" in parsed && "refresh_interval_seconds" in parsed && "providers" in parsed) {
|
|
805
|
+
return parsed;
|
|
806
|
+
}
|
|
807
|
+
await logger?.warn("Invalid cache schema, returning null");
|
|
808
|
+
return null;
|
|
809
|
+
} catch (error) {
|
|
810
|
+
if (logger) {
|
|
811
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
812
|
+
await logger.debug("Cache file not found or invalid", { error: message });
|
|
813
|
+
}
|
|
814
|
+
return null;
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
writeCache = async (cache, logger) => {
|
|
818
|
+
try {
|
|
819
|
+
await ensureCacheDir();
|
|
820
|
+
const content = JSON.stringify(cache, null, 2);
|
|
821
|
+
await writeFile(TMP_PATH(), content, "utf-8");
|
|
822
|
+
await rename(TMP_PATH(), CACHE_PATH());
|
|
823
|
+
await logger?.debug("Cache written successfully", { path: CACHE_PATH() });
|
|
824
|
+
} catch (error) {
|
|
825
|
+
await logger?.error("Failed to write cache", {
|
|
826
|
+
error: error instanceof Error ? error.message : String(error)
|
|
827
|
+
});
|
|
828
|
+
throw error;
|
|
829
|
+
}
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
// src/cache/types.ts
|
|
835
|
+
var SCHEMA_VERSION, REFRESH_INTERVAL_SECONDS, STALE_THRESHOLD_MULTIPLIER;
|
|
836
|
+
var init_types2 = __esm({
|
|
837
|
+
"src/cache/types.ts"() {
|
|
838
|
+
"use strict";
|
|
839
|
+
SCHEMA_VERSION = 1;
|
|
840
|
+
REFRESH_INTERVAL_SECONDS = 300;
|
|
841
|
+
STALE_THRESHOLD_MULTIPLIER = 2;
|
|
842
|
+
}
|
|
843
|
+
});
|
|
844
|
+
|
|
887
845
|
// src/cache/fetcher.ts
|
|
888
846
|
var fetchUsage, fetchAllProviders;
|
|
889
847
|
var init_fetcher = __esm({
|
|
@@ -892,9 +850,9 @@ var init_fetcher = __esm({
|
|
|
892
850
|
init_fetch();
|
|
893
851
|
init_fetch2();
|
|
894
852
|
init_fetch3();
|
|
895
|
-
init_types2();
|
|
896
|
-
init_file();
|
|
897
853
|
init_types();
|
|
854
|
+
init_file();
|
|
855
|
+
init_types2();
|
|
898
856
|
fetchUsage = async (provider, logger) => {
|
|
899
857
|
switch (provider) {
|
|
900
858
|
case "openai":
|
|
@@ -951,7 +909,7 @@ var init_worker = __esm({
|
|
|
951
909
|
"src/cache/worker.ts"() {
|
|
952
910
|
"use strict";
|
|
953
911
|
init_fetcher();
|
|
954
|
-
|
|
912
|
+
init_types2();
|
|
955
913
|
intervalId = null;
|
|
956
914
|
startWorker = (logger) => {
|
|
957
915
|
if (intervalId !== null) {
|
|
@@ -983,6 +941,48 @@ var init_worker = __esm({
|
|
|
983
941
|
}
|
|
984
942
|
});
|
|
985
943
|
|
|
944
|
+
// src/cache/reader.ts
|
|
945
|
+
var reader_exports = {};
|
|
946
|
+
__export(reader_exports, {
|
|
947
|
+
loadCacheForDisplay: () => loadCacheForDisplay
|
|
948
|
+
});
|
|
949
|
+
var loadCacheForDisplay;
|
|
950
|
+
var init_reader = __esm({
|
|
951
|
+
"src/cache/reader.ts"() {
|
|
952
|
+
"use strict";
|
|
953
|
+
init_file();
|
|
954
|
+
init_types2();
|
|
955
|
+
loadCacheForDisplay = async (logger) => {
|
|
956
|
+
const cache = await readCache(logger);
|
|
957
|
+
if (!cache) {
|
|
958
|
+
await logger.warn("No cache available");
|
|
959
|
+
return null;
|
|
960
|
+
}
|
|
961
|
+
const updatedAt = new Date(cache.updated_at);
|
|
962
|
+
const now = /* @__PURE__ */ new Date();
|
|
963
|
+
const staleThresholdMs = REFRESH_INTERVAL_SECONDS * 1e3 * STALE_THRESHOLD_MULTIPLIER;
|
|
964
|
+
const isStale = now.getTime() - updatedAt.getTime() > staleThresholdMs;
|
|
965
|
+
if (isStale) {
|
|
966
|
+
await logger.debug("Cache is stale", {
|
|
967
|
+
updatedAt: cache.updated_at,
|
|
968
|
+
staleThresholdSeconds: REFRESH_INTERVAL_SECONDS * STALE_THRESHOLD_MULTIPLIER
|
|
969
|
+
});
|
|
970
|
+
}
|
|
971
|
+
const configuredProviders = {};
|
|
972
|
+
for (const [providerId, entry] of Object.entries(cache.providers)) {
|
|
973
|
+
if (entry.configured) {
|
|
974
|
+
configuredProviders[providerId] = entry;
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return {
|
|
978
|
+
providers: configuredProviders,
|
|
979
|
+
updatedAt: cache.updated_at,
|
|
980
|
+
isStale
|
|
981
|
+
};
|
|
982
|
+
};
|
|
983
|
+
}
|
|
984
|
+
});
|
|
985
|
+
|
|
986
986
|
// src/index.ts
|
|
987
987
|
init_logger();
|
|
988
988
|
import { tool } from "@opencode-ai/plugin";
|
|
@@ -1343,7 +1343,16 @@ var formatUsageToast = async (input, logger) => {
|
|
|
1343
1343
|
// src/index.ts
|
|
1344
1344
|
var UsagePlugin = async ({ client }) => {
|
|
1345
1345
|
const logger = createLogger(client);
|
|
1346
|
-
|
|
1346
|
+
void logger.info("UsagePlugin initialized");
|
|
1347
|
+
try {
|
|
1348
|
+
const { startWorker: startWorker2 } = await Promise.resolve().then(() => (init_worker(), worker_exports));
|
|
1349
|
+
startWorker2(logger);
|
|
1350
|
+
void logger.info("Worker started during initialization");
|
|
1351
|
+
} catch (error) {
|
|
1352
|
+
void logger.error("Failed to start worker during initialization", {
|
|
1353
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1354
|
+
});
|
|
1355
|
+
}
|
|
1347
1356
|
const usageToastTool = tool({
|
|
1348
1357
|
description: "Show subscription usage as toast for OpenAI, Google, and z.ai providers",
|
|
1349
1358
|
args: {},
|
|
@@ -1382,19 +1391,7 @@ var UsagePlugin = async ({ client }) => {
|
|
|
1382
1391
|
usage_table: usageTableTool
|
|
1383
1392
|
},
|
|
1384
1393
|
async event({ event }) {
|
|
1385
|
-
|
|
1386
|
-
if (event.type === "server.connected") {
|
|
1387
|
-
try {
|
|
1388
|
-
await logger.info("server.connected event received, starting worker");
|
|
1389
|
-
const { startWorker: startWorker2 } = await Promise.resolve().then(() => (init_worker(), worker_exports));
|
|
1390
|
-
startWorker2(logger);
|
|
1391
|
-
await logger.info("Worker started successfully");
|
|
1392
|
-
} catch (error) {
|
|
1393
|
-
await logger.error("Failed to start worker", {
|
|
1394
|
-
error: error instanceof Error ? error.message : String(error)
|
|
1395
|
-
});
|
|
1396
|
-
}
|
|
1397
|
-
}
|
|
1394
|
+
void logger.debug("Event received", { type: event.type });
|
|
1398
1395
|
},
|
|
1399
1396
|
async config(config) {
|
|
1400
1397
|
config.command = config.command ?? {};
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/providers/common/logger.ts", "../src/providers/common/
|
|
4
|
-
"sourcesContent": ["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n info: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n warn: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n error: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n}\n\nexport const maskSecret = (secret: string): string => {\n if (!secret || typeof secret !== 'string' || secret.length <= 8) {\n return '***';\n }\n return `${secret.slice(0, 4)}...${secret.slice(-4)}`;\n};\n\nconst noOpLogger = {\n debug: async () => {},\n info: async () => {},\n warn: async () => {},\n error: async () => {},\n};\n\ninterface LogOptions {\n service: string;\n level: LogLevel;\n message: string;\n}\n\ninterface OpenCodeClient {\n app: {\n log: (options: LogOptions) => Promise<boolean> | { ok: boolean };\n };\n}\n\nexport const createLogger = (client: unknown): Logger => {\n const service = 'opencode-usage';\n\n return {\n debug: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'debug',\n message,\n ...(extra ?? {}),\n });\n },\n info: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'info',\n message,\n ...(extra ?? {}),\n });\n },\n warn: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'warn',\n message,\n ...(extra ?? {}),\n });\n },\n error: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'error',\n message,\n ...(extra ?? {}),\n });\n },\n };\n};\n\nexport const noopLogger = noOpLogger as unknown as Logger;\n", "import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { Logger } from './logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\n\nexport const xdgDataHome = (): string =>\n process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share');\n\nexport const xdgConfigHome = (): string =>\n process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');\n\nexport const xdgCacheHome = (): string => process.env.XDG_CACHE_HOME ?? join(homedir(), '.cache');\n\nexport const AUTH_PATHS = {\n opencode: (): string => join(xdgDataHome(), 'opencode', 'auth.json'),\n openaiPlugin: (): string => join(homedir(), '.opencode', 'auth', 'openai.json'),\n antigravityConfig: (): string => join(xdgConfigHome(), 'opencode', 'antigravity-accounts.json'),\n antigravityData: (): string => join(xdgDataHome(), 'opencode', 'antigravity-accounts.json'),\n} as const;\n\nexport const readJson = async <T>(filePath: string, logger?: Logger): Promise<T | null> => {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });\n }\n return null;\n }\n};\n\nexport const loadOpenCodeAuth = async (logger?: Logger): Promise<OpenCodeAuth | null> => {\n return readJson<OpenCodeAuth>(AUTH_PATHS.opencode(), logger);\n};\n", "import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';\n\nimport { xdgCacheHome } from '../providers/common/files.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport type { CacheSchema } from './types.ts';\n\nconst CACHE_DIR = (): string => `${xdgCacheHome()}/opencode/opencode-usage-plugin`;\n\nexport const CACHE_PATH = (): string => `${CACHE_DIR()}/usage.json`;\n\nconst TMP_PATH = (): string => `${CACHE_PATH()}.tmp`;\n\nconst ensureCacheDir = async (): Promise<void> => {\n try {\n await mkdir(CACHE_DIR(), { recursive: true });\n } catch (error) {\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code !== 'EEXIST'\n ) {\n throw error;\n }\n }\n};\n\nexport const readCache = async (logger?: Logger): Promise<CacheSchema | null> => {\n try {\n const content = await readFile(CACHE_PATH(), 'utf-8');\n const parsed = JSON.parse(content) as unknown;\n\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'schema_version' in parsed &&\n 'updated_at' in parsed &&\n 'refresh_interval_seconds' in parsed &&\n 'providers' in parsed\n ) {\n return parsed as CacheSchema;\n }\n\n await logger?.warn('Invalid cache schema, returning null');\n return null;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug('Cache file not found or invalid', { error: message });\n }\n return null;\n }\n};\n\nexport const writeCache = async (cache: CacheSchema, logger?: Logger): Promise<void> => {\n try {\n await ensureCacheDir();\n const content = JSON.stringify(cache, null, 2);\n await writeFile(TMP_PATH(), content, 'utf-8');\n await rename(TMP_PATH(), CACHE_PATH());\n await logger?.debug('Cache written successfully', { path: CACHE_PATH() });\n } catch (error) {\n await logger?.error('Failed to write cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const clearCache = async (logger?: Logger): Promise<void> => {\n try {\n await unlink(CACHE_PATH());\n await logger?.debug('Cache cleared', { path: CACHE_PATH() });\n } catch (error) {\n if (logger) {\n const code =\n error instanceof Error && 'code' in error ? (error as { code: string }).code : 'UNKNOWN';\n if (code === 'ENOENT') {\n await logger.debug('Cache file does not exist, nothing to clear');\n } else {\n await logger?.error('Failed to clear cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n};\n", "import type { ProviderId, ProviderUsage } from '../types/index.ts';\n\nexport const SCHEMA_VERSION = 1;\nexport const REFRESH_INTERVAL_SECONDS = 300;\nexport const STALE_THRESHOLD_MULTIPLIER = 2;\n\nexport interface ProviderCacheEntry {\n supported: boolean;\n configured: boolean;\n last_attempt_at: string;\n last_success_at: string | null;\n data: ProviderUsage | null;\n error: string | null;\n}\n\nexport interface CacheSchema {\n schema_version: number;\n updated_at: string;\n refresh_interval_seconds: number;\n providers: Record<ProviderId, ProviderCacheEntry>;\n}\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { readCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, STALE_THRESHOLD_MULTIPLIER, type CacheSchema } from './types.ts';\n\nexport interface DisplayCache {\n providers: CacheSchema['providers'];\n updatedAt: string;\n isStale: boolean;\n}\n\nexport const loadCacheForDisplay = async (logger: Logger): Promise<DisplayCache | null> => {\n const cache = await readCache(logger);\n if (!cache) {\n await logger.warn('No cache available');\n return null;\n }\n\n const updatedAt = new Date(cache.updated_at);\n const now = new Date();\n const staleThresholdMs = REFRESH_INTERVAL_SECONDS * 1000 * STALE_THRESHOLD_MULTIPLIER;\n const isStale = now.getTime() - updatedAt.getTime() > staleThresholdMs;\n\n if (isStale) {\n await logger.debug('Cache is stale', {\n updatedAt: cache.updated_at,\n staleThresholdSeconds: REFRESH_INTERVAL_SECONDS * STALE_THRESHOLD_MULTIPLIER,\n });\n }\n\n const configuredProviders: CacheSchema['providers'] = {} as CacheSchema['providers'];\n\n for (const [providerId, entry] of Object.entries(cache.providers)) {\n if (entry.configured) {\n configuredProviders[providerId as keyof typeof configuredProviders] = entry;\n }\n }\n\n return {\n providers: configuredProviders,\n updatedAt: cache.updated_at,\n isStale,\n };\n};\n", "export const calculateResetAfterSeconds = (\n resetAt: number | null,\n now: number = Date.now()\n): number | null => {\n if (!resetAt) {\n return null;\n }\n\n const diffMs = resetAt - now;\n if (diffMs <= 0) {\n return 0;\n }\n\n return Math.floor(diffMs / 1000);\n};\n\nexport const calculateResetAt = (\n resetAfterSeconds: number | null,\n now: number = Date.now()\n): number | null => {\n if (resetAfterSeconds === null || resetAfterSeconds === undefined) {\n return null;\n }\n\n return now + resetAfterSeconds * 1000;\n};\n\nexport const formatDuration = (seconds: number): string => {\n if (seconds <= 0) {\n return '0s';\n }\n\n const weeks = Math.floor(seconds / 604800);\n const days = Math.floor((seconds % 604800) / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (weeks > 0) parts.push(`${weeks}w`);\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 || parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(' ');\n};\n\nexport const formatResetAt = (resetAtMs: number): string => {\n return new Date(resetAtMs).toLocaleString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n });\n};\n", "import type { ProviderAlias, ProviderId } from '../../types/index.ts';\n\nexport const PROVIDER_ALIASES: Record<ProviderId, ProviderAlias[]> = {\n openai: ['openai', 'codex', 'chatgpt'],\n google: ['google', 'antigravity'],\n 'zai-coding-plan': ['zai-coding-plan', 'zai', 'z.ai'],\n};\n\nexport const parseProvider = (input?: string): ProviderId | null => {\n if (!input) {\n return null;\n }\n\n const normalized = input.trim().toLowerCase();\n for (const [providerId, aliases] of Object.entries(PROVIDER_ALIASES)) {\n if (aliases.includes(normalized as ProviderAlias)) {\n return providerId as ProviderId;\n }\n }\n\n return null;\n};\n\nexport const getProviderAliases = (provider: ProviderId): ProviderAlias[] => {\n return PROVIDER_ALIASES[provider];\n};\n", "import type {\n AntigravityAccount,\n AntigravityAccountsFile,\n OpenCodeAuth,\n ProviderAuthData,\n} from '../../types/index.ts';\nimport type { Logger } from '../common/logger.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nexport interface GoogleAuthContext {\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n projectId?: string;\n email?: string;\n}\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('google')) {\n const entry = toAuthData(auth[alias]);\n if (entry) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst toAuthContext = (entry: ProviderAuthData | null): GoogleAuthContext | null => {\n if (!entry) {\n return null;\n }\n\n const accessToken = entry.access ?? entry.token;\n let refreshToken = entry.refresh;\n let projectId: string | undefined = undefined;\n\n if (refreshToken && refreshToken.includes('|')) {\n const parts = refreshToken.split('|');\n refreshToken = parts[0];\n projectId = parts[1];\n }\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n refreshToken,\n expires: entry.expires,\n projectId,\n };\n};\n\nconst selectAccount = (accounts: AntigravityAccountsFile | null): AntigravityAccount | null => {\n if (!accounts?.accounts?.length) {\n return null;\n }\n\n const candidateIndex = accounts.activeIndex ?? 0;\n const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];\n return account ?? null;\n};\n\nconst loadAuthFromAccounts = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const configAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityConfig(),\n logger\n );\n const account = selectAccount(configAccounts);\n if (account) {\n return {\n refreshToken: account.refreshToken,\n projectId: account.projectId ?? account.managedProjectId,\n email: account.email,\n };\n }\n\n const dataAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityData(),\n logger\n );\n const fallbackAccount = selectAccount(dataAccounts);\n if (!fallbackAccount) {\n return null;\n }\n\n return {\n refreshToken: fallbackAccount.refreshToken,\n projectId: fallbackAccount.projectId ?? fallbackAccount.managedProjectId,\n email: fallbackAccount.email,\n };\n};\n\nexport const getGoogleAuth = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n const authContext = toAuthContext(openCodeAuth);\n if (authContext) {\n return authContext;\n }\n\n return loadAuthFromAccounts(logger);\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getGoogleAuth } from './auth.ts';\n\nconst GOOGLE_CLIENT_ID =\n '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';\nconst GOOGLE_CLIENT_SECRET = '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';\nconst DEFAULT_PROJECT_ID = 'rising-fact-p41fc';\nconst WINDOW_SECONDS = 5 * 60 * 60;\n\nconst ENDPOINTS: readonly string[] = [\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n 'https://autopush-cloudcode-pa.sandbox.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n];\n\nconst HEADERS = {\n 'User-Agent': 'antigravity/1.11.5 windows/amd64',\n 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\n 'Client-Metadata':\n '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}',\n} as const;\n\ninterface TokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\ninterface ModelUsageInfoResponse {\n displayName?: string;\n quotaInfo?: {\n remainingFraction?: number;\n resetTime?: string;\n };\n}\n\ninterface ModelsResponse {\n models?: Record<string, ModelUsageInfoResponse>;\n}\n\nconst refreshAccessToken = async (\n refreshToken: string,\n logger: Logger\n): Promise<TokenResponse | null> => {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: GOOGLE_CLIENT_ID,\n client_secret: GOOGLE_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n await logger.warn('Failed to refresh OAuth token for google', {\n status: response.status,\n token: maskSecret(refreshToken),\n });\n return null;\n }\n\n return (await response.json()) as TokenResponse;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.warn(`Token refresh failed for google: ${message}`);\n return null;\n }\n};\n\nconst fetchModels = async (\n accessToken: string,\n projectId: string | undefined,\n logger: Logger\n): Promise<ModelsResponse | null> => {\n const body = projectId ? { project: projectId } : {};\n\n for (const endpoint of ENDPOINTS) {\n try {\n const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n ...HEADERS,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (response.ok) {\n await logger.debug(`Fetched models from ${endpoint}`, { projectId });\n return (await response.json()) as ModelsResponse;\n }\n } catch {\n continue;\n }\n }\n\n await logger.error('Failed to fetch models from all google endpoints', { projectId });\n return null;\n};\n\nconst toWindow = (remainingFraction?: number, resetTime?: string): UsageWindow => {\n const remainingPercent =\n remainingFraction !== undefined ? Math.round(remainingFraction * 100) : null;\n const usedPercent = remainingPercent !== null ? Math.max(0, 100 - remainingPercent) : null;\n const resetAt = resetTime ? new Date(resetTime).getTime() : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: WINDOW_SECONDS,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nconst buildUsage = (data: ModelsResponse): ProviderUsage => {\n const models: Record<string, { windows: Record<string, UsageWindow> }> = {};\n\n for (const [modelName, modelData] of Object.entries(data.models ?? {})) {\n const window = toWindow(modelData.quotaInfo?.remainingFraction, modelData.quotaInfo?.resetTime);\n models[modelName] = {\n windows: {\n '5h': window,\n },\n };\n }\n\n return {\n windows: {},\n models: Object.keys(models).length ? models : undefined,\n };\n};\n\nconst resolveAccessToken = async (\n refreshToken: string | undefined,\n accessToken: string | undefined,\n expires: number | undefined,\n logger: Logger\n): Promise<string | null> => {\n const now = Date.now();\n\n if (accessToken && (!expires || expires > now)) {\n return accessToken;\n }\n\n if (!refreshToken) {\n return null;\n }\n\n const refreshed = await refreshAccessToken(refreshToken, logger);\n return refreshed?.access_token ?? null;\n};\n\nexport const fetchGoogleUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getGoogleAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for google');\n return {\n provider: 'google',\n ok: false,\n configured: false,\n error: 'Not configured - no accounts found',\n usage: null,\n };\n }\n\n const accessToken = await resolveAccessToken(\n auth.refreshToken,\n auth.accessToken,\n auth.expires,\n logger\n );\n\n if (!accessToken) {\n await logger.warn('Failed to refresh OAuth token for google', { email: auth.email });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to refresh OAuth token',\n usage: null,\n };\n }\n\n const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;\n const modelsData = await fetchModels(accessToken, projectId, logger);\n\n if (!modelsData) {\n await logger.error('Failed to fetch models from google API', { projectId });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to fetch models from API',\n usage: null,\n };\n }\n\n await logger.info('google usage fetched successfully');\n\n return {\n provider: 'google',\n ok: true,\n configured: true,\n usage: buildUsage(modelsData),\n };\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth, ProviderAuthData } from '../../types/index.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst hasAccessToken = (auth: ProviderAuthData | null): auth is ProviderAuthData => {\n return Boolean(auth?.access || auth?.token);\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('openai')) {\n const entry = toAuthData(auth[alias]);\n if (entry && hasAccessToken(entry)) {\n return entry;\n }\n }\n\n return null;\n};\n\nexport const getOpenaiAuth = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n if (openCodeAuth && hasAccessToken(openCodeAuth)) {\n return openCodeAuth;\n }\n\n const pluginAuth = await readJson<ProviderAuthData>(AUTH_PATHS.openaiPlugin(), logger);\n if (pluginAuth && hasAccessToken(pluginAuth)) {\n return pluginAuth;\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getOpenaiAuth } from './auth.ts';\n\ninterface OpenaiBackendWindow {\n used_percent: number;\n limit_window_seconds: number;\n reset_after_seconds: number;\n reset_at: number;\n}\n\ninterface OpenaiBackendResponse {\n plan_type: string;\n rate_limit: {\n allowed: boolean;\n limit_reached: boolean;\n primary_window?: OpenaiBackendWindow;\n secondary_window?: OpenaiBackendWindow;\n };\n}\n\nconst toWindow = (window?: OpenaiBackendWindow): UsageWindow | null => {\n if (!window) {\n return null;\n }\n\n const usedPercent = window.used_percent;\n const resetAt = window.reset_at ? window.reset_at * 1000 : null;\n const resetAfterSeconds = window.reset_after_seconds ?? calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent: Math.max(0, 100 - usedPercent),\n windowSeconds: window.limit_window_seconds ?? null,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchOpenaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getOpenaiAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - no OAuth token found',\n usage: null,\n };\n }\n\n const accessToken = auth.access ?? auth.token;\n if (!accessToken) {\n await logger.warn('Auth configured but access token missing for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - access token missing',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://chatgpt.com/backend-api/wham/usage', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for openai`, {\n token: maskSecret(accessToken),\n });\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as OpenaiBackendResponse;\n const primary = toWindow(payload.rate_limit.primary_window);\n const secondary = toWindow(payload.rate_limit.secondary_window);\n\n const windows: Record<string, UsageWindow> = {};\n if (primary) {\n windows['5h'] = primary;\n }\n if (secondary) {\n windows['weekly'] = secondary;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('openai usage fetched successfully');\n\n return {\n provider: 'openai',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for openai: ${message}`);\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\nimport { loadOpenCodeAuth } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst resolveAuthValue = (entry: OpenCodeAuth[string]): string | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'object') {\n return entry.api_key ?? entry.token ?? entry.key ?? null;\n }\n\n return null;\n};\n\nexport const getZaiApiKey = async (logger?: Logger): Promise<string | null> => {\n if (process.env.ZAI_API_KEY) {\n return process.env.ZAI_API_KEY;\n }\n\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('zai-coding-plan')) {\n const value = resolveAuthValue(auth[alias]);\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getZaiApiKey } from './auth.ts';\n\ninterface ZaiLimit {\n type: 'TIME_LIMIT' | 'TOKENS_LIMIT';\n unit: number;\n number: number;\n usage: number;\n currentValue: number;\n remaining: number;\n percentage: number;\n nextResetTime?: number;\n}\n\ninterface ZaiUsageResponse {\n code: number;\n msg: string;\n data?: {\n limits?: ZaiLimit[];\n };\n success: boolean;\n}\n\nconst normalizeTimestamp = (value: number): number => {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n};\n\nconst TOKEN_WINDOW_SECONDS: Record<number, number> = {\n 3: 3600,\n};\n\nconst resolveWindowSeconds = (limit?: ZaiLimit): number | null => {\n if (!limit) {\n return null;\n }\n\n if (!limit.number) {\n return null;\n }\n\n const unitSeconds = TOKEN_WINDOW_SECONDS[limit.unit];\n if (!unitSeconds) {\n return null;\n }\n\n return unitSeconds * limit.number;\n};\n\nconst resolveWindowLabel = (windowSeconds: number | null): string => {\n if (!windowSeconds) {\n return 'tokens';\n }\n\n if (windowSeconds % 86400 === 0) {\n const days = windowSeconds / 86400;\n return days === 7 ? 'weekly' : `${days}d`;\n }\n\n if (windowSeconds % 3600 === 0) {\n return `${windowSeconds / 3600}h`;\n }\n\n return `${windowSeconds}s`;\n};\n\nconst toWindow = (limit?: ZaiLimit): UsageWindow | null => {\n if (!limit) {\n return null;\n }\n\n const usedPercent = limit.percentage ?? null;\n const remainingPercent = usedPercent !== null ? Math.max(0, 100 - usedPercent) : null;\n const resetAt = limit.nextResetTime ? normalizeTimestamp(limit.nextResetTime) : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: resolveWindowSeconds(limit),\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchZaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const apiKey = await getZaiApiKey(logger);\n\n if (!apiKey) {\n await logger.warn('No auth configured for zai-coding-plan');\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: false,\n error: 'Not configured - no API key found',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://api.z.ai/api/monitor/usage/quota/limit', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for zai-coding-plan`, {\n token: maskSecret(apiKey),\n });\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as ZaiUsageResponse;\n const limits = payload.data?.limits ?? [];\n const tokensLimit = limits.find((limit) => limit.type === 'TOKENS_LIMIT');\n\n const windows: Record<string, UsageWindow> = {};\n const window = toWindow(tokensLimit);\n if (window) {\n const label = resolveWindowLabel(window.windowSeconds);\n windows[label] = window;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('zai-coding-plan usage fetched successfully');\n\n return {\n provider: 'zai-coding-plan',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for zai-coding-plan: ${message}`);\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "export type ProviderId = 'openai' | 'google' | 'zai-coding-plan';\n\nexport type ProviderAlias = ProviderId | 'codex' | 'antigravity' | 'zai' | 'z.ai' | 'chatgpt';\n\nexport type ProviderIdValues = 'openai' | 'google' | 'zai-coding-plan';\n\nexport const PROVIDERS: ProviderIdValues[] = ['openai', 'google', 'zai-coding-plan'];\n\nexport type OpenCodeAuth = Record<string, string | ProviderAuthData>;\n\nexport interface ProviderAuthData {\n type?: 'oauth' | 'api' | string;\n access?: string;\n refresh?: string;\n expires?: number;\n api_key?: string;\n token?: string;\n key?: string;\n accountId?: string;\n}\n", "export type StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nexport type StatusText = 'Critical' | 'Warning' | 'OK' | 'N/A';\n\nexport interface DashboardWindow {\n label: string;\n usedPercent: number | null;\n remainingPercent: number | null;\n status: StatusEmoji;\n statusText: StatusText;\n resetsIn: string;\n}\n\nexport interface DashboardSection {\n title: string;\n windows: DashboardWindow[];\n sections?: DashboardSection[];\n}\n\nexport interface DashboardProvider {\n name: string;\n sections: DashboardSection[];\n}\n\nexport interface DashboardData {\n providers: DashboardProvider[];\n}\n", "export type { ProviderId, ProviderAlias, OpenCodeAuth, ProviderAuthData } from './provider.ts';\nexport { PROVIDERS } from './provider.ts';\nexport type { UsageWindow, UsageWindows, ProviderUsage, ProviderResult } from './usage.ts';\nexport type { AntigravityAccount, AntigravityAccountsFile } from './google.ts';\nexport type { ToastUsageResult } from './toast.ts';\nexport * from './dashboard.js';\n", "import { fetchGoogleUsage } from '../providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from '../providers/openai/fetch.ts';\nimport { fetchZaiUsage } from '../providers/zai-coding-plan/fetch.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from '../types/index.ts';\nimport { readCache, writeCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, SCHEMA_VERSION, type CacheSchema } from './types.ts';\n\nconst fetchUsage = async (provider: ProviderId, logger: Logger): Promise<ProviderResult> => {\n switch (provider) {\n case 'openai':\n return fetchOpenaiUsage(logger);\n case 'google':\n return fetchGoogleUsage(logger);\n case 'zai-coding-plan':\n return fetchZaiUsage(logger);\n }\n};\n\nexport const fetchAllProviders = async (logger: Logger): Promise<CacheSchema> => {\n await logger.info('Fetching usage for all providers');\n\n const existingCache = await readCache(logger);\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const providers: Record<ProviderId, CacheSchema['providers'][ProviderId]> = {} as Record<\n ProviderId,\n CacheSchema['providers'][ProviderId]\n >;\n\n const now = new Date().toISOString();\n\n for (const result of results) {\n const providerId = result.provider;\n const wasConfigured = existingCache?.providers[providerId]?.configured ?? false;\n\n providers[providerId] = {\n supported: true,\n configured: result.configured,\n last_attempt_at: now,\n last_success_at: result.ok ? now : null,\n data: result.ok ? result.usage : null,\n error: result.ok ? null : (result.error ?? null),\n };\n\n if (!result.configured && wasConfigured) {\n providers[providerId].data = null;\n await logger.debug(`Wiped data for ${providerId} (no longer configured)`);\n }\n }\n\n const cache: CacheSchema = {\n schema_version: SCHEMA_VERSION,\n updated_at: now,\n refresh_interval_seconds: REFRESH_INTERVAL_SECONDS,\n providers,\n };\n\n await writeCache(cache, logger);\n return cache;\n};\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { fetchAllProviders } from './fetcher.ts';\nimport { REFRESH_INTERVAL_SECONDS } from './types.ts';\n\nlet intervalId: ReturnType<typeof globalThis.setInterval> | null = null;\n\nexport const startWorker = (logger: Logger): void => {\n if (intervalId !== null) {\n logger.warn('Worker already started');\n return;\n }\n\n const refreshLoop = async (): Promise<void> => {\n try {\n await fetchAllProviders(logger);\n } catch (error) {\n await logger.error('Worker refresh failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n void refreshLoop();\n\n intervalId = globalThis.setInterval(refreshLoop, REFRESH_INTERVAL_SECONDS * 1000);\n\n void logger.info(`Worker started, refreshing every ${REFRESH_INTERVAL_SECONDS}s`);\n};\n\nexport const stopWorker = (logger: Logger): void => {\n if (intervalId === null) {\n return;\n }\n\n globalThis.clearInterval(intervalId);\n intervalId = null;\n\n void logger.info('Worker stopped');\n};\n\nexport const isWorkerRunning = (): boolean => intervalId !== null;\n", "import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { createLogger } from './providers/common/logger.ts';\nimport { formatDashboardData, formatDashboardString } from './dashboard/format.ts';\nimport { formatUsageToast } from './toast/format.ts';\n\nexport const UsagePlugin: Plugin = async ({ client }) => {\n const logger = createLogger(client);\n\n await logger.info('UsagePlugin initialized');\n\n const usageToastTool = tool({\n description: 'Show subscription usage as toast for OpenAI, Google, and z.ai providers',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n const toast = await formatUsageToast(displayCache, logger);\n\n await client.tui.showToast({\n body: {\n title: toast.title,\n message: toast.message,\n variant: toast.variant,\n },\n });\n\n return 'Usage displayed';\n },\n });\n\n const usageTableTool = tool({\n description:\n 'Get subscription usage data for OpenAI, Google, and z.ai providers as a formatted table',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n if (!displayCache) {\n return 'No cache available';\n }\n\n const dashboardData = formatDashboardData(displayCache);\n\n return formatDashboardString(dashboardData, displayCache.updatedAt, displayCache.isStale);\n },\n });\n\n return {\n tool: {\n usage_toast: usageToastTool,\n usage_table: usageTableTool,\n },\n async event({ event }) {\n await logger.debug('Event received', { type: event.type });\n\n if (event.type === 'server.connected') {\n try {\n await logger.info('server.connected event received, starting worker');\n const { startWorker } = await import('./cache/worker.ts');\n startWorker(logger);\n await logger.info('Worker started successfully');\n } catch (error) {\n await logger.error('Failed to start worker', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n },\n async config(config) {\n config.command = config.command ?? {};\n\n config.command['usage-toast'] = {\n template: 'Call the usage_toast tool.',\n description: 'Show subscription usage as toast notification',\n };\n\n config.command.usage = {\n template: 'Call the usage_table tool and display the formatted table.',\n description: 'Show subscription usage as formatted table',\n };\n },\n };\n};\n\nconst setupShutdownHandlers = async (): Promise<void> => {\n const { isWorkerRunning, stopWorker } = await import('./cache/worker.ts');\n const { createLogger } = await import('./providers/common/logger.ts');\n const logger = createLogger({\n app: { log: () => Promise.resolve(true) },\n } as unknown as Parameters<typeof createLogger>[0]);\n\n const onShutdown = async (): Promise<void> => {\n if (await isWorkerRunning()) {\n stopWorker(logger);\n }\n };\n\n process.on('SIGINT', onShutdown);\n process.on('SIGTERM', onShutdown);\n process.on('exit', onShutdown);\n};\n\nvoid setupShutdownHandlers();\n\nexport default UsagePlugin;\n", "import type { UsageWindows } from '../types/index.js';\n\nconst FLAGSHIP_PATTERNS: RegExp[] = [\n /claude[-\\s]*opus[-\\s]*4[-\\s.]?5/i,\n /gemini[-\\s]*3[-\\s.]?pro/i,\n /gemini[-\\s]*3[-\\s.]?flash/i,\n];\n\nexport const isFlagshipModel = (modelName: string): boolean => {\n return FLAGSHIP_PATTERNS.some((pattern) => pattern.test(modelName));\n};\n\nexport const filterFlagshipModels = (\n models?: Record<string, UsageWindows>\n): Record<string, UsageWindows> => {\n if (!models) {\n return {};\n }\n\n const filtered: Record<string, UsageWindows> = {};\n\n for (const [modelName, modelData] of Object.entries(models)) {\n if (isFlagshipModel(modelName)) {\n filtered[modelName] = modelData;\n }\n }\n\n return filtered;\n};\n", "import type { ProviderResult, UsageWindow } from '../types/index.ts';\nimport type { DisplayCache } from '../cache/reader.ts';\nimport type {\n DashboardData,\n DashboardProvider,\n DashboardSection,\n DashboardWindow,\n StatusEmoji,\n StatusText,\n} from '../types/dashboard.ts';\nimport { filterFlagshipModels } from '../toast/filter.ts';\n\nconst getStatus = (remainingPercent: number | null): { emoji: StatusEmoji; text: StatusText } => {\n if (remainingPercent === null) {\n return { emoji: '\u26AA', text: 'N/A' };\n }\n\n if (remainingPercent < 10) {\n return { emoji: '\uD83D\uDD34', text: 'Critical' };\n }\n\n if (remainingPercent < 30) {\n return { emoji: '\uD83D\uDFE1', text: 'Warning' };\n }\n\n return { emoji: '\uD83D\uDFE2', text: 'OK' };\n};\n\nexport const formatWindowLabel = (key: string): string => {\n switch (key) {\n case '5h':\n return '5h Window';\n case 'weekly':\n return 'Weekly Window';\n default:\n return `${key} Window`;\n }\n};\n\nexport const renderBar = (percent: number | null, width: number = 20): string => {\n if (percent === null) {\n return `[${'\u2591'.repeat(width)}]`;\n }\n\n // Clamp percent between 0 and 100\n const validPercent = Math.max(0, Math.min(100, percent));\n const filledLength = Math.round((validPercent / 100) * width);\n const emptyLength = width - filledLength;\n\n return `[${'\u2588'.repeat(filledLength)}${'\u2591'.repeat(emptyLength)}]`;\n};\n\nconst formatWindow = (key: string, window: UsageWindow): DashboardWindow => {\n const remainingPercent = window.remainingPercent ?? null;\n const { emoji, text } = getStatus(remainingPercent);\n\n return {\n label: formatWindowLabel(key),\n usedPercent: window.usedPercent ?? null,\n remainingPercent,\n status: emoji,\n statusText: text,\n resetsIn: window.resetAfterFormatted ?? 'N/A',\n };\n};\n\nexport const formatDashboardData = (\n input: ProviderResult[] | DisplayCache | null\n): DashboardData => {\n if (input === null) {\n return { providers: [] };\n }\n\n if (!('providers' in input)) {\n return formatDashboardDataFromResults(input);\n }\n\n return formatDashboardDataFromCache(input);\n};\n\nconst formatDashboardDataFromResults = (results: ProviderResult[]): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const result of results) {\n if (!result.usage) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = result.usage;\n\n if (result.provider === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: result.provider.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nconst formatDashboardDataFromCache = (displayCache: DisplayCache): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = entry.data;\n\n if (providerId === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: providerId.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nexport const formatDashboardString = (\n data: DashboardData,\n updatedAt?: string,\n isStale?: boolean\n): string => {\n if (data.providers.length === 0) {\n let result = 'No usage data available';\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n return result;\n }\n\n const lines: string[] = [];\n const HEADER_WIDTH = 65; // Adjust as needed to match 70 chars total roughly\n\n for (const provider of data.providers) {\n // Header: PROVIDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Calculate padding for dash line\n const providerName = provider.name;\n const dashCount = Math.max(0, HEADER_WIDTH - providerName.length - 1);\n lines.push(`${providerName} ${'\u2500'.repeat(dashCount)}`);\n\n for (let i = 0; i < provider.sections.length; i++) {\n const section = provider.sections[i];\n // Section title (e.g., Overall Usage or Model Usage)\n lines.push(section.title);\n\n // Render direct windows (e.g. Overall Usage)\n for (let j = 0; j < section.windows.length; j++) {\n const window = section.windows[j];\n const isLastWindow = j === section.windows.length - 1;\n\n const branch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastWindow ? ' ' : '\u2502 ';\n\n // Line 1: Label\n lines.push(` ${branch} ${window.label}`);\n\n // Line 2: Progress Bar + Percent + Reset\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n lines.push(\n ` ${pipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n // Spacer line unless it's the very last window of the section\n if (!isLastWindow) {\n lines.push(` ${pipe}`);\n }\n }\n\n // Render nested sections (e.g. Models)\n if (section.sections) {\n for (let k = 0; k < section.sections.length; k++) {\n const subsection = section.sections[k];\n const isLastSubsection = k === section.sections.length - 1;\n const branch = isLastSubsection ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastSubsection ? ' ' : '\u2502 ';\n\n lines.push(` ${branch} ${subsection.title}`);\n\n for (let m = 0; m < subsection.windows.length; m++) {\n const window = subsection.windows[m];\n const isLastWindow = m === subsection.windows.length - 1;\n\n // Indent deeper for windows under a model\n const subBranch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n // If we are in the last subsection, the parent pipe is space\n // If we are NOT in the last subsection, the parent pipe is \u2502\n // Wait, we need to pass down the \"continuation\" context\n\n // Line 1: Label\n lines.push(` ${pipe} ${subBranch} ${window.label}`);\n\n // Line 2\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n const subPipe = isLastWindow ? ' ' : '\u2502 ';\n\n lines.push(\n ` ${pipe} ${subPipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n if (!isLastWindow) {\n lines.push(` ${pipe} ${subPipe}`);\n }\n }\n\n if (!isLastSubsection) {\n lines.push(` ${pipe}`);\n }\n }\n }\n\n // Add empty line after section\n lines.push('');\n }\n }\n\n let result = lines.join('\\n').trim();\n\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n\n if (isStale) {\n result += ' (STALE)';\n }\n\n return result;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../types/index.js';\nimport type { ToastUsageResult } from '../types/toast.js';\nimport type { Logger } from '../providers/common/logger.js';\nimport type { DisplayCache } from '../cache/reader.js';\nimport { filterFlagshipModels } from './filter.js';\n\ntype StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nconst getStatus = (remainingPercent: number | null): StatusEmoji => {\n if (remainingPercent === null) return '\u26AA';\n if (remainingPercent < 10) return '\uD83D\uDD34';\n if (remainingPercent < 30) return '\uD83D\uDFE1';\n return '\uD83D\uDFE2';\n};\n\nconst formatWindowLine = (name: string, window: UsageWindow, isModel: boolean = false): string => {\n const used = window.usedPercent !== null ? Math.round(window.usedPercent) : 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n const remaining = window.remainingPercent ?? null;\n const emoji = isModel ? '' : `${getStatus(remaining)} `;\n const indent = isModel ? ' ' : '';\n\n // Format: \"\uD83D\uDFE2 openai 75% \u2022 2h\" or \" gemini-3-pro 48% \u2022 4h\"\n return `${indent}${emoji}${name.padEnd(isModel ? 13 : 10)} ${used}% \u2022 ${reset}`;\n};\n\nconst formatProviderSection = (provider: string, usage: ProviderUsage | null): string[] => {\n if (!usage) {\n return [`\u26AA ${provider}: Not configured`];\n }\n\n const lines: string[] = [];\n const globalWindows = Object.values(usage.windows);\n\n // Provider Line\n if (globalWindows.length > 0) {\n lines.push(formatWindowLine(provider, globalWindows[0]));\n } else {\n lines.push(`\u26AA ${provider}: No usage data`);\n }\n\n // Model Lines\n if (usage.models) {\n for (const [modelName, modelData] of Object.entries(usage.models)) {\n const modelWindow = Object.values(modelData.windows)[0];\n if (modelWindow) {\n lines.push(formatWindowLine(modelName, modelWindow, true));\n }\n }\n }\n\n return lines;\n};\n\nexport const formatUsageToast = async (\n input: ProviderResult[] | DisplayCache | null,\n logger?: Logger\n): Promise<ToastUsageResult> => {\n if (!input) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n const displayCache = 'providers' in input ? input : null;\n const results = 'providers' in input ? null : input;\n\n const lines: string[] = [];\n const contentLines: string[] = [];\n const DIVIDER = '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500';\n\n let updatedAt = '';\n let isStale = false;\n\n if (displayCache) {\n updatedAt = displayCache.updatedAt;\n isStale = displayCache.isStale;\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) continue;\n\n let usage = entry.data;\n if (providerId === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(providerId, usage));\n }\n\n if (Object.values(displayCache.providers).some((e) => e.error !== null)) {\n contentLines.push('\u26A0\uFE0F Some providers failed');\n }\n } else if (results) {\n const now = new Date();\n updatedAt = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;\n\n for (const result of results) {\n if (!result.usage) {\n await logger?.debug(`Provider ${result.provider} not configured, skipping`);\n continue;\n }\n\n let usage = result.usage;\n if (result.provider === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(result.provider, usage));\n }\n }\n\n if (contentLines.length === 0) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n lines.push(DIVIDER);\n lines.push(...contentLines);\n lines.push(DIVIDER);\n\n let footer = `Updated: ${updatedAt}`;\n if (isStale) footer += ' (stale)';\n lines.push(footer);\n\n return {\n title: '\uD83D\uDCCA Usage',\n message: lines.join('\\n'),\n variant: 'info',\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../src/providers/common/logger.ts", "../src/providers/common/time.ts", "../src/providers/common/files.ts", "../src/providers/common/registry.ts", "../src/providers/google/auth.ts", "../src/providers/google/fetch.ts", "../src/providers/openai/auth.ts", "../src/providers/openai/fetch.ts", "../src/providers/zai-coding-plan/auth.ts", "../src/providers/zai-coding-plan/fetch.ts", "../src/types/provider.ts", "../src/types/dashboard.ts", "../src/types/index.ts", "../src/cache/file.ts", "../src/cache/types.ts", "../src/cache/fetcher.ts", "../src/cache/worker.ts", "../src/cache/reader.ts", "../src/index.ts", "../src/toast/filter.ts", "../src/dashboard/format.ts", "../src/toast/format.ts"],
|
|
4
|
+
"sourcesContent": ["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n info: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n warn: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n error: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n}\n\nexport const maskSecret = (secret: string): string => {\n if (!secret || typeof secret !== 'string' || secret.length <= 8) {\n return '***';\n }\n return `${secret.slice(0, 4)}...${secret.slice(-4)}`;\n};\n\nconst noOpLogger = {\n debug: async () => {},\n info: async () => {},\n warn: async () => {},\n error: async () => {},\n};\n\ninterface LogOptions {\n service: string;\n level: LogLevel;\n message: string;\n}\n\ninterface OpenCodeClient {\n app: {\n log: (options: LogOptions) => Promise<boolean> | { ok: boolean };\n };\n}\n\nexport const createLogger = (client: unknown): Logger => {\n const service = 'opencode-usage';\n\n return {\n debug: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'debug',\n message,\n ...(extra ?? {}),\n });\n },\n info: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'info',\n message,\n ...(extra ?? {}),\n });\n },\n warn: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'warn',\n message,\n ...(extra ?? {}),\n });\n },\n error: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'error',\n message,\n ...(extra ?? {}),\n });\n },\n };\n};\n\nexport const noopLogger = noOpLogger as unknown as Logger;\n", "export const calculateResetAfterSeconds = (\n resetAt: number | null,\n now: number = Date.now()\n): number | null => {\n if (!resetAt) {\n return null;\n }\n\n const diffMs = resetAt - now;\n if (diffMs <= 0) {\n return 0;\n }\n\n return Math.floor(diffMs / 1000);\n};\n\nexport const calculateResetAt = (\n resetAfterSeconds: number | null,\n now: number = Date.now()\n): number | null => {\n if (resetAfterSeconds === null || resetAfterSeconds === undefined) {\n return null;\n }\n\n return now + resetAfterSeconds * 1000;\n};\n\nexport const formatDuration = (seconds: number): string => {\n if (seconds <= 0) {\n return '0s';\n }\n\n const weeks = Math.floor(seconds / 604800);\n const days = Math.floor((seconds % 604800) / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (weeks > 0) parts.push(`${weeks}w`);\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 || parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(' ');\n};\n\nexport const formatResetAt = (resetAtMs: number): string => {\n return new Date(resetAtMs).toLocaleString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n });\n};\n", "import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { Logger } from './logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\n\nexport const xdgDataHome = (): string =>\n process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share');\n\nexport const xdgConfigHome = (): string =>\n process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');\n\nexport const xdgCacheHome = (): string => process.env.XDG_CACHE_HOME ?? join(homedir(), '.cache');\n\nexport const AUTH_PATHS = {\n opencode: (): string => join(xdgDataHome(), 'opencode', 'auth.json'),\n openaiPlugin: (): string => join(homedir(), '.opencode', 'auth', 'openai.json'),\n antigravityConfig: (): string => join(xdgConfigHome(), 'opencode', 'antigravity-accounts.json'),\n antigravityData: (): string => join(xdgDataHome(), 'opencode', 'antigravity-accounts.json'),\n} as const;\n\nexport const readJson = async <T>(filePath: string, logger?: Logger): Promise<T | null> => {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });\n }\n return null;\n }\n};\n\nexport const loadOpenCodeAuth = async (logger?: Logger): Promise<OpenCodeAuth | null> => {\n return readJson<OpenCodeAuth>(AUTH_PATHS.opencode(), logger);\n};\n", "import type { ProviderAlias, ProviderId } from '../../types/index.ts';\n\nexport const PROVIDER_ALIASES: Record<ProviderId, ProviderAlias[]> = {\n openai: ['openai', 'codex', 'chatgpt'],\n google: ['google', 'antigravity'],\n 'zai-coding-plan': ['zai-coding-plan', 'zai', 'z.ai'],\n};\n\nexport const parseProvider = (input?: string): ProviderId | null => {\n if (!input) {\n return null;\n }\n\n const normalized = input.trim().toLowerCase();\n for (const [providerId, aliases] of Object.entries(PROVIDER_ALIASES)) {\n if (aliases.includes(normalized as ProviderAlias)) {\n return providerId as ProviderId;\n }\n }\n\n return null;\n};\n\nexport const getProviderAliases = (provider: ProviderId): ProviderAlias[] => {\n return PROVIDER_ALIASES[provider];\n};\n", "import type {\n AntigravityAccount,\n AntigravityAccountsFile,\n OpenCodeAuth,\n ProviderAuthData,\n} from '../../types/index.ts';\nimport type { Logger } from '../common/logger.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nexport interface GoogleAuthContext {\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n projectId?: string;\n email?: string;\n}\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('google')) {\n const entry = toAuthData(auth[alias]);\n if (entry) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst toAuthContext = (entry: ProviderAuthData | null): GoogleAuthContext | null => {\n if (!entry) {\n return null;\n }\n\n const accessToken = entry.access ?? entry.token;\n let refreshToken = entry.refresh;\n let projectId: string | undefined = undefined;\n\n if (refreshToken && refreshToken.includes('|')) {\n const parts = refreshToken.split('|');\n refreshToken = parts[0];\n projectId = parts[1];\n }\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n refreshToken,\n expires: entry.expires,\n projectId,\n };\n};\n\nconst selectAccount = (accounts: AntigravityAccountsFile | null): AntigravityAccount | null => {\n if (!accounts?.accounts?.length) {\n return null;\n }\n\n const candidateIndex = accounts.activeIndex ?? 0;\n const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];\n return account ?? null;\n};\n\nconst loadAuthFromAccounts = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const configAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityConfig(),\n logger\n );\n const account = selectAccount(configAccounts);\n if (account) {\n return {\n refreshToken: account.refreshToken,\n projectId: account.projectId ?? account.managedProjectId,\n email: account.email,\n };\n }\n\n const dataAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityData(),\n logger\n );\n const fallbackAccount = selectAccount(dataAccounts);\n if (!fallbackAccount) {\n return null;\n }\n\n return {\n refreshToken: fallbackAccount.refreshToken,\n projectId: fallbackAccount.projectId ?? fallbackAccount.managedProjectId,\n email: fallbackAccount.email,\n };\n};\n\nexport const getGoogleAuth = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n const authContext = toAuthContext(openCodeAuth);\n if (authContext) {\n return authContext;\n }\n\n return loadAuthFromAccounts(logger);\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getGoogleAuth } from './auth.ts';\n\nconst GOOGLE_CLIENT_ID =\n '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';\nconst GOOGLE_CLIENT_SECRET = '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';\nconst DEFAULT_PROJECT_ID = 'rising-fact-p41fc';\nconst WINDOW_SECONDS = 5 * 60 * 60;\n\nconst ENDPOINTS: readonly string[] = [\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n 'https://autopush-cloudcode-pa.sandbox.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n];\n\nconst HEADERS = {\n 'User-Agent': 'antigravity/1.11.5 windows/amd64',\n 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\n 'Client-Metadata':\n '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}',\n} as const;\n\ninterface TokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\ninterface ModelUsageInfoResponse {\n displayName?: string;\n quotaInfo?: {\n remainingFraction?: number;\n resetTime?: string;\n };\n}\n\ninterface ModelsResponse {\n models?: Record<string, ModelUsageInfoResponse>;\n}\n\nconst refreshAccessToken = async (\n refreshToken: string,\n logger: Logger\n): Promise<TokenResponse | null> => {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: GOOGLE_CLIENT_ID,\n client_secret: GOOGLE_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n await logger.warn('Failed to refresh OAuth token for google', {\n status: response.status,\n token: maskSecret(refreshToken),\n });\n return null;\n }\n\n return (await response.json()) as TokenResponse;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.warn(`Token refresh failed for google: ${message}`);\n return null;\n }\n};\n\nconst fetchModels = async (\n accessToken: string,\n projectId: string | undefined,\n logger: Logger\n): Promise<ModelsResponse | null> => {\n const body = projectId ? { project: projectId } : {};\n\n for (const endpoint of ENDPOINTS) {\n try {\n const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n ...HEADERS,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (response.ok) {\n await logger.debug(`Fetched models from ${endpoint}`, { projectId });\n return (await response.json()) as ModelsResponse;\n }\n } catch {\n continue;\n }\n }\n\n await logger.error('Failed to fetch models from all google endpoints', { projectId });\n return null;\n};\n\nconst toWindow = (remainingFraction?: number, resetTime?: string): UsageWindow => {\n const remainingPercent =\n remainingFraction !== undefined ? Math.round(remainingFraction * 100) : null;\n const usedPercent = remainingPercent !== null ? Math.max(0, 100 - remainingPercent) : null;\n const resetAt = resetTime ? new Date(resetTime).getTime() : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: WINDOW_SECONDS,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nconst buildUsage = (data: ModelsResponse): ProviderUsage => {\n const models: Record<string, { windows: Record<string, UsageWindow> }> = {};\n\n for (const [modelName, modelData] of Object.entries(data.models ?? {})) {\n const window = toWindow(modelData.quotaInfo?.remainingFraction, modelData.quotaInfo?.resetTime);\n models[modelName] = {\n windows: {\n '5h': window,\n },\n };\n }\n\n return {\n windows: {},\n models: Object.keys(models).length ? models : undefined,\n };\n};\n\nconst resolveAccessToken = async (\n refreshToken: string | undefined,\n accessToken: string | undefined,\n expires: number | undefined,\n logger: Logger\n): Promise<string | null> => {\n const now = Date.now();\n\n if (accessToken && (!expires || expires > now)) {\n return accessToken;\n }\n\n if (!refreshToken) {\n return null;\n }\n\n const refreshed = await refreshAccessToken(refreshToken, logger);\n return refreshed?.access_token ?? null;\n};\n\nexport const fetchGoogleUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getGoogleAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for google');\n return {\n provider: 'google',\n ok: false,\n configured: false,\n error: 'Not configured - no accounts found',\n usage: null,\n };\n }\n\n const accessToken = await resolveAccessToken(\n auth.refreshToken,\n auth.accessToken,\n auth.expires,\n logger\n );\n\n if (!accessToken) {\n await logger.warn('Failed to refresh OAuth token for google', { email: auth.email });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to refresh OAuth token',\n usage: null,\n };\n }\n\n const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;\n const modelsData = await fetchModels(accessToken, projectId, logger);\n\n if (!modelsData) {\n await logger.error('Failed to fetch models from google API', { projectId });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to fetch models from API',\n usage: null,\n };\n }\n\n await logger.info('google usage fetched successfully');\n\n return {\n provider: 'google',\n ok: true,\n configured: true,\n usage: buildUsage(modelsData),\n };\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth, ProviderAuthData } from '../../types/index.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst hasAccessToken = (auth: ProviderAuthData | null): auth is ProviderAuthData => {\n return Boolean(auth?.access || auth?.token);\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('openai')) {\n const entry = toAuthData(auth[alias]);\n if (entry && hasAccessToken(entry)) {\n return entry;\n }\n }\n\n return null;\n};\n\nexport const getOpenaiAuth = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n if (openCodeAuth && hasAccessToken(openCodeAuth)) {\n return openCodeAuth;\n }\n\n const pluginAuth = await readJson<ProviderAuthData>(AUTH_PATHS.openaiPlugin(), logger);\n if (pluginAuth && hasAccessToken(pluginAuth)) {\n return pluginAuth;\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getOpenaiAuth } from './auth.ts';\n\ninterface OpenaiBackendWindow {\n used_percent: number;\n limit_window_seconds: number;\n reset_after_seconds: number;\n reset_at: number;\n}\n\ninterface OpenaiBackendResponse {\n plan_type: string;\n rate_limit: {\n allowed: boolean;\n limit_reached: boolean;\n primary_window?: OpenaiBackendWindow;\n secondary_window?: OpenaiBackendWindow;\n };\n}\n\nconst toWindow = (window?: OpenaiBackendWindow): UsageWindow | null => {\n if (!window) {\n return null;\n }\n\n const usedPercent = window.used_percent;\n const resetAt = window.reset_at ? window.reset_at * 1000 : null;\n const resetAfterSeconds = window.reset_after_seconds ?? calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent: Math.max(0, 100 - usedPercent),\n windowSeconds: window.limit_window_seconds ?? null,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchOpenaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getOpenaiAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - no OAuth token found',\n usage: null,\n };\n }\n\n const accessToken = auth.access ?? auth.token;\n if (!accessToken) {\n await logger.warn('Auth configured but access token missing for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - access token missing',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://chatgpt.com/backend-api/wham/usage', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for openai`, {\n token: maskSecret(accessToken),\n });\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as OpenaiBackendResponse;\n const primary = toWindow(payload.rate_limit.primary_window);\n const secondary = toWindow(payload.rate_limit.secondary_window);\n\n const windows: Record<string, UsageWindow> = {};\n if (primary) {\n windows['5h'] = primary;\n }\n if (secondary) {\n windows['weekly'] = secondary;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('openai usage fetched successfully');\n\n return {\n provider: 'openai',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for openai: ${message}`);\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\nimport { loadOpenCodeAuth } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst resolveAuthValue = (entry: OpenCodeAuth[string]): string | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'object') {\n return entry.api_key ?? entry.token ?? entry.key ?? null;\n }\n\n return null;\n};\n\nexport const getZaiApiKey = async (logger?: Logger): Promise<string | null> => {\n if (process.env.ZAI_API_KEY) {\n return process.env.ZAI_API_KEY;\n }\n\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('zai-coding-plan')) {\n const value = resolveAuthValue(auth[alias]);\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getZaiApiKey } from './auth.ts';\n\ninterface ZaiLimit {\n type: 'TIME_LIMIT' | 'TOKENS_LIMIT';\n unit: number;\n number: number;\n usage: number;\n currentValue: number;\n remaining: number;\n percentage: number;\n nextResetTime?: number;\n}\n\ninterface ZaiUsageResponse {\n code: number;\n msg: string;\n data?: {\n limits?: ZaiLimit[];\n };\n success: boolean;\n}\n\nconst normalizeTimestamp = (value: number): number => {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n};\n\nconst TOKEN_WINDOW_SECONDS: Record<number, number> = {\n 3: 3600,\n};\n\nconst resolveWindowSeconds = (limit?: ZaiLimit): number | null => {\n if (!limit) {\n return null;\n }\n\n if (!limit.number) {\n return null;\n }\n\n const unitSeconds = TOKEN_WINDOW_SECONDS[limit.unit];\n if (!unitSeconds) {\n return null;\n }\n\n return unitSeconds * limit.number;\n};\n\nconst resolveWindowLabel = (windowSeconds: number | null): string => {\n if (!windowSeconds) {\n return 'tokens';\n }\n\n if (windowSeconds % 86400 === 0) {\n const days = windowSeconds / 86400;\n return days === 7 ? 'weekly' : `${days}d`;\n }\n\n if (windowSeconds % 3600 === 0) {\n return `${windowSeconds / 3600}h`;\n }\n\n return `${windowSeconds}s`;\n};\n\nconst toWindow = (limit?: ZaiLimit): UsageWindow | null => {\n if (!limit) {\n return null;\n }\n\n const usedPercent = limit.percentage ?? null;\n const remainingPercent = usedPercent !== null ? Math.max(0, 100 - usedPercent) : null;\n const resetAt = limit.nextResetTime ? normalizeTimestamp(limit.nextResetTime) : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: resolveWindowSeconds(limit),\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchZaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const apiKey = await getZaiApiKey(logger);\n\n if (!apiKey) {\n await logger.warn('No auth configured for zai-coding-plan');\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: false,\n error: 'Not configured - no API key found',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://api.z.ai/api/monitor/usage/quota/limit', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for zai-coding-plan`, {\n token: maskSecret(apiKey),\n });\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as ZaiUsageResponse;\n const limits = payload.data?.limits ?? [];\n const tokensLimit = limits.find((limit) => limit.type === 'TOKENS_LIMIT');\n\n const windows: Record<string, UsageWindow> = {};\n const window = toWindow(tokensLimit);\n if (window) {\n const label = resolveWindowLabel(window.windowSeconds);\n windows[label] = window;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('zai-coding-plan usage fetched successfully');\n\n return {\n provider: 'zai-coding-plan',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for zai-coding-plan: ${message}`);\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "export type ProviderId = 'openai' | 'google' | 'zai-coding-plan';\n\nexport type ProviderAlias = ProviderId | 'codex' | 'antigravity' | 'zai' | 'z.ai' | 'chatgpt';\n\nexport type ProviderIdValues = 'openai' | 'google' | 'zai-coding-plan';\n\nexport const PROVIDERS: ProviderIdValues[] = ['openai', 'google', 'zai-coding-plan'];\n\nexport type OpenCodeAuth = Record<string, string | ProviderAuthData>;\n\nexport interface ProviderAuthData {\n type?: 'oauth' | 'api' | string;\n access?: string;\n refresh?: string;\n expires?: number;\n api_key?: string;\n token?: string;\n key?: string;\n accountId?: string;\n}\n", "export type StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nexport type StatusText = 'Critical' | 'Warning' | 'OK' | 'N/A';\n\nexport interface DashboardWindow {\n label: string;\n usedPercent: number | null;\n remainingPercent: number | null;\n status: StatusEmoji;\n statusText: StatusText;\n resetsIn: string;\n}\n\nexport interface DashboardSection {\n title: string;\n windows: DashboardWindow[];\n sections?: DashboardSection[];\n}\n\nexport interface DashboardProvider {\n name: string;\n sections: DashboardSection[];\n}\n\nexport interface DashboardData {\n providers: DashboardProvider[];\n}\n", "export type { ProviderId, ProviderAlias, OpenCodeAuth, ProviderAuthData } from './provider.ts';\nexport { PROVIDERS } from './provider.ts';\nexport type { UsageWindow, UsageWindows, ProviderUsage, ProviderResult } from './usage.ts';\nexport type { AntigravityAccount, AntigravityAccountsFile } from './google.ts';\nexport type { ToastUsageResult } from './toast.ts';\nexport * from './dashboard.js';\n", "import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';\n\nimport { xdgCacheHome } from '../providers/common/files.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport type { CacheSchema } from './types.ts';\n\nconst CACHE_DIR = (): string => `${xdgCacheHome()}/opencode/opencode-usage-plugin`;\n\nexport const CACHE_PATH = (): string => `${CACHE_DIR()}/usage.json`;\n\nconst TMP_PATH = (): string => `${CACHE_PATH()}.tmp`;\n\nconst ensureCacheDir = async (): Promise<void> => {\n try {\n await mkdir(CACHE_DIR(), { recursive: true });\n } catch (error) {\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code !== 'EEXIST'\n ) {\n throw error;\n }\n }\n};\n\nexport const readCache = async (logger?: Logger): Promise<CacheSchema | null> => {\n try {\n const content = await readFile(CACHE_PATH(), 'utf-8');\n const parsed = JSON.parse(content) as unknown;\n\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'schema_version' in parsed &&\n 'updated_at' in parsed &&\n 'refresh_interval_seconds' in parsed &&\n 'providers' in parsed\n ) {\n return parsed as CacheSchema;\n }\n\n await logger?.warn('Invalid cache schema, returning null');\n return null;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug('Cache file not found or invalid', { error: message });\n }\n return null;\n }\n};\n\nexport const writeCache = async (cache: CacheSchema, logger?: Logger): Promise<void> => {\n try {\n await ensureCacheDir();\n const content = JSON.stringify(cache, null, 2);\n await writeFile(TMP_PATH(), content, 'utf-8');\n await rename(TMP_PATH(), CACHE_PATH());\n await logger?.debug('Cache written successfully', { path: CACHE_PATH() });\n } catch (error) {\n await logger?.error('Failed to write cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const clearCache = async (logger?: Logger): Promise<void> => {\n try {\n await unlink(CACHE_PATH());\n await logger?.debug('Cache cleared', { path: CACHE_PATH() });\n } catch (error) {\n if (logger) {\n const code =\n error instanceof Error && 'code' in error ? (error as { code: string }).code : 'UNKNOWN';\n if (code === 'ENOENT') {\n await logger.debug('Cache file does not exist, nothing to clear');\n } else {\n await logger?.error('Failed to clear cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n};\n", "import type { ProviderId, ProviderUsage } from '../types/index.ts';\n\nexport const SCHEMA_VERSION = 1;\nexport const REFRESH_INTERVAL_SECONDS = 300;\nexport const STALE_THRESHOLD_MULTIPLIER = 2;\n\nexport interface ProviderCacheEntry {\n supported: boolean;\n configured: boolean;\n last_attempt_at: string;\n last_success_at: string | null;\n data: ProviderUsage | null;\n error: string | null;\n}\n\nexport interface CacheSchema {\n schema_version: number;\n updated_at: string;\n refresh_interval_seconds: number;\n providers: Record<ProviderId, ProviderCacheEntry>;\n}\n", "import { fetchGoogleUsage } from '../providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from '../providers/openai/fetch.ts';\nimport { fetchZaiUsage } from '../providers/zai-coding-plan/fetch.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from '../types/index.ts';\nimport { readCache, writeCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, SCHEMA_VERSION, type CacheSchema } from './types.ts';\n\nconst fetchUsage = async (provider: ProviderId, logger: Logger): Promise<ProviderResult> => {\n switch (provider) {\n case 'openai':\n return fetchOpenaiUsage(logger);\n case 'google':\n return fetchGoogleUsage(logger);\n case 'zai-coding-plan':\n return fetchZaiUsage(logger);\n }\n};\n\nexport const fetchAllProviders = async (logger: Logger): Promise<CacheSchema> => {\n await logger.info('Fetching usage for all providers');\n\n const existingCache = await readCache(logger);\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const providers: Record<ProviderId, CacheSchema['providers'][ProviderId]> = {} as Record<\n ProviderId,\n CacheSchema['providers'][ProviderId]\n >;\n\n const now = new Date().toISOString();\n\n for (const result of results) {\n const providerId = result.provider;\n const wasConfigured = existingCache?.providers[providerId]?.configured ?? false;\n\n providers[providerId] = {\n supported: true,\n configured: result.configured,\n last_attempt_at: now,\n last_success_at: result.ok ? now : null,\n data: result.ok ? result.usage : null,\n error: result.ok ? null : (result.error ?? null),\n };\n\n if (!result.configured && wasConfigured) {\n providers[providerId].data = null;\n await logger.debug(`Wiped data for ${providerId} (no longer configured)`);\n }\n }\n\n const cache: CacheSchema = {\n schema_version: SCHEMA_VERSION,\n updated_at: now,\n refresh_interval_seconds: REFRESH_INTERVAL_SECONDS,\n providers,\n };\n\n await writeCache(cache, logger);\n return cache;\n};\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { fetchAllProviders } from './fetcher.ts';\nimport { REFRESH_INTERVAL_SECONDS } from './types.ts';\n\nlet intervalId: ReturnType<typeof globalThis.setInterval> | null = null;\n\nexport const startWorker = (logger: Logger): void => {\n if (intervalId !== null) {\n logger.warn('Worker already started');\n return;\n }\n\n const refreshLoop = async (): Promise<void> => {\n try {\n await fetchAllProviders(logger);\n } catch (error) {\n await logger.error('Worker refresh failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n void refreshLoop();\n\n intervalId = globalThis.setInterval(refreshLoop, REFRESH_INTERVAL_SECONDS * 1000);\n\n void logger.info(`Worker started, refreshing every ${REFRESH_INTERVAL_SECONDS}s`);\n};\n\nexport const stopWorker = (logger: Logger): void => {\n if (intervalId === null) {\n return;\n }\n\n globalThis.clearInterval(intervalId);\n intervalId = null;\n\n void logger.info('Worker stopped');\n};\n\nexport const isWorkerRunning = (): boolean => intervalId !== null;\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { readCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, STALE_THRESHOLD_MULTIPLIER, type CacheSchema } from './types.ts';\n\nexport interface DisplayCache {\n providers: CacheSchema['providers'];\n updatedAt: string;\n isStale: boolean;\n}\n\nexport const loadCacheForDisplay = async (logger: Logger): Promise<DisplayCache | null> => {\n const cache = await readCache(logger);\n if (!cache) {\n await logger.warn('No cache available');\n return null;\n }\n\n const updatedAt = new Date(cache.updated_at);\n const now = new Date();\n const staleThresholdMs = REFRESH_INTERVAL_SECONDS * 1000 * STALE_THRESHOLD_MULTIPLIER;\n const isStale = now.getTime() - updatedAt.getTime() > staleThresholdMs;\n\n if (isStale) {\n await logger.debug('Cache is stale', {\n updatedAt: cache.updated_at,\n staleThresholdSeconds: REFRESH_INTERVAL_SECONDS * STALE_THRESHOLD_MULTIPLIER,\n });\n }\n\n const configuredProviders: CacheSchema['providers'] = {} as CacheSchema['providers'];\n\n for (const [providerId, entry] of Object.entries(cache.providers)) {\n if (entry.configured) {\n configuredProviders[providerId as keyof typeof configuredProviders] = entry;\n }\n }\n\n return {\n providers: configuredProviders,\n updatedAt: cache.updated_at,\n isStale,\n };\n};\n", "import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { createLogger } from './providers/common/logger.ts';\nimport { formatDashboardData, formatDashboardString } from './dashboard/format.ts';\nimport { formatUsageToast } from './toast/format.ts';\n\nexport const UsagePlugin: Plugin = async ({ client }) => {\n const logger = createLogger(client);\n\n void logger.info('UsagePlugin initialized');\n\n // Start worker immediately at plugin load\n try {\n const { startWorker } = await import('./cache/worker.ts');\n startWorker(logger);\n void logger.info('Worker started during initialization');\n } catch (error) {\n void logger.error('Failed to start worker during initialization', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const usageToastTool = tool({\n description: 'Show subscription usage as toast for OpenAI, Google, and z.ai providers',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n const toast = await formatUsageToast(displayCache, logger);\n\n await client.tui.showToast({\n body: {\n title: toast.title,\n message: toast.message,\n variant: toast.variant,\n },\n });\n\n return 'Usage displayed';\n },\n });\n\n const usageTableTool = tool({\n description:\n 'Get subscription usage data for OpenAI, Google, and z.ai providers as a formatted table',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n if (!displayCache) {\n return 'No cache available';\n }\n\n const dashboardData = formatDashboardData(displayCache);\n\n return formatDashboardString(dashboardData, displayCache.updatedAt, displayCache.isStale);\n },\n });\n\n return {\n tool: {\n usage_toast: usageToastTool,\n usage_table: usageTableTool,\n },\n async event({ event }) {\n void logger.debug('Event received', { type: event.type });\n },\n async config(config) {\n config.command = config.command ?? {};\n\n config.command['usage-toast'] = {\n template: 'Call the usage_toast tool.',\n description: 'Show subscription usage as toast notification',\n };\n\n config.command.usage = {\n template: 'Call the usage_table tool and display the formatted table.',\n description: 'Show subscription usage as formatted table',\n };\n },\n };\n};\n\nconst setupShutdownHandlers = async (): Promise<void> => {\n const { isWorkerRunning, stopWorker } = await import('./cache/worker.ts');\n const { createLogger } = await import('./providers/common/logger.ts');\n const logger = createLogger({\n app: { log: () => Promise.resolve(true) },\n } as unknown as Parameters<typeof createLogger>[0]);\n\n const onShutdown = async (): Promise<void> => {\n if (await isWorkerRunning()) {\n stopWorker(logger);\n }\n };\n\n process.on('SIGINT', onShutdown);\n process.on('SIGTERM', onShutdown);\n process.on('exit', onShutdown);\n};\n\nvoid setupShutdownHandlers();\n\nexport default UsagePlugin;\n", "import type { UsageWindows } from '../types/index.js';\n\nconst FLAGSHIP_PATTERNS: RegExp[] = [\n /claude[-\\s]*opus[-\\s]*4[-\\s.]?5/i,\n /gemini[-\\s]*3[-\\s.]?pro/i,\n /gemini[-\\s]*3[-\\s.]?flash/i,\n];\n\nexport const isFlagshipModel = (modelName: string): boolean => {\n return FLAGSHIP_PATTERNS.some((pattern) => pattern.test(modelName));\n};\n\nexport const filterFlagshipModels = (\n models?: Record<string, UsageWindows>\n): Record<string, UsageWindows> => {\n if (!models) {\n return {};\n }\n\n const filtered: Record<string, UsageWindows> = {};\n\n for (const [modelName, modelData] of Object.entries(models)) {\n if (isFlagshipModel(modelName)) {\n filtered[modelName] = modelData;\n }\n }\n\n return filtered;\n};\n", "import type { ProviderResult, UsageWindow } from '../types/index.ts';\nimport type { DisplayCache } from '../cache/reader.ts';\nimport type {\n DashboardData,\n DashboardProvider,\n DashboardSection,\n DashboardWindow,\n StatusEmoji,\n StatusText,\n} from '../types/dashboard.ts';\nimport { filterFlagshipModels } from '../toast/filter.ts';\n\nconst getStatus = (remainingPercent: number | null): { emoji: StatusEmoji; text: StatusText } => {\n if (remainingPercent === null) {\n return { emoji: '\u26AA', text: 'N/A' };\n }\n\n if (remainingPercent < 10) {\n return { emoji: '\uD83D\uDD34', text: 'Critical' };\n }\n\n if (remainingPercent < 30) {\n return { emoji: '\uD83D\uDFE1', text: 'Warning' };\n }\n\n return { emoji: '\uD83D\uDFE2', text: 'OK' };\n};\n\nexport const formatWindowLabel = (key: string): string => {\n switch (key) {\n case '5h':\n return '5h Window';\n case 'weekly':\n return 'Weekly Window';\n default:\n return `${key} Window`;\n }\n};\n\nexport const renderBar = (percent: number | null, width: number = 20): string => {\n if (percent === null) {\n return `[${'\u2591'.repeat(width)}]`;\n }\n\n // Clamp percent between 0 and 100\n const validPercent = Math.max(0, Math.min(100, percent));\n const filledLength = Math.round((validPercent / 100) * width);\n const emptyLength = width - filledLength;\n\n return `[${'\u2588'.repeat(filledLength)}${'\u2591'.repeat(emptyLength)}]`;\n};\n\nconst formatWindow = (key: string, window: UsageWindow): DashboardWindow => {\n const remainingPercent = window.remainingPercent ?? null;\n const { emoji, text } = getStatus(remainingPercent);\n\n return {\n label: formatWindowLabel(key),\n usedPercent: window.usedPercent ?? null,\n remainingPercent,\n status: emoji,\n statusText: text,\n resetsIn: window.resetAfterFormatted ?? 'N/A',\n };\n};\n\nexport const formatDashboardData = (\n input: ProviderResult[] | DisplayCache | null\n): DashboardData => {\n if (input === null) {\n return { providers: [] };\n }\n\n if (!('providers' in input)) {\n return formatDashboardDataFromResults(input);\n }\n\n return formatDashboardDataFromCache(input);\n};\n\nconst formatDashboardDataFromResults = (results: ProviderResult[]): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const result of results) {\n if (!result.usage) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = result.usage;\n\n if (result.provider === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: result.provider.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nconst formatDashboardDataFromCache = (displayCache: DisplayCache): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = entry.data;\n\n if (providerId === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: providerId.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nexport const formatDashboardString = (\n data: DashboardData,\n updatedAt?: string,\n isStale?: boolean\n): string => {\n if (data.providers.length === 0) {\n let result = 'No usage data available';\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n return result;\n }\n\n const lines: string[] = [];\n const HEADER_WIDTH = 65; // Adjust as needed to match 70 chars total roughly\n\n for (const provider of data.providers) {\n // Header: PROVIDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Calculate padding for dash line\n const providerName = provider.name;\n const dashCount = Math.max(0, HEADER_WIDTH - providerName.length - 1);\n lines.push(`${providerName} ${'\u2500'.repeat(dashCount)}`);\n\n for (let i = 0; i < provider.sections.length; i++) {\n const section = provider.sections[i];\n // Section title (e.g., Overall Usage or Model Usage)\n lines.push(section.title);\n\n // Render direct windows (e.g. Overall Usage)\n for (let j = 0; j < section.windows.length; j++) {\n const window = section.windows[j];\n const isLastWindow = j === section.windows.length - 1;\n\n const branch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastWindow ? ' ' : '\u2502 ';\n\n // Line 1: Label\n lines.push(` ${branch} ${window.label}`);\n\n // Line 2: Progress Bar + Percent + Reset\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n lines.push(\n ` ${pipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n // Spacer line unless it's the very last window of the section\n if (!isLastWindow) {\n lines.push(` ${pipe}`);\n }\n }\n\n // Render nested sections (e.g. Models)\n if (section.sections) {\n for (let k = 0; k < section.sections.length; k++) {\n const subsection = section.sections[k];\n const isLastSubsection = k === section.sections.length - 1;\n const branch = isLastSubsection ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastSubsection ? ' ' : '\u2502 ';\n\n lines.push(` ${branch} ${subsection.title}`);\n\n for (let m = 0; m < subsection.windows.length; m++) {\n const window = subsection.windows[m];\n const isLastWindow = m === subsection.windows.length - 1;\n\n // Indent deeper for windows under a model\n const subBranch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n // If we are in the last subsection, the parent pipe is space\n // If we are NOT in the last subsection, the parent pipe is \u2502\n // Wait, we need to pass down the \"continuation\" context\n\n // Line 1: Label\n lines.push(` ${pipe} ${subBranch} ${window.label}`);\n\n // Line 2\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n const subPipe = isLastWindow ? ' ' : '\u2502 ';\n\n lines.push(\n ` ${pipe} ${subPipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n if (!isLastWindow) {\n lines.push(` ${pipe} ${subPipe}`);\n }\n }\n\n if (!isLastSubsection) {\n lines.push(` ${pipe}`);\n }\n }\n }\n\n // Add empty line after section\n lines.push('');\n }\n }\n\n let result = lines.join('\\n').trim();\n\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n\n if (isStale) {\n result += ' (STALE)';\n }\n\n return result;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../types/index.js';\nimport type { ToastUsageResult } from '../types/toast.js';\nimport type { Logger } from '../providers/common/logger.js';\nimport type { DisplayCache } from '../cache/reader.js';\nimport { filterFlagshipModels } from './filter.js';\n\ntype StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nconst getStatus = (remainingPercent: number | null): StatusEmoji => {\n if (remainingPercent === null) return '\u26AA';\n if (remainingPercent < 10) return '\uD83D\uDD34';\n if (remainingPercent < 30) return '\uD83D\uDFE1';\n return '\uD83D\uDFE2';\n};\n\nconst formatWindowLine = (name: string, window: UsageWindow, isModel: boolean = false): string => {\n const used = window.usedPercent !== null ? Math.round(window.usedPercent) : 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n const remaining = window.remainingPercent ?? null;\n const emoji = isModel ? '' : `${getStatus(remaining)} `;\n const indent = isModel ? ' ' : '';\n\n // Format: \"\uD83D\uDFE2 openai 75% \u2022 2h\" or \" gemini-3-pro 48% \u2022 4h\"\n return `${indent}${emoji}${name.padEnd(isModel ? 13 : 10)} ${used}% \u2022 ${reset}`;\n};\n\nconst formatProviderSection = (provider: string, usage: ProviderUsage | null): string[] => {\n if (!usage) {\n return [`\u26AA ${provider}: Not configured`];\n }\n\n const lines: string[] = [];\n const globalWindows = Object.values(usage.windows);\n\n // Provider Line\n if (globalWindows.length > 0) {\n lines.push(formatWindowLine(provider, globalWindows[0]));\n } else {\n lines.push(`\u26AA ${provider}: No usage data`);\n }\n\n // Model Lines\n if (usage.models) {\n for (const [modelName, modelData] of Object.entries(usage.models)) {\n const modelWindow = Object.values(modelData.windows)[0];\n if (modelWindow) {\n lines.push(formatWindowLine(modelName, modelWindow, true));\n }\n }\n }\n\n return lines;\n};\n\nexport const formatUsageToast = async (\n input: ProviderResult[] | DisplayCache | null,\n logger?: Logger\n): Promise<ToastUsageResult> => {\n if (!input) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n const displayCache = 'providers' in input ? input : null;\n const results = 'providers' in input ? null : input;\n\n const lines: string[] = [];\n const contentLines: string[] = [];\n const DIVIDER = '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500';\n\n let updatedAt = '';\n let isStale = false;\n\n if (displayCache) {\n updatedAt = displayCache.updatedAt;\n isStale = displayCache.isStale;\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) continue;\n\n let usage = entry.data;\n if (providerId === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(providerId, usage));\n }\n\n if (Object.values(displayCache.providers).some((e) => e.error !== null)) {\n contentLines.push('\u26A0\uFE0F Some providers failed');\n }\n } else if (results) {\n const now = new Date();\n updatedAt = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;\n\n for (const result of results) {\n if (!result.usage) {\n await logger?.debug(`Provider ${result.provider} not configured, skipping`);\n continue;\n }\n\n let usage = result.usage;\n if (result.provider === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(result.provider, usage));\n }\n }\n\n if (contentLines.length === 0) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n lines.push(DIVIDER);\n lines.push(...contentLines);\n lines.push(DIVIDER);\n\n let footer = `Updated: ${updatedAt}`;\n if (isStale) footer += ' (stale)';\n lines.push(footer);\n\n return {\n title: '\uD83D\uDCCA Usage',\n message: lines.join('\\n'),\n variant: 'info',\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["toAuthData", "loadOpenCodeAuthEntry", "init_auth", "toWindow", "init_fetch", "init_auth", "init_auth", "toWindow", "init_fetch", "init_auth", "readFile", "init_types", "init_fetch", "init_types", "init_types", "init_types", "result", "getStatus", "startWorker", "loadCacheForDisplay", "isWorkerRunning", "stopWorker", "createLogger"]
|
|
7
7
|
}
|