oc-go-usage-display 1.1.0 → 2.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 (42) hide show
  1. package/README.md +246 -93
  2. package/bin/lib.js +395 -37
  3. package/bin/oc-go-usage-display-init.js +42 -13
  4. package/bin/oc-go-usage-display-remove.js +22 -17
  5. package/bin/oc-go-usage-display-show.js +47 -39
  6. package/bin/oc-go-usage-display-status.js +31 -52
  7. package/bin/oc-go-usage-display-update.js +27 -14
  8. package/dist/helpers.d.ts +117 -0
  9. package/dist/helpers.d.ts.map +1 -0
  10. package/dist/helpers.js +582 -0
  11. package/dist/helpers.js.map +1 -0
  12. package/dist/index.d.ts +5 -13
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +249 -159
  15. package/dist/index.js.map +1 -1
  16. package/dist/plugins/oc-go-usage-display.kilo.ts +699 -0
  17. package/dist/plugins/oc-go-usage-display.kilo.tsx +1364 -0
  18. package/dist/plugins/oc-go-usage-display.ts +699 -0
  19. package/dist/plugins/oc-go-usage-display.tsx +1108 -0
  20. package/dist/shared.d.ts +87 -8
  21. package/dist/shared.d.ts.map +1 -1
  22. package/dist/shared.js +596 -31
  23. package/dist/shared.js.map +1 -1
  24. package/dist/tui-shared.d.ts +109 -0
  25. package/dist/tui-shared.d.ts.map +1 -0
  26. package/dist/tui-shared.js +408 -0
  27. package/dist/tui-shared.js.map +1 -0
  28. package/dist/tui.d.ts +0 -17
  29. package/dist/tui.d.ts.map +1 -1
  30. package/dist/tui.js +229 -282
  31. package/dist/tui.js.map +1 -1
  32. package/dist/tui.kilo.d.ts +8 -0
  33. package/dist/tui.kilo.d.ts.map +1 -0
  34. package/dist/tui.kilo.js +502 -0
  35. package/dist/tui.kilo.js.map +1 -0
  36. package/package.json +49 -15
  37. package/src/helpers.ts +749 -0
  38. package/src/index.ts +316 -175
  39. package/src/shared.ts +693 -32
  40. package/src/tui-shared.tsx +755 -0
  41. package/src/tui.kilo.tsx +817 -0
  42. package/src/tui.tsx +352 -366
package/dist/index.js CHANGED
@@ -12,93 +12,66 @@
12
12
  // only (one tool). No transcript injection, no TUI
13
13
  // footer slot (unstable API).
14
14
  //
15
- // Auth (first match wins, secrets are never logged):
15
+ // Auth (first match wins, secrets are never logged), host-specific stores:
16
16
  // 1. OPENCODE_GO_MOCK=1 -> deterministic mock snapshot (for testing)
17
17
  // 2. OPENCODE_GO_API_KEY -> GET https://opencode.ai/zen/go/v1/usage
18
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.
19
+ // 3. Provider auth.json key -> same Bearer path as (2), no paste needed.
20
+ // opencode bundle: $XDG_DATA_HOME/opencode/
21
+ // auth.json (~/.local/share/opencode/auth.json),
22
+ // fallback $XDG_CONFIG_HOME/opencode/auth.json
23
+ // (~/.config/opencode/auth.json); uses the
24
+ // `opencode-go` key, else `opencode`.
25
+ // Kilo bundle (oc-go-usage-display.kilo.ts):
26
+ // the same files under the `kilo` roots, so
27
+ // a Kilo-only login works.
24
28
  // 4. OPENCODE_GO_WORKSPACE_ID + OPENCODE_GO_AUTH_COOKIE (env), or
25
- // ~/.config/opencode/oc-go-usage-display.json
29
+ // <host config dir>/oc-go-usage-display.json
26
30
  // ({ "workspaceId": "...", "authCookie": "..." })
27
31
  // -> GET https://opencode.ai/workspace/{id}/go
28
32
  // (scraped rolling/weekly/monthly)
29
33
  // 5. none -> unavailable snapshot (literal-only error)
30
- // Snapshots are cached 60s in memory + on disk.
34
+ // Snapshots are cached 60s in memory + on disk (host config dir).
31
35
  import { tool } from "@opencode-ai/plugin";
32
36
  import * as fs from "node:fs";
33
37
  import * as path from "node:path";
34
- import { CONFIG_DIR, extractSnapshotFromApiPayload, extractWindow, formatResetDuration, isRecord, mockSnapshot, readAuthJsonApiKey, toFiniteNumber, toNonEmptyString, unavailableSnapshot, } from "./shared.js";
35
- // Re-exported so `dist/index.js` keeps the helper surface used by tests.
36
- export { formatResetDuration };
38
+ import { formatServerLine, hasMalformedAuthCookie, isMalformedAuthCookie, readFileConfig, resolveAllowedRedirect, } from "./helpers.js";
39
+ import { errorMessage, extractSnapshotFromApiPayload, extractWindow, hostEnv, hostEnvName, isLimitedStatus, isRecord, mockSnapshot, readAuthJsonApiKey, resolveHostRoots, resolveUsageHost, safeJoinPath, toFiniteNumber, toNonEmptyString, unavailableSnapshot, } from "./shared.js";
37
40
  // ---------------------------------------------------------------------------
38
41
  // Constants
39
42
  // ---------------------------------------------------------------------------
40
43
  const API_USAGE_URL = "https://opencode.ai/zen/go/v1/usage";
41
44
  const CACHE_TTL_MS = 60_000;
42
45
  const FETCH_TIMEOUT_MS = 10_000;
43
- const FILE_CONFIG_PATH = path.join(CONFIG_DIR, "oc-go-usage-display.json");
44
- const DISK_CACHE_PATH = path.join(CONFIG_DIR, "oc-go-usage-display-cache.json");
45
- function formatWindow(window) {
46
- if (!window)
47
- return "n/a";
48
- return `${window.percent}%`;
49
- }
50
- export function formatCompactLine(snapshot) {
51
- if (snapshot.apiUnavailable || (!snapshot.rolling && !snapshot.weekly && !snapshot.monthly)) {
52
- const reason = snapshot.apiError ?? "unknown error";
53
- return `Go n/a (${reason})`;
54
- }
55
- const rollingReset = formatResetDuration(snapshot.rolling?.resetInSec ?? null) ??
56
- snapshot.rolling?.resetText ??
57
- null;
58
- const rollingText = snapshot.rolling === null
59
- ? "5h n/a"
60
- : `5h ${snapshot.rolling.percent}%${rollingReset ? ` (reset ${rollingReset})` : ""}`;
61
- return `Go ${rollingText} | 7d ${formatWindow(snapshot.weekly)} | 30d ${formatWindow(snapshot.monthly)}`;
62
- }
46
+ const WINDOW_KEYS = ["rolling", "weekly", "monthly"];
47
+ // Fetch redirect statuses (the cookie path handles them manually).
48
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
49
+ // Host this bundle serves: "kilo" only when baked in by the build (see
50
+ // scripts/build-plugins.mjs); every other case is opencode. Credentials, file
51
+ // config and the disk cache always resolve from this host's own roots.
52
+ const HOST = resolveUsageHost();
53
+ const DISK_CACHE_PATH = safeJoinPath(resolveHostRoots(HOST).configDir, "oc-go-usage-display-cache.json");
63
54
  // ---------------------------------------------------------------------------
64
55
  // Credentials (boundary: env + optional JSON file; never logged)
65
56
  // ---------------------------------------------------------------------------
66
- function readFileConfig() {
67
- let raw;
68
- try {
69
- raw = fs.readFileSync(FILE_CONFIG_PATH, "utf8");
70
- }
71
- catch {
72
- return { workspaceId: null, authCookie: null };
73
- }
74
- let parsed;
75
- try {
76
- parsed = JSON.parse(raw);
77
- }
78
- catch {
79
- return { workspaceId: null, authCookie: null };
80
- }
81
- if (!isRecord(parsed))
82
- return { workspaceId: null, authCookie: null };
83
- return {
84
- workspaceId: toNonEmptyString(parsed.workspaceId),
85
- authCookie: toNonEmptyString(parsed.authCookie),
86
- };
87
- }
88
- function resolveCredentials() {
89
- if (process.env.OPENCODE_GO_MOCK === "1")
57
+ function resolveCredentials(fileConfig = readFileConfig(HOST)) {
58
+ if (hostEnv(HOST, "MOCK") === "1")
90
59
  return { kind: "mock" };
91
- const apiKey = toNonEmptyString(process.env.OPENCODE_GO_API_KEY);
60
+ const apiKey = toNonEmptyString(hostEnv(HOST, "API_KEY"));
92
61
  if (apiKey)
93
62
  return { kind: "apiKey", apiKey };
94
- const authJsonKey = readAuthJsonApiKey();
63
+ const authJsonKey = readAuthJsonApiKey(HOST);
95
64
  if (authJsonKey)
96
65
  return { kind: "apiKey", apiKey: authJsonKey };
97
- const fileConfig = readFileConfig();
98
- const workspaceId = toNonEmptyString(process.env.OPENCODE_GO_WORKSPACE_ID) ?? fileConfig.workspaceId;
99
- const authCookie = toNonEmptyString(process.env.OPENCODE_GO_AUTH_COOKIE) ?? fileConfig.authCookie;
100
- if (workspaceId && authCookie)
66
+ const workspaceId = toNonEmptyString(hostEnv(HOST, "WORKSPACE_ID")) ?? fileConfig.workspaceId;
67
+ const authCookie = toNonEmptyString(hostEnv(HOST, "AUTH_COOKIE")) ?? fileConfig.authCookie;
68
+ if (workspaceId && authCookie) {
69
+ // Reject header-injection / cookie-jar confusion payloads. The cookie
70
+ // value is never logged; malformed values fall through to "none".
71
+ if (isMalformedAuthCookie(authCookie))
72
+ return { kind: "none" };
101
73
  return { kind: "cookie", workspaceId, authCookie };
74
+ }
102
75
  return { kind: "none" };
103
76
  }
104
77
  // ---------------------------------------------------------------------------
@@ -106,7 +79,7 @@ function resolveCredentials() {
106
79
  // ---------------------------------------------------------------------------
107
80
  let memoryCache = null;
108
81
  function isFresh(at, now) {
109
- return now - at < CACHE_TTL_MS;
82
+ return at <= now && now - at < CACHE_TTL_MS;
110
83
  }
111
84
  function readDiskCache(now) {
112
85
  let raw;
@@ -133,16 +106,25 @@ function readDiskCache(now) {
133
106
  const snapshot = parsed.snapshot;
134
107
  if (!("rolling" in snapshot && "weekly" in snapshot && "monthly" in snapshot))
135
108
  return null;
136
- // Validate cached windows instead of blindly trusting the shape; a corrupt
137
- // entry is dropped so the next fetch repopulates the cache.
138
- for (const key of ["rolling", "weekly", "monthly"]) {
109
+ // Re-parse the stored windows instead of casting the raw entry: a cache file
110
+ // written by an older build predates newer `UsageWindow` fields, so the entry
111
+ // can be missing them. A window that no longer parses drops the whole entry
112
+ // so the next fetch repopulates the cache.
113
+ const windows = {
114
+ rolling: null,
115
+ weekly: null,
116
+ monthly: null,
117
+ };
118
+ for (const key of WINDOW_KEYS) {
139
119
  const cachedWindow = snapshot[key];
140
120
  if (cachedWindow === null)
141
121
  continue;
142
- if (extractWindow(cachedWindow) === null)
122
+ const window = extractWindow(cachedWindow);
123
+ if (window === null)
143
124
  return null;
125
+ windows[key] = window;
144
126
  }
145
- return snapshot;
127
+ return { ...snapshot, ...windows };
146
128
  }
147
129
  function writeDiskCache(snapshot) {
148
130
  try {
@@ -156,11 +138,18 @@ function writeDiskCache(snapshot) {
156
138
  // ---------------------------------------------------------------------------
157
139
  // Fetch helpers
158
140
  // ---------------------------------------------------------------------------
159
- async function fetchWithTimeout(url, init) {
141
+ // Run the whole exchange (headers and body) under one abort timer: clearing
142
+ // it as soon as the response headers arrive would leave a server that stalls
143
+ // mid-body hanging past FETCH_TIMEOUT_MS. `read` consumes the body while the
144
+ // timer is armed; the signal lets callers tell an aborted read from a payload
145
+ // problem. The timer is cleared on every path (body read, redirect handling,
146
+ // fetch failure, abort).
147
+ async function fetchWithTimeout(url, init, read) {
160
148
  const controller = new AbortController();
161
149
  const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
162
150
  try {
163
- return await fetch(url, { ...init, signal: controller.signal });
151
+ const response = await fetch(url, { ...init, signal: controller.signal });
152
+ return await read(response, controller.signal);
164
153
  }
165
154
  finally {
166
155
  clearTimeout(timer);
@@ -169,32 +158,34 @@ async function fetchWithTimeout(url, init) {
169
158
  // --- API-key path: tolerant JSON parsing lives in `./shared.js` (shape may
170
159
  // evolve); scrape helpers below stay server-local. ---
171
160
  async function fetchViaApiKey(apiKey) {
172
- let response;
173
161
  try {
174
- response = await fetchWithTimeout(API_USAGE_URL, {
162
+ return await fetchWithTimeout(API_USAGE_URL, {
175
163
  headers: {
176
164
  Authorization: `Bearer ${apiKey}`,
177
165
  Accept: "application/json",
178
166
  },
167
+ }, async (response, signal) => {
168
+ if (response.status === 401 || response.status === 403) {
169
+ return unavailableSnapshot("API key rejected (401/403)");
170
+ }
171
+ if (!response.ok) {
172
+ return unavailableSnapshot(`upstream returned HTTP ${response.status}`);
173
+ }
174
+ let payload;
175
+ try {
176
+ payload = await response.json();
177
+ }
178
+ catch {
179
+ // A body read cut off by the timeout is a request failure; anything
180
+ // else is a payload the API-shape parser cannot use.
181
+ return unavailableSnapshot(signal.aborted ? "request failed" : "unexpected API response shape");
182
+ }
183
+ return extractSnapshotFromApiPayload(payload) ?? unavailableSnapshot("unexpected API response shape");
179
184
  });
180
185
  }
181
186
  catch {
182
187
  return unavailableSnapshot("request failed");
183
188
  }
184
- if (response.status === 401 || response.status === 403) {
185
- return unavailableSnapshot("API key rejected (401/403)");
186
- }
187
- if (!response.ok) {
188
- return unavailableSnapshot(`upstream returned HTTP ${response.status}`);
189
- }
190
- let payload;
191
- try {
192
- payload = await response.json();
193
- }
194
- catch {
195
- return unavailableSnapshot("unexpected API response shape");
196
- }
197
- return extractSnapshotFromApiPayload(payload) ?? unavailableSnapshot("unexpected API response shape");
198
189
  }
199
190
  // --- Cookie path: workspace page scrape (ported from opencode-go-hud) ---
200
191
  const USAGE_KEYS = {
@@ -202,6 +193,9 @@ const USAGE_KEYS = {
202
193
  weekly: "weeklyUsage",
203
194
  monthly: "monthlyUsage",
204
195
  };
196
+ // Markup order of the `usage-item` slots. Spelled out rather than derived from
197
+ // `WINDOW_KEYS`: it is a property of the scraped page, not of the display, and
198
+ // must not follow a display-order change.
205
199
  const DOM_ORDER = ["rolling", "weekly", "monthly"];
206
200
  const LOGIN_TITLE_MARKER = "<title>OpenAuth</title>";
207
201
  function isLoginPage(finalUrl, html) {
@@ -249,11 +243,12 @@ function extractUsageBlock(html, key) {
249
243
  }
250
244
  function parseIntField(block, field) {
251
245
  const match = new RegExp(`${escapeRegex(field)}\\s*:\\s*(-?\\d+)`).exec(block);
252
- return match ? Number.parseInt(match[1], 10) : null;
246
+ const digits = match?.[1];
247
+ return digits === undefined ? null : Number.parseInt(digits, 10);
253
248
  }
254
249
  function parseStrField(block, field) {
255
250
  const match = new RegExp(`${escapeRegex(field)}\\s*:\\s*"([^"]*)"`).exec(block);
256
- return match ? match[1] : null;
251
+ return match?.[1] ?? null;
257
252
  }
258
253
  function parseInlineUsage(html) {
259
254
  const result = {};
@@ -265,10 +260,12 @@ function parseInlineUsage(html) {
265
260
  const percent = parseIntField(block, "usagePercent");
266
261
  if (percent === null)
267
262
  continue;
263
+ const status = parseStrField(block, "status");
268
264
  result[window] = {
269
265
  percent,
266
+ status,
267
+ limited: isLimitedStatus(status),
270
268
  resetInSec: parseIntField(block, "resetInSec"),
271
- status: parseStrField(block, "status"),
272
269
  resetText: null,
273
270
  };
274
271
  }
@@ -289,19 +286,25 @@ function parseDomUsage(html) {
289
286
  itemStarts.push(match.index);
290
287
  }
291
288
  for (let idx = 0; idx < DOM_ORDER.length; idx++) {
292
- if (idx >= itemStarts.length)
289
+ const window = DOM_ORDER[idx];
290
+ const start = itemStarts[idx];
291
+ if (window === undefined || start === undefined)
293
292
  break;
294
- const segment = html.slice(itemStarts[idx], idx + 1 < itemStarts.length ? itemStarts[idx + 1] : itemStarts[idx] + 800);
293
+ const nextStart = itemStarts[idx + 1];
294
+ const segment = html.slice(start, nextStart !== undefined ? nextStart : start + 800);
295
295
  const valueMatch = /data-slot="usage-value">\s*(?:<!--[\s\S]*?-->)?\s*(\d+)/s.exec(segment) ??
296
296
  /width:\s*(\d+)%/.exec(segment);
297
- if (!valueMatch)
297
+ const percent = valueMatch?.[1];
298
+ if (percent === undefined)
298
299
  continue;
299
300
  const resetMatch = /data-slot="reset-time">\s*([\s\S]*?)<\/span>/.exec(segment);
300
- result[DOM_ORDER[idx]] = {
301
- percent: Number.parseInt(valueMatch[1], 10),
302
- resetInSec: null,
301
+ const resetText = resetMatch?.[1];
302
+ result[window] = {
303
+ percent: Number.parseInt(percent, 10),
303
304
  status: null,
304
- resetText: resetMatch ? cleanResetText(resetMatch[1]) : null,
305
+ limited: false,
306
+ resetInSec: null,
307
+ resetText: resetText !== undefined ? cleanResetText(resetText) : null,
305
308
  };
306
309
  }
307
310
  return result;
@@ -314,46 +317,64 @@ function parseScrapedUsage(html) {
314
317
  }
315
318
  async function fetchViaCookie(workspaceId, authCookie) {
316
319
  const workspaceUrl = `https://opencode.ai/workspace/${encodeURIComponent(workspaceId)}/go`;
317
- let response;
318
- try {
319
- response = await fetchWithTimeout(workspaceUrl, {
320
- redirect: "follow",
321
- headers: {
322
- Cookie: `auth=${authCookie}`,
323
- "User-Agent": "oc-go-usage-display-plugin",
324
- Accept: "text/html,application/xhtml+xml",
325
- },
326
- });
327
- }
328
- catch {
329
- return unavailableSnapshot("request failed");
330
- }
331
- let html = "";
332
- try {
333
- html = await response.text();
334
- }
335
- catch {
336
- return unavailableSnapshot("request failed");
337
- }
338
- if (isLoginPage(response.url, html)) {
339
- return unavailableSnapshot("login expired (refresh auth cookie)");
340
- }
341
- if (response.status !== 200) {
342
- return unavailableSnapshot(`upstream returned HTTP ${response.status}`);
343
- }
344
- const usages = parseScrapedUsage(html);
345
- if (Object.keys(usages).length === 0) {
346
- if (isNoSubscription(html))
347
- return unavailableSnapshot("no OpenCode Go subscription");
348
- return unavailableSnapshot("usage markup not recognized");
320
+ let currentUrl = workspaceUrl;
321
+ let hopsFollowed = 0;
322
+ // `redirect: "manual"`: automatic redirect following may re-send caller
323
+ // headers (including the auth cookie) to a cross-origin Location, and runtime
324
+ // header stripping cannot be relied on. Each hop is re-requested only after
325
+ // `resolveAllowedRedirect` approves the Location (allowlisted canonical HTTPS
326
+ // hosts, at most MAX_REDIRECT_HOPS hops).
327
+ for (;;) {
328
+ let hop;
329
+ try {
330
+ hop = await fetchWithTimeout(currentUrl, {
331
+ redirect: "manual",
332
+ headers: {
333
+ Cookie: `auth=${authCookie}`,
334
+ "User-Agent": "oc-go-usage-display-plugin",
335
+ Accept: "text/html,application/xhtml+xml",
336
+ },
337
+ }, async (response) => {
338
+ if (REDIRECT_STATUSES.has(response.status)) {
339
+ // The redirect body is never read: Location alone decides the next
340
+ // hop, so this resolves (and clears the abort timer) immediately.
341
+ return { kind: "redirect", location: response.headers.get("location") };
342
+ }
343
+ return { kind: "body", status: response.status, html: await response.text() };
344
+ });
345
+ }
346
+ catch {
347
+ return unavailableSnapshot("request failed");
348
+ }
349
+ if (hop.kind === "redirect") {
350
+ const decision = resolveAllowedRedirect(currentUrl, hop.location, hopsFollowed);
351
+ if (!decision.follow)
352
+ return unavailableSnapshot(decision.reason);
353
+ currentUrl = decision.url;
354
+ hopsFollowed += 1;
355
+ continue;
356
+ }
357
+ const { status, html } = hop;
358
+ if (isLoginPage(currentUrl, html)) {
359
+ return unavailableSnapshot("login expired (refresh auth cookie)");
360
+ }
361
+ if (status !== 200) {
362
+ return unavailableSnapshot(`upstream returned HTTP ${status}`);
363
+ }
364
+ const usages = parseScrapedUsage(html);
365
+ if (Object.keys(usages).length === 0) {
366
+ if (isNoSubscription(html))
367
+ return unavailableSnapshot("no OpenCode Go subscription");
368
+ return unavailableSnapshot("usage markup not recognized");
369
+ }
370
+ return {
371
+ rolling: usages.rolling ?? null,
372
+ weekly: usages.weekly ?? null,
373
+ monthly: usages.monthly ?? null,
374
+ source: "scrape",
375
+ fetchedAt: Date.now(),
376
+ };
349
377
  }
350
- return {
351
- rolling: usages.rolling ?? null,
352
- weekly: usages.weekly ?? null,
353
- monthly: usages.monthly ?? null,
354
- source: "scrape",
355
- fetchedAt: Date.now(),
356
- };
357
378
  }
358
379
  // ---------------------------------------------------------------------------
359
380
  // Snapshot entry point (cached, never throws, never logs secrets)
@@ -361,11 +382,10 @@ async function fetchViaCookie(workspaceId, authCookie) {
361
382
  async function getUsageSnapshot() {
362
383
  const now = Date.now();
363
384
  // Mock bypasses cache for determinism: a stale disk/memory entry must
364
- // never shadow the deterministic mock snapshot during tests.
365
- if (process.env.OPENCODE_GO_MOCK === "1") {
366
- const snapshot = mockSnapshot();
367
- memoryCache = { at: now, snapshot };
368
- return snapshot;
385
+ // never shadow the deterministic mock snapshot during tests. The mock
386
+ // never reads or writes the cache.
387
+ if (hostEnv(HOST, "MOCK") === "1") {
388
+ return mockSnapshot();
369
389
  }
370
390
  if (memoryCache && isFresh(memoryCache.at, now))
371
391
  return memoryCache.snapshot;
@@ -374,14 +394,20 @@ async function getUsageSnapshot() {
374
394
  memoryCache = { at: now, snapshot: diskCached };
375
395
  return diskCached;
376
396
  }
377
- const credentials = resolveCredentials();
397
+ const fileConfig = readFileConfig(HOST);
398
+ const credentials = resolveCredentials(fileConfig);
378
399
  if (credentials.kind === "mock") {
379
- const snapshot = mockSnapshot();
380
- memoryCache = { at: now, snapshot };
381
- return snapshot;
400
+ return mockSnapshot();
382
401
  }
383
402
  if (credentials.kind === "none") {
384
- return unavailableSnapshot("not configured (set OPENCODE_GO_API_KEY)");
403
+ // A malformed-cookie reason is only meaningful when a workspaceId is
404
+ // present (the user actually attempted cookie auth); a fully
405
+ // unconfigured setup reports the generic reason.
406
+ const workspaceId = toNonEmptyString(hostEnv(HOST, "WORKSPACE_ID")) ?? fileConfig.workspaceId;
407
+ if (workspaceId && hasMalformedAuthCookie(fileConfig)) {
408
+ return unavailableSnapshot("not configured (malformed auth cookie)");
409
+ }
410
+ return unavailableSnapshot(`not configured (set ${hostEnvName(HOST, "API_KEY")})`);
385
411
  }
386
412
  const snapshot = credentials.kind === "apiKey"
387
413
  ? await fetchViaApiKey(credentials.apiKey)
@@ -395,19 +421,83 @@ async function getUsageSnapshot() {
395
421
  // ---------------------------------------------------------------------------
396
422
  // Plugin
397
423
  // ---------------------------------------------------------------------------
398
- export default (async () => {
399
- return {
400
- tool: {
401
- go_usage: tool({
402
- description: "Show OpenCode Go subscription usage: rolling 5h, weekly, and monthly windows. Takes no arguments.",
403
- args: {},
404
- execute: async () => {
405
- const snapshot = await getUsageSnapshot().catch(() => unavailableSnapshot("request failed"));
406
- const line = formatCompactLine(snapshot);
407
- return `${line}\n${JSON.stringify(snapshot, null, 2)}`;
408
- },
409
- }),
410
- },
411
- };
412
- });
424
+ // The ONLY export must be the default module: OpenCode's loader enumerates
425
+ // every export and invokes each as a plugin factory when the default is not a
426
+ // `{ id, server }` module. Helpers live in `./helpers.js` for exactly that
427
+ // reason. `server` returns the existing `{ tool: { go_usage } }` hook surface.
428
+ // A Hooks value is always a plain object. Drop nullish hook entries (and
429
+ // nullish tool definitions) so the loader can never dereference
430
+ // `hook.config` / `hook.provider` on a null value.
431
+ function sanitizeHooks(hooks) {
432
+ if (!isRecord(hooks))
433
+ return {};
434
+ const clean = {};
435
+ for (const [key, value] of Object.entries(hooks)) {
436
+ if (value === null || value === undefined)
437
+ continue;
438
+ if (key === "tool" && isRecord(value)) {
439
+ const tools = {};
440
+ for (const [name, definition] of Object.entries(value)) {
441
+ if (definition === null || definition === undefined)
442
+ continue;
443
+ tools[name] = definition;
444
+ }
445
+ clean[key] = tools;
446
+ continue;
447
+ }
448
+ clean[key] = value;
449
+ }
450
+ return clean;
451
+ }
452
+ // Best-effort error log. The client (or its `log` method) may be absent or
453
+ // throw on a malformed input, and logging must never rethrow into a caller or
454
+ // delay plugin resolution: callers use `void logServerError(...)`.
455
+ async function logServerError(input, message) {
456
+ try {
457
+ const client = input?.client;
458
+ await client?.app?.log?.({
459
+ service: "oc-go-usage-display",
460
+ level: "error",
461
+ message,
462
+ });
463
+ }
464
+ catch {
465
+ // Logging is best-effort; callers must never fail because of it.
466
+ }
467
+ }
468
+ // Fail-safe contract: OpenCode always starts, even if this plugin cannot. The
469
+ // factory resolves to a valid Hooks object (never undefined/null) for any
470
+ // input; on initialization failure it logs best-effort and resolves to `{}`.
471
+ const server = async (input, _options) => {
472
+ try {
473
+ return sanitizeHooks({
474
+ tool: {
475
+ go_usage: tool({
476
+ description: "Show OpenCode Go subscription usage: rolling 5h, weekly, and monthly windows. Takes no arguments.",
477
+ args: {},
478
+ execute: async () => {
479
+ try {
480
+ const snapshot = await getUsageSnapshot().catch(() => unavailableSnapshot("request failed"));
481
+ const line = formatServerLine(snapshot);
482
+ return `${line}\n${JSON.stringify(snapshot, null, 2)}`;
483
+ }
484
+ catch (error) {
485
+ // Same output shape as the success path (line + JSON tail); the
486
+ // failure is logged best-effort and the invocation still
487
+ // resolves so it can never reject into the host.
488
+ const snapshot = unavailableSnapshot("request failed");
489
+ void logServerError(input, `go_usage tool execution failed: ${errorMessage(error)}`);
490
+ return `${formatServerLine(snapshot)}\n${JSON.stringify(snapshot, null, 2)}`;
491
+ }
492
+ },
493
+ }),
494
+ },
495
+ });
496
+ }
497
+ catch (error) {
498
+ void logServerError(input, `Go usage plugin failed to initialize: ${errorMessage(error)}; continuing without hooks`);
499
+ return {};
500
+ }
501
+ };
502
+ export default { id: "oc-go-usage-display", server };
413
503
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}