@arandevcode/opencode-quota-extended 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README-es.md +153 -0
  3. package/README.md +154 -0
  4. package/bin/quota.mjs +105 -0
  5. package/dist/config/defaults.d.ts +16 -0
  6. package/dist/config/defaults.d.ts.map +1 -0
  7. package/dist/config/defaults.js +15 -0
  8. package/dist/config/defaults.js.map +1 -0
  9. package/dist/config/index.html +26 -0
  10. package/dist/config/loader.d.ts +10 -0
  11. package/dist/config/loader.d.ts.map +1 -0
  12. package/dist/config/loader.js +89 -0
  13. package/dist/config/loader.js.map +1 -0
  14. package/dist/config/schema.d.ts +16 -0
  15. package/dist/config/schema.d.ts.map +1 -0
  16. package/dist/config/schema.js +28 -0
  17. package/dist/config/schema.js.map +1 -0
  18. package/dist/index.d.ts +14 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.html +29 -0
  21. package/dist/index.js +8 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/lib/auth.d.ts +45 -0
  24. package/dist/lib/auth.d.ts.map +1 -0
  25. package/dist/lib/auth.js +68 -0
  26. package/dist/lib/auth.js.map +1 -0
  27. package/dist/lib/http.d.ts +15 -0
  28. package/dist/lib/http.d.ts.map +1 -0
  29. package/dist/lib/http.js +30 -0
  30. package/dist/lib/http.js.map +1 -0
  31. package/dist/lib/index.html +46 -0
  32. package/dist/lib/opencode-go-config.d.ts +22 -0
  33. package/dist/lib/opencode-go-config.d.ts.map +1 -0
  34. package/dist/lib/opencode-go-config.js +92 -0
  35. package/dist/lib/opencode-go-config.js.map +1 -0
  36. package/dist/lib/reset-format.d.ts +9 -0
  37. package/dist/lib/reset-format.d.ts.map +1 -0
  38. package/dist/lib/reset-format.js +83 -0
  39. package/dist/lib/reset-format.js.map +1 -0
  40. package/dist/lib/sanitize.d.ts +10 -0
  41. package/dist/lib/sanitize.d.ts.map +1 -0
  42. package/dist/lib/sanitize.js +14 -0
  43. package/dist/lib/sanitize.js.map +1 -0
  44. package/dist/lib/throttle.d.ts +18 -0
  45. package/dist/lib/throttle.d.ts.map +1 -0
  46. package/dist/lib/throttle.js +26 -0
  47. package/dist/lib/throttle.js.map +1 -0
  48. package/dist/lib/toast-format.d.ts +24 -0
  49. package/dist/lib/toast-format.d.ts.map +1 -0
  50. package/dist/lib/toast-format.js +79 -0
  51. package/dist/lib/toast-format.js.map +1 -0
  52. package/dist/lib/types.d.ts +50 -0
  53. package/dist/lib/types.d.ts.map +1 -0
  54. package/dist/lib/types.js +10 -0
  55. package/dist/lib/types.js.map +1 -0
  56. package/dist/providers/copilot.d.ts +3 -0
  57. package/dist/providers/copilot.d.ts.map +1 -0
  58. package/dist/providers/copilot.js +303 -0
  59. package/dist/providers/copilot.js.map +1 -0
  60. package/dist/providers/index.html +34 -0
  61. package/dist/providers/openai.d.ts +10 -0
  62. package/dist/providers/openai.d.ts.map +1 -0
  63. package/dist/providers/openai.js +152 -0
  64. package/dist/providers/openai.js.map +1 -0
  65. package/dist/providers/opencode-go.d.ts +12 -0
  66. package/dist/providers/opencode-go.d.ts.map +1 -0
  67. package/dist/providers/opencode-go.js +102 -0
  68. package/dist/providers/opencode-go.js.map +1 -0
  69. package/dist/providers/registry.d.ts +20 -0
  70. package/dist/providers/registry.d.ts.map +1 -0
  71. package/dist/providers/registry.js +76 -0
  72. package/dist/providers/registry.js.map +1 -0
  73. package/dist/providers/types.d.ts +27 -0
  74. package/dist/providers/types.d.ts.map +1 -0
  75. package/dist/providers/types.js +2 -0
  76. package/dist/providers/types.js.map +1 -0
  77. package/dist/server.d.ts +10 -0
  78. package/dist/server.d.ts.map +1 -0
  79. package/dist/server.js +4 -0
  80. package/dist/server.js.map +1 -0
  81. package/dist/tui.d.ts +7 -0
  82. package/dist/tui.d.ts.map +1 -0
  83. package/dist/tui.tsx +121 -0
  84. package/dist/ui/SidebarPanel.d.ts +10 -0
  85. package/dist/ui/SidebarPanel.d.ts.map +1 -0
  86. package/dist/ui/SidebarPanel.tsx +36 -0
  87. package/dist/ui/cards.d.ts +13 -0
  88. package/dist/ui/cards.d.ts.map +1 -0
  89. package/dist/ui/cards.tsx +117 -0
  90. package/dist/ui/index.html +24 -0
  91. package/dist/ui/progress-bar.d.ts +27 -0
  92. package/dist/ui/progress-bar.d.ts.map +1 -0
  93. package/dist/ui/progress-bar.js +48 -0
  94. package/dist/ui/progress-bar.js.map +1 -0
  95. package/images/opencode_quota_extended_cli.png +0 -0
  96. package/images/opencode_quota_extended_sidebar.png +0 -0
  97. package/package.json +74 -0
@@ -0,0 +1,79 @@
1
+ import { formatResetRelative, clampPercent } from "./reset-format.js";
2
+ function padRight(text, width) {
3
+ if (text.length >= width)
4
+ return text;
5
+ return text + " ".repeat(width - text.length);
6
+ }
7
+ function padLeft(text, width) {
8
+ if (text.length >= width)
9
+ return text;
10
+ return " ".repeat(width - text.length) + text;
11
+ }
12
+ function formatProviderHeader(provider) {
13
+ return provider.label;
14
+ }
15
+ function formatWindowLine(provider, window, now) {
16
+ const label = padRight(window.label, 7);
17
+ const countdown = formatResetRelative(window.resetTimeIso, now);
18
+ const reset = padRight(countdown, 11);
19
+ const percent = `${clampPercent(window.percentRemaining)}%`;
20
+ const percentCell = padLeft(percent, 4);
21
+ // Copilot exposes remaining/total counts — surface them after the percent.
22
+ let suffix = "";
23
+ if (provider.id === "github-copilot" &&
24
+ typeof window.remaining === "number" &&
25
+ typeof window.total === "number") {
26
+ suffix = ` (${window.remaining}/${window.total})`;
27
+ }
28
+ return ` ${label} ${reset} ${percentCell}${suffix}`;
29
+ }
30
+ function formatProviderBlock(provider, now) {
31
+ if (provider.status !== "ok" || provider.windows.length === 0)
32
+ return [];
33
+ const lines = [{ text: formatProviderHeader(provider) }];
34
+ for (const window of provider.windows) {
35
+ lines.push({ text: formatWindowLine(provider, window, now) });
36
+ }
37
+ return lines;
38
+ }
39
+ function formatProviderError(provider) {
40
+ if (provider.status === "ok")
41
+ return null;
42
+ // Skip purely "skipped" providers (no auth configured) — they would spam
43
+ // the toast every time it fires. Surface only real errors.
44
+ if (provider.status === "skipped" || provider.status === "no-auth") {
45
+ return null;
46
+ }
47
+ const reason = provider.error ?? provider.status;
48
+ return { text: `${provider.label}: ${reason}` };
49
+ }
50
+ /**
51
+ * Render a CardsSnapshot to a multi-line toast string, or `null` if there
52
+ * is nothing meaningful to display.
53
+ */
54
+ export function formatToastMessage(snapshot, opts = {}) {
55
+ const now = opts.now ?? new Date();
56
+ const maxWidth = opts.maxLineWidth ?? 60;
57
+ const lines = [];
58
+ for (const provider of snapshot.providers) {
59
+ const block = formatProviderBlock(provider, now);
60
+ if (block.length > 0) {
61
+ lines.push(...block);
62
+ }
63
+ }
64
+ const errors = [];
65
+ for (const provider of snapshot.providers) {
66
+ const err = formatProviderError(provider);
67
+ if (err)
68
+ errors.push(err);
69
+ }
70
+ if (errors.length > 0) {
71
+ if (lines.length > 0)
72
+ lines.push({ text: "" });
73
+ lines.push(...errors);
74
+ }
75
+ if (lines.length === 0)
76
+ return null;
77
+ return lines.map((l) => l.text.slice(0, maxWidth)).join("\n");
78
+ }
79
+ //# sourceMappingURL=toast-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast-format.js","sourceRoot":"","sources":["../../src/lib/toast-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Core type definitions for opencode-quota-extended.
3
+ *
4
+ * The plugin models each provider as a list of independent usage windows
5
+ * (5h, weekly, monthly, code review, etc.). Each window has a percent
6
+ * remaining (0-100) and an optional reset time. The TUI sidebar renders
7
+ * one card per window with a progress bar.
8
+ */
9
+ /** Known window identifiers (used to match multi-window providers). */
10
+ export type WindowId = "5h" | "weekly" | "monthly" | "code-review" | "primary";
11
+ /** A single usage window for a provider. */
12
+ export interface QuotaWindow {
13
+ /** Stable window id. */
14
+ id: WindowId;
15
+ /** Human-readable short label, e.g. "5h", "Weekly", "Monthly", "Code Review". */
16
+ label: string;
17
+ /** Percent remaining (0-100). Higher = more quota available. */
18
+ percentRemaining: number;
19
+ /** ISO timestamp when the window resets, if known. */
20
+ resetTimeIso?: string;
21
+ /** Total quota for the window, if exposed by the provider (e.g. GitHub Copilot premium requests). */
22
+ total?: number;
23
+ /** Used quota for the window, if exposed by the provider. */
24
+ used?: number;
25
+ /** Remaining quota for the window, if exposed by the provider. */
26
+ remaining?: number;
27
+ }
28
+ /** Status of a single provider fetch. */
29
+ export type ProviderStatus = "ok" | "no-auth" | "error" | "skipped" | "loading";
30
+ /** A single provider's quota result. */
31
+ export interface ProviderQuota {
32
+ /** Stable provider id, e.g. "openai", "github-copilot", "opencode-go". */
33
+ id: string;
34
+ /** Display name shown in the sidebar header, e.g. "OpenAI (Pro)". */
35
+ label: string;
36
+ /** Current status. */
37
+ status: ProviderStatus;
38
+ /** Optional error message when status === "error". */
39
+ error?: string;
40
+ /** Per-window usage data. Empty if status !== "ok". */
41
+ windows: QuotaWindow[];
42
+ /** Timestamp the snapshot was taken. */
43
+ fetchedAt: string;
44
+ }
45
+ /** Aggregate snapshot used by the TUI sidebar and the server tool. */
46
+ export interface CardsSnapshot {
47
+ generatedAt: string;
48
+ providers: ProviderQuota[];
49
+ }
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uEAAuE;AACvE,MAAM,MAAM,QAAQ,GAChB,IAAI,GACJ,QAAQ,GACR,SAAS,GACT,aAAa,GACb,SAAS,CAAC;AAEd,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,EAAE,EAAE,QAAQ,CAAC;IACb,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qGAAqG;IACrG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yCAAyC;AACzC,MAAM,MAAM,cAAc,GACtB,IAAI,GACJ,SAAS,GACT,OAAO,GACP,SAAS,GACT,SAAS,CAAC;AAEd,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Core type definitions for opencode-quota-extended.
3
+ *
4
+ * The plugin models each provider as a list of independent usage windows
5
+ * (5h, weekly, monthly, code review, etc.). Each window has a percent
6
+ * remaining (0-100) and an optional reset time. The TUI sidebar renders
7
+ * one card per window with a progress bar.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,3 @@
1
+ import type { Provider } from "./types.js";
2
+ export declare const copilotProvider: Provider;
3
+ //# sourceMappingURL=copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/providers/copilot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AA2M5D,eAAO,MAAM,eAAe,EAAE,QA4H7B,CAAC"}
@@ -0,0 +1,303 @@
1
+ import { readAuthFileCached } from "../lib/auth.js";
2
+ import { fetchWithTimeout } from "../lib/http.js";
3
+ const COPILOT_INTERNAL_URL = "https://api.github.com/copilot_internal/user";
4
+ const USER_AGENT = "opencode-quota-extended/0.1.0";
5
+ const COPILOT_PLAN_LIMITS = {
6
+ free: 50,
7
+ pro: 300,
8
+ "pro+": 1500,
9
+ business: 300,
10
+ enterprise: 1000,
11
+ individual: 1500,
12
+ };
13
+ const PLAN_DISPLAY = {
14
+ free: "Free",
15
+ pro: "Pro",
16
+ "pro+": "Pro+",
17
+ business: "Business",
18
+ enterprise: "Enterprise",
19
+ individual: "Individual",
20
+ };
21
+ const TOTAL_PATHS = [
22
+ ["quota", "limit"],
23
+ ["quota", "total"],
24
+ ["monthly_quota", "limit"],
25
+ ["monthly_quota", "total"],
26
+ ["monthly_premium_requests", "limit"],
27
+ ["monthly_premium_requests", "total"],
28
+ ["premium_requests", "limit"],
29
+ ["premium_requests", "total"],
30
+ ["quota_snapshots", "premium_interactions", "entitlement"],
31
+ ["limit"],
32
+ ["total"],
33
+ ["quota_limit"],
34
+ ["monthly_limit"],
35
+ ["included_premium_requests"],
36
+ ];
37
+ const USED_PATHS = [
38
+ ["quota", "used"],
39
+ ["monthly_quota", "used"],
40
+ ["monthly_premium_requests", "used"],
41
+ ["premium_requests", "used"],
42
+ ["used"],
43
+ ["quota_used"],
44
+ ["monthly_used"],
45
+ ["premium_requests_used"],
46
+ ];
47
+ const REMAINING_PATHS = [
48
+ ["quota", "remaining"],
49
+ ["monthly_quota", "remaining"],
50
+ ["monthly_premium_requests", "remaining"],
51
+ ["premium_requests", "remaining"],
52
+ ["quota_snapshots", "premium_interactions", "remaining"],
53
+ ["quota_snapshots", "premium_interactions", "quota_remaining"],
54
+ ["remaining"],
55
+ ["quota_remaining"],
56
+ ["monthly_remaining"],
57
+ ["premium_requests_remaining"],
58
+ ];
59
+ const RESET_PATHS = [
60
+ ["quota", "reset_at"],
61
+ ["monthly_quota", "reset_at"],
62
+ ["monthly_premium_requests", "reset_at"],
63
+ ["premium_requests", "reset_at"],
64
+ ["reset_at"],
65
+ ["quota_reset_date_utc"],
66
+ ["quota_reset_date"],
67
+ ["quota_reset_at"],
68
+ ];
69
+ const TIER_PATHS = [
70
+ ["plan", "type"],
71
+ ["plan", "name"],
72
+ ["plan"],
73
+ ["copilot_plan"],
74
+ ["subscription_plan"],
75
+ ["sku"],
76
+ ];
77
+ function getNested(source, path) {
78
+ let cur = source;
79
+ for (const key of path) {
80
+ if (cur === null || typeof cur !== "object")
81
+ return undefined;
82
+ cur = cur[key];
83
+ }
84
+ return cur;
85
+ }
86
+ function getFirstNumber(source, paths) {
87
+ for (const p of paths) {
88
+ const v = getNested(source, p);
89
+ if (typeof v === "number" && Number.isFinite(v))
90
+ return v;
91
+ if (typeof v === "string") {
92
+ const n = Number(v);
93
+ if (Number.isFinite(n))
94
+ return n;
95
+ }
96
+ }
97
+ return undefined;
98
+ }
99
+ function getFirstString(source, paths) {
100
+ for (const p of paths) {
101
+ const v = getNested(source, p);
102
+ if (typeof v === "string" && v.trim().length > 0)
103
+ return v;
104
+ }
105
+ return undefined;
106
+ }
107
+ function normalizeTier(raw) {
108
+ if (!raw)
109
+ return undefined;
110
+ const v = raw.trim().toLowerCase();
111
+ if (v === "free")
112
+ return "free";
113
+ if (v === "pro")
114
+ return "pro";
115
+ if (v === "pro+" || v === "pro_plus" || v === "pro-plus")
116
+ return "pro+";
117
+ if (v === "business")
118
+ return "business";
119
+ if (v === "enterprise")
120
+ return "enterprise";
121
+ if (v === "individual")
122
+ return "individual";
123
+ return undefined;
124
+ }
125
+ function tierDisplay(tier) {
126
+ if (!tier)
127
+ return "";
128
+ return PLAN_DISPLAY[tier] ?? tier.charAt(0).toUpperCase() + tier.slice(1);
129
+ }
130
+ function tierLimit(tier) {
131
+ if (!tier)
132
+ return undefined;
133
+ return COPILOT_PLAN_LIMITS[tier];
134
+ }
135
+ function getFirstPremiumSnapshot(data) {
136
+ const snapshots = data.quota_snapshots;
137
+ if (!snapshots || typeof snapshots !== "object")
138
+ return null;
139
+ const s = snapshots;
140
+ for (const key of ["premium_interactions", "chat", "completions"]) {
141
+ const snap = s[key];
142
+ if (snap && typeof snap === "object")
143
+ return snap;
144
+ }
145
+ return null;
146
+ }
147
+ function approxNextMonthResetIso() {
148
+ const now = new Date();
149
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1)).toISOString();
150
+ }
151
+ function parseResetIso(raw) {
152
+ if (!raw)
153
+ return undefined;
154
+ const trimmed = raw.trim();
155
+ if (!trimmed)
156
+ return undefined;
157
+ if (/^\d+$/.test(trimmed)) {
158
+ const ms = Number(trimmed) * (trimmed.length > 10 ? 1 : 1000);
159
+ const d = new Date(ms);
160
+ return Number.isNaN(d.getTime()) ? undefined : d.toISOString();
161
+ }
162
+ const d = new Date(trimmed);
163
+ if (Number.isNaN(d.getTime()))
164
+ return undefined;
165
+ return d.toISOString();
166
+ }
167
+ function pickAuthEntry(auth) {
168
+ if (!auth)
169
+ return null;
170
+ const entry = (auth["github-copilot"] ?? auth.copilot);
171
+ if (!entry)
172
+ return null;
173
+ const hasAccess = typeof entry.access === "string" && entry.access.length > 0;
174
+ const hasKey = typeof entry.key === "string" && entry.key.length > 0;
175
+ if (!hasAccess && !hasKey)
176
+ return null;
177
+ return entry;
178
+ }
179
+ function isOAuthEntry(entry) {
180
+ if (entry.type === "oauth")
181
+ return true;
182
+ if (entry.type === "api")
183
+ return false;
184
+ return typeof entry.access === "string" && entry.access.length > 0;
185
+ }
186
+ function isPatEntry(entry) {
187
+ return entry.type === "api" && typeof entry.key === "string" && entry.key.length > 0;
188
+ }
189
+ function err(fetchedAt, msg) {
190
+ return { id: "github-copilot", label: "GitHub Copilot", status: "error", error: msg, windows: [], fetchedAt };
191
+ }
192
+ export const copilotProvider = {
193
+ id: "github-copilot",
194
+ defaultLabel: "GitHub Copilot",
195
+ async isAvailable(_ctx) {
196
+ const auth = await readAuthFileCached(5_000);
197
+ return pickAuthEntry(auth) !== null;
198
+ },
199
+ async fetch(ctx) {
200
+ const fetchedAt = new Date().toISOString();
201
+ try {
202
+ const auth = await readAuthFileCached(5_000);
203
+ const entry = pickAuthEntry(auth);
204
+ if (!entry)
205
+ return { id: "github-copilot", label: "GitHub Copilot", status: "no-auth", windows: [], fetchedAt };
206
+ if (isPatEntry(entry)) {
207
+ return err(fetchedAt, !entry.key ? "Missing PAT" : "PAT mode: tier-specific math not supported");
208
+ }
209
+ if (!isOAuthEntry(entry))
210
+ return err(fetchedAt, "Unsupported Copilot auth type");
211
+ const res = await fetchWithTimeout(COPILOT_INTERNAL_URL, {
212
+ headers: {
213
+ Authorization: `Bearer ${entry.access}`,
214
+ Accept: "application/vnd.github+json",
215
+ "X-GitHub-Api-Version": "2022-11-28",
216
+ "User-Agent": USER_AGENT,
217
+ },
218
+ }, ctx.requestTimeoutMs);
219
+ if (!res.ok) {
220
+ let snippet = "";
221
+ try {
222
+ snippet = (await res.text()).slice(0, 120);
223
+ }
224
+ catch { }
225
+ return err(fetchedAt, `Copilot API error ${res.status}: ${snippet}`);
226
+ }
227
+ const data = (await res.json());
228
+ const tierRaw = getFirstString(data, TIER_PATHS);
229
+ const tier = normalizeTier(tierRaw);
230
+ const tierShown = tierDisplay(tier);
231
+ let total = getFirstNumber(data, TOTAL_PATHS);
232
+ let used = getFirstNumber(data, USED_PATHS);
233
+ const remaining = getFirstNumber(data, REMAINING_PATHS);
234
+ if (total === undefined && used !== undefined && remaining !== undefined)
235
+ total = used + remaining;
236
+ if (used === undefined && total !== undefined && remaining !== undefined) {
237
+ used = Math.max(0, total - remaining);
238
+ }
239
+ if (total === undefined && tier)
240
+ total = tierLimit(tier);
241
+ const resetIso = parseResetIso(getFirstString(data, RESET_PATHS)) ?? approxNextMonthResetIso();
242
+ if (!Number.isFinite(total) || total === undefined || total <= 0) {
243
+ const snap = getFirstPremiumSnapshot(data);
244
+ if (snap) {
245
+ const sTotal = getFirstNumber(snap, [["entitlement"]]);
246
+ const sRemaining = getFirstNumber(snap, [["remaining"], ["quota_remaining"]]);
247
+ if (sTotal && sTotal > 0) {
248
+ const ratio = sRemaining !== undefined ? sRemaining / sTotal : 1;
249
+ const pct = Math.max(0, Math.min(100, Math.floor(ratio * 100)));
250
+ const fallbackTotal = sTotal;
251
+ const fallbackRemaining = sRemaining ?? 0;
252
+ const fallbackUsed = fallbackTotal - fallbackRemaining;
253
+ const window = {
254
+ id: "primary",
255
+ label: "Premium requests",
256
+ percentRemaining: pct,
257
+ resetTimeIso: resetIso,
258
+ total: fallbackTotal,
259
+ used: fallbackUsed,
260
+ remaining: fallbackRemaining,
261
+ };
262
+ return {
263
+ id: "github-copilot",
264
+ label: tierShown ? `GitHub Copilot (${tierShown})` : "GitHub Copilot",
265
+ status: "ok",
266
+ windows: [window],
267
+ fetchedAt,
268
+ };
269
+ }
270
+ }
271
+ return err(fetchedAt, "No Copilot quota data in response");
272
+ }
273
+ if (used === undefined)
274
+ used = 0;
275
+ used = Math.max(0, used);
276
+ const remainingComputed = Math.max(0, total - used);
277
+ const percent = Math.max(0, Math.min(100, Math.floor((remainingComputed * 100) / total)));
278
+ const usedValue = used;
279
+ const remainingValue = remainingComputed;
280
+ const window = {
281
+ id: "primary",
282
+ label: "Premium requests",
283
+ percentRemaining: percent,
284
+ resetTimeIso: resetIso,
285
+ total,
286
+ used: usedValue,
287
+ remaining: remainingValue,
288
+ };
289
+ return {
290
+ id: "github-copilot",
291
+ label: tierShown ? `GitHub Copilot (${tierShown})` : "GitHub Copilot",
292
+ status: "ok",
293
+ windows: [window],
294
+ fetchedAt,
295
+ };
296
+ }
297
+ catch (e) {
298
+ const message = e instanceof Error ? e.message : String(e);
299
+ return err(fetchedAt, message.slice(0, 200));
300
+ }
301
+ },
302
+ };
303
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/providers/copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE HTML>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Directory listing for /opencode-personal-projects/opencode-quota-extended/dist/providers/</title>
6
+ </head>
7
+ <body>
8
+ <h1>Directory listing for /opencode-personal-projects/opencode-quota-extended/dist/providers/</h1>
9
+ <hr>
10
+ <ul>
11
+ <li><a href="copilot.d.ts">copilot.d.ts</a></li>
12
+ <li><a href="copilot.d.ts.map">copilot.d.ts.map</a></li>
13
+ <li><a href="copilot.js">copilot.js</a></li>
14
+ <li><a href="copilot.js.map">copilot.js.map</a></li>
15
+ <li><a href="openai.d.ts">openai.d.ts</a></li>
16
+ <li><a href="openai.d.ts.map">openai.d.ts.map</a></li>
17
+ <li><a href="openai.js">openai.js</a></li>
18
+ <li><a href="openai.js.map">openai.js.map</a></li>
19
+ <li><a href="opencode-go.d.ts">opencode-go.d.ts</a></li>
20
+ <li><a href="opencode-go.d.ts.map">opencode-go.d.ts.map</a></li>
21
+ <li><a href="opencode-go.js">opencode-go.js</a></li>
22
+ <li><a href="opencode-go.js.map">opencode-go.js.map</a></li>
23
+ <li><a href="registry.d.ts">registry.d.ts</a></li>
24
+ <li><a href="registry.d.ts.map">registry.d.ts.map</a></li>
25
+ <li><a href="registry.js">registry.js</a></li>
26
+ <li><a href="registry.js.map">registry.js.map</a></li>
27
+ <li><a href="types.d.ts">types.d.ts</a></li>
28
+ <li><a href="types.d.ts.map">types.d.ts.map</a></li>
29
+ <li><a href="types.js">types.js</a></li>
30
+ <li><a href="types.js.map">types.js.map</a></li>
31
+ </ul>
32
+ <hr>
33
+ </body>
34
+ </html>
@@ -0,0 +1,10 @@
1
+ /**
2
+ * OpenAI quota provider.
3
+ *
4
+ * Fetches usage data from `chatgpt.com/backend-api/wham/usage`.
5
+ * Returns up to 3 windows: `5h` (rolling), `Weekly`, `Code Review`.
6
+ * Auth token is read from the opencode `auth.json` (openai / codex / chatgpt entry).
7
+ */
8
+ import type { Provider } from "./types.js";
9
+ export declare const openaiProvider: Provider;
10
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqE3C,eAAO,MAAM,cAAc,EAAE,QA+F5B,CAAC"}