@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.
- package/LICENSE +21 -0
- package/README-es.md +153 -0
- package/README.md +154 -0
- package/bin/quota.mjs +105 -0
- package/dist/config/defaults.d.ts +16 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +15 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.html +26 -0
- package/dist/config/loader.d.ts +10 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +89 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +16 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +28 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.html +29 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +45 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +68 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/http.d.ts +15 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +30 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/index.html +46 -0
- package/dist/lib/opencode-go-config.d.ts +22 -0
- package/dist/lib/opencode-go-config.d.ts.map +1 -0
- package/dist/lib/opencode-go-config.js +92 -0
- package/dist/lib/opencode-go-config.js.map +1 -0
- package/dist/lib/reset-format.d.ts +9 -0
- package/dist/lib/reset-format.d.ts.map +1 -0
- package/dist/lib/reset-format.js +83 -0
- package/dist/lib/reset-format.js.map +1 -0
- package/dist/lib/sanitize.d.ts +10 -0
- package/dist/lib/sanitize.d.ts.map +1 -0
- package/dist/lib/sanitize.js +14 -0
- package/dist/lib/sanitize.js.map +1 -0
- package/dist/lib/throttle.d.ts +18 -0
- package/dist/lib/throttle.d.ts.map +1 -0
- package/dist/lib/throttle.js +26 -0
- package/dist/lib/throttle.js.map +1 -0
- package/dist/lib/toast-format.d.ts +24 -0
- package/dist/lib/toast-format.d.ts.map +1 -0
- package/dist/lib/toast-format.js +79 -0
- package/dist/lib/toast-format.js.map +1 -0
- package/dist/lib/types.d.ts +50 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +10 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/providers/copilot.d.ts +3 -0
- package/dist/providers/copilot.d.ts.map +1 -0
- package/dist/providers/copilot.js +303 -0
- package/dist/providers/copilot.js.map +1 -0
- package/dist/providers/index.html +34 -0
- package/dist/providers/openai.d.ts +10 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +152 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/opencode-go.d.ts +12 -0
- package/dist/providers/opencode-go.d.ts.map +1 -0
- package/dist/providers/opencode-go.js +102 -0
- package/dist/providers/opencode-go.js.map +1 -0
- package/dist/providers/registry.d.ts +20 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +76 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +27 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -0
- package/dist/tui.d.ts +7 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.tsx +121 -0
- package/dist/ui/SidebarPanel.d.ts +10 -0
- package/dist/ui/SidebarPanel.d.ts.map +1 -0
- package/dist/ui/SidebarPanel.tsx +36 -0
- package/dist/ui/cards.d.ts +13 -0
- package/dist/ui/cards.d.ts.map +1 -0
- package/dist/ui/cards.tsx +117 -0
- package/dist/ui/index.html +24 -0
- package/dist/ui/progress-bar.d.ts +27 -0
- package/dist/ui/progress-bar.d.ts.map +1 -0
- package/dist/ui/progress-bar.js +48 -0
- package/dist/ui/progress-bar.js.map +1 -0
- package/images/opencode_quota_extended_cli.png +0 -0
- package/images/opencode_quota_extended_sidebar.png +0 -0
- package/package.json +74 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Quota Cards Plugin (server entry)
|
|
3
|
+
*
|
|
4
|
+
* Renders quota usage as progress-bar cards in the TUI sidebar for
|
|
5
|
+
* OpenAI, GitHub Copilot and OpenCode Go (5h / weekly / monthly).
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { PluginModule } from "@opencode-ai/plugin";
|
|
10
|
+
import { quotaCardsServerPlugin } from "./server.js";
|
|
11
|
+
declare const pluginModule: PluginModule;
|
|
12
|
+
export default pluginModule;
|
|
13
|
+
export { quotaCardsServerPlugin };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAA8B,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,QAAA,MAAM,YAAY,EAAE,YAGnB,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
package/dist/index.html
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
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/</title>
|
|
6
|
+
</head>
|
|
7
|
+
<body>
|
|
8
|
+
<h1>Directory listing for /opencode-personal-projects/opencode-quota-extended/dist/</h1>
|
|
9
|
+
<hr>
|
|
10
|
+
<ul>
|
|
11
|
+
<li><a href="config/">config/</a></li>
|
|
12
|
+
<li><a href="index.d.ts">index.d.ts</a></li>
|
|
13
|
+
<li><a href="index.d.ts.map">index.d.ts.map</a></li>
|
|
14
|
+
<li><a href="index.js">index.js</a></li>
|
|
15
|
+
<li><a href="index.js.map">index.js.map</a></li>
|
|
16
|
+
<li><a href="lib/">lib/</a></li>
|
|
17
|
+
<li><a href="providers/">providers/</a></li>
|
|
18
|
+
<li><a href="server.d.ts">server.d.ts</a></li>
|
|
19
|
+
<li><a href="server.d.ts.map">server.d.ts.map</a></li>
|
|
20
|
+
<li><a href="server.js">server.js</a></li>
|
|
21
|
+
<li><a href="server.js.map">server.js.map</a></li>
|
|
22
|
+
<li><a href="tui.d.ts">tui.d.ts</a></li>
|
|
23
|
+
<li><a href="tui.d.ts.map">tui.d.ts.map</a></li>
|
|
24
|
+
<li><a href="tui.tsx">tui.tsx</a></li>
|
|
25
|
+
<li><a href="ui/">ui/</a></li>
|
|
26
|
+
</ul>
|
|
27
|
+
<hr>
|
|
28
|
+
</body>
|
|
29
|
+
</html>
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,YAAY,GAAiB;IACjC,EAAE,EAAE,gCAAgC;IACpC,MAAM,EAAE,sBAAgC;CACzC,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** Shape of the entries we care about (partial). */
|
|
2
|
+
export interface AuthFile {
|
|
3
|
+
openai?: {
|
|
4
|
+
type?: string;
|
|
5
|
+
access?: string;
|
|
6
|
+
refresh?: string;
|
|
7
|
+
expires?: number;
|
|
8
|
+
accountId?: string;
|
|
9
|
+
};
|
|
10
|
+
codex?: {
|
|
11
|
+
type?: string;
|
|
12
|
+
access?: string;
|
|
13
|
+
refresh?: string;
|
|
14
|
+
expires?: number;
|
|
15
|
+
accountId?: string;
|
|
16
|
+
};
|
|
17
|
+
chatgpt?: {
|
|
18
|
+
type?: string;
|
|
19
|
+
access?: string;
|
|
20
|
+
refresh?: string;
|
|
21
|
+
expires?: number;
|
|
22
|
+
accountId?: string;
|
|
23
|
+
};
|
|
24
|
+
"github-copilot"?: {
|
|
25
|
+
type?: string;
|
|
26
|
+
access?: string;
|
|
27
|
+
refresh?: string;
|
|
28
|
+
expires?: number;
|
|
29
|
+
};
|
|
30
|
+
copilot?: {
|
|
31
|
+
type?: string;
|
|
32
|
+
access?: string;
|
|
33
|
+
refresh?: string;
|
|
34
|
+
expires?: number;
|
|
35
|
+
};
|
|
36
|
+
"opencode-go"?: {
|
|
37
|
+
type?: string;
|
|
38
|
+
workspaceId?: string;
|
|
39
|
+
authCookie?: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export declare function readAuthFile(): Promise<AuthFile | null>;
|
|
43
|
+
export declare function readAuthFileCached(maxAgeMs?: number): Promise<AuthFile | null>;
|
|
44
|
+
export declare function clearAuthCache(): void;
|
|
45
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAWA,oDAAoD;AACpD,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpG,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnG,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrG,gBAAgB,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1F,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjF,aAAa,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9E;AA4CD,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAU7D;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQ1B;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode auth.json reader.
|
|
3
|
+
*
|
|
4
|
+
* Reads ~/.local/share/opencode/auth.json (or platform equivalent) and
|
|
5
|
+
* returns the parsed object, or null if not found.
|
|
6
|
+
*/
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
import { readFile } from "fs/promises";
|
|
10
|
+
import { xdgCache, xdgConfig, xdgData, xdgState } from "xdg-basedir";
|
|
11
|
+
function dedupe(list) {
|
|
12
|
+
const out = [];
|
|
13
|
+
const seen = new Set();
|
|
14
|
+
for (const item of list) {
|
|
15
|
+
if (!item || seen.has(item))
|
|
16
|
+
continue;
|
|
17
|
+
seen.add(item);
|
|
18
|
+
out.push(item);
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
function getAuthPathCandidates() {
|
|
23
|
+
const home = homedir();
|
|
24
|
+
const dataBase = process.env.XDG_DATA_HOME?.trim() || xdgData || join(home, ".local", "share");
|
|
25
|
+
const configBase = process.env.XDG_CONFIG_HOME?.trim() || xdgConfig || join(home, ".config");
|
|
26
|
+
const cacheBase = process.env.XDG_CACHE_HOME?.trim() || xdgCache || join(home, ".cache");
|
|
27
|
+
const stateBase = process.env.XDG_STATE_HOME?.trim() || xdgState || join(home, ".local", "state");
|
|
28
|
+
const primary = join(dataBase, "opencode");
|
|
29
|
+
const configPrimary = join(configBase, "opencode");
|
|
30
|
+
const statePrimary = join(stateBase, "opencode");
|
|
31
|
+
const cachePrimary = join(cacheBase, "opencode");
|
|
32
|
+
const list = [primary, configPrimary, statePrimary, cachePrimary];
|
|
33
|
+
if (process.platform === "darwin") {
|
|
34
|
+
list.push(join(home, "Library", "Application Support", "opencode"));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
list.push(join(home, ".local", "share", "opencode"));
|
|
38
|
+
list.push(join(home, ".config", "opencode"));
|
|
39
|
+
}
|
|
40
|
+
return dedupe(list.map((d) => join(d, "auth.json")));
|
|
41
|
+
}
|
|
42
|
+
let cached = null;
|
|
43
|
+
const DEFAULT_CACHE_MAX_AGE_MS = 5_000;
|
|
44
|
+
export async function readAuthFile() {
|
|
45
|
+
for (const path of getAuthPathCandidates()) {
|
|
46
|
+
try {
|
|
47
|
+
const content = await readFile(path, "utf-8");
|
|
48
|
+
return JSON.parse(content);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// try next
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export async function readAuthFileCached(maxAgeMs = DEFAULT_CACHE_MAX_AGE_MS) {
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
if (cached && now - cached.at <= maxAgeMs) {
|
|
59
|
+
return cached.value;
|
|
60
|
+
}
|
|
61
|
+
const value = await readAuthFile();
|
|
62
|
+
cached = { value, at: now };
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
export function clearAuthCache() {
|
|
66
|
+
cached = null;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP utilities for provider API calls.
|
|
3
|
+
*/
|
|
4
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 8000;
|
|
5
|
+
/**
|
|
6
|
+
* Fetch with timeout using AbortController.
|
|
7
|
+
*
|
|
8
|
+
* @param url - The URL to fetch
|
|
9
|
+
* @param options - Fetch options (headers, method, body, etc.)
|
|
10
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
11
|
+
* @returns The fetch Response
|
|
12
|
+
* @throws Error with message "Request timeout after Xs" if request times out
|
|
13
|
+
*/
|
|
14
|
+
export declare function fetchWithTimeout(url: string, options: RequestInit, timeoutMs?: number): Promise<Response>;
|
|
15
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,SAAS,GAAE,MAAmC,GAC7C,OAAO,CAAC,QAAQ,CAAC,CAenB"}
|
package/dist/lib/http.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP utilities for provider API calls.
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_REQUEST_TIMEOUT_MS = 8_000;
|
|
5
|
+
/**
|
|
6
|
+
* Fetch with timeout using AbortController.
|
|
7
|
+
*
|
|
8
|
+
* @param url - The URL to fetch
|
|
9
|
+
* @param options - Fetch options (headers, method, body, etc.)
|
|
10
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
11
|
+
* @returns The fetch Response
|
|
12
|
+
* @throws Error with message "Request timeout after Xs" if request times out
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchWithTimeout(url, options, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
15
|
+
const controller = new AbortController();
|
|
16
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
17
|
+
try {
|
|
18
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
22
|
+
throw new Error(`Request timeout after ${Math.round(timeoutMs / 1000)}s`);
|
|
23
|
+
}
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEhD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,OAAoB,EACpB,YAAoB,0BAA0B;IAE9C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CACzD,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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/lib/</title>
|
|
6
|
+
</head>
|
|
7
|
+
<body>
|
|
8
|
+
<h1>Directory listing for /opencode-personal-projects/opencode-quota-extended/dist/lib/</h1>
|
|
9
|
+
<hr>
|
|
10
|
+
<ul>
|
|
11
|
+
<li><a href="auth.d.ts">auth.d.ts</a></li>
|
|
12
|
+
<li><a href="auth.d.ts.map">auth.d.ts.map</a></li>
|
|
13
|
+
<li><a href="auth.js">auth.js</a></li>
|
|
14
|
+
<li><a href="auth.js.map">auth.js.map</a></li>
|
|
15
|
+
<li><a href="http.d.ts">http.d.ts</a></li>
|
|
16
|
+
<li><a href="http.d.ts.map">http.d.ts.map</a></li>
|
|
17
|
+
<li><a href="http.js">http.js</a></li>
|
|
18
|
+
<li><a href="http.js.map">http.js.map</a></li>
|
|
19
|
+
<li><a href="opencode-go-config.d.ts">opencode-go-config.d.ts</a></li>
|
|
20
|
+
<li><a href="opencode-go-config.d.ts.map">opencode-go-config.d.ts.map</a></li>
|
|
21
|
+
<li><a href="opencode-go-config.js">opencode-go-config.js</a></li>
|
|
22
|
+
<li><a href="opencode-go-config.js.map">opencode-go-config.js.map</a></li>
|
|
23
|
+
<li><a href="reset-format.d.ts">reset-format.d.ts</a></li>
|
|
24
|
+
<li><a href="reset-format.d.ts.map">reset-format.d.ts.map</a></li>
|
|
25
|
+
<li><a href="reset-format.js">reset-format.js</a></li>
|
|
26
|
+
<li><a href="reset-format.js.map">reset-format.js.map</a></li>
|
|
27
|
+
<li><a href="sanitize.d.ts">sanitize.d.ts</a></li>
|
|
28
|
+
<li><a href="sanitize.d.ts.map">sanitize.d.ts.map</a></li>
|
|
29
|
+
<li><a href="sanitize.js">sanitize.js</a></li>
|
|
30
|
+
<li><a href="sanitize.js.map">sanitize.js.map</a></li>
|
|
31
|
+
<li><a href="throttle.d.ts">throttle.d.ts</a></li>
|
|
32
|
+
<li><a href="throttle.d.ts.map">throttle.d.ts.map</a></li>
|
|
33
|
+
<li><a href="throttle.js">throttle.js</a></li>
|
|
34
|
+
<li><a href="throttle.js.map">throttle.js.map</a></li>
|
|
35
|
+
<li><a href="toast-format.d.ts">toast-format.d.ts</a></li>
|
|
36
|
+
<li><a href="toast-format.d.ts.map">toast-format.d.ts.map</a></li>
|
|
37
|
+
<li><a href="toast-format.js">toast-format.js</a></li>
|
|
38
|
+
<li><a href="toast-format.js.map">toast-format.js.map</a></li>
|
|
39
|
+
<li><a href="types.d.ts">types.d.ts</a></li>
|
|
40
|
+
<li><a href="types.d.ts.map">types.d.ts.map</a></li>
|
|
41
|
+
<li><a href="types.js">types.js</a></li>
|
|
42
|
+
<li><a href="types.js.map">types.js.map</a></li>
|
|
43
|
+
</ul>
|
|
44
|
+
<hr>
|
|
45
|
+
</body>
|
|
46
|
+
</html>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type OpenCodeGoConfig = {
|
|
2
|
+
workspaceId: string;
|
|
3
|
+
authCookie: string;
|
|
4
|
+
};
|
|
5
|
+
export type OpenCodeGoConfigResolution = {
|
|
6
|
+
state: "configured";
|
|
7
|
+
config: OpenCodeGoConfig;
|
|
8
|
+
source: string;
|
|
9
|
+
} | {
|
|
10
|
+
state: "incomplete";
|
|
11
|
+
source: string;
|
|
12
|
+
missing: "workspaceId" | "authCookie";
|
|
13
|
+
} | {
|
|
14
|
+
state: "invalid";
|
|
15
|
+
source: string;
|
|
16
|
+
error: string;
|
|
17
|
+
} | {
|
|
18
|
+
state: "none";
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveOpenCodeGoConfig(): Promise<OpenCodeGoConfigResolution>;
|
|
21
|
+
export declare function resolveOpenCodeGoConfigCached(): Promise<OpenCodeGoConfigResolution>;
|
|
22
|
+
//# sourceMappingURL=opencode-go-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-go-config.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-go-config.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,gBAAgB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,0BAA0B,GAClC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAAA;CAAE,GAC9E;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAiCtB,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,0BAA0B,CAAC,CA0CnF;AAKD,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAMzF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { readFile } from "fs/promises";
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { xdgConfig } from "xdg-basedir";
|
|
5
|
+
const SIDECAR_DIR = "opencode-quota";
|
|
6
|
+
const SIDECAR_FILE = "opencode-go.json";
|
|
7
|
+
function getConfigDirCandidates() {
|
|
8
|
+
const dirs = [];
|
|
9
|
+
if (process.env.OPENCODE_CONFIG_DIR) {
|
|
10
|
+
dirs.push(process.env.OPENCODE_CONFIG_DIR);
|
|
11
|
+
}
|
|
12
|
+
if (xdgConfig) {
|
|
13
|
+
dirs.push(xdgConfig);
|
|
14
|
+
dirs.push(join(xdgConfig, "opencode"));
|
|
15
|
+
}
|
|
16
|
+
dirs.push(join(homedir(), ".config", "opencode"));
|
|
17
|
+
return Array.from(new Set(dirs));
|
|
18
|
+
}
|
|
19
|
+
function getConfigCandidatePaths() {
|
|
20
|
+
return getConfigDirCandidates().map((d) => join(d, SIDECAR_DIR, SIDECAR_FILE));
|
|
21
|
+
}
|
|
22
|
+
function fromEnv() {
|
|
23
|
+
const workspaceId = process.env.OPENCODE_GO_WORKSPACE_ID?.trim();
|
|
24
|
+
const authCookie = process.env.OPENCODE_GO_AUTH_COOKIE?.trim();
|
|
25
|
+
if (!workspaceId && !authCookie)
|
|
26
|
+
return { state: "none" };
|
|
27
|
+
if (workspaceId && authCookie) {
|
|
28
|
+
return { state: "configured", config: { workspaceId, authCookie }, source: "env" };
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
state: "incomplete",
|
|
32
|
+
source: "env",
|
|
33
|
+
missing: workspaceId ? "authCookie" : "workspaceId",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export async function resolveOpenCodeGoConfig() {
|
|
37
|
+
const envResult = fromEnv();
|
|
38
|
+
if (envResult.state !== "none")
|
|
39
|
+
return envResult;
|
|
40
|
+
for (const path of getConfigCandidatePaths()) {
|
|
41
|
+
let raw;
|
|
42
|
+
try {
|
|
43
|
+
raw = await readFile(path, "utf8");
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err.code === "ENOENT")
|
|
47
|
+
continue;
|
|
48
|
+
return {
|
|
49
|
+
state: "invalid",
|
|
50
|
+
source: path,
|
|
51
|
+
error: err instanceof Error ? err.message : String(err),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(raw);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return {
|
|
60
|
+
state: "invalid",
|
|
61
|
+
source: path,
|
|
62
|
+
error: err instanceof Error ? err.message : String(err),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
66
|
+
return { state: "invalid", source: path, error: "Config must be a JSON object" };
|
|
67
|
+
}
|
|
68
|
+
const obj = parsed;
|
|
69
|
+
const workspaceId = typeof obj.workspaceId === "string" ? obj.workspaceId.trim() : "";
|
|
70
|
+
const authCookie = typeof obj.authCookie === "string" ? obj.authCookie.trim() : "";
|
|
71
|
+
if (workspaceId && authCookie) {
|
|
72
|
+
return { state: "configured", config: { workspaceId, authCookie }, source: path };
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
state: "incomplete",
|
|
76
|
+
source: path,
|
|
77
|
+
missing: workspaceId ? "authCookie" : "workspaceId",
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { state: "none" };
|
|
81
|
+
}
|
|
82
|
+
let cached = null;
|
|
83
|
+
const CACHE_MAX_AGE_MS = 30_000;
|
|
84
|
+
export async function resolveOpenCodeGoConfigCached() {
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
if (cached && now - cached.at < CACHE_MAX_AGE_MS)
|
|
87
|
+
return cached.value;
|
|
88
|
+
const value = await resolveOpenCodeGoConfig();
|
|
89
|
+
cached = { at: now, value };
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=opencode-go-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-go-config.js","sourceRoot":"","sources":["../../src/lib/opencode-go-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAUxC,SAAS,sBAAsB;IAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,sBAAsB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,OAAO;IACd,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1D,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACrF,CAAC;IACD,OAAO;QACL,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;IAC5B,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC7C,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC/D,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;QACnF,CAAC;QACD,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACpF,CAAC;QACD,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;SACpD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,IAAI,MAAM,GAA6D,IAAI,CAAC;AAC5E,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,gBAAgB;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,uBAAuB,EAAE,CAAC;IAC9C,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset time formatting helpers.
|
|
3
|
+
*/
|
|
4
|
+
export declare function formatResetRelative(resetIso: string | undefined, now?: Date): string;
|
|
5
|
+
export declare function formatDuration(ms: number): string;
|
|
6
|
+
export declare function clampPercent(value: number): number;
|
|
7
|
+
export declare function formatResetAbsolute(resetIso: string | undefined, now?: Date): string;
|
|
8
|
+
export declare function formatResetCombined(resetIso: string | undefined, now?: Date): string;
|
|
9
|
+
//# sourceMappingURL=reset-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-format.d.ts","sourceRoot":"","sources":["../../src/lib/reset-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAOhG;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAiBjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAyBD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,GAAE,IAAiB,GACrB,MAAM,CAOR;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,GAAE,IAAiB,GACrB,MAAM,CASR"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset time formatting helpers.
|
|
3
|
+
*/
|
|
4
|
+
export function formatResetRelative(resetIso, now = new Date()) {
|
|
5
|
+
if (!resetIso)
|
|
6
|
+
return "";
|
|
7
|
+
const reset = new Date(resetIso);
|
|
8
|
+
if (Number.isNaN(reset.getTime()))
|
|
9
|
+
return "";
|
|
10
|
+
const diffMs = reset.getTime() - now.getTime();
|
|
11
|
+
if (diffMs <= 0)
|
|
12
|
+
return "now";
|
|
13
|
+
return `in ${formatDuration(diffMs)}`;
|
|
14
|
+
}
|
|
15
|
+
export function formatDuration(ms) {
|
|
16
|
+
const totalSeconds = Math.max(0, Math.round(ms / 1000));
|
|
17
|
+
const days = Math.floor(totalSeconds / 86_400);
|
|
18
|
+
const hours = Math.floor((totalSeconds % 86_400) / 3_600);
|
|
19
|
+
const minutes = Math.floor((totalSeconds % 3_600) / 60);
|
|
20
|
+
const seconds = totalSeconds % 60;
|
|
21
|
+
if (days > 0) {
|
|
22
|
+
return `${days}d ${hours}h`;
|
|
23
|
+
}
|
|
24
|
+
if (hours > 0) {
|
|
25
|
+
return `${hours}h ${minutes}m`;
|
|
26
|
+
}
|
|
27
|
+
if (minutes > 0) {
|
|
28
|
+
return `${minutes}m`;
|
|
29
|
+
}
|
|
30
|
+
return `${seconds}s`;
|
|
31
|
+
}
|
|
32
|
+
export function clampPercent(value) {
|
|
33
|
+
if (!Number.isFinite(value))
|
|
34
|
+
return 0;
|
|
35
|
+
if (value < 0)
|
|
36
|
+
return 0;
|
|
37
|
+
if (value > 100)
|
|
38
|
+
return 100;
|
|
39
|
+
return Math.round(value);
|
|
40
|
+
}
|
|
41
|
+
const MONTHS = [
|
|
42
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
43
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
|
44
|
+
];
|
|
45
|
+
function pad(n) {
|
|
46
|
+
return String(n).padStart(2, "0");
|
|
47
|
+
}
|
|
48
|
+
function isSameDay(a, b) {
|
|
49
|
+
return (a.getFullYear() === b.getFullYear() &&
|
|
50
|
+
a.getMonth() === b.getMonth() &&
|
|
51
|
+
a.getDate() === b.getDate());
|
|
52
|
+
}
|
|
53
|
+
function formatAbsoluteTime(reset, now) {
|
|
54
|
+
const time = `${pad(reset.getHours())}:${pad(reset.getMinutes())}`;
|
|
55
|
+
if (isSameDay(reset, now))
|
|
56
|
+
return time;
|
|
57
|
+
return `${reset.getDate()} ${MONTHS[reset.getMonth()]} ${time}`;
|
|
58
|
+
}
|
|
59
|
+
export function formatResetAbsolute(resetIso, now = new Date()) {
|
|
60
|
+
if (!resetIso)
|
|
61
|
+
return "";
|
|
62
|
+
const reset = new Date(resetIso);
|
|
63
|
+
if (Number.isNaN(reset.getTime()))
|
|
64
|
+
return "";
|
|
65
|
+
const diffMs = reset.getTime() - now.getTime();
|
|
66
|
+
if (diffMs <= 0)
|
|
67
|
+
return "now";
|
|
68
|
+
return formatAbsoluteTime(reset, now);
|
|
69
|
+
}
|
|
70
|
+
export function formatResetCombined(resetIso, now = new Date()) {
|
|
71
|
+
if (!resetIso)
|
|
72
|
+
return "";
|
|
73
|
+
const reset = new Date(resetIso);
|
|
74
|
+
if (Number.isNaN(reset.getTime()))
|
|
75
|
+
return "";
|
|
76
|
+
const diffMs = reset.getTime() - now.getTime();
|
|
77
|
+
if (diffMs <= 0)
|
|
78
|
+
return "now";
|
|
79
|
+
const relative = `in ${formatDuration(diffMs)}`;
|
|
80
|
+
const absolute = formatAbsoluteTime(reset, now);
|
|
81
|
+
return `${relative} (${absolute})`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=reset-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-format.js","sourceRoot":"","sources":["../../src/lib/reset-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display sanitization for user-visible toast output.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the upstream `@slkiser/opencode-quota` helper of the same name:
|
|
5
|
+
* strips ANSI escape sequences and control characters (except newline/tab)
|
|
6
|
+
* so that provider error text cannot inject terminal control codes into
|
|
7
|
+
* toasts or transcript output.
|
|
8
|
+
*/
|
|
9
|
+
export declare function sanitizeDisplayText(text: string): string;
|
|
10
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/lib/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display sanitization for user-visible toast output.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the upstream `@slkiser/opencode-quota` helper of the same name:
|
|
5
|
+
* strips ANSI escape sequences and control characters (except newline/tab)
|
|
6
|
+
* so that provider error text cannot inject terminal control codes into
|
|
7
|
+
* toasts or transcript output.
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line no-control-regex
|
|
10
|
+
const DISPLAY_CONTROL_RE = /\x1B\[[0-9;]*[A-Za-z]|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
|
|
11
|
+
export function sanitizeDisplayText(text) {
|
|
12
|
+
return text.replace(DISPLAY_CONTROL_RE, "");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/lib/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,4CAA4C;AAC5C,MAAM,kBAAkB,GAAG,yDAAyD,CAAC;AAErF,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple time-since-last-fire throttle gate.
|
|
3
|
+
*
|
|
4
|
+
* Used by the toast feature so a flurry of `session.idle` /
|
|
5
|
+
* `session.compacted` events does not spam the user. No caching, no
|
|
6
|
+
* deduplication — callers ask "may I fire?" and, when they actually fire,
|
|
7
|
+
* call `record()`.
|
|
8
|
+
*/
|
|
9
|
+
export interface Throttle {
|
|
10
|
+
/** Returns true if the configured min interval has elapsed since the last `record()`. */
|
|
11
|
+
shouldFire(nowMs?: number): boolean;
|
|
12
|
+
/** Mark a fire as having occurred at the given time (defaults to now). */
|
|
13
|
+
record(nowMs?: number): void;
|
|
14
|
+
/** Reset the gate so the next `shouldFire()` returns true. Useful for tests. */
|
|
15
|
+
reset(): void;
|
|
16
|
+
}
|
|
17
|
+
export declare function createThrottle(minIntervalMs: number): Throttle;
|
|
18
|
+
//# sourceMappingURL=throttle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/lib/throttle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,QAAQ;IACvB,yFAAyF;IACzF,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,0EAA0E;IAC1E,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gFAAgF;IAChF,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,CAe9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple time-since-last-fire throttle gate.
|
|
3
|
+
*
|
|
4
|
+
* Used by the toast feature so a flurry of `session.idle` /
|
|
5
|
+
* `session.compacted` events does not spam the user. No caching, no
|
|
6
|
+
* deduplication — callers ask "may I fire?" and, when they actually fire,
|
|
7
|
+
* call `record()`.
|
|
8
|
+
*/
|
|
9
|
+
export function createThrottle(minIntervalMs) {
|
|
10
|
+
let lastFireMs = Number.NEGATIVE_INFINITY;
|
|
11
|
+
return {
|
|
12
|
+
shouldFire(nowMs) {
|
|
13
|
+
if (minIntervalMs <= 0)
|
|
14
|
+
return true;
|
|
15
|
+
const now = nowMs ?? Date.now();
|
|
16
|
+
return now - lastFireMs >= minIntervalMs;
|
|
17
|
+
},
|
|
18
|
+
record(nowMs) {
|
|
19
|
+
lastFireMs = nowMs ?? Date.now();
|
|
20
|
+
},
|
|
21
|
+
reset() {
|
|
22
|
+
lastFireMs = Number.NEGATIVE_INFINITY;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../src/lib/throttle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,IAAI,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC1C,OAAO;QACL,UAAU,CAAC,KAAc;YACvB,IAAI,aAAa,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpC,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,OAAO,GAAG,GAAG,UAAU,IAAI,aAAa,CAAC;QAC3C,CAAC;QACD,MAAM,CAAC,KAAc;YACnB,UAAU,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,CAAC;QACD,KAAK;YACH,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast message formatter.
|
|
3
|
+
*
|
|
4
|
+
* Renders a `CardsSnapshot` (the same data structure the TUI sidebar
|
|
5
|
+
* consumes) into a compact multi-line string suitable for OpenCode's
|
|
6
|
+
* `tui.showToast`. The shape is loosely modelled on upstream's
|
|
7
|
+
* `formatQuotaRowsGrouped` — provider header followed by one line per
|
|
8
|
+
* usage window — but kept narrower since our snapshot has fewer fields.
|
|
9
|
+
*
|
|
10
|
+
* Returns `null` when no provider has any window worth showing.
|
|
11
|
+
*/
|
|
12
|
+
import type { CardsSnapshot } from "./types.js";
|
|
13
|
+
export interface FormatToastMessageOptions {
|
|
14
|
+
/** Override the current time for deterministic tests. */
|
|
15
|
+
now?: Date;
|
|
16
|
+
/** Maximum chars per line (lines longer than this are clipped). Default 60. */
|
|
17
|
+
maxLineWidth?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Render a CardsSnapshot to a multi-line toast string, or `null` if there
|
|
21
|
+
* is nothing meaningful to display.
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatToastMessage(snapshot: CardsSnapshot, opts?: FormatToastMessageOptions): string | null;
|
|
24
|
+
//# sourceMappingURL=toast-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast-format.d.ts","sourceRoot":"","sources":["../../src/lib/toast-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAG/D,MAAM,WAAW,yBAAyB;IACxC,yDAAyD;IACzD,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAiED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EACvB,IAAI,GAAE,yBAA8B,GACnC,MAAM,GAAG,IAAI,CAyBf"}
|