pi-harness-runtime 0.9.13 → 0.9.15
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/README.md +54 -45
- package/harness/auto-quota-resume.ts +129 -0
- package/harness/e2e/minimax-quota-scraper.ts +10 -4
- package/harness/index.ts +8 -0
- package/harness/loop-runtime.ts +57 -0
- package/index.ts +47 -11
- package/mirror.ts +40 -18
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/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/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/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/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/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/performance-optimizer/package.json +1 -1
- package/packages/project-analyzer/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/provider-id.d.ts +2 -0
- package/packages/providers/dist/provider-id.d.ts.map +1 -1
- package/packages/providers/dist/provider-id.js +9 -0
- package/packages/providers/dist/provider-id.js.map +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/providers/src/provider-id.ts +12 -0
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/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/session/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/dist/ai-providers.d.ts +36 -0
- package/packages/types/dist/ai-providers.d.ts.map +1 -0
- package/packages/types/dist/ai-providers.js +66 -0
- package/packages/types/dist/ai-providers.js.map +1 -0
- package/packages/types/dist/runtime-types.d.ts +6 -0
- package/packages/types/dist/runtime-types.d.ts.map +1 -1
- package/packages/types/dist/runtime-types.js +2 -1
- package/packages/types/dist/runtime-types.js.map +1 -1
- package/packages/types/package.json +1 -1
- package/packages/types/src/ai-providers.ts +73 -0
- package/packages/types/src/runtime-types.ts +15 -0
- package/packages/types/tsconfig.tsbuildinfo +1 -1
- package/packages/worktree/package.json +1 -1
package/mirror.ts
CHANGED
|
@@ -32,6 +32,27 @@
|
|
|
32
32
|
|
|
33
33
|
import { getMirrorPath, readJson, writeJson } from "./cli.ts";
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Canonical lowercase provider ids — mirrors the KNOWN_AI_PROVIDERS from
|
|
37
|
+
* packages/types/src/ai-providers.ts. Duplicated here to avoid import path
|
|
38
|
+
* resolution issues in the root workspace.
|
|
39
|
+
*/
|
|
40
|
+
const KNOWN_PROVIDER_IDS = [
|
|
41
|
+
"minimax",
|
|
42
|
+
"openai",
|
|
43
|
+
"anthropic",
|
|
44
|
+
"glm",
|
|
45
|
+
"openrouter",
|
|
46
|
+
"openai-codex",
|
|
47
|
+
"deepseek",
|
|
48
|
+
"gemini",
|
|
49
|
+
"kimi",
|
|
50
|
+
] as const;
|
|
51
|
+
|
|
52
|
+
function isKnownProvider(id: string): boolean {
|
|
53
|
+
return (KNOWN_PROVIDER_IDS as readonly string[]).includes(id);
|
|
54
|
+
}
|
|
55
|
+
|
|
35
56
|
/** Where a piece of data came from. */
|
|
36
57
|
export type MirrorSource = "scrape" | "tui-signal" | "manual";
|
|
37
58
|
|
|
@@ -49,10 +70,14 @@ export interface ProviderMirrorRecord {
|
|
|
49
70
|
h5_used_pct?: number;
|
|
50
71
|
/** When the 5h window resets — human-readable or ISO. */
|
|
51
72
|
h5_resets_at?: string;
|
|
73
|
+
/** Epoch ms when the 5h window resets — precise UTC timestamp. */
|
|
74
|
+
h5_resets_at_epoch?: number;
|
|
52
75
|
/** Weekly used percent. */
|
|
53
76
|
weekly_used_pct?: number;
|
|
54
77
|
/** When the weekly window resets. */
|
|
55
78
|
weekly_resets_at?: string;
|
|
79
|
+
/** Epoch ms when the weekly window resets — precise UTC timestamp. */
|
|
80
|
+
weekly_resets_at_epoch?: number;
|
|
56
81
|
/** Set when a limit was hit and we have the exhaustion signal. */
|
|
57
82
|
exhausted?: boolean;
|
|
58
83
|
/** Limit type from TUI signal: tokens, context_window, rate_limit, unknown. */
|
|
@@ -81,15 +106,7 @@ export interface MirrorRecord {
|
|
|
81
106
|
weekly_resets_at?: string;
|
|
82
107
|
}
|
|
83
108
|
|
|
84
|
-
|
|
85
|
-
export type KnownProviderId =
|
|
86
|
-
| "minimax"
|
|
87
|
-
| "openai"
|
|
88
|
-
| "openai-codex"
|
|
89
|
-
| "glm"
|
|
90
|
-
| "anthropic"
|
|
91
|
-
| "openrouter"
|
|
92
|
-
| (string & {}); // allow extension
|
|
109
|
+
|
|
93
110
|
|
|
94
111
|
const STALE_WARN_MS = 30 * 60 * 1000; // 30 min → orange
|
|
95
112
|
const STALE_ERROR_MS = 2 * 60 * 60 * 1000; // 2 h → red
|
|
@@ -112,11 +129,12 @@ function isLegacyShape(raw: unknown): raw is MirrorRecord & {
|
|
|
112
129
|
}
|
|
113
130
|
|
|
114
131
|
/** Convert a legacy single-row record to per-provider shape. */
|
|
115
|
-
function upgradeLegacyRecord(legacy: MirrorRecord): PerProviderMirror {
|
|
132
|
+
function upgradeLegacyRecord(legacy: MirrorRecord): PerProviderMirror | null {
|
|
116
133
|
const provider = legacy.provider ?? "minimax";
|
|
134
|
+
const known = isKnownProvider(provider) ? provider : "minimax";
|
|
117
135
|
const rec: ProviderMirrorRecord = {
|
|
118
136
|
synced_at: legacy.synced_at ?? new Date().toISOString(),
|
|
119
|
-
provider,
|
|
137
|
+
provider: known,
|
|
120
138
|
source: "scrape", // legacy was always scrape
|
|
121
139
|
model: legacy.model,
|
|
122
140
|
h5_used_pct: legacy.h5_used_pct,
|
|
@@ -124,7 +142,7 @@ function upgradeLegacyRecord(legacy: MirrorRecord): PerProviderMirror {
|
|
|
124
142
|
weekly_used_pct: legacy.weekly_used_pct,
|
|
125
143
|
weekly_resets_at: legacy.weekly_resets_at,
|
|
126
144
|
};
|
|
127
|
-
return { [
|
|
145
|
+
return { [known]: rec };
|
|
128
146
|
}
|
|
129
147
|
|
|
130
148
|
export class MirrorStore {
|
|
@@ -152,13 +170,17 @@ export class MirrorStore {
|
|
|
152
170
|
|
|
153
171
|
if (isLegacyShape(raw)) {
|
|
154
172
|
const upgraded = upgradeLegacyRecord(raw as MirrorRecord);
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
173
|
+
if (upgraded) {
|
|
174
|
+
// Persist the upgrade so subsequent reads are fast.
|
|
175
|
+
try {
|
|
176
|
+
writeJson(this.path, upgraded);
|
|
177
|
+
} catch {
|
|
178
|
+
// best-effort
|
|
179
|
+
}
|
|
180
|
+
return upgraded;
|
|
160
181
|
}
|
|
161
|
-
|
|
182
|
+
// Unknown legacy provider — treat as absent.
|
|
183
|
+
return null;
|
|
162
184
|
}
|
|
163
185
|
|
|
164
186
|
// Already per-provider shape.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/capability-registry",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.15",
|
|
4
4
|
"description": "Capability Registry for pi-harness-runtime — tracks model capabilities and enables capability-based routing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/provider-router",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.15",
|
|
4
4
|
"description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/provider-router.js",
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
* wiki/bugs/multi-provider-usage-status.md.
|
|
28
28
|
*/
|
|
29
29
|
export type KnownProvider = "minimax" | "openai" | "openai-codex" | "glm" | "anthropic" | "openrouter";
|
|
30
|
+
/** True if the given string is a known, canonical provider id. */
|
|
31
|
+
export declare function isKnownAiProvider(value: string): value is KnownProvider;
|
|
30
32
|
export type ProviderId = KnownProvider | (string & {});
|
|
31
33
|
/** Return the provider id for a model id, or null if unknown. */
|
|
32
34
|
export declare function providerFromModelId(modelId: string | null | undefined): ProviderId | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-id.d.ts","sourceRoot":"","sources":["../src/provider-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,aAAa,GACtB,SAAS,GACT,QAAQ,GACR,cAAc,GACd,KAAK,GACL,WAAW,GACX,YAAY,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAYvD,iEAAiE;AACjE,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,UAAU,GAAG,IAAI,CAqBnB;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAiBhE;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEzE;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAQlE"}
|
|
1
|
+
{"version":3,"file":"provider-id.d.ts","sourceRoot":"","sources":["../src/provider-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,aAAa,GACtB,SAAS,GACT,QAAQ,GACR,cAAc,GACd,KAAK,GACL,WAAW,GACX,YAAY,CAAC;AAEhB,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CASvE;AAED,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAYvD,iEAAiE;AACjE,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,UAAU,GAAG,IAAI,CAqBnB;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAiBhE;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEzE;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAQlE"}
|
|
@@ -26,6 +26,15 @@
|
|
|
26
26
|
* a row to MODEL_PREFIXES and to the sanitization doc in
|
|
27
27
|
* wiki/bugs/multi-provider-usage-status.md.
|
|
28
28
|
*/
|
|
29
|
+
/** True if the given string is a known, canonical provider id. */
|
|
30
|
+
export function isKnownAiProvider(value) {
|
|
31
|
+
return (value === "minimax" ||
|
|
32
|
+
value === "openai" ||
|
|
33
|
+
value === "openai-codex" ||
|
|
34
|
+
value === "glm" ||
|
|
35
|
+
value === "anthropic" ||
|
|
36
|
+
value === "openrouter");
|
|
37
|
+
}
|
|
29
38
|
const MODEL_PREFIXES = [
|
|
30
39
|
{ prefix: "minimax/", provider: "minimax" },
|
|
31
40
|
{ prefix: "openai-codex/", provider: "openai-codex" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-id.js","sourceRoot":"","sources":["../src/provider-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"provider-id.js","sourceRoot":"","sources":["../src/provider-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,18 @@ export type KnownProvider =
|
|
|
35
35
|
| "anthropic"
|
|
36
36
|
| "openrouter";
|
|
37
37
|
|
|
38
|
+
/** True if the given string is a known, canonical provider id. */
|
|
39
|
+
export function isKnownAiProvider(value: string): value is KnownProvider {
|
|
40
|
+
return (
|
|
41
|
+
value === "minimax" ||
|
|
42
|
+
value === "openai" ||
|
|
43
|
+
value === "openai-codex" ||
|
|
44
|
+
value === "glm" ||
|
|
45
|
+
value === "anthropic" ||
|
|
46
|
+
value === "openrouter"
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
38
50
|
export type ProviderId = KnownProvider | (string & {});
|
|
39
51
|
|
|
40
52
|
const MODEL_PREFIXES: Array<{ prefix: string; provider: ProviderId }> = [
|