From 75d9204c863792226389a4d33eeb40c4e842528d Mon Sep 17 00:00:00 2001 From: Josh Lehman Date: Thu, 12 Mar 2026 07:13:16 -0700 Subject: [PATCH] fix: align pi-ai payload hooks --- .../pi-embedded-runner-extraparams.test.ts | 30 +++++++++---------- .../pi-tools.workspace-only-false.test.ts | 7 +++-- src/telegram/bot.ts | 22 +++++++++----- src/tts/tts.test.ts | 8 +++-- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/agents/pi-embedded-runner-extraparams.test.ts b/src/agents/pi-embedded-runner-extraparams.test.ts index 3f6fb7a2f5a..1785abfb843 100644 --- a/src/agents/pi-embedded-runner-extraparams.test.ts +++ b/src/agents/pi-embedded-runner-extraparams.test.ts @@ -276,7 +276,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { model: "deepseek/deepseek-r1" }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -308,7 +308,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = {}; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -332,7 +332,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { reasoning_effort: "high" }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -357,7 +357,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { reasoning: { max_tokens: 256 } }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -381,7 +381,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { reasoning_effort: "medium" }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -588,7 +588,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { thinking: "off" }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -619,7 +619,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { thinking: "off" }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -650,7 +650,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = {}; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -674,7 +674,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = { tool_choice: "required" }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -699,7 +699,7 @@ describe("applyExtraParamsToAgent", () => { const payloads: Record[] = []; const baseStreamFn: StreamFn = (_model, _context, options) => { const payload: Record = {}; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -749,7 +749,7 @@ describe("applyExtraParamsToAgent", () => { ], tool_choice: { type: "tool", name: "read" }, }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -793,7 +793,7 @@ describe("applyExtraParamsToAgent", () => { }, ], }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -832,7 +832,7 @@ describe("applyExtraParamsToAgent", () => { }, ], }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -896,7 +896,7 @@ describe("applyExtraParamsToAgent", () => { }, }, }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; @@ -943,7 +943,7 @@ describe("applyExtraParamsToAgent", () => { }, }, }; - options?.onPayload?.(payload, model); + options?.onPayload?.(payload, _model); payloads.push(payload); return {} as ReturnType; }; diff --git a/src/agents/pi-tools.workspace-only-false.test.ts b/src/agents/pi-tools.workspace-only-false.test.ts index 146eb943c49..99d3a9e4b39 100644 --- a/src/agents/pi-tools.workspace-only-false.test.ts +++ b/src/agents/pi-tools.workspace-only-false.test.ts @@ -7,11 +7,14 @@ vi.mock("@mariozechner/pi-ai", async (importOriginal) => { const original = await importOriginal(); return { ...original, - getOAuthApiKey: () => undefined, - getOAuthProviders: () => [], }; }); +vi.mock("@mariozechner/pi-ai/oauth", () => ({ + getOAuthApiKey: () => undefined, + getOAuthProviders: () => [], +})); + import { createOpenClawCodingTools } from "./pi-tools.js"; describe("FS tools with workspaceOnly=false", () => { diff --git a/src/telegram/bot.ts b/src/telegram/bot.ts index b0c288efcea..ddb26314f12 100644 --- a/src/telegram/bot.ts +++ b/src/telegram/bot.ts @@ -69,7 +69,12 @@ export type TelegramBotOptions = { export { getTelegramSequentialKey }; -function readRequestUrl(input: RequestInfo | URL): string | null { +type TelegramFetchInput = Parameters>[0]; +type TelegramFetchInit = Parameters>[1]; +type GlobalFetchInput = Parameters[0]; +type GlobalFetchInit = Parameters[1]; + +function readRequestUrl(input: TelegramFetchInput): string | null { if (typeof input === "string") { return input; } @@ -83,7 +88,7 @@ function readRequestUrl(input: RequestInfo | URL): string | null { return null; } -function extractTelegramApiMethod(input: RequestInfo | URL): string | null { +function extractTelegramApiMethod(input: TelegramFetchInput): string | null { const url = readRequestUrl(input); if (!url) { return null; @@ -150,7 +155,7 @@ export function createTelegramBot(opts: TelegramBotOptions) { // Use manual event forwarding instead of AbortSignal.any() to avoid the cross-realm // AbortSignal issue in Node.js (grammY's signal may come from a different module context, // causing "signals[0] must be an instance of AbortSignal" errors). - finalFetch = ((input: RequestInfo | URL, init?: RequestInit) => { + finalFetch = ((input: TelegramFetchInput, init?: TelegramFetchInit) => { const controller = new AbortController(); const abortWith = (signal: AbortSignal) => controller.abort(signal.reason); const onShutdown = () => abortWith(shutdownSignal); @@ -162,13 +167,16 @@ export function createTelegramBot(opts: TelegramBotOptions) { } if (init?.signal) { if (init.signal.aborted) { - abortWith(init.signal); + abortWith(init.signal as unknown as AbortSignal); } else { onRequestAbort = () => abortWith(init.signal as AbortSignal); - init.signal.addEventListener("abort", onRequestAbort, { once: true }); + init.signal.addEventListener("abort", onRequestAbort); } } - return callFetch(input, { ...init, signal: controller.signal }).finally(() => { + return callFetch(input as GlobalFetchInput, { + ...(init as GlobalFetchInit), + signal: controller.signal, + }).finally(() => { shutdownSignal.removeEventListener("abort", onShutdown); if (init?.signal && onRequestAbort) { init.signal.removeEventListener("abort", onRequestAbort); @@ -178,7 +186,7 @@ export function createTelegramBot(opts: TelegramBotOptions) { } if (finalFetch) { const baseFetch = finalFetch; - finalFetch = ((input: RequestInfo | URL, init?: RequestInit) => { + finalFetch = ((input: TelegramFetchInput, init?: TelegramFetchInit) => { return Promise.resolve(baseFetch(input, init)).catch((err: unknown) => { try { tagTelegramNetworkError(err, { diff --git a/src/tts/tts.test.ts b/src/tts/tts.test.ts index d11190a21d4..eedc325fd4f 100644 --- a/src/tts/tts.test.ts +++ b/src/tts/tts.test.ts @@ -12,12 +12,14 @@ vi.mock("@mariozechner/pi-ai", async (importOriginal) => { return { ...original, completeSimple: vi.fn(), - // Some auth helpers import oauth provider metadata at module load time. - getOAuthProviders: () => [], - getOAuthApiKey: vi.fn(async () => null), }; }); +vi.mock("@mariozechner/pi-ai/oauth", () => ({ + getOAuthProviders: () => [], + getOAuthApiKey: vi.fn(async () => null), +})); + vi.mock("../agents/pi-embedded-runner/model.js", () => ({ resolveModel: vi.fn((provider: string, modelId: string) => ({ model: {