pi-harness-runtime 1.1.408 → 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/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/package.json +1 -1
- 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 +1 -1
- package/packages/worktree/dist/worktree.d.ts.map +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/worktree/src/worktree.ts +1 -1
- 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
|
@@ -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
|
|
|
@@ -17,8 +17,11 @@
|
|
|
17
17
|
import { EventEmitter } from "node:events";
|
|
18
18
|
import type { QuotaManager } from "./quota-manager.js";
|
|
19
19
|
|
|
20
|
+
/** The providers the monitor can recognize. */
|
|
21
|
+
export type TUIProvider = "openai" | "glm" | "minimax" | "anthropic" | "openrouter";
|
|
22
|
+
|
|
20
23
|
export interface TUIUsageSignal {
|
|
21
|
-
provider:
|
|
24
|
+
provider: TUIProvider | "unknown";
|
|
22
25
|
timestamp: string;
|
|
23
26
|
/** Usage percentage (0-100), if available */
|
|
24
27
|
usedPct?: number;
|
|
@@ -44,14 +47,19 @@ export interface TUIUsageMonitorConfig {
|
|
|
44
47
|
/**
|
|
45
48
|
* Provider-specific patterns
|
|
46
49
|
*/
|
|
47
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The patterns that name the provider.
|
|
52
|
+
*
|
|
53
|
+
* A pattern that names the provider wins over a bare error code: the message
|
|
54
|
+
* "Claude overloaded_error" is about Anthropic, not about the provider that
|
|
55
|
+
* happens to use the error code first.
|
|
56
|
+
*/
|
|
57
|
+
const PROVIDER_PATTERNS: Record<TUIProvider, RegExp[]> = {
|
|
48
58
|
openai: [
|
|
49
59
|
/(?:^|\s)OpenAI(?:$|\s)/i,
|
|
50
60
|
/(?:^|\s)GPT(?:$|\s)/i,
|
|
51
61
|
/openai.*(?:quota|limit|exhausted)/i,
|
|
52
62
|
/gpt.*(?:quota|limit|exhausted)/i,
|
|
53
|
-
/insufficient_quota/i,
|
|
54
|
-
/context_length_exceeded/i,
|
|
55
63
|
/openai.*rate.?limit/i,
|
|
56
64
|
/429.*openai/i,
|
|
57
65
|
/openai.*context.*(?:window|length)/i,
|
|
@@ -64,25 +72,17 @@ const PROVIDER_PATTERNS = {
|
|
|
64
72
|
/glm.*context.*(?:window|length)/i,
|
|
65
73
|
/glm.*rate.?limit/i,
|
|
66
74
|
/glm.*429/i,
|
|
67
|
-
/code.*1308/i, // GLM specific error code
|
|
68
|
-
/Usage limit reached/i,
|
|
69
|
-
/5 hour.*quota/i,
|
|
70
75
|
],
|
|
71
76
|
minimax: [
|
|
72
77
|
/(?:^|\s)Minimax(?:$|\s)/i,
|
|
73
78
|
/minimax.*(?:overload|surge|busy)/i,
|
|
74
|
-
/overloaded_error/i,
|
|
75
79
|
/529.*minimax/i,
|
|
76
|
-
/peak.?hour.*surge/i,
|
|
77
80
|
],
|
|
78
|
-
|
|
79
81
|
anthropic: [
|
|
80
82
|
/(?:^|\s)Claude(?:$|\s)/i,
|
|
81
83
|
/(?:^|\s)Anthropic(?:$|\s)/i,
|
|
82
84
|
/anthropic.*(?:quota|limit|exhausted)/i,
|
|
83
85
|
/claude.*(?:quota|limit|exhausted)/i,
|
|
84
|
-
/overloaded_error/i,
|
|
85
|
-
/rate_limit_error/i,
|
|
86
86
|
],
|
|
87
87
|
openrouter: [
|
|
88
88
|
/(?:^|\s)OpenRouter(?:$|\s)/i,
|
|
@@ -90,6 +90,23 @@ const PROVIDER_PATTERNS = {
|
|
|
90
90
|
],
|
|
91
91
|
};
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* The error codes without a provider name.
|
|
95
|
+
*
|
|
96
|
+
* They are checked only when no pattern names a provider. A code that several
|
|
97
|
+
* providers share belongs to the one that reported it first.
|
|
98
|
+
*/
|
|
99
|
+
const GENERIC_PATTERNS: { provider: TUIProvider; pattern: RegExp }[] = [
|
|
100
|
+
{ provider: "openai", pattern: /insufficient_quota/i },
|
|
101
|
+
{ provider: "openai", pattern: /context_length_exceeded/i },
|
|
102
|
+
{ provider: "glm", pattern: /code.*1308/i },
|
|
103
|
+
{ provider: "glm", pattern: /Usage limit reached/i },
|
|
104
|
+
{ provider: "glm", pattern: /5 hour.*quota/i },
|
|
105
|
+
{ provider: "minimax", pattern: /overloaded_error/i },
|
|
106
|
+
{ provider: "minimax", pattern: /peak.?hour.*surge/i },
|
|
107
|
+
{ provider: "anthropic", pattern: /rate_limit_error/i },
|
|
108
|
+
];
|
|
109
|
+
|
|
93
110
|
const RESET_TIME_PATTERNS = [
|
|
94
111
|
// GLM specific: "reset at 2026-08-25 01:47:16" or "reset at 2026-08-25T01:47:16"
|
|
95
112
|
/reset\s+(?:at\s+)?(\d{4}-\d{2}-\d{2}[T ]?\d{2}:\d{2}:\d{2})/i,
|
|
@@ -150,14 +167,20 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
150
167
|
*/
|
|
151
168
|
detectProvider(
|
|
152
169
|
message: string,
|
|
153
|
-
):
|
|
170
|
+
): TUIProvider | null {
|
|
171
|
+
// The named provider first, the bare error codes second.
|
|
154
172
|
for (const [provider, patterns] of Object.entries(PROVIDER_PATTERNS)) {
|
|
155
173
|
for (const pattern of patterns) {
|
|
156
174
|
if (pattern.test(message)) {
|
|
157
|
-
return provider as
|
|
175
|
+
return provider as TUIProvider;
|
|
158
176
|
}
|
|
159
177
|
}
|
|
160
178
|
}
|
|
179
|
+
for (const { provider, pattern } of GENERIC_PATTERNS) {
|
|
180
|
+
if (pattern.test(message)) {
|
|
181
|
+
return provider;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
161
184
|
return null;
|
|
162
185
|
}
|
|
163
186
|
|
|
@@ -165,7 +188,7 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
165
188
|
* Get the last signal for a provider
|
|
166
189
|
*/
|
|
167
190
|
getLastSignal(
|
|
168
|
-
provider:
|
|
191
|
+
provider: TUIProvider,
|
|
169
192
|
): TUIUsageSignal | null {
|
|
170
193
|
return this.lastSignals.get(provider) ?? null;
|
|
171
194
|
}
|
|
@@ -189,7 +212,7 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
189
212
|
*/
|
|
190
213
|
private parseSignal(
|
|
191
214
|
message: string,
|
|
192
|
-
provider:
|
|
215
|
+
provider: TUIProvider,
|
|
193
216
|
): TUIUsageSignal | null {
|
|
194
217
|
// Determine limit type
|
|
195
218
|
const limitType = this.detectLimitType(message);
|
|
@@ -294,7 +317,7 @@ export class TUIUsageMonitor extends EventEmitter {
|
|
|
294
317
|
// GLM full datetime format: "2026-08-25 01:47:16" or "2026-08-25T01:47:16"
|
|
295
318
|
const datetimeStr = match[1].replace(" ", "T");
|
|
296
319
|
const date = new Date(datetimeStr);
|
|
297
|
-
if (!isNaN(date.getTime())) {
|
|
320
|
+
if (!Number.isNaN(date.getTime())) {
|
|
298
321
|
return date.toISOString();
|
|
299
322
|
}
|
|
300
323
|
}
|