pi-harness-runtime 1.1.407 → 1.1.410
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/harness/key-file-audit.ts +2 -2
- package/index.ts +78 -0
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/connection-runtime/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/durable-review/package.json +1 -1
- package/packages/e2e-tester/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-sink/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/logging/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/permission-mode/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/dist/adapters.d.ts +1 -1
- package/packages/providers/dist/adapters.d.ts.map +1 -1
- package/packages/providers/dist/deepagents-adapter.d.ts +22 -1
- package/packages/providers/dist/deepagents-adapter.d.ts.map +1 -1
- package/packages/providers/dist/deepagents-adapter.js +3 -8
- package/packages/providers/dist/deepagents-adapter.js.map +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/providers/src/adapters.ts +1 -1
- package/packages/providers/src/deepagents-adapter.ts +28 -31
- package/packages/qdrant-skills/dist/embedder.d.ts +5 -1
- package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -1
- package/packages/qdrant-skills/dist/embedder.js +52 -37
- package/packages/qdrant-skills/dist/embedder.js.map +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/qdrant-skills/src/embedder.ts +56 -40
- package/packages/qdrant-skills/test/embedder.test.ts +97 -0
- package/packages/quota-manager/dist/quota-manager.d.ts +1 -1
- package/packages/quota-manager/dist/quota-manager.d.ts.map +1 -1
- package/packages/quota-manager/dist/quota-manager.js +10 -8
- package/packages/quota-manager/dist/quota-manager.js.map +1 -1
- package/packages/quota-manager/dist/tui-usage-monitor.d.ts +5 -3
- package/packages/quota-manager/dist/tui-usage-monitor.d.ts.map +1 -1
- package/packages/quota-manager/dist/tui-usage-monitor.js +30 -10
- package/packages/quota-manager/dist/tui-usage-monitor.js.map +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/quota-manager/src/quota-manager.ts +10 -9
- package/packages/quota-manager/src/tui-usage-monitor.ts +40 -17
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/relay/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/dist/loader.d.ts.map +1 -1
- package/packages/skills/dist/loader.js +9 -6
- package/packages/skills/dist/loader.js.map +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/skills/src/loader.ts +13 -6
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/telegram/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/tooling-preference/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/two-phase-review/dist/classify.d.ts +56 -0
- package/packages/two-phase-review/dist/classify.d.ts.map +1 -0
- package/packages/two-phase-review/dist/classify.js +108 -0
- package/packages/two-phase-review/dist/classify.js.map +1 -0
- package/packages/two-phase-review/dist/index.d.ts +20 -0
- package/packages/two-phase-review/dist/index.d.ts.map +1 -0
- package/packages/two-phase-review/dist/index.js +14 -0
- package/packages/two-phase-review/dist/index.js.map +1 -0
- package/packages/two-phase-review/dist/rules.d.ts +81 -0
- package/packages/two-phase-review/dist/rules.d.ts.map +1 -0
- package/packages/two-phase-review/dist/rules.js +195 -0
- package/packages/two-phase-review/dist/rules.js.map +1 -0
- package/packages/two-phase-review/dist/runtime.d.ts +70 -0
- package/packages/two-phase-review/dist/runtime.d.ts.map +1 -0
- package/packages/two-phase-review/dist/runtime.js +298 -0
- package/packages/two-phase-review/dist/runtime.js.map +1 -0
- package/packages/two-phase-review/dist/scope.d.ts +68 -0
- package/packages/two-phase-review/dist/scope.d.ts.map +1 -0
- package/packages/two-phase-review/dist/scope.js +205 -0
- package/packages/two-phase-review/dist/scope.js.map +1 -0
- package/packages/two-phase-review/dist/signals.d.ts +74 -0
- package/packages/two-phase-review/dist/signals.d.ts.map +1 -0
- package/packages/two-phase-review/dist/signals.js +297 -0
- package/packages/two-phase-review/dist/signals.js.map +1 -0
- package/packages/two-phase-review/dist/state.d.ts +72 -0
- package/packages/two-phase-review/dist/state.d.ts.map +1 -0
- package/packages/two-phase-review/dist/state.js +238 -0
- package/packages/two-phase-review/dist/state.js.map +1 -0
- package/packages/two-phase-review/dist/types.d.ts +62 -0
- package/packages/two-phase-review/dist/types.d.ts.map +1 -0
- package/packages/two-phase-review/dist/types.js +9 -0
- package/packages/two-phase-review/dist/types.js.map +1 -0
- package/packages/two-phase-review/package.json +21 -0
- package/packages/two-phase-review/src/classify.ts +129 -0
- package/packages/two-phase-review/src/index.ts +110 -0
- package/packages/two-phase-review/src/rules.ts +236 -0
- package/packages/two-phase-review/src/runtime.ts +392 -0
- package/packages/two-phase-review/src/scope.ts +247 -0
- package/packages/two-phase-review/src/signals.ts +340 -0
- package/packages/two-phase-review/src/state.ts +280 -0
- package/packages/two-phase-review/src/types.ts +72 -0
- package/packages/two-phase-review/test/classify.test.ts +102 -0
- package/packages/two-phase-review/test/helpers.ts +72 -0
- package/packages/two-phase-review/test/rules.test.ts +150 -0
- package/packages/two-phase-review/test/runtime.test.ts +362 -0
- package/packages/two-phase-review/test/scope.test.ts +186 -0
- package/packages/two-phase-review/test/signals.test.ts +183 -0
- package/packages/two-phase-review/test/state.test.ts +201 -0
- package/packages/types/package.json +1 -1
- package/packages/voice-api/package.json +1 -1
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/wiki/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/dist/worktree.d.ts +32 -1
- package/packages/worktree/dist/worktree.d.ts.map +1 -1
- package/packages/worktree/dist/worktree.js +21 -8
- package/packages/worktree/dist/worktree.js.map +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/worktree/src/worktree.ts +50 -9
- package/packages/worktree/test/worktree.test.ts +27 -27
- package/packages/write-review/package.json +1 -1
- package/scripts/typecheck-packages.mjs +3 -3
- package/packages/providers/adapters.ts +0 -362
- package/packages/providers/deepagents-adapter.ts +0 -458
- package/packages/providers/glm-usage.ts +0 -248
- package/packages/providers/index.ts +0 -85
- package/packages/providers/openai-usage.ts +0 -263
- package/packages/trajectory/dist/test/store.test.d.ts +0 -2
- package/packages/trajectory/dist/test/store.test.d.ts.map +0 -1
- package/packages/trajectory/dist/test/store.test.js +0 -228
- package/packages/trajectory/dist/test/store.test.js.map +0 -1
- package/packages/types/src/agent-worker-types.d.ts +0 -206
- package/packages/types/src/agent-worker-types.js +0 -41
- package/packages/worktree/worktree.ts +0 -293
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
* Used to store skills in Qdrant for semantic search.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
9
|
+
import { homedir as osHomedir } from "node:os";
|
|
10
|
+
import { join } from "node:path";
|
|
8
11
|
import type { SkillPoint } from "./client.js";
|
|
9
12
|
|
|
10
13
|
/**
|
|
@@ -15,55 +18,68 @@ export interface EmbeddingResult {
|
|
|
15
18
|
tokens: number;
|
|
16
19
|
}
|
|
17
20
|
|
|
21
|
+
/** The embeddings endpoint of OpenAI. */
|
|
22
|
+
const OPENAI_EMBEDDINGS_URL = "https://api.openai.com/v1/embeddings";
|
|
23
|
+
|
|
24
|
+
/** The home directory of the current user. */
|
|
25
|
+
function homeDir(): string {
|
|
26
|
+
return process.env.HOME || process.env.USERPROFILE || osHomedir();
|
|
27
|
+
}
|
|
28
|
+
|
|
18
29
|
/**
|
|
19
|
-
*
|
|
30
|
+
* Read a key file. A file that cannot be read is no key - the caller must
|
|
31
|
+
* not see an exception of an unreadable file as a broken installation.
|
|
20
32
|
*/
|
|
21
|
-
|
|
22
|
-
// 1. Env vars (same priority as Jev)
|
|
23
|
-
if (process.env.OPENAI_API_KEY) {
|
|
24
|
-
return process.env.OPENAI_API_KEY;
|
|
25
|
-
}
|
|
26
|
-
if (process.env.TYPESAFE_API_KEY) {
|
|
27
|
-
return process.env.TYPESAFE_API_KEY;
|
|
28
|
-
}
|
|
29
|
-
if (process.env.OPENROUTER_API_KEY) {
|
|
30
|
-
return process.env.OPENROUTER_API_KEY;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// 2. Keys file
|
|
33
|
+
function readKeyFile(path: string): string | null {
|
|
34
34
|
try {
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
if (existsSync(keyPath)) {
|
|
39
|
-
const val = readFileSync(keyPath, "utf-8").trim();
|
|
40
|
-
if (val.length > 5) return val;
|
|
41
|
-
}
|
|
35
|
+
if (!existsSync(path)) return null;
|
|
36
|
+
const value = readFileSync(path, "utf8").trim();
|
|
37
|
+
return value.length > 5 ? value : null;
|
|
42
38
|
} catch {
|
|
43
|
-
|
|
39
|
+
return null;
|
|
44
40
|
}
|
|
41
|
+
}
|
|
45
42
|
|
|
46
|
-
|
|
43
|
+
/**
|
|
44
|
+
* The OpenAI token of a pi.dev login (an OAuth access token).
|
|
45
|
+
*/
|
|
46
|
+
function readPiAuthToken(): string | null {
|
|
47
|
+
const authPath = join(homeDir(), ".pi", "agent", "auth.json");
|
|
47
48
|
try {
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const entry = auth.openai ?? auth["openai-codex"];
|
|
58
|
-
if (entry) {
|
|
59
|
-
return entry.access ?? entry.key ?? null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
49
|
+
if (!existsSync(authPath)) return null;
|
|
50
|
+
const auth = JSON.parse(readFileSync(authPath, "utf8")) as {
|
|
51
|
+
openai?: { key?: string; access?: string };
|
|
52
|
+
"openai-codex"?: { key?: string; access?: string };
|
|
53
|
+
};
|
|
54
|
+
// The api key first, then the OAuth access token of the codex login.
|
|
55
|
+
const entry = auth.openai ?? auth["openai-codex"];
|
|
56
|
+
if (!entry) return null;
|
|
57
|
+
return (entry.access ?? entry.key ?? "").trim() || null;
|
|
62
58
|
} catch {
|
|
63
|
-
|
|
59
|
+
return null;
|
|
64
60
|
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get the OpenAI API key for embeddings.
|
|
65
|
+
*
|
|
66
|
+
* Only a key of OpenAI belongs here: the embeddings endpoint of OpenAI does
|
|
67
|
+
* not accept the key of another provider. A TypeSafe or an OpenRouter key is
|
|
68
|
+
* a different credential and must never be sent to that endpoint.
|
|
69
|
+
*/
|
|
70
|
+
export function getOpenAIApiKey(): string | null {
|
|
71
|
+
// 1. The environment.
|
|
72
|
+
const fromEnv = process.env.OPENAI_API_KEY?.trim();
|
|
73
|
+
if (fromEnv) return fromEnv;
|
|
74
|
+
|
|
75
|
+
// 2. The key file of the installation.
|
|
76
|
+
const fromFile = readKeyFile(
|
|
77
|
+
join(homeDir(), ".pi-harness-runtime", "keys", "openai-api-key.txt"),
|
|
78
|
+
);
|
|
79
|
+
if (fromFile) return fromFile;
|
|
65
80
|
|
|
66
|
-
|
|
81
|
+
// 3. pi.dev auth.json (the OpenAI token of a pi.dev login).
|
|
82
|
+
return readPiAuthToken();
|
|
67
83
|
}
|
|
68
84
|
|
|
69
85
|
/**
|
|
@@ -78,7 +94,7 @@ export async function createEmbedding(
|
|
|
78
94
|
throw new Error("No OpenAI API key available for embeddings");
|
|
79
95
|
}
|
|
80
96
|
|
|
81
|
-
const response = await fetch(
|
|
97
|
+
const response = await fetch(OPENAI_EMBEDDINGS_URL, {
|
|
82
98
|
method: "POST",
|
|
83
99
|
headers: {
|
|
84
100
|
"Content-Type": "application/json",
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The OpenAI key of the embedder.
|
|
3
|
+
*
|
|
4
|
+
* The embeddings endpoint of OpenAI accepts only an OpenAI key. The key of
|
|
5
|
+
* another provider is a different credential and must never be sent there.
|
|
6
|
+
* The loader must also work in ESM, where `require` does not exist.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach } from "bun:test";
|
|
10
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { getOpenAIApiKey } from "../src/embedder.js";
|
|
14
|
+
|
|
15
|
+
/** The environment variables the loader looks at. */
|
|
16
|
+
const ENV_KEYS = [
|
|
17
|
+
"OPENAI_API_KEY",
|
|
18
|
+
"TYPESAFE_API_KEY",
|
|
19
|
+
"OPENROUTER_API_KEY",
|
|
20
|
+
"HOME",
|
|
21
|
+
"USERPROFILE",
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
let saved: Record<string, string | undefined> = {};
|
|
25
|
+
let tempHome: string;
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
saved = {};
|
|
29
|
+
for (const key of ENV_KEYS) {
|
|
30
|
+
saved[key] = process.env[key];
|
|
31
|
+
delete process.env[key];
|
|
32
|
+
}
|
|
33
|
+
// The home directory points at a fresh directory, so the test never
|
|
34
|
+
// reads the key of the machine it runs on.
|
|
35
|
+
tempHome = mkdtempSync(join(homedir(), ".test-qdrant-embedder-"));
|
|
36
|
+
process.env.HOME = tempHome;
|
|
37
|
+
process.env.USERPROFILE = tempHome;
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
for (const key of ENV_KEYS) {
|
|
42
|
+
if (saved[key] === undefined) delete process.env[key];
|
|
43
|
+
else process.env[key] = saved[key];
|
|
44
|
+
}
|
|
45
|
+
rmSync(tempHome, { recursive: true, force: true });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/** Write a key file of the installation. */
|
|
49
|
+
function writeKeyFile(name: string, content: string): void {
|
|
50
|
+
const dir = join(tempHome, ".pi-harness-runtime", "keys");
|
|
51
|
+
mkdirSync(dir, { recursive: true });
|
|
52
|
+
writeFileSync(join(dir, name), content, "utf8");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe("the OpenAI key of the embedder", () => {
|
|
56
|
+
it("takes the key of the environment", () => {
|
|
57
|
+
process.env.OPENAI_API_KEY = "sk-openai-from-env";
|
|
58
|
+
expect(getOpenAIApiKey()).toBe("sk-openai-from-env");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("takes the key file of the installation", () => {
|
|
62
|
+
writeKeyFile("openai-api-key.txt", "sk-openai-from-file\n");
|
|
63
|
+
expect(getOpenAIApiKey()).toBe("sk-openai-from-file");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("takes the token of a pi.dev login", () => {
|
|
67
|
+
const dir = join(tempHome, ".pi", "agent");
|
|
68
|
+
mkdirSync(dir, { recursive: true });
|
|
69
|
+
writeFileSync(
|
|
70
|
+
join(dir, "auth.json"),
|
|
71
|
+
JSON.stringify({ openai: { access: "openai-oauth-token" } }),
|
|
72
|
+
"utf8",
|
|
73
|
+
);
|
|
74
|
+
expect(getOpenAIApiKey()).toBe("openai-oauth-token");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("never takes the key of another provider", () => {
|
|
78
|
+
// A TypeSafe key and an OpenRouter key are different credentials:
|
|
79
|
+
// the embeddings endpoint of OpenAI rejects them.
|
|
80
|
+
process.env.TYPESAFE_API_KEY = "ts-key-of-another-provider";
|
|
81
|
+
expect(getOpenAIApiKey()).toBeNull();
|
|
82
|
+
|
|
83
|
+
process.env.OPENROUTER_API_KEY = "or-key-of-another-provider";
|
|
84
|
+
expect(getOpenAIApiKey()).toBeNull();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("prefers the OpenAI key over the key of another provider", () => {
|
|
88
|
+
process.env.OPENAI_API_KEY = "sk-openai-from-env";
|
|
89
|
+
process.env.TYPESAFE_API_KEY = "ts-key-of-another-provider";
|
|
90
|
+
process.env.OPENROUTER_API_KEY = "or-key-of-another-provider";
|
|
91
|
+
expect(getOpenAIApiKey()).toBe("sk-openai-from-env");
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("finds no key when there is none", () => {
|
|
95
|
+
expect(getOpenAIApiKey()).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Collects quota signals from API responses, provider status,
|
|
5
5
|
* Playwright, and local estimates. Produces provider availability state.
|
|
6
6
|
*/
|
|
7
|
-
import type { QuotaSignal, QuotaState } from "../../types/
|
|
7
|
+
import type { QuotaSignal, QuotaState } from "../../types/dist/runtime-types.js";
|
|
8
8
|
export interface QuotaSignalInput {
|
|
9
9
|
provider: string;
|
|
10
10
|
source: "api_response" | "provider_status" | "playwright" | "local_estimate" | "tui_message";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-manager.d.ts","sourceRoot":"","sources":["../src/quota-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"quota-manager.d.ts","sourceRoot":"","sources":["../src/quota-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EACH,cAAc,GACd,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,GAChB,aAAa,CAAC;IACjB,UAAU,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACxB,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,YAAY,gBAAgB,GAAE,MAAuB,EAEpD;IAED;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAe1C;IAED;;OAEG;IACH,eAAe,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAChD,WAAW,GAAG,IAAI,CAkCpB;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CA8B7C;IAED;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAgB1C;IAED;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErC;IAED;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErC;IAED;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3C;IAED;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAerD;IAED;;OAEG;IACH,UAAU,IAAI,IAAI,CAcjB;IAED;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CA+B1C;CACD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAmCpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CA0CnE"}
|
|
@@ -40,7 +40,7 @@ export class QuotaManager {
|
|
|
40
40
|
// Return most recent across all window types
|
|
41
41
|
let latest = null;
|
|
42
42
|
let latestTs = 0;
|
|
43
|
-
for (const entry of
|
|
43
|
+
for (const entry of this.signals.entries()) {
|
|
44
44
|
const [k, sigs] = entry;
|
|
45
45
|
if (k.startsWith(`${provider}:`)) {
|
|
46
46
|
const mostRecent = sigs.sort((a, b) => Date.parse(b.capturedAt) - Date.parse(a.capturedAt))[0];
|
|
@@ -87,7 +87,7 @@ export class QuotaManager {
|
|
|
87
87
|
getSignals(provider) {
|
|
88
88
|
const result = [];
|
|
89
89
|
const cutoff = Date.now() - this.staleThresholdMs;
|
|
90
|
-
for (const entry of
|
|
90
|
+
for (const entry of this.signals.entries()) {
|
|
91
91
|
const [key, sigs] = entry;
|
|
92
92
|
if (key.startsWith(`${provider}:`)) {
|
|
93
93
|
for (const signal of sigs) {
|
|
@@ -143,7 +143,7 @@ export class QuotaManager {
|
|
|
143
143
|
*/
|
|
144
144
|
clearStale() {
|
|
145
145
|
const cutoff = Date.now() - this.staleThresholdMs;
|
|
146
|
-
for (const entry of
|
|
146
|
+
for (const entry of this.signals.entries()) {
|
|
147
147
|
const [key, sigs] = entry;
|
|
148
148
|
const fresh = sigs.filter((s) => Date.parse(s.capturedAt) >= cutoff);
|
|
149
149
|
if (fresh.length === 0) {
|
|
@@ -162,11 +162,13 @@ export class QuotaManager {
|
|
|
162
162
|
for (const provider of providers) {
|
|
163
163
|
const state = this.getProviderState(provider);
|
|
164
164
|
const latest = this.getLatestSignal(provider);
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
let status = "AVAILABLE";
|
|
166
|
+
if (state.exhausted) {
|
|
167
|
+
status = "EXHAUSTED";
|
|
168
|
+
}
|
|
169
|
+
else if (state.limited) {
|
|
170
|
+
status = "LIMITED";
|
|
171
|
+
}
|
|
170
172
|
lines.push(`${provider}: ${status}`);
|
|
171
173
|
if (latest) {
|
|
172
174
|
lines.push(` Latest: ${latest.usedPct ?? 0}% used`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-manager.js","sourceRoot":"","sources":["../src/quota-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,MAAM,OAAO,YAAY;IAChB,OAAO,GAA+B,IAAI,GAAG,EAAE,CAAC;IACvC,gBAAgB,CAAS;IAE1C,YAAY,gBAAgB,GAAW,EAAE,GAAG,EAAE,GAAG,IAAI;QACpD,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAuB;QACnC,MAAM,MAAM,GAAgB;YAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;YAC3B,YAAY,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,eAAe,CACd,QAAgB,EAChB,UAAkD;QAElD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEhE,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5C,OAAO,CACN,OAAO,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAC7D,CAAC,CAAC,CAAC,IAAI,IAAI,CACZ,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"quota-manager.js","sourceRoot":"","sources":["../src/quota-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { EventEmitter } from "node:events";
|
|
17
17
|
import type { QuotaManager } from "./quota-manager.js";
|
|
18
|
+
/** The providers the monitor can recognize. */
|
|
19
|
+
export type TUIProvider = "openai" | "glm" | "minimax" | "anthropic" | "openrouter";
|
|
18
20
|
export interface TUIUsageSignal {
|
|
19
|
-
provider:
|
|
21
|
+
provider: TUIProvider | "unknown";
|
|
20
22
|
timestamp: string;
|
|
21
23
|
/** Usage percentage (0-100), if available */
|
|
22
24
|
usedPct?: number;
|
|
@@ -49,11 +51,11 @@ export declare class TUIUsageMonitor extends EventEmitter {
|
|
|
49
51
|
/**
|
|
50
52
|
* Detect which provider the message is about
|
|
51
53
|
*/
|
|
52
|
-
detectProvider(message: string):
|
|
54
|
+
detectProvider(message: string): TUIProvider | null;
|
|
53
55
|
/**
|
|
54
56
|
* Get the last signal for a provider
|
|
55
57
|
*/
|
|
56
|
-
getLastSignal(provider:
|
|
58
|
+
getLastSignal(provider: TUIProvider): TUIUsageSignal | null;
|
|
57
59
|
/**
|
|
58
60
|
* Get all last signals
|
|
59
61
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-usage-monitor.d.ts","sourceRoot":"","sources":["../src/tui-usage-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"tui-usage-monitor.d.ts","sourceRoot":"","sources":["../src/tui-usage-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;IAClE,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACrC,iDAAiD;IACjD,YAAY,EAAE,YAAY,CAAC;IAC3B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AA4ED,qBAAa,eAAgB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,WAAW,CAA0C;IAE7D,YAAY,MAAM,EAAE,qBAAqB,EAIxC;IAED;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA4BrD;IAED;;OAEG;IACH,cAAc,CACb,OAAO,EAAE,MAAM,GACb,WAAW,GAAG,IAAI,CAepB;IAED;;OAEG;IACH,aAAa,CACZ,QAAQ,EAAE,WAAW,GACnB,cAAc,GAAG,IAAI,CAEvB;IAED;;OAEG;IACH,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAE/C;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;IAqCnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;OAEG;IACH,OAAO,CAAC,cAAc;IA2CtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAmB5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE;IACH,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CAC3E,EACD,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,eAAe,CAgBjB"}
|
|
@@ -17,14 +17,19 @@ import { EventEmitter } from "node:events";
|
|
|
17
17
|
/**
|
|
18
18
|
* Provider-specific patterns
|
|
19
19
|
*/
|
|
20
|
+
/**
|
|
21
|
+
* The patterns that name the provider.
|
|
22
|
+
*
|
|
23
|
+
* A pattern that names the provider wins over a bare error code: the message
|
|
24
|
+
* "Claude overloaded_error" is about Anthropic, not about the provider that
|
|
25
|
+
* happens to use the error code first.
|
|
26
|
+
*/
|
|
20
27
|
const PROVIDER_PATTERNS = {
|
|
21
28
|
openai: [
|
|
22
29
|
/(?:^|\s)OpenAI(?:$|\s)/i,
|
|
23
30
|
/(?:^|\s)GPT(?:$|\s)/i,
|
|
24
31
|
/openai.*(?:quota|limit|exhausted)/i,
|
|
25
32
|
/gpt.*(?:quota|limit|exhausted)/i,
|
|
26
|
-
/insufficient_quota/i,
|
|
27
|
-
/context_length_exceeded/i,
|
|
28
33
|
/openai.*rate.?limit/i,
|
|
29
34
|
/429.*openai/i,
|
|
30
35
|
/openai.*context.*(?:window|length)/i,
|
|
@@ -37,30 +42,39 @@ const PROVIDER_PATTERNS = {
|
|
|
37
42
|
/glm.*context.*(?:window|length)/i,
|
|
38
43
|
/glm.*rate.?limit/i,
|
|
39
44
|
/glm.*429/i,
|
|
40
|
-
/code.*1308/i, // GLM specific error code
|
|
41
|
-
/Usage limit reached/i,
|
|
42
|
-
/5 hour.*quota/i,
|
|
43
45
|
],
|
|
44
46
|
minimax: [
|
|
45
47
|
/(?:^|\s)Minimax(?:$|\s)/i,
|
|
46
48
|
/minimax.*(?:overload|surge|busy)/i,
|
|
47
|
-
/overloaded_error/i,
|
|
48
49
|
/529.*minimax/i,
|
|
49
|
-
/peak.?hour.*surge/i,
|
|
50
50
|
],
|
|
51
51
|
anthropic: [
|
|
52
52
|
/(?:^|\s)Claude(?:$|\s)/i,
|
|
53
53
|
/(?:^|\s)Anthropic(?:$|\s)/i,
|
|
54
54
|
/anthropic.*(?:quota|limit|exhausted)/i,
|
|
55
55
|
/claude.*(?:quota|limit|exhausted)/i,
|
|
56
|
-
/overloaded_error/i,
|
|
57
|
-
/rate_limit_error/i,
|
|
58
56
|
],
|
|
59
57
|
openrouter: [
|
|
60
58
|
/(?:^|\s)OpenRouter(?:$|\s)/i,
|
|
61
59
|
/openrouter.*(?:quota|limit|exhausted)/i,
|
|
62
60
|
],
|
|
63
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* The error codes without a provider name.
|
|
64
|
+
*
|
|
65
|
+
* They are checked only when no pattern names a provider. A code that several
|
|
66
|
+
* providers share belongs to the one that reported it first.
|
|
67
|
+
*/
|
|
68
|
+
const GENERIC_PATTERNS = [
|
|
69
|
+
{ provider: "openai", pattern: /insufficient_quota/i },
|
|
70
|
+
{ provider: "openai", pattern: /context_length_exceeded/i },
|
|
71
|
+
{ provider: "glm", pattern: /code.*1308/i },
|
|
72
|
+
{ provider: "glm", pattern: /Usage limit reached/i },
|
|
73
|
+
{ provider: "glm", pattern: /5 hour.*quota/i },
|
|
74
|
+
{ provider: "minimax", pattern: /overloaded_error/i },
|
|
75
|
+
{ provider: "minimax", pattern: /peak.?hour.*surge/i },
|
|
76
|
+
{ provider: "anthropic", pattern: /rate_limit_error/i },
|
|
77
|
+
];
|
|
64
78
|
const RESET_TIME_PATTERNS = [
|
|
65
79
|
// GLM specific: "reset at 2026-08-25 01:47:16" or "reset at 2026-08-25T01:47:16"
|
|
66
80
|
/reset\s+(?:at\s+)?(\d{4}-\d{2}-\d{2}[T ]?\d{2}:\d{2}:\d{2})/i,
|
|
@@ -108,6 +122,7 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
108
122
|
* Detect which provider the message is about
|
|
109
123
|
*/
|
|
110
124
|
detectProvider(message) {
|
|
125
|
+
// The named provider first, the bare error codes second.
|
|
111
126
|
for (const [provider, patterns] of Object.entries(PROVIDER_PATTERNS)) {
|
|
112
127
|
for (const pattern of patterns) {
|
|
113
128
|
if (pattern.test(message)) {
|
|
@@ -115,6 +130,11 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
115
130
|
}
|
|
116
131
|
}
|
|
117
132
|
}
|
|
133
|
+
for (const { provider, pattern } of GENERIC_PATTERNS) {
|
|
134
|
+
if (pattern.test(message)) {
|
|
135
|
+
return provider;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
118
138
|
return null;
|
|
119
139
|
}
|
|
120
140
|
/**
|
|
@@ -221,7 +241,7 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
221
241
|
// GLM full datetime format: "2026-08-25 01:47:16" or "2026-08-25T01:47:16"
|
|
222
242
|
const datetimeStr = match[1].replace(" ", "T");
|
|
223
243
|
const date = new Date(datetimeStr);
|
|
224
|
-
if (!isNaN(date.getTime())) {
|
|
244
|
+
if (!Number.isNaN(date.getTime())) {
|
|
225
245
|
return date.toISOString();
|
|
226
246
|
}
|
|
227
247
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-usage-monitor.js","sourceRoot":"","sources":["../src/tui-usage-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tui-usage-monitor.js","sourceRoot":"","sources":["../src/tui-usage-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Playwright, and local estimates. Produces provider availability state.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { QuotaSignal, QuotaState } from "../../types/
|
|
8
|
+
import type { QuotaSignal, QuotaState } from "../../types/dist/runtime-types.js";
|
|
9
9
|
|
|
10
10
|
export interface QuotaSignalInput {
|
|
11
11
|
provider: string;
|
|
@@ -72,7 +72,7 @@ export class QuotaManager {
|
|
|
72
72
|
let latest: QuotaSignal | null = null;
|
|
73
73
|
let latestTs = 0;
|
|
74
74
|
|
|
75
|
-
for (const entry of
|
|
75
|
+
for (const entry of this.signals.entries()) {
|
|
76
76
|
const [k, sigs] = entry;
|
|
77
77
|
if (k.startsWith(`${provider}:`)) {
|
|
78
78
|
const mostRecent = sigs.sort(
|
|
@@ -134,7 +134,7 @@ export class QuotaManager {
|
|
|
134
134
|
const result: QuotaSignal[] = [];
|
|
135
135
|
const cutoff = Date.now() - this.staleThresholdMs;
|
|
136
136
|
|
|
137
|
-
for (const entry of
|
|
137
|
+
for (const entry of this.signals.entries()) {
|
|
138
138
|
const [key, sigs] = entry;
|
|
139
139
|
if (key.startsWith(`${provider}:`)) {
|
|
140
140
|
for (const signal of sigs) {
|
|
@@ -199,7 +199,7 @@ export class QuotaManager {
|
|
|
199
199
|
clearStale(): void {
|
|
200
200
|
const cutoff = Date.now() - this.staleThresholdMs;
|
|
201
201
|
|
|
202
|
-
for (const entry of
|
|
202
|
+
for (const entry of this.signals.entries()) {
|
|
203
203
|
const [key, sigs] = entry;
|
|
204
204
|
const fresh = sigs.filter(
|
|
205
205
|
(s: QuotaSignal) => Date.parse(s.capturedAt) >= cutoff,
|
|
@@ -222,11 +222,12 @@ export class QuotaManager {
|
|
|
222
222
|
const state = this.getProviderState(provider);
|
|
223
223
|
const latest = this.getLatestSignal(provider);
|
|
224
224
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
225
|
+
let status = "AVAILABLE";
|
|
226
|
+
if (state.exhausted) {
|
|
227
|
+
status = "EXHAUSTED";
|
|
228
|
+
} else if (state.limited) {
|
|
229
|
+
status = "LIMITED";
|
|
230
|
+
}
|
|
230
231
|
|
|
231
232
|
lines.push(`${provider}: ${status}`);
|
|
232
233
|
|