@slkiser/opencode-quota 1.0.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.
- package/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/data/modelsdev-pricing.min.json +504 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache.d.ts +49 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +127 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/config.d.ts +30 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +154 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/copilot.d.ts +25 -0
- package/dist/lib/copilot.d.ts.map +1 -0
- package/dist/lib/copilot.js +306 -0
- package/dist/lib/copilot.js.map +1 -0
- package/dist/lib/entries.d.ts +60 -0
- package/dist/lib/entries.d.ts.map +1 -0
- package/dist/lib/entries.js +8 -0
- package/dist/lib/entries.js.map +1 -0
- package/dist/lib/firmware.d.ts +15 -0
- package/dist/lib/firmware.d.ts.map +1 -0
- package/dist/lib/firmware.js +79 -0
- package/dist/lib/firmware.js.map +1 -0
- package/dist/lib/format.d.ts +16 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +99 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/google-token-cache.d.ts +30 -0
- package/dist/lib/google-token-cache.d.ts.map +1 -0
- package/dist/lib/google-token-cache.js +100 -0
- package/dist/lib/google-token-cache.js.map +1 -0
- package/dist/lib/google.d.ts +43 -0
- package/dist/lib/google.d.ts.map +1 -0
- package/dist/lib/google.js +399 -0
- package/dist/lib/google.js.map +1 -0
- package/dist/lib/markdown-table.d.ts +8 -0
- package/dist/lib/markdown-table.d.ts.map +1 -0
- package/dist/lib/markdown-table.js +56 -0
- package/dist/lib/markdown-table.js.map +1 -0
- package/dist/lib/modelsdev-pricing.d.ts +23 -0
- package/dist/lib/modelsdev-pricing.d.ts.map +1 -0
- package/dist/lib/modelsdev-pricing.js +32 -0
- package/dist/lib/modelsdev-pricing.js.map +1 -0
- package/dist/lib/openai.d.ts +33 -0
- package/dist/lib/openai.d.ts.map +1 -0
- package/dist/lib/openai.js +162 -0
- package/dist/lib/openai.js.map +1 -0
- package/dist/lib/opencode-auth.d.ts +11 -0
- package/dist/lib/opencode-auth.d.ts.map +1 -0
- package/dist/lib/opencode-auth.js +27 -0
- package/dist/lib/opencode-auth.js.map +1 -0
- package/dist/lib/opencode-storage.d.ts +45 -0
- package/dist/lib/opencode-storage.d.ts.map +1 -0
- package/dist/lib/opencode-storage.js +120 -0
- package/dist/lib/opencode-storage.js.map +1 -0
- package/dist/lib/quota-command-format.d.ts +14 -0
- package/dist/lib/quota-command-format.d.ts.map +1 -0
- package/dist/lib/quota-command-format.js +122 -0
- package/dist/lib/quota-command-format.js.map +1 -0
- package/dist/lib/quota-stats-format.d.ts +9 -0
- package/dist/lib/quota-stats-format.d.ts.map +1 -0
- package/dist/lib/quota-stats-format.js +244 -0
- package/dist/lib/quota-stats-format.js.map +1 -0
- package/dist/lib/quota-stats.d.ts +71 -0
- package/dist/lib/quota-stats.d.ts.map +1 -0
- package/dist/lib/quota-stats.js +270 -0
- package/dist/lib/quota-stats.js.map +1 -0
- package/dist/lib/quota-status.d.ts +23 -0
- package/dist/lib/quota-status.d.ts.map +1 -0
- package/dist/lib/quota-status.js +112 -0
- package/dist/lib/quota-status.js.map +1 -0
- package/dist/lib/toast-format-grouped.d.ts +25 -0
- package/dist/lib/toast-format-grouped.d.ts.map +1 -0
- package/dist/lib/toast-format-grouped.js +123 -0
- package/dist/lib/toast-format-grouped.js.map +1 -0
- package/dist/lib/types.d.ts +218 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +39 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/plugin.d.ts +13 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +633 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/copilot.d.ts +8 -0
- package/dist/providers/copilot.d.ts.map +1 -0
- package/dist/providers/copilot.js +50 -0
- package/dist/providers/copilot.js.map +1 -0
- package/dist/providers/firmware.d.ts +6 -0
- package/dist/providers/firmware.d.ts.map +1 -0
- package/dist/providers/firmware.js +52 -0
- package/dist/providers/firmware.js.map +1 -0
- package/dist/providers/google-antigravity.d.ts +6 -0
- package/dist/providers/google-antigravity.d.ts.map +1 -0
- package/dist/providers/google-antigravity.js +77 -0
- package/dist/providers/google-antigravity.js.map +1 -0
- package/dist/providers/openai.d.ts +6 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +106 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +8 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +14 -0
- package/dist/providers/registry.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"AA8BA,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACjH,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC;CACH,GAAG,OAAO,CAAC,MAAM,CAAC,CA8GlB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { getAuthPath } from "./opencode-auth.js";
|
|
2
|
+
import { getGoogleTokenCachePath } from "./google-token-cache.js";
|
|
3
|
+
import { getAntigravityAccountsCandidatePaths, pickAntigravityAccountsPath, readAntigravityAccounts, } from "./google.js";
|
|
4
|
+
import { hasFirmwareApiKeyConfigured } from "./firmware.js";
|
|
5
|
+
import { getPricingSnapshotMeta, listProviders, getProviderModelCount } from "./modelsdev-pricing.js";
|
|
6
|
+
import { getOpenCodeMessageDir, getOpenCodeSessionDir, listSessionIDsFromMessageStorage, } from "./opencode-storage.js";
|
|
7
|
+
import { aggregateUsage } from "./quota-stats.js";
|
|
8
|
+
function fmtInt(n) {
|
|
9
|
+
return Math.trunc(n).toLocaleString("en-US");
|
|
10
|
+
}
|
|
11
|
+
function tokensTotal(t) {
|
|
12
|
+
return t.input + t.output + t.reasoning + t.cache_read + t.cache_write;
|
|
13
|
+
}
|
|
14
|
+
export async function buildQuotaStatusReport(params) {
|
|
15
|
+
const lines = [];
|
|
16
|
+
lines.push("Quota Status (opencode-quota)");
|
|
17
|
+
lines.push("");
|
|
18
|
+
// === toast diagnostics ===
|
|
19
|
+
lines.push("toast:");
|
|
20
|
+
lines.push(`- configSource: ${params.configSource}${params.configPaths.length ? ` (${params.configPaths.join(" | ")})` : ""}`);
|
|
21
|
+
lines.push(`- enabledProviders: ${params.enabledProviders.length ? params.enabledProviders.join(",") : "(none)"}`);
|
|
22
|
+
lines.push(`- onlyCurrentModel: ${params.onlyCurrentModel ? "true" : "false"}`);
|
|
23
|
+
lines.push(`- currentModel: ${params.currentModel ?? "(unknown)"}`);
|
|
24
|
+
lines.push("- providers:");
|
|
25
|
+
for (const p of params.providerAvailability) {
|
|
26
|
+
const bits = [];
|
|
27
|
+
bits.push(p.enabled ? "enabled" : "disabled");
|
|
28
|
+
bits.push(p.available ? "available" : "unavailable");
|
|
29
|
+
if (p.matchesCurrentModel !== undefined) {
|
|
30
|
+
bits.push(`matchesCurrentModel=${p.matchesCurrentModel ? "yes" : "no"}`);
|
|
31
|
+
}
|
|
32
|
+
lines.push(` - ${p.id}: ${bits.join(" ")}`);
|
|
33
|
+
}
|
|
34
|
+
lines.push("");
|
|
35
|
+
lines.push("paths:");
|
|
36
|
+
lines.push(`- auth.json: ${getAuthPath()}`);
|
|
37
|
+
let firmwareConfigured = false;
|
|
38
|
+
try {
|
|
39
|
+
firmwareConfigured = await hasFirmwareApiKeyConfigured();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
firmwareConfigured = false;
|
|
43
|
+
}
|
|
44
|
+
lines.push(`- firmware api key configured: ${firmwareConfigured ? "true" : "false"}`);
|
|
45
|
+
lines.push(`- google token cache: ${getGoogleTokenCachePath()}`);
|
|
46
|
+
lines.push(`- antigravity accounts (selected): ${pickAntigravityAccountsPath()}`);
|
|
47
|
+
const candidates = getAntigravityAccountsCandidatePaths();
|
|
48
|
+
lines.push(`- antigravity accounts (candidates): ${candidates.length ? candidates.join(" | ") : "(none)"}`);
|
|
49
|
+
lines.push(`- opencode storage message: ${getOpenCodeMessageDir()}`);
|
|
50
|
+
lines.push(`- opencode storage session: ${getOpenCodeSessionDir()}`);
|
|
51
|
+
if (params.googleRefresh?.attempted) {
|
|
52
|
+
lines.push("");
|
|
53
|
+
lines.push("google_token_refresh:");
|
|
54
|
+
if (typeof params.googleRefresh.total === "number" && typeof params.googleRefresh.successCount === "number") {
|
|
55
|
+
lines.push(`- refreshed: ${params.googleRefresh.successCount}/${params.googleRefresh.total}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
lines.push("- attempted");
|
|
59
|
+
}
|
|
60
|
+
for (const f of params.googleRefresh.failures ?? []) {
|
|
61
|
+
lines.push(`- ${f.email ?? "Unknown"}: ${f.error}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
let accountCount = 0;
|
|
65
|
+
try {
|
|
66
|
+
const accounts = await readAntigravityAccounts();
|
|
67
|
+
accountCount = accounts?.length ?? 0;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
accountCount = 0;
|
|
71
|
+
}
|
|
72
|
+
lines.push("");
|
|
73
|
+
lines.push(`google accounts: count=${accountCount}`);
|
|
74
|
+
// === pricing snapshot ===
|
|
75
|
+
const meta = getPricingSnapshotMeta();
|
|
76
|
+
lines.push("");
|
|
77
|
+
lines.push("pricing_snapshot:");
|
|
78
|
+
lines.push(`- source: ${meta.source}`);
|
|
79
|
+
lines.push(`- generatedAt: ${new Date(meta.generatedAt).toISOString()}`);
|
|
80
|
+
lines.push(`- units: ${meta.units}`);
|
|
81
|
+
const providers = listProviders();
|
|
82
|
+
lines.push(`- providers: ${providers.join(",")}`);
|
|
83
|
+
for (const p of providers) {
|
|
84
|
+
lines.push(` - ${p}: models=${fmtInt(getProviderModelCount(p))}`);
|
|
85
|
+
}
|
|
86
|
+
// === storage scan ===
|
|
87
|
+
const sessionIDs = await listSessionIDsFromMessageStorage();
|
|
88
|
+
lines.push("");
|
|
89
|
+
lines.push("storage:");
|
|
90
|
+
lines.push(`- sessions_in_message_storage: ${fmtInt(sessionIDs.length)}`);
|
|
91
|
+
// === unknown pricing ===
|
|
92
|
+
// We intentionally report unknowns for *all time* so users can see what needs mapping.
|
|
93
|
+
const agg = await aggregateUsage({});
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("unknown_pricing:");
|
|
96
|
+
if (agg.unknown.length === 0) {
|
|
97
|
+
lines.push("- none");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
lines.push(`- keys: ${fmtInt(agg.unknown.length)} tokens_total=${fmtInt(tokensTotal(agg.totals.unknown))}`);
|
|
101
|
+
for (const row of agg.unknown.slice(0, 25)) {
|
|
102
|
+
const src = `${row.key.sourceProviderID}/${row.key.sourceModelID}`;
|
|
103
|
+
const mapped = row.key.mappedProvider && row.key.mappedModel ? `${row.key.mappedProvider}/${row.key.mappedModel}` : "(none)";
|
|
104
|
+
lines.push(`- ${src} mapped=${mapped} tokens=${fmtInt(tokensTotal(row.tokens))} msgs=${fmtInt(row.messageCount)}`);
|
|
105
|
+
}
|
|
106
|
+
if (agg.unknown.length > 25) {
|
|
107
|
+
lines.push(`- ... (${fmtInt(agg.unknown.length - 25)} more)`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return lines.join("\n");
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=quota-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-status.js","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grouped toast formatter.
|
|
3
|
+
*
|
|
4
|
+
* Renders quota entries grouped by provider/account with compact bars.
|
|
5
|
+
* Designed to feel like a status dashboard while still respecting OpenCode toast width.
|
|
6
|
+
*/
|
|
7
|
+
import type { QuotaToastEntry, QuotaToastError } from "./entries.js";
|
|
8
|
+
export type ToastGroupEntry = QuotaToastEntry & {
|
|
9
|
+
/** Group id (e.g. "OpenAI (Pro)", "Antigravity (abc..gmail)") */
|
|
10
|
+
group?: string;
|
|
11
|
+
/** Row label within group (e.g. "Hourly", "Weekly", "Claude") */
|
|
12
|
+
label?: string;
|
|
13
|
+
/** Optional right-side suffix (e.g. "94/250") */
|
|
14
|
+
right?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function formatQuotaRowsGrouped(params: {
|
|
17
|
+
layout?: {
|
|
18
|
+
maxWidth: number;
|
|
19
|
+
narrowAt: number;
|
|
20
|
+
tinyAt: number;
|
|
21
|
+
};
|
|
22
|
+
entries?: ToastGroupEntry[];
|
|
23
|
+
errors?: QuotaToastError[];
|
|
24
|
+
}): string;
|
|
25
|
+
//# sourceMappingURL=toast-format-grouped.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast-format-grouped.d.ts","sourceRoot":"","sources":["../../src/lib/toast-format-grouped.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG;IAC9C,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA6CF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B,GAAG,MAAM,CAoFT"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grouped toast formatter.
|
|
3
|
+
*
|
|
4
|
+
* Renders quota entries grouped by provider/account with compact bars.
|
|
5
|
+
* Designed to feel like a status dashboard while still respecting OpenCode toast width.
|
|
6
|
+
*/
|
|
7
|
+
function clampInt(n, min, max) {
|
|
8
|
+
return Math.max(min, Math.min(max, Math.trunc(n)));
|
|
9
|
+
}
|
|
10
|
+
function padRight(str, width) {
|
|
11
|
+
if (str.length >= width)
|
|
12
|
+
return str.slice(0, width);
|
|
13
|
+
return str + " ".repeat(width - str.length);
|
|
14
|
+
}
|
|
15
|
+
function padLeft(str, width) {
|
|
16
|
+
if (str.length >= width)
|
|
17
|
+
return str.slice(str.length - width);
|
|
18
|
+
return " ".repeat(width - str.length) + str;
|
|
19
|
+
}
|
|
20
|
+
function bar(percentRemaining, width) {
|
|
21
|
+
const p = clampInt(percentRemaining, 0, 100);
|
|
22
|
+
const filled = Math.round((p / 100) * width);
|
|
23
|
+
const empty = width - filled;
|
|
24
|
+
return "█".repeat(filled) + "░".repeat(empty);
|
|
25
|
+
}
|
|
26
|
+
function formatResetCountdown(iso) {
|
|
27
|
+
if (!iso)
|
|
28
|
+
return "";
|
|
29
|
+
const resetDate = new Date(iso);
|
|
30
|
+
const now = new Date();
|
|
31
|
+
const diffMs = resetDate.getTime() - now.getTime();
|
|
32
|
+
if (!Number.isFinite(diffMs) || diffMs <= 0)
|
|
33
|
+
return "reset";
|
|
34
|
+
const diffMinutes = Math.floor(diffMs / 60000);
|
|
35
|
+
const days = Math.floor(diffMinutes / 1440);
|
|
36
|
+
const hours = Math.floor((diffMinutes % 1440) / 60);
|
|
37
|
+
const minutes = diffMinutes % 60;
|
|
38
|
+
if (days > 0)
|
|
39
|
+
return `${days}d ${hours}h`;
|
|
40
|
+
return `${hours}h ${minutes}m`;
|
|
41
|
+
}
|
|
42
|
+
function splitGroupName(name) {
|
|
43
|
+
// Heuristic: "Label (group)" -> group is label, label is empty.
|
|
44
|
+
// Prefer explicit group/label metadata when available.
|
|
45
|
+
return { group: name, label: "" };
|
|
46
|
+
}
|
|
47
|
+
export function formatQuotaRowsGrouped(params) {
|
|
48
|
+
const layout = params.layout ?? { maxWidth: 50, narrowAt: 42, tinyAt: 32 };
|
|
49
|
+
const maxWidth = layout.maxWidth;
|
|
50
|
+
const isTiny = maxWidth <= layout.tinyAt;
|
|
51
|
+
const isNarrow = !isTiny && maxWidth <= layout.narrowAt;
|
|
52
|
+
const separator = " ";
|
|
53
|
+
const percentCol = 4;
|
|
54
|
+
const barWidth = Math.max(10, maxWidth - separator.length - percentCol);
|
|
55
|
+
const timeCol = isTiny ? 6 : isNarrow ? 7 : 7;
|
|
56
|
+
const lines = [];
|
|
57
|
+
// Group entries in stable order.
|
|
58
|
+
const groupOrder = [];
|
|
59
|
+
const groups = new Map();
|
|
60
|
+
for (const e of params.entries ?? []) {
|
|
61
|
+
const group = (e.group ?? "").trim();
|
|
62
|
+
const label = (e.label ?? "").trim();
|
|
63
|
+
if (!group) {
|
|
64
|
+
const fallback = splitGroupName(e.name);
|
|
65
|
+
const g = fallback.group;
|
|
66
|
+
const list = groups.get(g);
|
|
67
|
+
if (list)
|
|
68
|
+
list.push({ ...e, group: g, label: label || fallback.label });
|
|
69
|
+
else {
|
|
70
|
+
groupOrder.push(g);
|
|
71
|
+
groups.set(g, [{ ...e, group: g, label: label || fallback.label }]);
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const list = groups.get(group);
|
|
76
|
+
if (list)
|
|
77
|
+
list.push(e);
|
|
78
|
+
else {
|
|
79
|
+
groupOrder.push(group);
|
|
80
|
+
groups.set(group, [e]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
for (let gi = 0; gi < groupOrder.length; gi++) {
|
|
84
|
+
const g = groupOrder[gi];
|
|
85
|
+
const list = groups.get(g) ?? [];
|
|
86
|
+
if (gi > 0)
|
|
87
|
+
lines.push("");
|
|
88
|
+
// Group header like "→ [OpenAI] (Pro)"
|
|
89
|
+
lines.push(`→ ${g}`.slice(0, maxWidth));
|
|
90
|
+
for (const entry of list) {
|
|
91
|
+
const label = entry.label?.trim() || entry.name;
|
|
92
|
+
const timeStr = entry.percentRemaining === 0 ? formatResetCountdown(entry.resetTimeIso) : "";
|
|
93
|
+
const right = entry.right ? entry.right.trim() : "";
|
|
94
|
+
if (isTiny) {
|
|
95
|
+
// Tiny: "label time XX%" (ignore bar)
|
|
96
|
+
const tinyNameCol = maxWidth - separator.length - timeCol - separator.length - percentCol;
|
|
97
|
+
const line = [
|
|
98
|
+
padRight(label, tinyNameCol),
|
|
99
|
+
padLeft(timeStr, timeCol),
|
|
100
|
+
padLeft(`${clampInt(entry.percentRemaining, 0, 100)}%`, percentCol),
|
|
101
|
+
].join(separator);
|
|
102
|
+
lines.push(line.slice(0, maxWidth));
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// Line 1: label + optional right + time at end
|
|
106
|
+
const timeWidth = Math.max(timeStr.length, timeCol);
|
|
107
|
+
const leftMax = Math.max(1, barWidth - separator.length - timeWidth);
|
|
108
|
+
const leftText = right ? `${label} ${right}` : label;
|
|
109
|
+
lines.push((padRight(leftText, leftMax) + separator + padLeft(timeStr, timeWidth)).slice(0, barWidth));
|
|
110
|
+
// Line 2: bar + percent
|
|
111
|
+
const barCell = bar(entry.percentRemaining, barWidth);
|
|
112
|
+
const percentCell = padLeft(`${clampInt(entry.percentRemaining, 0, 100)}%`, percentCol);
|
|
113
|
+
lines.push([barCell, percentCell].join(separator));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const err of params.errors ?? []) {
|
|
117
|
+
if (lines.length > 0)
|
|
118
|
+
lines.push("");
|
|
119
|
+
lines.push(`${err.label}: ${err.message}`);
|
|
120
|
+
}
|
|
121
|
+
return lines.join("\n");
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=toast-format-grouped.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast-format-grouped.js","sourceRoot":"","sources":["../../src/lib/toast-format-grouped.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for opencode-quota plugin
|
|
3
|
+
*/
|
|
4
|
+
/** Google model identifiers */
|
|
5
|
+
export type GoogleModelId = "G3PRO" | "G3FLASH" | "CLAUDE" | "G3IMAGE";
|
|
6
|
+
/** Plugin configuration from opencode.json experimental.quotaToast */
|
|
7
|
+
export interface QuotaToastConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
/** If false, never show popup toasts (commands/tools still work). */
|
|
10
|
+
enableToast: boolean;
|
|
11
|
+
/** Toast formatting style. */
|
|
12
|
+
toastStyle: "classic" | "grouped";
|
|
13
|
+
minIntervalMs: number;
|
|
14
|
+
/**
|
|
15
|
+
* Debug mode for troubleshooting.
|
|
16
|
+
*
|
|
17
|
+
* When enabled, the plugin appends a short debug footer to the toast.
|
|
18
|
+
* If the plugin would normally show no toast (e.g. enabledProviders empty),
|
|
19
|
+
* it will show a debug-only toast explaining why.
|
|
20
|
+
*/
|
|
21
|
+
debug: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Provider ids to query.
|
|
24
|
+
*
|
|
25
|
+
* Keep this list short and user-friendly; each provider advertises a stable id.
|
|
26
|
+
* Example: ["copilot", "google-antigravity"].
|
|
27
|
+
*/
|
|
28
|
+
enabledProviders: string[];
|
|
29
|
+
googleModels: GoogleModelId[];
|
|
30
|
+
showOnIdle: boolean;
|
|
31
|
+
showOnQuestion: boolean;
|
|
32
|
+
showOnCompact: boolean;
|
|
33
|
+
showOnBothFail: boolean;
|
|
34
|
+
/** Toast duration in milliseconds */
|
|
35
|
+
toastDurationMs: number;
|
|
36
|
+
/** If true, only show quota for current model */
|
|
37
|
+
onlyCurrentModel: boolean;
|
|
38
|
+
/** Responsive layout breakpoints */
|
|
39
|
+
layout: {
|
|
40
|
+
/** Default max width target for formatting */
|
|
41
|
+
maxWidth: number;
|
|
42
|
+
/** If toast max width is <= this, use compact layout */
|
|
43
|
+
narrowAt: number;
|
|
44
|
+
/** If toast max width is <= this, use ultra-compact layout */
|
|
45
|
+
tinyAt: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Default configuration values */
|
|
49
|
+
export declare const DEFAULT_CONFIG: QuotaToastConfig;
|
|
50
|
+
/** GitHub Copilot authentication data */
|
|
51
|
+
export interface CopilotAuthData {
|
|
52
|
+
type: string;
|
|
53
|
+
refresh?: string;
|
|
54
|
+
access?: string;
|
|
55
|
+
expires?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Copilot subscription tier.
|
|
59
|
+
* See: https://docs.github.com/en/copilot/about-github-copilot/subscription-plans-for-github-copilot
|
|
60
|
+
*/
|
|
61
|
+
export type CopilotTier = "free" | "pro" | "pro+" | "business" | "enterprise";
|
|
62
|
+
/**
|
|
63
|
+
* Copilot quota token configuration.
|
|
64
|
+
*
|
|
65
|
+
* Stored locally in:
|
|
66
|
+
* - $XDG_CONFIG_HOME/opencode/copilot-quota-token.json, or
|
|
67
|
+
* - ~/.config/opencode/copilot-quota-token.json
|
|
68
|
+
*
|
|
69
|
+
* Users can create a fine-grained PAT with "Plan" read permission
|
|
70
|
+
* to enable quota checking via GitHub's public billing API.
|
|
71
|
+
*/
|
|
72
|
+
export interface CopilotQuotaConfig {
|
|
73
|
+
/** Fine-grained PAT with "Plan" read permission */
|
|
74
|
+
token: string;
|
|
75
|
+
/** GitHub username (for API calls) */
|
|
76
|
+
username: string;
|
|
77
|
+
/** Copilot subscription tier (determines monthly quota limit) */
|
|
78
|
+
tier: CopilotTier;
|
|
79
|
+
}
|
|
80
|
+
/** Full auth.json structure (partial - only what we need) */
|
|
81
|
+
export interface AuthData {
|
|
82
|
+
"github-copilot"?: CopilotAuthData;
|
|
83
|
+
google?: {
|
|
84
|
+
type: string;
|
|
85
|
+
access?: string;
|
|
86
|
+
refresh?: string;
|
|
87
|
+
expires?: number;
|
|
88
|
+
};
|
|
89
|
+
openai?: {
|
|
90
|
+
type: string;
|
|
91
|
+
access?: string;
|
|
92
|
+
refresh?: string;
|
|
93
|
+
expires?: number;
|
|
94
|
+
};
|
|
95
|
+
codex?: {
|
|
96
|
+
type: string;
|
|
97
|
+
access?: string;
|
|
98
|
+
refresh?: string;
|
|
99
|
+
expires?: number;
|
|
100
|
+
accountId?: string;
|
|
101
|
+
};
|
|
102
|
+
firmware?: {
|
|
103
|
+
type: string;
|
|
104
|
+
key?: string;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Single Antigravity account from opencode-antigravity-auth storage */
|
|
108
|
+
export interface AntigravityAccount {
|
|
109
|
+
email?: string;
|
|
110
|
+
refreshToken: string;
|
|
111
|
+
projectId?: string;
|
|
112
|
+
/** Legacy spelling used by some plugin versions */
|
|
113
|
+
projectID?: string;
|
|
114
|
+
managedProjectId?: string;
|
|
115
|
+
addedAt: number;
|
|
116
|
+
lastUsed: number;
|
|
117
|
+
rateLimitResetTimes?: Record<string, number>;
|
|
118
|
+
}
|
|
119
|
+
/** Antigravity accounts file structure */
|
|
120
|
+
export interface AntigravityAccountsFile {
|
|
121
|
+
version: number;
|
|
122
|
+
accounts: AntigravityAccount[];
|
|
123
|
+
activeIndex?: number;
|
|
124
|
+
activeIndexByFamily?: {
|
|
125
|
+
claude?: number;
|
|
126
|
+
gemini?: number;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** Google quota API response */
|
|
130
|
+
export interface GoogleQuotaResponse {
|
|
131
|
+
models: Record<string, {
|
|
132
|
+
quotaInfo?: {
|
|
133
|
+
remainingFraction?: number;
|
|
134
|
+
resetTime?: string;
|
|
135
|
+
};
|
|
136
|
+
}>;
|
|
137
|
+
}
|
|
138
|
+
/** Copilot API response includes a quota reset date */
|
|
139
|
+
export interface CopilotQuotaResponseWithReset extends CopilotUsageResponse {
|
|
140
|
+
quota_reset_date: string;
|
|
141
|
+
}
|
|
142
|
+
interface QuotaDetail {
|
|
143
|
+
entitlement: number;
|
|
144
|
+
overage_count: number;
|
|
145
|
+
overage_permitted: boolean;
|
|
146
|
+
percent_remaining: number;
|
|
147
|
+
quota_id: string;
|
|
148
|
+
quota_remaining: number;
|
|
149
|
+
remaining: number;
|
|
150
|
+
unlimited: boolean;
|
|
151
|
+
}
|
|
152
|
+
interface QuotaSnapshots {
|
|
153
|
+
chat?: QuotaDetail;
|
|
154
|
+
completions?: QuotaDetail;
|
|
155
|
+
premium_interactions: QuotaDetail;
|
|
156
|
+
}
|
|
157
|
+
export interface CopilotUsageResponse {
|
|
158
|
+
access_type_sku: string;
|
|
159
|
+
analytics_tracking_id: string;
|
|
160
|
+
assigned_date: string;
|
|
161
|
+
can_signup_for_limited: boolean;
|
|
162
|
+
chat_enabled: boolean;
|
|
163
|
+
copilot_plan: string;
|
|
164
|
+
organization_login_list: unknown[];
|
|
165
|
+
organization_list: unknown[];
|
|
166
|
+
quota_reset_date: string;
|
|
167
|
+
quota_snapshots: QuotaSnapshots;
|
|
168
|
+
}
|
|
169
|
+
/** Result from fetching Copilot quota */
|
|
170
|
+
export interface CopilotQuotaResult {
|
|
171
|
+
success: true;
|
|
172
|
+
used: number;
|
|
173
|
+
total: number;
|
|
174
|
+
percentRemaining: number;
|
|
175
|
+
resetTimeIso?: string;
|
|
176
|
+
}
|
|
177
|
+
/** Result from fetching Google quota for a single model */
|
|
178
|
+
export interface GoogleModelQuota {
|
|
179
|
+
modelId: GoogleModelId;
|
|
180
|
+
displayName: string;
|
|
181
|
+
percentRemaining: number;
|
|
182
|
+
resetTimeIso?: string;
|
|
183
|
+
accountEmail?: string;
|
|
184
|
+
}
|
|
185
|
+
/** Error for a single account */
|
|
186
|
+
export interface GoogleAccountError {
|
|
187
|
+
email: string;
|
|
188
|
+
error: string;
|
|
189
|
+
}
|
|
190
|
+
/** Result from fetching Google quota */
|
|
191
|
+
export interface GoogleQuotaResult {
|
|
192
|
+
success: true;
|
|
193
|
+
models: GoogleModelQuota[];
|
|
194
|
+
errors?: GoogleAccountError[];
|
|
195
|
+
}
|
|
196
|
+
/** Error result */
|
|
197
|
+
export interface QuotaError {
|
|
198
|
+
success: false;
|
|
199
|
+
error: string;
|
|
200
|
+
}
|
|
201
|
+
/** Combined quota result */
|
|
202
|
+
export type CopilotResult = CopilotQuotaResult | QuotaError | null;
|
|
203
|
+
export type GoogleResult = GoogleQuotaResult | QuotaError | null;
|
|
204
|
+
/** Cached toast data */
|
|
205
|
+
export interface CachedToast {
|
|
206
|
+
message: string;
|
|
207
|
+
timestamp: number;
|
|
208
|
+
}
|
|
209
|
+
/** Request timeout in milliseconds */
|
|
210
|
+
export declare const REQUEST_TIMEOUT_MS = 3000;
|
|
211
|
+
/** Model key mapping for Google API */
|
|
212
|
+
export declare const GOOGLE_MODEL_KEYS: Record<GoogleModelId, {
|
|
213
|
+
key: string;
|
|
214
|
+
altKey?: string;
|
|
215
|
+
display: string;
|
|
216
|
+
}>;
|
|
217
|
+
export {};
|
|
218
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for opencode-quota plugin
|
|
3
|
+
*/
|
|
4
|
+
/** Default configuration values */
|
|
5
|
+
export const DEFAULT_CONFIG = {
|
|
6
|
+
enabled: true,
|
|
7
|
+
enableToast: true,
|
|
8
|
+
toastStyle: "classic",
|
|
9
|
+
minIntervalMs: 300000, // 5 minutes
|
|
10
|
+
debug: false,
|
|
11
|
+
// Providers are OFF by default; users opt-in via config.
|
|
12
|
+
enabledProviders: [],
|
|
13
|
+
// If Google Antigravity is enabled, default to Claude only.
|
|
14
|
+
googleModels: ["CLAUDE"],
|
|
15
|
+
showOnIdle: true,
|
|
16
|
+
showOnQuestion: true,
|
|
17
|
+
showOnCompact: true,
|
|
18
|
+
showOnBothFail: true,
|
|
19
|
+
toastDurationMs: 9000,
|
|
20
|
+
onlyCurrentModel: false,
|
|
21
|
+
layout: {
|
|
22
|
+
maxWidth: 50,
|
|
23
|
+
narrowAt: 42,
|
|
24
|
+
tinyAt: 32,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Constants
|
|
29
|
+
// =============================================================================
|
|
30
|
+
/** Request timeout in milliseconds */
|
|
31
|
+
export const REQUEST_TIMEOUT_MS = 3000;
|
|
32
|
+
/** Model key mapping for Google API */
|
|
33
|
+
export const GOOGLE_MODEL_KEYS = {
|
|
34
|
+
G3PRO: { key: "gemini-3-pro-high", altKey: "gemini-3-pro-low", display: "G3Pro" },
|
|
35
|
+
G3FLASH: { key: "gemini-3-flash", display: "G3Flash" },
|
|
36
|
+
CLAUDE: { key: "claude-opus-4-5-thinking", altKey: "claude-opus-4-5", display: "Claude" },
|
|
37
|
+
G3IMAGE: { key: "gemini-3-pro-image", display: "G3Image" },
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2DH,mCAAmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,OAAO,EAAE,IAAI;IAEb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,MAAM,EAAE,YAAY;IAEnC,KAAK,EAAE,KAAK;IAEZ,yDAAyD;IACzD,gBAAgB,EAAE,EAAE;IAEpB,4DAA4D;IAC5D,YAAY,EAAE,CAAC,QAAQ,CAAC;IAExB,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,KAAK;IACvB,MAAM,EAAE;QACN,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;KACX;CACF,CAAC;AA2MF,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,sCAAsC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC,uCAAuC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAG1B;IACF,KAAK,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;IACjF,OAAO,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE;IACtD,MAAM,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACzF,OAAO,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE;CAC3D,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Quota Toast Plugin
|
|
3
|
+
*
|
|
4
|
+
* Shows a minimal quota status toast without LLM invocation.
|
|
5
|
+
* Triggers on session.idle, session.compacted, and question tool completion.
|
|
6
|
+
* Supports GitHub Copilot and Google (via opencode-antigravity-auth).
|
|
7
|
+
*/
|
|
8
|
+
import type { Plugin } from "@opencode-ai/plugin";
|
|
9
|
+
/**
|
|
10
|
+
* Main plugin export
|
|
11
|
+
*/
|
|
12
|
+
export declare const QuotaToastPlugin: Plugin;
|
|
13
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAsGlD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MA4rB9B,CAAC"}
|