codex-multi-auth 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 +1 -0
- package/README.md +162 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +87 -0
- package/config/minimal-opencode.json +13 -0
- package/config/opencode-legacy.json +571 -0
- package/config/opencode-modern.json +239 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3160 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts/rate-limits.d.ts +22 -0
- package/dist/lib/accounts/rate-limits.d.ts.map +1 -0
- package/dist/lib/accounts/rate-limits.js +63 -0
- package/dist/lib/accounts/rate-limits.js.map +1 -0
- package/dist/lib/accounts.d.ts +95 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +668 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/audit.d.ts +45 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +131 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +56 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +214 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +34 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +185 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/server.d.ts +24 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +116 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/auth/token-utils.d.ts +59 -0
- package/dist/lib/auth/token-utils.d.ts.map +1 -0
- package/dist/lib/auth/token-utils.js +331 -0
- package/dist/lib/auth/token-utils.js.map +1 -0
- package/dist/lib/auth-rate-limit.d.ts +20 -0
- package/dist/lib/auth-rate-limit.d.ts.map +1 -0
- package/dist/lib/auth-rate-limit.js +91 -0
- package/dist/lib/auth-rate-limit.js.map +1 -0
- package/dist/lib/auto-update-checker.d.ts +10 -0
- package/dist/lib/auto-update-checker.d.ts.map +1 -0
- package/dist/lib/auto-update-checker.js +216 -0
- package/dist/lib/auto-update-checker.js.map +1 -0
- package/dist/lib/capability-policy.d.ts +18 -0
- package/dist/lib/capability-policy.d.ts.map +1 -0
- package/dist/lib/capability-policy.js +150 -0
- package/dist/lib/capability-policy.js.map +1 -0
- package/dist/lib/circuit-breaker.d.ts +34 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +124 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/cli.d.ts +64 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +274 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/codex-cli/observability.d.ts +22 -0
- package/dist/lib/codex-cli/observability.d.ts.map +1 -0
- package/dist/lib/codex-cli/observability.js +36 -0
- package/dist/lib/codex-cli/observability.js.map +1 -0
- package/dist/lib/codex-cli/state.d.ts +86 -0
- package/dist/lib/codex-cli/state.d.ts.map +1 -0
- package/dist/lib/codex-cli/state.js +470 -0
- package/dist/lib/codex-cli/state.js.map +1 -0
- package/dist/lib/codex-cli/sync.d.ts +27 -0
- package/dist/lib/codex-cli/sync.d.ts.map +1 -0
- package/dist/lib/codex-cli/sync.js +325 -0
- package/dist/lib/codex-cli/sync.js.map +1 -0
- package/dist/lib/codex-cli/writer.d.ts +12 -0
- package/dist/lib/codex-cli/writer.d.ts.map +1 -0
- package/dist/lib/codex-cli/writer.js +388 -0
- package/dist/lib/codex-cli/writer.js.map +1 -0
- package/dist/lib/codex-manager.d.ts +2 -0
- package/dist/lib/codex-manager.d.ts.map +1 -0
- package/dist/lib/codex-manager.js +4841 -0
- package/dist/lib/codex-manager.js.map +1 -0
- package/dist/lib/config.d.ts +269 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +789 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +78 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +78 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/context-overflow.d.ts +27 -0
- package/dist/lib/context-overflow.d.ts.map +1 -0
- package/dist/lib/context-overflow.js +124 -0
- package/dist/lib/context-overflow.js.map +1 -0
- package/dist/lib/dashboard-settings.d.ts +90 -0
- package/dist/lib/dashboard-settings.d.ts.map +1 -0
- package/dist/lib/dashboard-settings.js +327 -0
- package/dist/lib/dashboard-settings.js.map +1 -0
- package/dist/lib/entitlement-cache.d.ts +41 -0
- package/dist/lib/entitlement-cache.d.ts.map +1 -0
- package/dist/lib/entitlement-cache.js +137 -0
- package/dist/lib/entitlement-cache.js.map +1 -0
- package/dist/lib/errors.d.ts +113 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +103 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/forecast.d.ts +42 -0
- package/dist/lib/forecast.d.ts.map +1 -0
- package/dist/lib/forecast.js +256 -0
- package/dist/lib/forecast.js.map +1 -0
- package/dist/lib/health.d.ts +33 -0
- package/dist/lib/health.d.ts.map +1 -0
- package/dist/lib/health.js +70 -0
- package/dist/lib/health.js.map +1 -0
- package/dist/lib/index.d.ts +32 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +32 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/live-account-sync.d.ts +39 -0
- package/dist/lib/live-account-sync.d.ts.map +1 -0
- package/dist/lib/live-account-sync.js +196 -0
- package/dist/lib/live-account-sync.js.map +1 -0
- package/dist/lib/logger.d.ts +40 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +364 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +338 -0
- package/dist/lib/parallel-probe.d.ts +28 -0
- package/dist/lib/parallel-probe.d.ts.map +1 -0
- package/dist/lib/parallel-probe.js +97 -0
- package/dist/lib/parallel-probe.js.map +1 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts +53 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -0
- package/dist/lib/preemptive-quota-scheduler.js +220 -0
- package/dist/lib/preemptive-quota-scheduler.js.map +1 -0
- package/dist/lib/proactive-refresh.d.ts +66 -0
- package/dist/lib/proactive-refresh.d.ts.map +1 -0
- package/dist/lib/proactive-refresh.js +143 -0
- package/dist/lib/proactive-refresh.js.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +169 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +41 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +383 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +25 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +270 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/quota-cache.d.ts +68 -0
- package/dist/lib/quota-cache.d.ts.map +1 -0
- package/dist/lib/quota-cache.js +224 -0
- package/dist/lib/quota-cache.js.map +1 -0
- package/dist/lib/quota-probe.d.ts +49 -0
- package/dist/lib/quota-probe.d.ts.map +1 -0
- package/dist/lib/quota-probe.js +368 -0
- package/dist/lib/quota-probe.js.map +1 -0
- package/dist/lib/recovery/constants.d.ts +12 -0
- package/dist/lib/recovery/constants.d.ts.map +1 -0
- package/dist/lib/recovery/constants.js +31 -0
- package/dist/lib/recovery/constants.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +12 -0
- package/dist/lib/recovery/index.d.ts.map +1 -0
- package/dist/lib/recovery/index.js +12 -0
- package/dist/lib/recovery/index.js.map +1 -0
- package/dist/lib/recovery/storage.d.ts +24 -0
- package/dist/lib/recovery/storage.d.ts.map +1 -0
- package/dist/lib/recovery/storage.js +362 -0
- package/dist/lib/recovery/storage.js.map +1 -0
- package/dist/lib/recovery/types.d.ts +116 -0
- package/dist/lib/recovery/types.d.ts.map +1 -0
- package/dist/lib/recovery/types.js +7 -0
- package/dist/lib/recovery/types.js.map +1 -0
- package/dist/lib/recovery.d.ts +31 -0
- package/dist/lib/recovery.d.ts.map +1 -0
- package/dist/lib/recovery.js +313 -0
- package/dist/lib/recovery.js.map +1 -0
- package/dist/lib/refresh-guardian.d.ts +31 -0
- package/dist/lib/refresh-guardian.d.ts.map +1 -0
- package/dist/lib/refresh-guardian.js +151 -0
- package/dist/lib/refresh-guardian.js.map +1 -0
- package/dist/lib/refresh-lease.d.ts +37 -0
- package/dist/lib/refresh-lease.d.ts.map +1 -0
- package/dist/lib/refresh-lease.js +335 -0
- package/dist/lib/refresh-lease.js.map +1 -0
- package/dist/lib/refresh-queue.d.ts +117 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -0
- package/dist/lib/refresh-queue.js +297 -0
- package/dist/lib/refresh-queue.js.map +1 -0
- package/dist/lib/request/failure-policy.d.ts +42 -0
- package/dist/lib/request/failure-policy.d.ts.map +1 -0
- package/dist/lib/request/failure-policy.js +133 -0
- package/dist/lib/request/failure-policy.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +152 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +704 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +7 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +214 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +28 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +133 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/helpers/tool-utils.d.ts +29 -0
- package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/tool-utils.js +117 -0
- package/dist/lib/request/helpers/tool-utils.js.map +1 -0
- package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
- package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
- package/dist/lib/request/rate-limit-backoff.js +83 -0
- package/dist/lib/request/rate-limit-backoff.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +107 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +814 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +23 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +155 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/request/stream-failover.d.ts +21 -0
- package/dist/lib/request/stream-failover.d.ts.map +1 -0
- package/dist/lib/request/stream-failover.js +204 -0
- package/dist/lib/request/stream-failover.js.map +1 -0
- package/dist/lib/rotation.d.ts +146 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +321 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +58 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +164 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/schemas.d.ts +435 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +268 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/session-affinity.d.ts +23 -0
- package/dist/lib/session-affinity.d.ts.map +1 -0
- package/dist/lib/session-affinity.js +127 -0
- package/dist/lib/session-affinity.js.map +1 -0
- package/dist/lib/shutdown.d.ts +7 -0
- package/dist/lib/shutdown.d.ts.map +1 -0
- package/dist/lib/shutdown.js +43 -0
- package/dist/lib/shutdown.js.map +1 -0
- package/dist/lib/storage/migrations.d.ts +59 -0
- package/dist/lib/storage/migrations.d.ts.map +1 -0
- package/dist/lib/storage/migrations.js +41 -0
- package/dist/lib/storage/migrations.js.map +1 -0
- package/dist/lib/storage/paths.d.ts +51 -0
- package/dist/lib/storage/paths.d.ts.map +1 -0
- package/dist/lib/storage/paths.js +152 -0
- package/dist/lib/storage/paths.js.map +1 -0
- package/dist/lib/storage.d.ts +106 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +896 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/table-formatter.d.ts +32 -0
- package/dist/lib/table-formatter.d.ts.map +1 -0
- package/dist/lib/table-formatter.js +44 -0
- package/dist/lib/table-formatter.js.map +1 -0
- package/dist/lib/tools/hashline-tools.d.ts +51 -0
- package/dist/lib/tools/hashline-tools.d.ts.map +1 -0
- package/dist/lib/tools/hashline-tools.js +456 -0
- package/dist/lib/tools/hashline-tools.js.map +1 -0
- package/dist/lib/types.d.ts +130 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/ui/ansi.d.ts +40 -0
- package/dist/lib/ui/ansi.d.ts.map +1 -0
- package/dist/lib/ui/ansi.js +68 -0
- package/dist/lib/ui/ansi.js.map +1 -0
- package/dist/lib/ui/auth-menu.d.ts +76 -0
- package/dist/lib/ui/auth-menu.d.ts.map +1 -0
- package/dist/lib/ui/auth-menu.js +590 -0
- package/dist/lib/ui/auth-menu.js.map +1 -0
- package/dist/lib/ui/confirm.d.ts +11 -0
- package/dist/lib/ui/confirm.d.ts.map +1 -0
- package/dist/lib/ui/confirm.js +29 -0
- package/dist/lib/ui/confirm.js.map +1 -0
- package/dist/lib/ui/copy.d.ts +123 -0
- package/dist/lib/ui/copy.d.ts.map +1 -0
- package/dist/lib/ui/copy.js +127 -0
- package/dist/lib/ui/copy.js.map +1 -0
- package/dist/lib/ui/format.d.ts +62 -0
- package/dist/lib/ui/format.d.ts.map +1 -0
- package/dist/lib/ui/format.js +205 -0
- package/dist/lib/ui/format.js.map +1 -0
- package/dist/lib/ui/runtime.d.ts +43 -0
- package/dist/lib/ui/runtime.d.ts.map +1 -0
- package/dist/lib/ui/runtime.js +69 -0
- package/dist/lib/ui/runtime.js.map +1 -0
- package/dist/lib/ui/select.d.ts +60 -0
- package/dist/lib/ui/select.d.ts.map +1 -0
- package/dist/lib/ui/select.js +467 -0
- package/dist/lib/ui/select.js.map +1 -0
- package/dist/lib/ui/theme.d.ts +56 -0
- package/dist/lib/ui/theme.d.ts.map +1 -0
- package/dist/lib/ui/theme.js +186 -0
- package/dist/lib/ui/theme.js.map +1 -0
- package/dist/lib/unified-settings.d.ts +71 -0
- package/dist/lib/unified-settings.d.ts.map +1 -0
- package/dist/lib/unified-settings.js +299 -0
- package/dist/lib/unified-settings.js.map +1 -0
- package/dist/lib/utils.d.ts +29 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +54 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +115 -0
- package/scripts/audit-dev-allowlist.js +128 -0
- package/scripts/bench-format/hashline-v2.mjs +642 -0
- package/scripts/bench-format/models.mjs +105 -0
- package/scripts/bench-format/opencode.mjs +205 -0
- package/scripts/bench-format/render.mjs +496 -0
- package/scripts/bench-format/stats.mjs +54 -0
- package/scripts/bench-format/tasks.mjs +151 -0
- package/scripts/benchmark-edit-formats.mjs +1161 -0
- package/scripts/benchmark-render-dashboard.mjs +49 -0
- package/scripts/codex-multi-auth.js +6 -0
- package/scripts/codex-routing.js +34 -0
- package/scripts/codex.js +122 -0
- package/scripts/copy-oauth-success.js +37 -0
- package/scripts/install-opencode-codex-auth.js +193 -0
- package/scripts/test-all-models.sh +7 -0
- package/scripts/test-model-matrix.js +424 -0
- package/scripts/validate-model-map.sh +7 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createLogger } from "./logger.js";
|
|
4
|
+
import { getCodexCacheDir } from "./runtime-paths.js";
|
|
5
|
+
const log = createLogger("update-checker");
|
|
6
|
+
const PACKAGE_NAME = "codex-multi-auth";
|
|
7
|
+
const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
8
|
+
const CACHE_DIR = getCodexCacheDir();
|
|
9
|
+
const CACHE_FILE = join(CACHE_DIR, "update-check-cache.json");
|
|
10
|
+
const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
11
|
+
const RETRYABLE_WRITE_ERRORS = new Set(["EBUSY", "EPERM"]);
|
|
12
|
+
function sleepSync(ms) {
|
|
13
|
+
const delay = Math.max(0, Math.floor(ms));
|
|
14
|
+
if (delay === 0)
|
|
15
|
+
return;
|
|
16
|
+
const lock = new Int32Array(new SharedArrayBuffer(4));
|
|
17
|
+
Atomics.wait(lock, 0, 0, delay);
|
|
18
|
+
}
|
|
19
|
+
function getCurrentVersion() {
|
|
20
|
+
try {
|
|
21
|
+
const packageJsonPath = join(import.meta.dirname ?? __dirname, "..", "package.json");
|
|
22
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
23
|
+
return packageJson.version;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return "0.0.0";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function loadCache() {
|
|
30
|
+
try {
|
|
31
|
+
if (!existsSync(CACHE_FILE))
|
|
32
|
+
return null;
|
|
33
|
+
const content = readFileSync(CACHE_FILE, "utf8");
|
|
34
|
+
return JSON.parse(content);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function saveCache(cache) {
|
|
41
|
+
try {
|
|
42
|
+
if (!existsSync(CACHE_DIR)) {
|
|
43
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
const serialized = JSON.stringify(cache, null, 2);
|
|
46
|
+
let lastError = null;
|
|
47
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
48
|
+
try {
|
|
49
|
+
writeFileSync(CACHE_FILE, serialized, "utf8");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const code = error.code ?? "";
|
|
54
|
+
lastError = error;
|
|
55
|
+
if (!RETRYABLE_WRITE_ERRORS.has(code) || attempt >= 3) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
sleepSync(15 * (2 ** attempt));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (lastError)
|
|
62
|
+
throw lastError;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
log.warn("Failed to save update cache", { error: error.message });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function parseSemver(version) {
|
|
69
|
+
const normalized = version.trim().replace(/^v/i, "");
|
|
70
|
+
const [withoutBuild] = normalized.split("+");
|
|
71
|
+
const [corePart = "0.0.0", prereleasePart] = (withoutBuild ?? "0.0.0").split("-", 2);
|
|
72
|
+
const [majorRaw = "0", minorRaw = "0", patchRaw = "0"] = corePart.split(".");
|
|
73
|
+
const toSafeInt = (value) => {
|
|
74
|
+
if (!/^\d+$/.test(value))
|
|
75
|
+
return 0;
|
|
76
|
+
const parsed = Number.parseInt(value, 10);
|
|
77
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
core: [toSafeInt(majorRaw), toSafeInt(minorRaw), toSafeInt(patchRaw)],
|
|
81
|
+
prerelease: prereleasePart && prereleasePart.trim().length > 0
|
|
82
|
+
? prereleasePart.split(".").filter((segment) => segment.length > 0)
|
|
83
|
+
: [],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function comparePrerelease(current, latest) {
|
|
87
|
+
const maxLen = Math.max(current.length, latest.length);
|
|
88
|
+
for (let i = 0; i < maxLen; i++) {
|
|
89
|
+
const currentPart = current[i];
|
|
90
|
+
const latestPart = latest[i];
|
|
91
|
+
if (currentPart === undefined && latestPart === undefined)
|
|
92
|
+
return 0;
|
|
93
|
+
if (currentPart === undefined)
|
|
94
|
+
return 1;
|
|
95
|
+
if (latestPart === undefined)
|
|
96
|
+
return -1;
|
|
97
|
+
if (currentPart === latestPart)
|
|
98
|
+
continue;
|
|
99
|
+
const currentIsNumeric = /^\d+$/.test(currentPart);
|
|
100
|
+
const latestIsNumeric = /^\d+$/.test(latestPart);
|
|
101
|
+
if (currentIsNumeric && latestIsNumeric) {
|
|
102
|
+
const currentNum = Number.parseInt(currentPart, 10);
|
|
103
|
+
const latestNum = Number.parseInt(latestPart, 10);
|
|
104
|
+
if (latestNum > currentNum)
|
|
105
|
+
return 1;
|
|
106
|
+
if (latestNum < currentNum)
|
|
107
|
+
return -1;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (currentIsNumeric && !latestIsNumeric)
|
|
111
|
+
return 1;
|
|
112
|
+
if (!currentIsNumeric && latestIsNumeric)
|
|
113
|
+
return -1;
|
|
114
|
+
const lexical = latestPart.localeCompare(currentPart, "en", { sensitivity: "case" });
|
|
115
|
+
if (lexical > 0)
|
|
116
|
+
return 1;
|
|
117
|
+
if (lexical < 0)
|
|
118
|
+
return -1;
|
|
119
|
+
}
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
function compareVersions(current, latest) {
|
|
123
|
+
const parsedCurrent = parseSemver(current);
|
|
124
|
+
const parsedLatest = parseSemver(latest);
|
|
125
|
+
for (let i = 0; i < parsedCurrent.core.length; i++) {
|
|
126
|
+
const currentPart = parsedCurrent.core[i] ?? 0;
|
|
127
|
+
const latestPart = parsedLatest.core[i] ?? 0;
|
|
128
|
+
if (latestPart > currentPart)
|
|
129
|
+
return 1;
|
|
130
|
+
if (latestPart < currentPart)
|
|
131
|
+
return -1;
|
|
132
|
+
}
|
|
133
|
+
const currentHasPrerelease = parsedCurrent.prerelease.length > 0;
|
|
134
|
+
const latestHasPrerelease = parsedLatest.prerelease.length > 0;
|
|
135
|
+
if (!currentHasPrerelease && latestHasPrerelease) {
|
|
136
|
+
return -1;
|
|
137
|
+
}
|
|
138
|
+
if (currentHasPrerelease && !latestHasPrerelease) {
|
|
139
|
+
return 1;
|
|
140
|
+
}
|
|
141
|
+
return comparePrerelease(parsedCurrent.prerelease, parsedLatest.prerelease);
|
|
142
|
+
}
|
|
143
|
+
async function fetchLatestVersion() {
|
|
144
|
+
try {
|
|
145
|
+
const controller = new AbortController();
|
|
146
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
147
|
+
const response = await fetch(NPM_REGISTRY_URL, {
|
|
148
|
+
signal: controller.signal,
|
|
149
|
+
headers: { Accept: "application/json" },
|
|
150
|
+
});
|
|
151
|
+
clearTimeout(timeout);
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
log.debug("Failed to fetch npm registry", { status: response.status });
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
const data = (await response.json());
|
|
157
|
+
return data.version ?? null;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
log.debug("Failed to check for updates", { error: error.message });
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export async function checkForUpdates(force = false) {
|
|
165
|
+
const currentVersion = getCurrentVersion();
|
|
166
|
+
const cache = loadCache();
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
if (!force && cache && now - cache.lastCheck < CHECK_INTERVAL_MS) {
|
|
169
|
+
const hasUpdate = cache.latestVersion ? compareVersions(currentVersion, cache.latestVersion) > 0 : false;
|
|
170
|
+
return {
|
|
171
|
+
hasUpdate,
|
|
172
|
+
currentVersion,
|
|
173
|
+
latestVersion: cache.latestVersion,
|
|
174
|
+
updateCommand: `npm update -g ${PACKAGE_NAME}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const latestVersion = await fetchLatestVersion();
|
|
178
|
+
saveCache({
|
|
179
|
+
lastCheck: now,
|
|
180
|
+
latestVersion,
|
|
181
|
+
currentVersion,
|
|
182
|
+
});
|
|
183
|
+
const hasUpdate = latestVersion ? compareVersions(currentVersion, latestVersion) > 0 : false;
|
|
184
|
+
return {
|
|
185
|
+
hasUpdate,
|
|
186
|
+
currentVersion,
|
|
187
|
+
latestVersion,
|
|
188
|
+
updateCommand: `npm update -g ${PACKAGE_NAME}`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
export async function checkAndNotify(showToast) {
|
|
192
|
+
try {
|
|
193
|
+
const result = await checkForUpdates();
|
|
194
|
+
if (result.hasUpdate && result.latestVersion) {
|
|
195
|
+
const message = `Update available: ${PACKAGE_NAME} v${result.latestVersion} (current: v${result.currentVersion})`;
|
|
196
|
+
log.info(message);
|
|
197
|
+
if (showToast) {
|
|
198
|
+
await showToast(`Plugin update available: v${result.latestVersion}. Run: ${result.updateCommand}`, "info");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
log.debug("Update check failed", { error: error.message });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
export function clearUpdateCache() {
|
|
207
|
+
try {
|
|
208
|
+
if (existsSync(CACHE_FILE)) {
|
|
209
|
+
writeFileSync(CACHE_FILE, "{}", "utf8");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Ignore errors
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=auto-update-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update-checker.js","sourceRoot":"","sources":["../../lib/auto-update-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CapabilityPolicySnapshot {
|
|
2
|
+
successes: number;
|
|
3
|
+
failures: number;
|
|
4
|
+
unsupported: number;
|
|
5
|
+
lastSuccessAt?: number;
|
|
6
|
+
lastFailureAt?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class CapabilityPolicyStore {
|
|
9
|
+
private readonly entries;
|
|
10
|
+
recordSuccess(accountKey: string, model: string, now?: number): void;
|
|
11
|
+
recordFailure(accountKey: string, model: string, now?: number): void;
|
|
12
|
+
recordUnsupported(accountKey: string, model: string, now?: number): void;
|
|
13
|
+
getBoost(accountKey: string, model: string, now?: number): number;
|
|
14
|
+
getSnapshot(accountKey: string, model: string): CapabilityPolicySnapshot | null;
|
|
15
|
+
clearAccount(accountKey: string): number;
|
|
16
|
+
private evictIfNeeded;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=capability-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-policy.d.ts","sourceRoot":"","sources":["../../lib/capability-policy.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAmDD,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAE9D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAexE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAexE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAe5E,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM;IAiBrE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI;IAc/E,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAYxC,OAAO,CAAC,aAAa;CASrB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { getNormalizedModel } from "./request/helpers/model-map.js";
|
|
2
|
+
const MAX_ENTRIES = 2048;
|
|
3
|
+
const PASSIVE_RECOVERY_PER_MIN = 0.5;
|
|
4
|
+
/**
|
|
5
|
+
* Produce a compact canonical token from a model identifier for use in storage keys.
|
|
6
|
+
*
|
|
7
|
+
* The function is side-effect-free and safe for concurrent use. It treats only forward slashes ("/") as segment separators,
|
|
8
|
+
* removes common trailing qualifiers (`-none`, `-minimal`, `-low`, `-medium`, `-high`, `-xhigh`) from the final segment,
|
|
9
|
+
* and does not access the filesystem. It does not further redact secrets; the resulting token may require encoding before
|
|
10
|
+
* use as a Windows filename.
|
|
11
|
+
*
|
|
12
|
+
* @param model - Optional model string which may include path-like segments and trailing qualifiers
|
|
13
|
+
* @returns The normalized model token, or `null` if `model` is missing or empty after trimming
|
|
14
|
+
*/
|
|
15
|
+
function normalizeModel(model) {
|
|
16
|
+
if (!model)
|
|
17
|
+
return null;
|
|
18
|
+
const trimmedInput = model.trim();
|
|
19
|
+
if (!trimmedInput)
|
|
20
|
+
return null;
|
|
21
|
+
const withoutProvider = trimmedInput.includes("/")
|
|
22
|
+
? (trimmedInput.split("/").pop() ?? trimmedInput)
|
|
23
|
+
: trimmedInput;
|
|
24
|
+
const mapped = getNormalizedModel(withoutProvider) ?? withoutProvider;
|
|
25
|
+
const trimmed = mapped.trim().toLowerCase();
|
|
26
|
+
if (!trimmed)
|
|
27
|
+
return null;
|
|
28
|
+
return trimmed.replace(/-(none|minimal|low|medium|high|xhigh)$/i, "");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Compose a storage key from an account key and a normalized model identifier.
|
|
32
|
+
*
|
|
33
|
+
* The function is pure and safe to call concurrently. It does not perform any
|
|
34
|
+
* secret/token redaction — do not pass sensitive values in `accountKey` or `model`.
|
|
35
|
+
* Note: the returned key includes a colon separator (`accountKey:normalizedModel`)
|
|
36
|
+
* and may not be suitable as a Windows filename without further encoding.
|
|
37
|
+
*
|
|
38
|
+
* @param accountKey - The account identifier used as the key prefix
|
|
39
|
+
* @param model - The model string to normalize and append; may be undefined
|
|
40
|
+
* @returns The combined key string, or `null` if `accountKey` is falsy or `model` cannot be normalized
|
|
41
|
+
*/
|
|
42
|
+
function makeKey(accountKey, model) {
|
|
43
|
+
const normalized = normalizeModel(model);
|
|
44
|
+
if (!accountKey || !normalized)
|
|
45
|
+
return null;
|
|
46
|
+
return `${accountKey}:${normalized}`;
|
|
47
|
+
}
|
|
48
|
+
export class CapabilityPolicyStore {
|
|
49
|
+
entries = new Map();
|
|
50
|
+
recordSuccess(accountKey, model, now = Date.now()) {
|
|
51
|
+
const key = makeKey(accountKey, model);
|
|
52
|
+
if (!key)
|
|
53
|
+
return;
|
|
54
|
+
const existing = this.entries.get(key);
|
|
55
|
+
this.entries.set(key, {
|
|
56
|
+
successes: (existing?.successes ?? 0) + 1,
|
|
57
|
+
failures: Math.max(0, (existing?.failures ?? 0) - 1),
|
|
58
|
+
unsupported: Math.max(0, (existing?.unsupported ?? 0) - 1),
|
|
59
|
+
lastSuccessAt: now,
|
|
60
|
+
lastFailureAt: existing?.lastFailureAt,
|
|
61
|
+
updatedAt: now,
|
|
62
|
+
});
|
|
63
|
+
this.evictIfNeeded();
|
|
64
|
+
}
|
|
65
|
+
recordFailure(accountKey, model, now = Date.now()) {
|
|
66
|
+
const key = makeKey(accountKey, model);
|
|
67
|
+
if (!key)
|
|
68
|
+
return;
|
|
69
|
+
const existing = this.entries.get(key);
|
|
70
|
+
this.entries.set(key, {
|
|
71
|
+
successes: existing?.successes ?? 0,
|
|
72
|
+
failures: (existing?.failures ?? 0) + 1,
|
|
73
|
+
unsupported: existing?.unsupported ?? 0,
|
|
74
|
+
lastSuccessAt: existing?.lastSuccessAt,
|
|
75
|
+
lastFailureAt: now,
|
|
76
|
+
updatedAt: now,
|
|
77
|
+
});
|
|
78
|
+
this.evictIfNeeded();
|
|
79
|
+
}
|
|
80
|
+
recordUnsupported(accountKey, model, now = Date.now()) {
|
|
81
|
+
const key = makeKey(accountKey, model);
|
|
82
|
+
if (!key)
|
|
83
|
+
return;
|
|
84
|
+
const existing = this.entries.get(key);
|
|
85
|
+
this.entries.set(key, {
|
|
86
|
+
successes: existing?.successes ?? 0,
|
|
87
|
+
failures: (existing?.failures ?? 0) + 1,
|
|
88
|
+
unsupported: (existing?.unsupported ?? 0) + 1,
|
|
89
|
+
lastSuccessAt: existing?.lastSuccessAt,
|
|
90
|
+
lastFailureAt: now,
|
|
91
|
+
updatedAt: now,
|
|
92
|
+
});
|
|
93
|
+
this.evictIfNeeded();
|
|
94
|
+
}
|
|
95
|
+
getBoost(accountKey, model, now = Date.now()) {
|
|
96
|
+
const key = makeKey(accountKey, model);
|
|
97
|
+
if (!key)
|
|
98
|
+
return 0;
|
|
99
|
+
const entry = this.entries.get(key);
|
|
100
|
+
if (!entry)
|
|
101
|
+
return 0;
|
|
102
|
+
const minutesSinceUpdate = Math.max(0, (now - entry.updatedAt) / 60_000);
|
|
103
|
+
const recoveredFailures = Math.max(0, entry.failures - minutesSinceUpdate * PASSIVE_RECOVERY_PER_MIN);
|
|
104
|
+
const recoveredUnsupported = Math.max(0, entry.unsupported - minutesSinceUpdate * PASSIVE_RECOVERY_PER_MIN);
|
|
105
|
+
const successScore = Math.min(12, entry.successes * 2);
|
|
106
|
+
const failurePenalty = Math.min(18, recoveredFailures * 3);
|
|
107
|
+
const unsupportedPenalty = Math.min(24, recoveredUnsupported * 6);
|
|
108
|
+
const net = successScore - failurePenalty - unsupportedPenalty;
|
|
109
|
+
return Math.max(-30, Math.min(20, net));
|
|
110
|
+
}
|
|
111
|
+
getSnapshot(accountKey, model) {
|
|
112
|
+
const key = makeKey(accountKey, model);
|
|
113
|
+
if (!key)
|
|
114
|
+
return null;
|
|
115
|
+
const entry = this.entries.get(key);
|
|
116
|
+
if (!entry)
|
|
117
|
+
return null;
|
|
118
|
+
return {
|
|
119
|
+
successes: entry.successes,
|
|
120
|
+
failures: entry.failures,
|
|
121
|
+
unsupported: entry.unsupported,
|
|
122
|
+
lastSuccessAt: entry.lastSuccessAt,
|
|
123
|
+
lastFailureAt: entry.lastFailureAt,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
clearAccount(accountKey) {
|
|
127
|
+
if (!accountKey)
|
|
128
|
+
return 0;
|
|
129
|
+
let removed = 0;
|
|
130
|
+
for (const key of this.entries.keys()) {
|
|
131
|
+
if (key.startsWith(`${accountKey}:`)) {
|
|
132
|
+
this.entries.delete(key);
|
|
133
|
+
removed += 1;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return removed;
|
|
137
|
+
}
|
|
138
|
+
evictIfNeeded() {
|
|
139
|
+
if (this.entries.size <= MAX_ENTRIES)
|
|
140
|
+
return;
|
|
141
|
+
const oldest = this.entries.entries().next().value;
|
|
142
|
+
if (!oldest)
|
|
143
|
+
return;
|
|
144
|
+
const [key] = oldest;
|
|
145
|
+
if (typeof key === "string") {
|
|
146
|
+
this.entries.delete(key);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=capability-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-policy.js","sourceRoot":"","sources":["../../lib/capability-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface CircuitBreakerConfig {
|
|
2
|
+
failureThreshold: number;
|
|
3
|
+
failureWindowMs: number;
|
|
4
|
+
resetTimeoutMs: number;
|
|
5
|
+
halfOpenMaxAttempts: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig;
|
|
8
|
+
export type CircuitState = "closed" | "open" | "half-open";
|
|
9
|
+
export declare class CircuitOpenError extends Error {
|
|
10
|
+
constructor(message?: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class CircuitBreaker {
|
|
13
|
+
private state;
|
|
14
|
+
private failures;
|
|
15
|
+
private lastStateChange;
|
|
16
|
+
private halfOpenAttempts;
|
|
17
|
+
private config;
|
|
18
|
+
constructor(config?: Partial<CircuitBreakerConfig>);
|
|
19
|
+
canExecute(): boolean;
|
|
20
|
+
recordSuccess(): void;
|
|
21
|
+
recordFailure(): void;
|
|
22
|
+
getState(): CircuitState;
|
|
23
|
+
reset(): void;
|
|
24
|
+
getFailureCount(): number;
|
|
25
|
+
getTimeUntilReset(): number;
|
|
26
|
+
private pruneFailures;
|
|
27
|
+
private transitionToOpen;
|
|
28
|
+
private transitionToHalfOpen;
|
|
29
|
+
private resetToClosed;
|
|
30
|
+
}
|
|
31
|
+
export declare function getCircuitBreaker(key: string, config?: Partial<CircuitBreakerConfig>): CircuitBreaker;
|
|
32
|
+
export declare function resetAllCircuitBreakers(): void;
|
|
33
|
+
export declare function clearCircuitBreakers(): void;
|
|
34
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../lib/circuit-breaker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAK5C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,SAAoB;CAIvC;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAItD,UAAU,IAAI,OAAO;IAsBrB,aAAa,IAAI,IAAI;IAYrB,aAAa,IAAI,IAAI;IAerB,QAAQ,IAAI,YAAY;IAIxB,KAAK,IAAI,IAAI;IAIb,eAAe,IAAI,MAAM;IAKzB,iBAAiB,IAAI,MAAM;IAM3B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;CAMrB;AAKD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAYrG;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export const DEFAULT_CIRCUIT_BREAKER_CONFIG = {
|
|
2
|
+
failureThreshold: 3,
|
|
3
|
+
failureWindowMs: 60_000,
|
|
4
|
+
resetTimeoutMs: 30_000,
|
|
5
|
+
halfOpenMaxAttempts: 1,
|
|
6
|
+
};
|
|
7
|
+
export class CircuitOpenError extends Error {
|
|
8
|
+
constructor(message = "Circuit is open") {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "CircuitOpenError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class CircuitBreaker {
|
|
14
|
+
state = "closed";
|
|
15
|
+
failures = [];
|
|
16
|
+
lastStateChange = Date.now();
|
|
17
|
+
halfOpenAttempts = 0;
|
|
18
|
+
config;
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.config = { ...DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };
|
|
21
|
+
}
|
|
22
|
+
canExecute() {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
if (this.state === "open") {
|
|
25
|
+
if (now - this.lastStateChange >= this.config.resetTimeoutMs) {
|
|
26
|
+
this.transitionToHalfOpen(now);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
throw new CircuitOpenError();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (this.state === "half-open") {
|
|
33
|
+
if (this.halfOpenAttempts >= this.config.halfOpenMaxAttempts) {
|
|
34
|
+
throw new CircuitOpenError("Circuit is half-open");
|
|
35
|
+
}
|
|
36
|
+
this.halfOpenAttempts += 1;
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
recordSuccess() {
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
if (this.state === "half-open") {
|
|
44
|
+
this.resetToClosed(now);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (this.state === "closed") {
|
|
48
|
+
this.pruneFailures(now);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
recordFailure() {
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
this.pruneFailures(now);
|
|
54
|
+
this.failures.push(now);
|
|
55
|
+
if (this.state === "half-open") {
|
|
56
|
+
this.transitionToOpen(now);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (this.state === "closed" && this.failures.length >= this.config.failureThreshold) {
|
|
60
|
+
this.transitionToOpen(now);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getState() {
|
|
64
|
+
return this.state;
|
|
65
|
+
}
|
|
66
|
+
reset() {
|
|
67
|
+
this.resetToClosed(Date.now());
|
|
68
|
+
}
|
|
69
|
+
getFailureCount() {
|
|
70
|
+
this.pruneFailures(Date.now());
|
|
71
|
+
return this.failures.length;
|
|
72
|
+
}
|
|
73
|
+
getTimeUntilReset() {
|
|
74
|
+
if (this.state !== "open")
|
|
75
|
+
return 0;
|
|
76
|
+
const elapsed = Date.now() - this.lastStateChange;
|
|
77
|
+
return Math.max(0, this.config.resetTimeoutMs - elapsed);
|
|
78
|
+
}
|
|
79
|
+
pruneFailures(now) {
|
|
80
|
+
const cutoff = now - this.config.failureWindowMs;
|
|
81
|
+
this.failures = this.failures.filter((timestamp) => timestamp >= cutoff);
|
|
82
|
+
}
|
|
83
|
+
transitionToOpen(now) {
|
|
84
|
+
this.state = "open";
|
|
85
|
+
this.lastStateChange = now;
|
|
86
|
+
this.halfOpenAttempts = 0;
|
|
87
|
+
}
|
|
88
|
+
transitionToHalfOpen(now) {
|
|
89
|
+
this.state = "half-open";
|
|
90
|
+
this.lastStateChange = now;
|
|
91
|
+
this.halfOpenAttempts = 0;
|
|
92
|
+
}
|
|
93
|
+
resetToClosed(now) {
|
|
94
|
+
this.state = "closed";
|
|
95
|
+
this.lastStateChange = now;
|
|
96
|
+
this.halfOpenAttempts = 0;
|
|
97
|
+
this.failures = [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const MAX_CIRCUIT_BREAKERS = 100;
|
|
101
|
+
const circuitBreakers = new Map();
|
|
102
|
+
export function getCircuitBreaker(key, config) {
|
|
103
|
+
let breaker = circuitBreakers.get(key);
|
|
104
|
+
if (!breaker) {
|
|
105
|
+
if (circuitBreakers.size >= MAX_CIRCUIT_BREAKERS) {
|
|
106
|
+
const firstKey = circuitBreakers.keys().next().value;
|
|
107
|
+
// istanbul ignore next -- defensive: firstKey always exists when size >= MAX_CIRCUIT_BREAKERS
|
|
108
|
+
if (firstKey)
|
|
109
|
+
circuitBreakers.delete(firstKey);
|
|
110
|
+
}
|
|
111
|
+
breaker = new CircuitBreaker(config);
|
|
112
|
+
circuitBreakers.set(key, breaker);
|
|
113
|
+
}
|
|
114
|
+
return breaker;
|
|
115
|
+
}
|
|
116
|
+
export function resetAllCircuitBreakers() {
|
|
117
|
+
for (const breaker of circuitBreakers.values()) {
|
|
118
|
+
breaker.reset();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function clearCircuitBreakers() {
|
|
122
|
+
circuitBreakers.clear();
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../lib/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { AccountIdSource } from "./types.js";
|
|
2
|
+
import { isTTY, type AccountStatus } from "./ui/auth-menu.js";
|
|
3
|
+
/**
|
|
4
|
+
* Detect if running in OpenCode Desktop/TUI mode where readline prompts don't work.
|
|
5
|
+
* In TUI mode, stdin/stdout are controlled by the TUI renderer, so readline breaks.
|
|
6
|
+
* Exported for testing purposes.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isNonInteractiveMode(): boolean;
|
|
9
|
+
export declare function promptAddAnotherAccount(currentCount: number): Promise<boolean>;
|
|
10
|
+
export type LoginMode = "add" | "forecast" | "fix" | "settings" | "fresh" | "manage" | "check" | "deep-check" | "verify-flagged" | "cancel";
|
|
11
|
+
export interface ExistingAccountInfo {
|
|
12
|
+
accountId?: string;
|
|
13
|
+
accountLabel?: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
index: number;
|
|
16
|
+
sourceIndex?: number;
|
|
17
|
+
quickSwitchNumber?: number;
|
|
18
|
+
addedAt?: number;
|
|
19
|
+
lastUsed?: number;
|
|
20
|
+
status?: AccountStatus;
|
|
21
|
+
quotaSummary?: string;
|
|
22
|
+
quota5hLeftPercent?: number;
|
|
23
|
+
quota5hResetAtMs?: number;
|
|
24
|
+
quota7dLeftPercent?: number;
|
|
25
|
+
quota7dResetAtMs?: number;
|
|
26
|
+
quotaRateLimited?: boolean;
|
|
27
|
+
isCurrentAccount?: boolean;
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
showStatusBadge?: boolean;
|
|
30
|
+
showCurrentBadge?: boolean;
|
|
31
|
+
showLastUsed?: boolean;
|
|
32
|
+
showQuotaCooldown?: boolean;
|
|
33
|
+
showHintsForUnselectedRows?: boolean;
|
|
34
|
+
highlightCurrentRow?: boolean;
|
|
35
|
+
focusStyle?: "row-invert" | "chip";
|
|
36
|
+
statuslineFields?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface LoginMenuOptions {
|
|
39
|
+
flaggedCount?: number;
|
|
40
|
+
statusMessage?: string | (() => string | undefined);
|
|
41
|
+
}
|
|
42
|
+
export interface LoginMenuResult {
|
|
43
|
+
mode: LoginMode;
|
|
44
|
+
deleteAccountIndex?: number;
|
|
45
|
+
refreshAccountIndex?: number;
|
|
46
|
+
toggleAccountIndex?: number;
|
|
47
|
+
switchAccountIndex?: number;
|
|
48
|
+
deleteAll?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare function promptLoginMode(existingAccounts: ExistingAccountInfo[], options?: LoginMenuOptions): Promise<LoginMenuResult>;
|
|
51
|
+
export interface AccountSelectionCandidate {
|
|
52
|
+
accountId: string;
|
|
53
|
+
label: string;
|
|
54
|
+
source?: AccountIdSource;
|
|
55
|
+
isDefault?: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface AccountSelectionOptions {
|
|
58
|
+
defaultIndex?: number;
|
|
59
|
+
title?: string;
|
|
60
|
+
}
|
|
61
|
+
export declare function promptAccountSelection(candidates: AccountSelectionCandidate[], options?: AccountSelectionOptions): Promise<AccountSelectionCandidate | null>;
|
|
62
|
+
export { isTTY };
|
|
63
|
+
export type { AccountStatus };
|
|
64
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../lib/cli.ts"],"names":[],"mappings":"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"}
|