@ccpocket-base-auth/bridge 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +67 -0
  2. package/dist/archive-store.d.ts +28 -0
  3. package/dist/archive-store.js +68 -0
  4. package/dist/archive-store.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +82 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/codex-process.d.ts +171 -0
  9. package/dist/codex-process.js +1928 -0
  10. package/dist/codex-process.js.map +1 -0
  11. package/dist/debug-trace-store.d.ts +15 -0
  12. package/dist/debug-trace-store.js +78 -0
  13. package/dist/debug-trace-store.js.map +1 -0
  14. package/dist/doctor.d.ts +58 -0
  15. package/dist/doctor.js +663 -0
  16. package/dist/doctor.js.map +1 -0
  17. package/dist/firebase-auth.d.ts +35 -0
  18. package/dist/firebase-auth.js +132 -0
  19. package/dist/firebase-auth.js.map +1 -0
  20. package/dist/gallery-store.d.ts +67 -0
  21. package/dist/gallery-store.js +333 -0
  22. package/dist/gallery-store.js.map +1 -0
  23. package/dist/image-store.d.ts +23 -0
  24. package/dist/image-store.js +142 -0
  25. package/dist/image-store.js.map +1 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +191 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mdns.d.ts +7 -0
  30. package/dist/mdns.js +49 -0
  31. package/dist/mdns.js.map +1 -0
  32. package/dist/parser.d.ts +465 -0
  33. package/dist/parser.js +251 -0
  34. package/dist/parser.js.map +1 -0
  35. package/dist/project-history.d.ts +10 -0
  36. package/dist/project-history.js +73 -0
  37. package/dist/project-history.js.map +1 -0
  38. package/dist/prompt-history-backup.d.ts +15 -0
  39. package/dist/prompt-history-backup.js +46 -0
  40. package/dist/prompt-history-backup.js.map +1 -0
  41. package/dist/proxy.d.ts +15 -0
  42. package/dist/proxy.js +95 -0
  43. package/dist/proxy.js.map +1 -0
  44. package/dist/push-i18n.d.ts +7 -0
  45. package/dist/push-i18n.js +75 -0
  46. package/dist/push-i18n.js.map +1 -0
  47. package/dist/push-relay.d.ts +29 -0
  48. package/dist/push-relay.js +70 -0
  49. package/dist/push-relay.js.map +1 -0
  50. package/dist/recording-store.d.ts +51 -0
  51. package/dist/recording-store.js +158 -0
  52. package/dist/recording-store.js.map +1 -0
  53. package/dist/screenshot.d.ts +28 -0
  54. package/dist/screenshot.js +98 -0
  55. package/dist/screenshot.js.map +1 -0
  56. package/dist/sdk-process.d.ts +180 -0
  57. package/dist/sdk-process.js +937 -0
  58. package/dist/sdk-process.js.map +1 -0
  59. package/dist/session.d.ts +142 -0
  60. package/dist/session.js +615 -0
  61. package/dist/session.js.map +1 -0
  62. package/dist/sessions-index.d.ts +128 -0
  63. package/dist/sessions-index.js +1767 -0
  64. package/dist/sessions-index.js.map +1 -0
  65. package/dist/setup-launchd.d.ts +8 -0
  66. package/dist/setup-launchd.js +109 -0
  67. package/dist/setup-launchd.js.map +1 -0
  68. package/dist/setup-systemd.d.ts +8 -0
  69. package/dist/setup-systemd.js +118 -0
  70. package/dist/setup-systemd.js.map +1 -0
  71. package/dist/startup-info.d.ts +8 -0
  72. package/dist/startup-info.js +92 -0
  73. package/dist/startup-info.js.map +1 -0
  74. package/dist/usage.d.ts +69 -0
  75. package/dist/usage.js +545 -0
  76. package/dist/usage.js.map +1 -0
  77. package/dist/version.d.ts +13 -0
  78. package/dist/version.js +43 -0
  79. package/dist/version.js.map +1 -0
  80. package/dist/websocket.d.ts +127 -0
  81. package/dist/websocket.js +2482 -0
  82. package/dist/websocket.js.map +1 -0
  83. package/dist/worktree-store.d.ts +25 -0
  84. package/dist/worktree-store.js +59 -0
  85. package/dist/worktree-store.js.map +1 -0
  86. package/dist/worktree.d.ts +47 -0
  87. package/dist/worktree.js +313 -0
  88. package/dist/worktree.js.map +1 -0
  89. package/package.json +68 -0
package/dist/usage.js ADDED
@@ -0,0 +1,545 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readdir, readFile, writeFile, stat } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ const CLAUDE_OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
8
+ const CLAUDE_OAUTH_TOKEN_URL = "https://platform.claude.com/v1/oauth/token";
9
+ const TOKEN_EXPIRY_SKEW_MS = 60_000;
10
+ // Mutex to prevent concurrent token refreshes from racing and invalidating
11
+ // each other's refresh tokens (OAuth servers may rotate refresh tokens).
12
+ let _refreshPromise = null;
13
+ /**
14
+ * Read Claude OAuth credentials from ~/.claude/.credentials.json,
15
+ * falling back to macOS Keychain ("Claude Code-credentials" service)
16
+ * for environments where credentials are stored there instead.
17
+ */
18
+ export async function getClaudeOAuthCredentials() {
19
+ // 1. Try file-based credentials first
20
+ const credPath = join(homedir(), ".claude", ".credentials.json");
21
+ let raw;
22
+ try {
23
+ raw = await readFile(credPath, "utf-8");
24
+ }
25
+ catch {
26
+ // File not found — will try Keychain below
27
+ }
28
+ // 2. Fallback to macOS Keychain
29
+ if (!raw && process.platform === "darwin") {
30
+ try {
31
+ const { stdout } = await execFileAsync("security", [
32
+ "find-generic-password",
33
+ "-s", "Claude Code-credentials",
34
+ "-w",
35
+ ]);
36
+ raw = stdout.trim();
37
+ }
38
+ catch {
39
+ // Keychain entry not found either
40
+ }
41
+ }
42
+ if (!raw) {
43
+ throw new Error("Claude Code credentials file not found (~/.claude/.credentials.json)");
44
+ }
45
+ try {
46
+ const payload = JSON.parse(raw);
47
+ const oauth = payload.claudeAiOauth;
48
+ if (!oauth) {
49
+ throw new Error("No OAuth payload in Claude Code credentials");
50
+ }
51
+ return {
52
+ accessToken: oauth.accessToken,
53
+ refreshToken: oauth.refreshToken,
54
+ expiresAt: oauth.expiresAt,
55
+ };
56
+ }
57
+ catch (err) {
58
+ if (err instanceof Error && err.message.includes("OAuth"))
59
+ throw err;
60
+ throw new Error("Failed to parse Claude Code credentials");
61
+ }
62
+ }
63
+ export function isTokenExpired(expiresAt) {
64
+ if (typeof expiresAt !== "number" || !Number.isFinite(expiresAt)) {
65
+ return false;
66
+ }
67
+ return Date.now() >= expiresAt - TOKEN_EXPIRY_SKEW_MS;
68
+ }
69
+ async function saveClaudeOAuthCredentials(creds) {
70
+ const credPath = join(homedir(), ".claude", ".credentials.json");
71
+ // Merge with existing file to preserve extra fields (scopes, subscriptionType, etc.)
72
+ let existing = {};
73
+ try {
74
+ const raw = await readFile(credPath, "utf-8");
75
+ existing = JSON.parse(raw);
76
+ }
77
+ catch {
78
+ // File doesn't exist or is invalid — start fresh
79
+ }
80
+ const existingOauth = (typeof existing.claudeAiOauth === "object" && existing.claudeAiOauth !== null)
81
+ ? existing.claudeAiOauth
82
+ : {};
83
+ const merged = {
84
+ ...existing,
85
+ claudeAiOauth: {
86
+ ...existingOauth,
87
+ accessToken: creds.accessToken,
88
+ refreshToken: creds.refreshToken,
89
+ expiresAt: creds.expiresAt,
90
+ },
91
+ };
92
+ await writeFile(credPath, JSON.stringify(merged), { encoding: "utf-8", mode: 0o600 });
93
+ }
94
+ async function refreshClaudeAccessTokenRaw(refreshToken) {
95
+ const body = new URLSearchParams({
96
+ grant_type: "refresh_token",
97
+ refresh_token: refreshToken,
98
+ client_id: CLAUDE_OAUTH_CLIENT_ID,
99
+ });
100
+ const res = await fetch(CLAUDE_OAUTH_TOKEN_URL, {
101
+ method: "POST",
102
+ headers: {
103
+ "content-type": "application/x-www-form-urlencoded",
104
+ },
105
+ body: body.toString(),
106
+ });
107
+ const raw = await res.text();
108
+ let data;
109
+ try {
110
+ data = JSON.parse(raw);
111
+ }
112
+ catch {
113
+ throw new Error(`OAuth token refresh failed: ${res.status} ${res.statusText}`);
114
+ }
115
+ if (!res.ok) {
116
+ const detail = data.error_description ?? data.error ?? `${res.status} ${res.statusText}`;
117
+ throw new Error(`OAuth token refresh failed: ${detail}`);
118
+ }
119
+ if (!data.access_token) {
120
+ throw new Error(`OAuth token refresh failed: ${data.error ?? "missing access_token"}`);
121
+ }
122
+ const expiresAt = typeof data.expires_in === "number"
123
+ ? Date.now() + data.expires_in * 1000
124
+ : undefined;
125
+ return {
126
+ accessToken: data.access_token,
127
+ refreshToken: data.refresh_token,
128
+ expiresAt,
129
+ };
130
+ }
131
+ /**
132
+ * Serialised wrapper around refreshClaudeAccessTokenRaw.
133
+ * If a refresh is already in-flight, callers share the same Promise so
134
+ * only ONE refresh request hits the OAuth server. This prevents
135
+ * concurrent callers from consuming a single-use refresh token twice.
136
+ */
137
+ async function refreshClaudeAccessToken(refreshToken) {
138
+ if (_refreshPromise) {
139
+ return _refreshPromise;
140
+ }
141
+ _refreshPromise = refreshClaudeAccessTokenRaw(refreshToken).finally(() => {
142
+ _refreshPromise = null;
143
+ });
144
+ return _refreshPromise;
145
+ }
146
+ export async function getValidClaudeAccessToken() {
147
+ const creds = await getClaudeOAuthCredentials();
148
+ if (creds.accessToken && !isTokenExpired(creds.expiresAt)) {
149
+ return { accessToken: creds.accessToken, refreshToken: creds.refreshToken };
150
+ }
151
+ if (!creds.refreshToken) {
152
+ throw new Error("No OAuth refresh token in Claude Code credentials");
153
+ }
154
+ const refreshed = await refreshClaudeAccessToken(creds.refreshToken);
155
+ const updatedCreds = {
156
+ accessToken: refreshed.accessToken,
157
+ refreshToken: refreshed.refreshToken ?? creds.refreshToken,
158
+ expiresAt: refreshed.expiresAt ?? creds.expiresAt,
159
+ };
160
+ try {
161
+ await saveClaudeOAuthCredentials(updatedCreds);
162
+ }
163
+ catch {
164
+ // If Keychain update fails, continue with in-memory token for this request.
165
+ }
166
+ return { accessToken: refreshed.accessToken, refreshToken: updatedCreds.refreshToken };
167
+ }
168
+ async function probeClaudeAccessToken(token) {
169
+ const res = await fetch("https://api.anthropic.com/api/oauth/usage", {
170
+ headers: {
171
+ Authorization: `Bearer ${token}`,
172
+ "anthropic-beta": "oauth-2025-04-20",
173
+ },
174
+ });
175
+ if (res.ok) {
176
+ return { ok: true };
177
+ }
178
+ return {
179
+ ok: false,
180
+ status: res.status,
181
+ detail: `API Error: ${res.status} ${res.statusText}`,
182
+ };
183
+ }
184
+ /**
185
+ * Verify that the stored Claude OAuth access token is still accepted upstream.
186
+ * This catches revoked/invalid sessions that have not yet reached expiresAt.
187
+ *
188
+ * Returns ok=false only for confirmed auth failures (401/403) or refresh errors.
189
+ * Transient upstream/network failures are tolerated so normal query startup can
190
+ * decide how to surface them.
191
+ */
192
+ export async function validateClaudeAccessToken() {
193
+ const creds = await getClaudeOAuthCredentials();
194
+ if (!creds.accessToken) {
195
+ return { ok: false, detail: "No OAuth access token in Claude Code credentials" };
196
+ }
197
+ const initial = await probeClaudeAccessToken(creds.accessToken);
198
+ if (initial.ok) {
199
+ return initial;
200
+ }
201
+ if (initial.status !== 401 && initial.status !== 403) {
202
+ return { ok: true };
203
+ }
204
+ if (!creds.refreshToken) {
205
+ return initial;
206
+ }
207
+ const refreshed = await refreshClaudeAccessToken(creds.refreshToken);
208
+ const updatedCreds = {
209
+ accessToken: refreshed.accessToken,
210
+ refreshToken: refreshed.refreshToken ?? creds.refreshToken,
211
+ expiresAt: refreshed.expiresAt ?? creds.expiresAt,
212
+ };
213
+ try {
214
+ await saveClaudeOAuthCredentials(updatedCreds);
215
+ }
216
+ catch {
217
+ // Continue even if we cannot persist; the refreshed token is still valid
218
+ // for this process.
219
+ }
220
+ return probeClaudeAccessToken(refreshed.accessToken);
221
+ }
222
+ /**
223
+ * Check Claude authentication status using **local credentials only**.
224
+ *
225
+ * This intentionally does NOT probe the upstream API to avoid redundant
226
+ * requests — the usage endpoint (`fetchClaudeUsage`) already contacts the
227
+ * same API, and firing both simultaneously causes 429 rate-limit errors.
228
+ *
229
+ * For OAuth credentials we verify:
230
+ * 1. An access token exists.
231
+ * 2. The token has not yet expired (with a small skew margin).
232
+ *
233
+ * Actual API reachability is implicitly validated by the usage fetch that
234
+ * runs in parallel on the Flutter settings screen.
235
+ */
236
+ export async function getClaudeAuthStatus() {
237
+ if (process.env.ANTHROPIC_API_KEY) {
238
+ return {
239
+ authenticated: true,
240
+ source: "api_key",
241
+ message: "Authenticated with ANTHROPIC_API_KEY.",
242
+ };
243
+ }
244
+ if (process.env.ANTHROPIC_AUTH_TOKEN) {
245
+ return {
246
+ authenticated: true,
247
+ source: "api_key",
248
+ message: "Authenticated with ANTHROPIC_AUTH_TOKEN.",
249
+ };
250
+ }
251
+ try {
252
+ const creds = await getClaudeOAuthCredentials();
253
+ if (!creds.accessToken) {
254
+ return {
255
+ authenticated: false,
256
+ source: "none",
257
+ message: "Claude Code credentials exist, but no access token was found.",
258
+ errorCode: "auth_login_required",
259
+ };
260
+ }
261
+ // Local expiry check — avoids an API round-trip.
262
+ if (creds.expiresAt && Date.now() > creds.expiresAt - TOKEN_EXPIRY_SKEW_MS) {
263
+ // Token expired or about to expire. If we have a refresh token the
264
+ // usage fetch will attempt a refresh anyway, so just flag it here.
265
+ if (creds.refreshToken) {
266
+ return {
267
+ authenticated: true,
268
+ source: "oauth",
269
+ message: "Claude Code is authenticated (token will be refreshed).",
270
+ };
271
+ }
272
+ return {
273
+ authenticated: false,
274
+ source: "none",
275
+ message: "Claude Code access token has expired.",
276
+ errorCode: "auth_login_required",
277
+ };
278
+ }
279
+ return {
280
+ authenticated: true,
281
+ source: "oauth",
282
+ message: "Claude Code is authenticated.",
283
+ };
284
+ }
285
+ catch (err) {
286
+ const detail = err instanceof Error ? err.message : String(err);
287
+ if (detail.includes("not found")) {
288
+ return {
289
+ authenticated: false,
290
+ source: "none",
291
+ message: "Claude Code is not logged in on this machine.",
292
+ errorCode: "auth_login_required",
293
+ };
294
+ }
295
+ return {
296
+ authenticated: false,
297
+ source: "none",
298
+ message: detail,
299
+ errorCode: "auth_api_error",
300
+ };
301
+ }
302
+ }
303
+ export async function fetchClaudeUsage() {
304
+ if (!process.env.BRIDGE_ENABLE_USAGE) {
305
+ return {
306
+ provider: "claude",
307
+ fiveHour: null,
308
+ sevenDay: null,
309
+ error: "Usage fetch disabled (set BRIDGE_ENABLE_USAGE=1 to enable)",
310
+ };
311
+ }
312
+ try {
313
+ const auth = await getValidClaudeAccessToken();
314
+ let token = auth.accessToken;
315
+ let res = await fetch("https://api.anthropic.com/api/oauth/usage", {
316
+ headers: {
317
+ Authorization: `Bearer ${token}`,
318
+ "anthropic-beta": "oauth-2025-04-20",
319
+ },
320
+ });
321
+ // 401 = expired/invalid token, 429 = token-level rate limit.
322
+ // In both cases a fresh token resolves the issue.
323
+ if ((res.status === 401 || res.status === 429) && auth.refreshToken) {
324
+ const refreshed = await refreshClaudeAccessToken(auth.refreshToken);
325
+ // Persist the refreshed token so subsequent callers (and the SDK)
326
+ // pick up the new access & refresh tokens.
327
+ try {
328
+ await saveClaudeOAuthCredentials({
329
+ accessToken: refreshed.accessToken,
330
+ refreshToken: refreshed.refreshToken ?? auth.refreshToken,
331
+ expiresAt: refreshed.expiresAt,
332
+ });
333
+ }
334
+ catch {
335
+ // Best-effort save — continue with in-memory token.
336
+ }
337
+ token = refreshed.accessToken;
338
+ res = await fetch("https://api.anthropic.com/api/oauth/usage", {
339
+ headers: {
340
+ Authorization: `Bearer ${token}`,
341
+ "anthropic-beta": "oauth-2025-04-20",
342
+ },
343
+ });
344
+ }
345
+ if (!res.ok) {
346
+ return {
347
+ provider: "claude",
348
+ fiveHour: null,
349
+ sevenDay: null,
350
+ error: `API error: ${res.status} ${res.statusText}`,
351
+ };
352
+ }
353
+ const data = (await res.json());
354
+ return {
355
+ provider: "claude",
356
+ fiveHour: data.five_hour
357
+ ? { utilization: data.five_hour.utilization, resetsAt: data.five_hour.resets_at }
358
+ : null,
359
+ sevenDay: data.seven_day
360
+ ? { utilization: data.seven_day.utilization, resetsAt: data.seven_day.resets_at }
361
+ : null,
362
+ };
363
+ }
364
+ catch (err) {
365
+ return {
366
+ provider: "claude",
367
+ fiveHour: null,
368
+ sevenDay: null,
369
+ error: err instanceof Error ? err.message : String(err),
370
+ };
371
+ }
372
+ }
373
+ /**
374
+ * Find the latest token_count event from Codex session files.
375
+ * Scans the most recent session directories (last 7 days).
376
+ */
377
+ export async function fetchCodexUsage() {
378
+ try {
379
+ const sessionsDir = join(homedir(), ".codex", "sessions");
380
+ // Check if sessions directory exists
381
+ try {
382
+ await stat(sessionsDir);
383
+ }
384
+ catch {
385
+ return {
386
+ provider: "codex",
387
+ fiveHour: null,
388
+ sevenDay: null,
389
+ error: "Codex sessions directory not found",
390
+ };
391
+ }
392
+ // Find recent session files (last 7 days)
393
+ const sessionFiles = await findRecentSessionFiles(sessionsDir, 7);
394
+ if (sessionFiles.length === 0) {
395
+ return {
396
+ provider: "codex",
397
+ fiveHour: null,
398
+ sevenDay: null,
399
+ error: "No recent Codex sessions found",
400
+ };
401
+ }
402
+ // Search from newest file for the latest token_count event
403
+ for (const filePath of sessionFiles) {
404
+ const event = await findLatestTokenCount(filePath);
405
+ if (event?.payload.rate_limits) {
406
+ const rl = event.payload.rate_limits;
407
+ return {
408
+ provider: "codex",
409
+ fiveHour: rl.primary
410
+ ? {
411
+ utilization: rl.primary.used_percent,
412
+ resetsAt: new Date(rl.primary.resets_at * 1000).toISOString(),
413
+ }
414
+ : null,
415
+ sevenDay: rl.secondary
416
+ ? {
417
+ utilization: rl.secondary.used_percent,
418
+ resetsAt: new Date(rl.secondary.resets_at * 1000).toISOString(),
419
+ }
420
+ : null,
421
+ };
422
+ }
423
+ }
424
+ return {
425
+ provider: "codex",
426
+ fiveHour: null,
427
+ sevenDay: null,
428
+ error: "No rate limit data found in recent Codex sessions",
429
+ };
430
+ }
431
+ catch (err) {
432
+ return {
433
+ provider: "codex",
434
+ fiveHour: null,
435
+ sevenDay: null,
436
+ error: err instanceof Error ? err.message : String(err),
437
+ };
438
+ }
439
+ }
440
+ /**
441
+ * Walk the sessions directory to find .jsonl files, sorted newest first.
442
+ */
443
+ async function findRecentSessionFiles(sessionsDir, maxDays) {
444
+ const files = [];
445
+ const cutoff = Date.now() - maxDays * 24 * 60 * 60 * 1000;
446
+ // Walk year/month/day directories
447
+ try {
448
+ const years = await readdir(sessionsDir);
449
+ for (const year of years) {
450
+ if (!year.match(/^\d{4}$/))
451
+ continue;
452
+ const yearDir = join(sessionsDir, year);
453
+ let months;
454
+ try {
455
+ months = await readdir(yearDir);
456
+ }
457
+ catch {
458
+ continue;
459
+ }
460
+ for (const month of months) {
461
+ if (!month.match(/^\d{2}$/))
462
+ continue;
463
+ const monthDir = join(yearDir, month);
464
+ let days;
465
+ try {
466
+ days = await readdir(monthDir);
467
+ }
468
+ catch {
469
+ continue;
470
+ }
471
+ for (const day of days) {
472
+ if (!day.match(/^\d{2}$/))
473
+ continue;
474
+ const dayDir = join(monthDir, day);
475
+ let entries;
476
+ try {
477
+ entries = await readdir(dayDir);
478
+ }
479
+ catch {
480
+ continue;
481
+ }
482
+ for (const entry of entries) {
483
+ if (!entry.endsWith(".jsonl"))
484
+ continue;
485
+ const filePath = join(dayDir, entry);
486
+ try {
487
+ const s = await stat(filePath);
488
+ if (s.mtimeMs >= cutoff) {
489
+ files.push({ path: filePath, mtime: s.mtimeMs });
490
+ }
491
+ }
492
+ catch {
493
+ continue;
494
+ }
495
+ }
496
+ }
497
+ }
498
+ }
499
+ }
500
+ catch {
501
+ // Sessions directory not readable
502
+ }
503
+ // Sort newest first
504
+ files.sort((a, b) => b.mtime - a.mtime);
505
+ return files.map((f) => f.path);
506
+ }
507
+ /**
508
+ * Read a JSONL file from the end and find the latest token_count event.
509
+ */
510
+ async function findLatestTokenCount(filePath) {
511
+ try {
512
+ const content = await readFile(filePath, "utf-8");
513
+ const lines = content.trim().split("\n");
514
+ // Search from the end for the most recent token_count
515
+ for (let i = lines.length - 1; i >= 0; i--) {
516
+ const line = lines[i].trim();
517
+ if (!line || !line.includes("token_count"))
518
+ continue;
519
+ try {
520
+ const event = JSON.parse(line);
521
+ if (event.type === "event_msg" &&
522
+ event.payload?.type === "token_count" &&
523
+ event.payload?.rate_limits) {
524
+ return event;
525
+ }
526
+ }
527
+ catch {
528
+ continue;
529
+ }
530
+ }
531
+ }
532
+ catch {
533
+ // File not readable
534
+ }
535
+ return null;
536
+ }
537
+ // ── Combined ──
538
+ export async function fetchAllUsage() {
539
+ const [claude, codex] = await Promise.all([
540
+ fetchClaudeUsage(),
541
+ fetchCodexUsage(),
542
+ ]);
543
+ return [claude, codex];
544
+ }
545
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface VersionInfo {
2
+ version: string;
3
+ nodeVersion: string;
4
+ platform: NodeJS.Platform;
5
+ arch: NodeJS.Architecture;
6
+ startedAt: string;
7
+ uptime: number;
8
+ gitCommit?: string;
9
+ gitBranch?: string;
10
+ }
11
+ /** Returns the package version string (e.g. "1.17.1"). */
12
+ export declare function getPackageVersion(): string;
13
+ export declare function getVersionInfo(serverStartedAt: number): VersionInfo;
@@ -0,0 +1,43 @@
1
+ import { execSync } from "node:child_process";
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ // Read package.json version at module load time
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const packagePath = join(__dirname, "..", "package.json");
8
+ const packageJson = JSON.parse(readFileSync(packagePath, "utf-8"));
9
+ // Capture git info at startup (optional, may fail in non-git environments)
10
+ function getGitInfo() {
11
+ try {
12
+ const commit = execSync("git rev-parse --short HEAD", {
13
+ encoding: "utf-8",
14
+ stdio: ["pipe", "pipe", "pipe"],
15
+ }).trim();
16
+ const branch = execSync("git rev-parse --abbrev-ref HEAD", {
17
+ encoding: "utf-8",
18
+ stdio: ["pipe", "pipe", "pipe"],
19
+ }).trim();
20
+ return { commit, branch };
21
+ }
22
+ catch {
23
+ return {};
24
+ }
25
+ }
26
+ const gitInfo = getGitInfo();
27
+ /** Returns the package version string (e.g. "1.17.1"). */
28
+ export function getPackageVersion() {
29
+ return packageJson.version;
30
+ }
31
+ export function getVersionInfo(serverStartedAt) {
32
+ return {
33
+ version: packageJson.version,
34
+ nodeVersion: process.version,
35
+ platform: process.platform,
36
+ arch: process.arch,
37
+ startedAt: new Date(serverStartedAt).toISOString(),
38
+ uptime: Math.floor((Date.now() - serverStartedAt) / 1000),
39
+ ...(gitInfo.commit && { gitCommit: gitInfo.commit }),
40
+ ...(gitInfo.branch && { gitBranch: gitInfo.branch }),
41
+ };
42
+ }
43
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,gDAAgD;AAChD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE,2EAA2E;AAC3E,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,4BAA4B,EAAE;YACpD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,QAAQ,CAAC,iCAAiC,EAAE;YACzD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAa7B,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,eAAuB;IACpD,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE;QAClD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;QACzD,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACpD,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC"}