oc-go-usage-display 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 +90 -0
- package/bin/lib.js +312 -0
- package/bin/oc-go-usage-display-init.js +35 -0
- package/bin/oc-go-usage-display-show.js +65 -0
- package/bin/oc-go-usage-display-status.js +64 -0
- package/bin/oc-go-usage-display-update.js +66 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +527 -0
- package/dist/index.js.map +1 -0
- package/dist/tui.d.ts +8 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +419 -0
- package/dist/tui.js.map +1 -0
- package/package.json +66 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
// OpenCode Go usage plugin for OpenCode (global, native).
|
|
2
|
+
//
|
|
3
|
+
// Shows OpenCode Go subscription usage as an additive overlay:
|
|
4
|
+
// - `go_usage` tool -> JSON snapshot + a human-readable line, e.g.
|
|
5
|
+
// `Go 5h 42% (reset 3h12m) | 7d 15% | 30d 61%`
|
|
6
|
+
//
|
|
7
|
+
// There is no automatic display: usage surfaces live in `src/tui.tsx`
|
|
8
|
+
// (sidebar + statusline).
|
|
9
|
+
//
|
|
10
|
+
// Coexistence with worktrunk.ts: this plugin NEVER touches
|
|
11
|
+
// session.status / session.deleted markers. It registers an additive hook
|
|
12
|
+
// only (one tool). No transcript injection, no TUI
|
|
13
|
+
// footer slot (unstable API).
|
|
14
|
+
//
|
|
15
|
+
// Auth (first match wins, secrets are never logged):
|
|
16
|
+
// 1. OPENCODE_GO_MOCK=1 -> deterministic mock snapshot (for testing)
|
|
17
|
+
// 2. OPENCODE_GO_API_KEY -> GET https://opencode.ai/zen/go/v1/usage
|
|
18
|
+
// (Authorization: Bearer <key>)
|
|
19
|
+
// 3. Provider auth.json key -> same Bearer path as (2), no paste needed:
|
|
20
|
+
// $XDG_DATA_HOME/opencode/auth.json (or
|
|
21
|
+
// ~/.local/share/opencode/auth.json), fallback
|
|
22
|
+
// ~/.config/opencode/auth.json (legacy).
|
|
23
|
+
// Uses `opencode-go` key, else `opencode` key.
|
|
24
|
+
// 4. OPENCODE_GO_WORKSPACE_ID + OPENCODE_GO_AUTH_COOKIE (env), or
|
|
25
|
+
// ~/.config/opencode/oc-go-usage-display.json
|
|
26
|
+
// ({ "workspaceId": "...", "authCookie": "..." })
|
|
27
|
+
// -> GET https://opencode.ai/workspace/{id}/go
|
|
28
|
+
// (scraped rolling/weekly/monthly)
|
|
29
|
+
// 5. none -> unavailable snapshot (literal-only error)
|
|
30
|
+
// Snapshots are cached 60s in memory + on disk.
|
|
31
|
+
import { tool } from "@opencode-ai/plugin";
|
|
32
|
+
import * as fs from "node:fs";
|
|
33
|
+
import * as os from "node:os";
|
|
34
|
+
import * as path from "node:path";
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Constants
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
const API_USAGE_URL = "https://opencode.ai/zen/go/v1/usage";
|
|
39
|
+
const CACHE_TTL_MS = 60_000;
|
|
40
|
+
const FETCH_TIMEOUT_MS = 10_000;
|
|
41
|
+
const CONFIG_DIR = path.join(os.homedir(), ".config", "opencode");
|
|
42
|
+
const FILE_CONFIG_PATH = path.join(CONFIG_DIR, "oc-go-usage-display.json");
|
|
43
|
+
const LEGACY_FILE_CONFIG_PATH = path.join(CONFIG_DIR, "opencode-go-usage.json");
|
|
44
|
+
const DISK_CACHE_PATH = path.join(CONFIG_DIR, "oc-go-usage-display-cache.json");
|
|
45
|
+
function dataShareAuthPath() {
|
|
46
|
+
const xdgDataHome = toNonEmptyString(process.env.XDG_DATA_HOME);
|
|
47
|
+
if (xdgDataHome)
|
|
48
|
+
return path.join(xdgDataHome, "opencode", "auth.json");
|
|
49
|
+
return path.join(os.homedir(), ".local", "share", "opencode", "auth.json");
|
|
50
|
+
}
|
|
51
|
+
function authJsonPaths() {
|
|
52
|
+
return [dataShareAuthPath(), path.join(CONFIG_DIR, "auth.json")];
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Small pure helpers
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
function isRecord(value) {
|
|
58
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
59
|
+
}
|
|
60
|
+
function toFiniteNumber(value) {
|
|
61
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
62
|
+
return null;
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
function toNonEmptyString(value) {
|
|
66
|
+
if (typeof value !== "string")
|
|
67
|
+
return null;
|
|
68
|
+
const trimmed = value.trim();
|
|
69
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
70
|
+
}
|
|
71
|
+
function formatResetDuration(totalSec) {
|
|
72
|
+
if (totalSec === null || !Number.isFinite(totalSec) || totalSec < 0)
|
|
73
|
+
return null;
|
|
74
|
+
const sec = Math.floor(totalSec);
|
|
75
|
+
const hours = Math.floor(sec / 3600);
|
|
76
|
+
const minutes = Math.floor((sec % 3600) / 60);
|
|
77
|
+
if (hours > 0)
|
|
78
|
+
return `${hours}h${minutes}m`;
|
|
79
|
+
if (minutes > 0)
|
|
80
|
+
return `${minutes}m`;
|
|
81
|
+
return `${sec}s`;
|
|
82
|
+
}
|
|
83
|
+
function formatWindow(window) {
|
|
84
|
+
if (!window)
|
|
85
|
+
return "n/a";
|
|
86
|
+
return `${window.percent}%`;
|
|
87
|
+
}
|
|
88
|
+
function formatCompactLine(snapshot) {
|
|
89
|
+
if (snapshot.apiUnavailable || (!snapshot.rolling && !snapshot.weekly && !snapshot.monthly)) {
|
|
90
|
+
const reason = snapshot.apiError ?? "unknown error";
|
|
91
|
+
return `Go n/a (${reason})`;
|
|
92
|
+
}
|
|
93
|
+
const rollingReset = formatResetDuration(snapshot.rolling?.resetInSec ?? null) ??
|
|
94
|
+
snapshot.rolling?.resetText ??
|
|
95
|
+
null;
|
|
96
|
+
const rollingText = snapshot.rolling === null
|
|
97
|
+
? "5h n/a"
|
|
98
|
+
: `5h ${snapshot.rolling.percent}%${rollingReset ? ` (reset ${rollingReset})` : ""}`;
|
|
99
|
+
return `Go ${rollingText} | 7d ${formatWindow(snapshot.weekly)} | 30d ${formatWindow(snapshot.monthly)}`;
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Credentials (boundary: env + optional JSON file; never logged)
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
function readFileConfig() {
|
|
105
|
+
for (const configPath of [FILE_CONFIG_PATH, LEGACY_FILE_CONFIG_PATH]) {
|
|
106
|
+
let raw;
|
|
107
|
+
try {
|
|
108
|
+
raw = fs.readFileSync(configPath, "utf8");
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
let parsed;
|
|
114
|
+
try {
|
|
115
|
+
parsed = JSON.parse(raw);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return { workspaceId: null, authCookie: null };
|
|
119
|
+
}
|
|
120
|
+
if (!isRecord(parsed))
|
|
121
|
+
return { workspaceId: null, authCookie: null };
|
|
122
|
+
return {
|
|
123
|
+
workspaceId: toNonEmptyString(parsed.workspaceId),
|
|
124
|
+
authCookie: toNonEmptyString(parsed.authCookie),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return { workspaceId: null, authCookie: null };
|
|
128
|
+
}
|
|
129
|
+
function readAuthJsonApiKey() {
|
|
130
|
+
for (const authPath of authJsonPaths()) {
|
|
131
|
+
let raw;
|
|
132
|
+
try {
|
|
133
|
+
raw = fs.readFileSync(authPath, "utf8");
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
let parsed;
|
|
139
|
+
try {
|
|
140
|
+
parsed = JSON.parse(raw);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!isRecord(parsed))
|
|
146
|
+
continue;
|
|
147
|
+
const goEntry = parsed["opencode-go"];
|
|
148
|
+
const fallbackEntry = parsed["opencode"];
|
|
149
|
+
const goKey = isRecord(goEntry) ? toNonEmptyString(goEntry.key) : null;
|
|
150
|
+
if (goKey)
|
|
151
|
+
return goKey;
|
|
152
|
+
const fallbackKey = isRecord(fallbackEntry) ? toNonEmptyString(fallbackEntry.key) : null;
|
|
153
|
+
if (fallbackKey)
|
|
154
|
+
return fallbackKey;
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
function resolveCredentials() {
|
|
159
|
+
if (process.env.OPENCODE_GO_MOCK === "1")
|
|
160
|
+
return { kind: "mock" };
|
|
161
|
+
const apiKey = toNonEmptyString(process.env.OPENCODE_GO_API_KEY);
|
|
162
|
+
if (apiKey)
|
|
163
|
+
return { kind: "apiKey", apiKey };
|
|
164
|
+
const authJsonKey = readAuthJsonApiKey();
|
|
165
|
+
if (authJsonKey)
|
|
166
|
+
return { kind: "apiKey", apiKey: authJsonKey };
|
|
167
|
+
const fileConfig = readFileConfig();
|
|
168
|
+
const workspaceId = toNonEmptyString(process.env.OPENCODE_GO_WORKSPACE_ID) ?? fileConfig.workspaceId;
|
|
169
|
+
const authCookie = toNonEmptyString(process.env.OPENCODE_GO_AUTH_COOKIE) ?? fileConfig.authCookie;
|
|
170
|
+
if (workspaceId && authCookie)
|
|
171
|
+
return { kind: "cookie", workspaceId, authCookie };
|
|
172
|
+
return { kind: "none" };
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// Cache (memory + disk, 60s TTL)
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
let memoryCache = null;
|
|
178
|
+
function isFresh(at, now) {
|
|
179
|
+
return now - at < CACHE_TTL_MS;
|
|
180
|
+
}
|
|
181
|
+
function readDiskCache(now) {
|
|
182
|
+
let raw;
|
|
183
|
+
try {
|
|
184
|
+
raw = fs.readFileSync(DISK_CACHE_PATH, "utf8");
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
let parsed;
|
|
190
|
+
try {
|
|
191
|
+
parsed = JSON.parse(raw);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
if (!isRecord(parsed))
|
|
197
|
+
return null;
|
|
198
|
+
const at = toFiniteNumber(parsed.at);
|
|
199
|
+
if (at === null || !isFresh(at, now))
|
|
200
|
+
return null;
|
|
201
|
+
if (!isRecord(parsed.snapshot))
|
|
202
|
+
return null;
|
|
203
|
+
const snapshot = parsed.snapshot;
|
|
204
|
+
if (!("rolling" in snapshot && "weekly" in snapshot && "monthly" in snapshot))
|
|
205
|
+
return null;
|
|
206
|
+
return snapshot;
|
|
207
|
+
}
|
|
208
|
+
function writeDiskCache(snapshot) {
|
|
209
|
+
try {
|
|
210
|
+
fs.mkdirSync(path.dirname(DISK_CACHE_PATH), { recursive: true });
|
|
211
|
+
fs.writeFileSync(DISK_CACHE_PATH, JSON.stringify({ at: Date.now(), snapshot }), "utf8");
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Cache is best-effort; usage display must never break the host.
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Fetch helpers
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
function unavailableSnapshot(error, source = "unavailable") {
|
|
221
|
+
return {
|
|
222
|
+
rolling: null,
|
|
223
|
+
weekly: null,
|
|
224
|
+
monthly: null,
|
|
225
|
+
source,
|
|
226
|
+
fetchedAt: Date.now(),
|
|
227
|
+
apiUnavailable: true,
|
|
228
|
+
apiError: error,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function fetchWithTimeout(url, init) {
|
|
232
|
+
const controller = new AbortController();
|
|
233
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
234
|
+
try {
|
|
235
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
clearTimeout(timer);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// --- API-key path: tolerant JSON parsing (shape may evolve) ---
|
|
242
|
+
function extractWindow(candidate) {
|
|
243
|
+
if (!isRecord(candidate))
|
|
244
|
+
return null;
|
|
245
|
+
const percent = toFiniteNumber(candidate.percent ??
|
|
246
|
+
candidate.usagePercent ??
|
|
247
|
+
candidate.usedPercent ??
|
|
248
|
+
candidate.value ??
|
|
249
|
+
candidate.usage);
|
|
250
|
+
if (percent === null)
|
|
251
|
+
return null;
|
|
252
|
+
const resetInSec = toFiniteNumber(candidate.resetInSec ?? candidate.resetInSeconds ?? null);
|
|
253
|
+
const status = toNonEmptyString(candidate.status);
|
|
254
|
+
const resetText = toNonEmptyString(candidate.resetText ?? candidate.reset ?? null);
|
|
255
|
+
return { percent: Math.round(percent), resetInSec, status, resetText };
|
|
256
|
+
}
|
|
257
|
+
function extractSnapshotFromApiPayload(payload) {
|
|
258
|
+
if (!isRecord(payload))
|
|
259
|
+
return null;
|
|
260
|
+
const containers = [payload];
|
|
261
|
+
for (const key of ["usage", "data", "go"]) {
|
|
262
|
+
if (isRecord(payload[key]))
|
|
263
|
+
containers.push(payload[key]);
|
|
264
|
+
}
|
|
265
|
+
for (const container of containers) {
|
|
266
|
+
if (!isRecord(container))
|
|
267
|
+
continue;
|
|
268
|
+
const rolling = extractWindow(container.rolling ?? container.rollingUsage ?? container["5h"]);
|
|
269
|
+
const weekly = extractWindow(container.weekly ?? container.weeklyUsage ?? container["7d"]);
|
|
270
|
+
const monthly = extractWindow(container.monthly ?? container.monthlyUsage ?? container["30d"]);
|
|
271
|
+
if (rolling || weekly || monthly) {
|
|
272
|
+
return {
|
|
273
|
+
rolling,
|
|
274
|
+
weekly,
|
|
275
|
+
monthly,
|
|
276
|
+
source: "api",
|
|
277
|
+
fetchedAt: Date.now(),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
async function fetchViaApiKey(apiKey) {
|
|
284
|
+
let response;
|
|
285
|
+
try {
|
|
286
|
+
response = await fetchWithTimeout(API_USAGE_URL, {
|
|
287
|
+
headers: {
|
|
288
|
+
Authorization: `Bearer ${apiKey}`,
|
|
289
|
+
Accept: "application/json",
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return unavailableSnapshot("request failed");
|
|
295
|
+
}
|
|
296
|
+
if (response.status === 401 || response.status === 403) {
|
|
297
|
+
return unavailableSnapshot("API key rejected (401/403)");
|
|
298
|
+
}
|
|
299
|
+
if (!response.ok) {
|
|
300
|
+
return unavailableSnapshot(`upstream returned HTTP ${response.status}`);
|
|
301
|
+
}
|
|
302
|
+
let payload;
|
|
303
|
+
try {
|
|
304
|
+
payload = await response.json();
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return unavailableSnapshot("unexpected API response shape");
|
|
308
|
+
}
|
|
309
|
+
return extractSnapshotFromApiPayload(payload) ?? unavailableSnapshot("unexpected API response shape");
|
|
310
|
+
}
|
|
311
|
+
// --- Cookie path: workspace page scrape (ported from opencode-go-hud) ---
|
|
312
|
+
const USAGE_KEYS = {
|
|
313
|
+
rolling: "rollingUsage",
|
|
314
|
+
weekly: "weeklyUsage",
|
|
315
|
+
monthly: "monthlyUsage",
|
|
316
|
+
};
|
|
317
|
+
const DOM_ORDER = ["rolling", "weekly", "monthly"];
|
|
318
|
+
const LOGIN_TITLE_MARKER = "<title>OpenAuth</title>";
|
|
319
|
+
function isLoginPage(finalUrl, html) {
|
|
320
|
+
let host = "";
|
|
321
|
+
let pathname = "";
|
|
322
|
+
try {
|
|
323
|
+
const parsed = new URL(finalUrl);
|
|
324
|
+
host = parsed.hostname;
|
|
325
|
+
pathname = parsed.pathname;
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// Malformed URL: fall through to marker check.
|
|
329
|
+
}
|
|
330
|
+
if (host === "auth.opencode.ai")
|
|
331
|
+
return true;
|
|
332
|
+
if (host === "opencode.ai" && pathname.startsWith("/auth"))
|
|
333
|
+
return true;
|
|
334
|
+
return html.includes(LOGIN_TITLE_MARKER);
|
|
335
|
+
}
|
|
336
|
+
function isNoSubscription(html) {
|
|
337
|
+
if (!html.includes('data-slot="subscribe-button"'))
|
|
338
|
+
return false;
|
|
339
|
+
return /lite\s*:\s*null/.test(html) && /liteSubscriptionID\s*:\s*null/.test(html);
|
|
340
|
+
}
|
|
341
|
+
function escapeRegex(text) {
|
|
342
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
343
|
+
}
|
|
344
|
+
function extractUsageBlock(html, key) {
|
|
345
|
+
const pattern = new RegExp(`${escapeRegex(key)}\\s*:\\s*(?:\\$R\\[\\d+\\]\\s*=\\s*)?\\{`);
|
|
346
|
+
const match = pattern.exec(html);
|
|
347
|
+
if (!match || match.index === undefined)
|
|
348
|
+
return null;
|
|
349
|
+
const braceStart = match.index + match[0].length - 1;
|
|
350
|
+
let depth = 0;
|
|
351
|
+
for (let i = braceStart; i < html.length; i++) {
|
|
352
|
+
if (html[i] === "{")
|
|
353
|
+
depth += 1;
|
|
354
|
+
else if (html[i] === "}") {
|
|
355
|
+
depth -= 1;
|
|
356
|
+
if (depth === 0)
|
|
357
|
+
return html.slice(braceStart, i + 1);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
function parseIntField(block, field) {
|
|
363
|
+
const match = new RegExp(`${escapeRegex(field)}\\s*:\\s*(-?\\d+)`).exec(block);
|
|
364
|
+
return match ? Number.parseInt(match[1], 10) : null;
|
|
365
|
+
}
|
|
366
|
+
function parseStrField(block, field) {
|
|
367
|
+
const match = new RegExp(`${escapeRegex(field)}\\s*:\\s*"([^"]*)"`).exec(block);
|
|
368
|
+
return match ? match[1] : null;
|
|
369
|
+
}
|
|
370
|
+
function parseInlineUsage(html) {
|
|
371
|
+
const result = {};
|
|
372
|
+
for (const [name, key] of Object.entries(USAGE_KEYS)) {
|
|
373
|
+
const window = name;
|
|
374
|
+
const block = extractUsageBlock(html, key);
|
|
375
|
+
if (!block)
|
|
376
|
+
continue;
|
|
377
|
+
const percent = parseIntField(block, "usagePercent");
|
|
378
|
+
if (percent === null)
|
|
379
|
+
continue;
|
|
380
|
+
result[window] = {
|
|
381
|
+
percent,
|
|
382
|
+
resetInSec: parseIntField(block, "resetInSec"),
|
|
383
|
+
status: parseStrField(block, "status"),
|
|
384
|
+
resetText: null,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return result;
|
|
388
|
+
}
|
|
389
|
+
function cleanResetText(raw) {
|
|
390
|
+
const cleaned = raw
|
|
391
|
+
.replace(/<!--[\s\S]*?-->/g, "")
|
|
392
|
+
.replace(/\s+/g, " ")
|
|
393
|
+
.trim();
|
|
394
|
+
return cleaned || null;
|
|
395
|
+
}
|
|
396
|
+
function parseDomUsage(html) {
|
|
397
|
+
const result = {};
|
|
398
|
+
const itemStarts = [];
|
|
399
|
+
for (const match of html.matchAll(/data-slot="usage-item"/g)) {
|
|
400
|
+
if (match.index !== undefined)
|
|
401
|
+
itemStarts.push(match.index);
|
|
402
|
+
}
|
|
403
|
+
for (let idx = 0; idx < DOM_ORDER.length; idx++) {
|
|
404
|
+
if (idx >= itemStarts.length)
|
|
405
|
+
break;
|
|
406
|
+
const segment = html.slice(itemStarts[idx], idx + 1 < itemStarts.length ? itemStarts[idx + 1] : itemStarts[idx] + 800);
|
|
407
|
+
const valueMatch = /data-slot="usage-value">\s*(?:<!--[\s\S]*?-->)?\s*(\d+)/s.exec(segment) ??
|
|
408
|
+
/width:\s*(\d+)%/.exec(segment);
|
|
409
|
+
if (!valueMatch)
|
|
410
|
+
continue;
|
|
411
|
+
const resetMatch = /data-slot="reset-time">\s*([\s\S]*?)<\/span>/.exec(segment);
|
|
412
|
+
result[DOM_ORDER[idx]] = {
|
|
413
|
+
percent: Number.parseInt(valueMatch[1], 10),
|
|
414
|
+
resetInSec: null,
|
|
415
|
+
status: null,
|
|
416
|
+
resetText: resetMatch ? cleanResetText(resetMatch[1]) : null,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
return result;
|
|
420
|
+
}
|
|
421
|
+
function parseScrapedUsage(html) {
|
|
422
|
+
const inline = parseInlineUsage(html);
|
|
423
|
+
if (Object.keys(inline).length === 3)
|
|
424
|
+
return inline;
|
|
425
|
+
return { ...parseDomUsage(html), ...inline };
|
|
426
|
+
}
|
|
427
|
+
async function fetchViaCookie(workspaceId, authCookie) {
|
|
428
|
+
const workspaceUrl = `https://opencode.ai/workspace/${encodeURIComponent(workspaceId)}/go`;
|
|
429
|
+
let response;
|
|
430
|
+
try {
|
|
431
|
+
response = await fetchWithTimeout(workspaceUrl, {
|
|
432
|
+
redirect: "follow",
|
|
433
|
+
headers: {
|
|
434
|
+
Cookie: `auth=${authCookie}`,
|
|
435
|
+
"User-Agent": "oc-go-usage-display-plugin/1.0",
|
|
436
|
+
Accept: "text/html,application/xhtml+xml",
|
|
437
|
+
},
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
return unavailableSnapshot("request failed");
|
|
442
|
+
}
|
|
443
|
+
let html = "";
|
|
444
|
+
try {
|
|
445
|
+
html = await response.text();
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
return unavailableSnapshot("request failed");
|
|
449
|
+
}
|
|
450
|
+
if (isLoginPage(response.url, html)) {
|
|
451
|
+
return unavailableSnapshot("login expired (refresh auth cookie)");
|
|
452
|
+
}
|
|
453
|
+
if (response.status !== 200) {
|
|
454
|
+
return unavailableSnapshot(`upstream returned HTTP ${response.status}`);
|
|
455
|
+
}
|
|
456
|
+
const usages = parseScrapedUsage(html);
|
|
457
|
+
if (Object.keys(usages).length === 0) {
|
|
458
|
+
if (isNoSubscription(html))
|
|
459
|
+
return unavailableSnapshot("no OpenCode Go subscription");
|
|
460
|
+
return unavailableSnapshot("usage markup not recognized");
|
|
461
|
+
}
|
|
462
|
+
return {
|
|
463
|
+
rolling: usages.rolling ?? null,
|
|
464
|
+
weekly: usages.weekly ?? null,
|
|
465
|
+
monthly: usages.monthly ?? null,
|
|
466
|
+
source: "scrape",
|
|
467
|
+
fetchedAt: Date.now(),
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
function mockSnapshot() {
|
|
471
|
+
return {
|
|
472
|
+
rolling: { percent: 42, resetInSec: 7543, status: "active", resetText: null },
|
|
473
|
+
weekly: { percent: 15, resetInSec: null, status: "active", resetText: null },
|
|
474
|
+
monthly: { percent: 61, resetInSec: null, status: "active", resetText: null },
|
|
475
|
+
source: "mock",
|
|
476
|
+
fetchedAt: Date.now(),
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
// ---------------------------------------------------------------------------
|
|
480
|
+
// Snapshot entry point (cached, never throws, never logs secrets)
|
|
481
|
+
// ---------------------------------------------------------------------------
|
|
482
|
+
async function getUsageSnapshot() {
|
|
483
|
+
const now = Date.now();
|
|
484
|
+
if (memoryCache && isFresh(memoryCache.at, now))
|
|
485
|
+
return memoryCache.snapshot;
|
|
486
|
+
const diskCached = readDiskCache(now);
|
|
487
|
+
if (diskCached) {
|
|
488
|
+
memoryCache = { at: now, snapshot: diskCached };
|
|
489
|
+
return diskCached;
|
|
490
|
+
}
|
|
491
|
+
const credentials = resolveCredentials();
|
|
492
|
+
if (credentials.kind === "mock") {
|
|
493
|
+
const snapshot = mockSnapshot();
|
|
494
|
+
memoryCache = { at: now, snapshot };
|
|
495
|
+
return snapshot;
|
|
496
|
+
}
|
|
497
|
+
if (credentials.kind === "none") {
|
|
498
|
+
return unavailableSnapshot("not configured (set OPENCODE_GO_API_KEY)");
|
|
499
|
+
}
|
|
500
|
+
const snapshot = credentials.kind === "apiKey"
|
|
501
|
+
? await fetchViaApiKey(credentials.apiKey)
|
|
502
|
+
: await fetchViaCookie(credentials.workspaceId, credentials.authCookie);
|
|
503
|
+
if (!snapshot.apiUnavailable) {
|
|
504
|
+
memoryCache = { at: now, snapshot };
|
|
505
|
+
writeDiskCache(snapshot);
|
|
506
|
+
}
|
|
507
|
+
return snapshot;
|
|
508
|
+
}
|
|
509
|
+
// ---------------------------------------------------------------------------
|
|
510
|
+
// Plugin
|
|
511
|
+
// ---------------------------------------------------------------------------
|
|
512
|
+
export default (async () => {
|
|
513
|
+
return {
|
|
514
|
+
tool: {
|
|
515
|
+
go_usage: tool({
|
|
516
|
+
description: "Show OpenCode Go subscription usage: rolling 5h, weekly, and monthly windows. Takes no arguments.",
|
|
517
|
+
args: {},
|
|
518
|
+
execute: async () => {
|
|
519
|
+
const snapshot = await getUsageSnapshot().catch(() => unavailableSnapshot("request failed"));
|
|
520
|
+
const line = formatCompactLine(snapshot);
|
|
521
|
+
return `${line}\n${JSON.stringify(snapshot, null, 2)}`;
|
|
522
|
+
},
|
|
523
|
+
}),
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
});
|
|
527
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tui.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAqDtC,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,yBAAyB,CAAC;;;;;AA8djC,wBAAwF"}
|