Skip to content

Commit 69b8aef

Browse files
committed
fix: restore rebased gate checks
1 parent 62e2bf2 commit 69b8aef

7 files changed

Lines changed: 214 additions & 11 deletions

File tree

extensions/signal/src/setup-surface.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import {
2424
signalSetupAdapter,
2525
} from "./setup-core.js";
2626

27-
export { normalizeSignalAccountInput, parseSignalAllowFromEntries } from "./setup-core.js";
28-
2927
const channel = "signal" as const;
3028
const INVALID_SIGNAL_ACCOUNT_ERROR =
3129
"Invalid E.164 phone number (must start with + and country code, e.g. +15555550123)";

src/infra/bonjour.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export async function startGatewayBonjourAdvertiser(
185185
if (!cycle) {
186186
return;
187187
}
188-
const responder = cycle.responder as {
188+
const responder = cycle.responder as unknown as {
189189
advertiseService?: (...args: unknown[]) => unknown;
190190
announce?: (...args: unknown[]) => unknown;
191191
probe?: (...args: unknown[]) => unknown;

src/infra/provider-usage.auth.normalizes-keys.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@ import { NON_ENV_SECRETREF_MARKER } from "../agents/model-auth-markers.js";
66
import { resolveProviderAuths, type ProviderAuth } from "./provider-usage.auth.js";
77

88
vi.mock("../plugins/provider-runtime.js", () => ({
9-
resolveProviderUsageAuthWithPlugin: vi.fn(async () => null),
9+
resolveProviderUsageAuthWithPlugin: async (
10+
...args: Parameters<
11+
typeof import("./provider-usage.test-mock.js").resolveProviderUsageAuthWithPlugin
12+
>
13+
) => {
14+
const mod = await import("./provider-usage.test-mock.js");
15+
return await mod.resolveProviderUsageAuthWithPlugin(...args);
16+
},
1017
}));
1118

1219
describe("resolveProviderAuths key normalization", () => {

src/infra/provider-usage.load.test.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,22 @@ import { loadProviderUsageSummary } from "./provider-usage.load.js";
44
import { ignoredErrors } from "./provider-usage.shared.js";
55

66
vi.mock("../plugins/provider-runtime.js", () => ({
7-
resolveProviderUsageAuthWithPlugin: vi.fn(async () => null),
8-
resolveProviderUsageSnapshotWithPlugin: vi.fn(async () => null),
7+
resolveProviderUsageAuthWithPlugin: async (
8+
...args: Parameters<
9+
typeof import("./provider-usage.test-mock.js").resolveProviderUsageAuthWithPlugin
10+
>
11+
) => {
12+
const mod = await import("./provider-usage.test-mock.js");
13+
return await mod.resolveProviderUsageAuthWithPlugin(...args);
14+
},
15+
resolveProviderUsageSnapshotWithPlugin: async (
16+
...args: Parameters<
17+
typeof import("./provider-usage.test-mock.js").resolveProviderUsageSnapshotWithPlugin
18+
>
19+
) => {
20+
const mod = await import("./provider-usage.test-mock.js");
21+
return await mod.resolveProviderUsageSnapshotWithPlugin(...args);
22+
},
923
}));
1024

1125
const usageNow = Date.UTC(2026, 0, 7, 0, 0, 0);
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
import fs from "node:fs";
2+
import os from "node:os";
3+
import path from "node:path";
4+
import { fetchCopilotUsage } from "../../extensions/github-copilot/usage.js";
5+
import { resolveRequiredHomeDir } from "./home-dir.js";
6+
import {
7+
fetchClaudeUsage,
8+
fetchCodexUsage,
9+
fetchGeminiUsage,
10+
fetchMinimaxUsage,
11+
fetchZaiUsage,
12+
} from "./provider-usage.fetch.js";
13+
import { PROVIDER_LABELS } from "./provider-usage.shared.js";
14+
import type { UsageProviderId } from "./provider-usage.types.js";
15+
16+
type ResolveUsageAuthParams = {
17+
provider: string;
18+
context: {
19+
env: NodeJS.ProcessEnv;
20+
resolveApiKeyFromConfigAndStore: (options?: {
21+
providerIds?: string[];
22+
envDirect?: Array<string | undefined>;
23+
}) => string | undefined;
24+
resolveOAuthToken: () => Promise<{ token: string; accountId?: string } | null>;
25+
};
26+
};
27+
28+
type ResolveUsageSnapshotParams = {
29+
provider: string;
30+
context: {
31+
token: string;
32+
accountId?: string;
33+
timeoutMs: number;
34+
fetchFn: typeof fetch;
35+
};
36+
};
37+
38+
function parseGoogleUsageToken(apiKey: string): string {
39+
try {
40+
const parsed = JSON.parse(apiKey) as { token?: unknown };
41+
if (typeof parsed?.token === "string") {
42+
return parsed.token;
43+
}
44+
} catch {
45+
// ignore
46+
}
47+
return apiKey;
48+
}
49+
50+
function resolveLegacyZaiUsageToken(env: NodeJS.ProcessEnv): string | undefined {
51+
try {
52+
const authPath = path.join(
53+
resolveRequiredHomeDir(env, os.homedir),
54+
".pi",
55+
"agent",
56+
"auth.json",
57+
);
58+
if (!fs.existsSync(authPath)) {
59+
return undefined;
60+
}
61+
const parsed = JSON.parse(fs.readFileSync(authPath, "utf8")) as Record<
62+
string,
63+
{ access?: string }
64+
>;
65+
return parsed["z-ai"]?.access || parsed.zai?.access;
66+
} catch {
67+
return undefined;
68+
}
69+
}
70+
71+
export async function resolveProviderUsageAuthWithPlugin(params: ResolveUsageAuthParams) {
72+
switch (params.provider) {
73+
case "anthropic":
74+
case "github-copilot":
75+
case "openai-codex":
76+
return await params.context.resolveOAuthToken();
77+
case "google-gemini-cli": {
78+
const auth = await params.context.resolveOAuthToken();
79+
if (!auth) {
80+
return null;
81+
}
82+
return {
83+
...auth,
84+
token: parseGoogleUsageToken(auth.token),
85+
};
86+
}
87+
case "minimax": {
88+
const token = params.context.resolveApiKeyFromConfigAndStore({
89+
envDirect: [params.context.env.MINIMAX_CODE_PLAN_KEY, params.context.env.MINIMAX_API_KEY],
90+
});
91+
return token ? { token } : null;
92+
}
93+
case "xiaomi": {
94+
const token = params.context.resolveApiKeyFromConfigAndStore({
95+
envDirect: [params.context.env.XIAOMI_API_KEY],
96+
});
97+
return token ? { token } : null;
98+
}
99+
case "zai": {
100+
const token = params.context.resolveApiKeyFromConfigAndStore({
101+
providerIds: ["zai", "z-ai"],
102+
envDirect: [params.context.env.ZAI_API_KEY, params.context.env.Z_AI_API_KEY],
103+
});
104+
if (token) {
105+
return { token };
106+
}
107+
const legacyToken = resolveLegacyZaiUsageToken(params.context.env);
108+
return legacyToken ? { token: legacyToken } : null;
109+
}
110+
default:
111+
return null;
112+
}
113+
}
114+
115+
export async function resolveProviderUsageSnapshotWithPlugin(params: ResolveUsageSnapshotParams) {
116+
switch (params.provider as UsageProviderId) {
117+
case "anthropic":
118+
return await fetchClaudeUsage(
119+
params.context.token,
120+
params.context.timeoutMs,
121+
params.context.fetchFn,
122+
);
123+
case "github-copilot":
124+
return await fetchCopilotUsage(
125+
params.context.token,
126+
params.context.timeoutMs,
127+
params.context.fetchFn,
128+
);
129+
case "google-gemini-cli":
130+
return await fetchGeminiUsage(
131+
params.context.token,
132+
params.context.timeoutMs,
133+
params.context.fetchFn,
134+
"google-gemini-cli",
135+
);
136+
case "minimax":
137+
return await fetchMinimaxUsage(
138+
params.context.token,
139+
params.context.timeoutMs,
140+
params.context.fetchFn,
141+
);
142+
case "openai-codex":
143+
return await fetchCodexUsage(
144+
params.context.token,
145+
params.context.accountId,
146+
params.context.timeoutMs,
147+
params.context.fetchFn,
148+
);
149+
case "xiaomi":
150+
return {
151+
provider: "xiaomi",
152+
displayName: PROVIDER_LABELS.xiaomi,
153+
windows: [],
154+
};
155+
case "zai":
156+
return await fetchZaiUsage(
157+
params.context.token,
158+
params.context.timeoutMs,
159+
params.context.fetchFn,
160+
);
161+
default:
162+
return null;
163+
}
164+
}

src/infra/provider-usage.test.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,22 @@ import {
1313
} from "./provider-usage.js";
1414

1515
vi.mock("../plugins/provider-runtime.js", () => ({
16-
resolveProviderUsageAuthWithPlugin: vi.fn(async () => null),
17-
resolveProviderUsageSnapshotWithPlugin: vi.fn(async () => null),
16+
resolveProviderUsageAuthWithPlugin: async (
17+
...args: Parameters<
18+
typeof import("./provider-usage.test-mock.js").resolveProviderUsageAuthWithPlugin
19+
>
20+
) => {
21+
const mod = await import("./provider-usage.test-mock.js");
22+
return await mod.resolveProviderUsageAuthWithPlugin(...args);
23+
},
24+
resolveProviderUsageSnapshotWithPlugin: async (
25+
...args: Parameters<
26+
typeof import("./provider-usage.test-mock.js").resolveProviderUsageSnapshotWithPlugin
27+
>
28+
) => {
29+
const mod = await import("./provider-usage.test-mock.js");
30+
return await mod.resolveProviderUsageSnapshotWithPlugin(...args);
31+
},
1832
}));
1933

2034
const minimaxRemainsEndpoint = "api.minimaxi.com/v1/api/openplatform/coding_plan/remains";

src/plugins/contracts/auth-choice.contract.test.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@ import type { OpenClawPluginApi, ProviderPlugin } from "../types.js";
1616

1717
const loginQwenPortalOAuthMock = vi.hoisted(() => vi.fn());
1818
const githubCopilotLoginCommandMock = vi.hoisted(() => vi.fn());
19-
const resolvePluginProvidersMock = vi.hoisted(() => vi.fn<() => ProviderPlugin[]>(() => []));
19+
const resolvePluginProvidersMock = vi.hoisted(() =>
20+
vi.fn<(...args: unknown[]) => ProviderPlugin[]>((_args?: unknown) => []),
21+
);
2022
const resolveProviderPluginChoiceMock = vi.hoisted(() =>
21-
vi.fn<() => { provider: ProviderPlugin; method: ProviderPlugin["auth"][number] } | null>(),
23+
vi.fn<
24+
(
25+
...args: unknown[]
26+
) => { provider: ProviderPlugin; method: ProviderPlugin["auth"][number] } | null
27+
>((_args?: unknown) => null),
2228
);
23-
const runProviderModelSelectedHookMock = vi.hoisted(() => vi.fn(async () => {}));
29+
const runProviderModelSelectedHookMock = vi.hoisted(() => vi.fn(async (..._args: unknown[]) => {}));
2430

2531
vi.mock("../../../extensions/qwen-portal-auth/oauth.js", () => ({
2632
loginQwenPortalOAuth: loginQwenPortalOAuthMock,

0 commit comments

Comments
 (0)