mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
chore: Fix types in tests 26/N.
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
import type { StreamFn } from "@mariozechner/pi-agent-core";
|
||||
import type { Context, Model, SimpleStreamOptions } from "@mariozechner/pi-ai";
|
||||
import { AssistantMessageEventStream } from "@mariozechner/pi-ai";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { applyExtraParamsToAgent, resolveExtraParams } from "./pi-embedded-runner.js";
|
||||
|
||||
@@ -77,7 +76,7 @@ describe("applyExtraParamsToAgent", () => {
|
||||
const payload = { store: false };
|
||||
const baseStreamFn: StreamFn = (_model, _context, options) => {
|
||||
options?.onPayload?.(payload);
|
||||
return new AssistantMessageEventStream();
|
||||
return {} as ReturnType<StreamFn>;
|
||||
};
|
||||
const agent = { streamFn: baseStreamFn };
|
||||
applyExtraParamsToAgent(agent, undefined, params.applyProvider, params.applyModelId);
|
||||
@@ -90,7 +89,7 @@ describe("applyExtraParamsToAgent", () => {
|
||||
const calls: Array<SimpleStreamOptions | undefined> = [];
|
||||
const baseStreamFn: StreamFn = (_model, _context, options) => {
|
||||
calls.push(options);
|
||||
return new AssistantMessageEventStream();
|
||||
return {} as ReturnType<StreamFn>;
|
||||
};
|
||||
const agent = { streamFn: baseStreamFn };
|
||||
|
||||
@@ -159,7 +158,7 @@ describe("applyExtraParamsToAgent", () => {
|
||||
const payload = { store: false };
|
||||
const baseStreamFn: StreamFn = (_model, _context, options) => {
|
||||
options?.onPayload?.(payload);
|
||||
return new AssistantMessageEventStream();
|
||||
return {} as ReturnType<StreamFn>;
|
||||
};
|
||||
const agent = { streamFn: baseStreamFn };
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ const describeLive = LIVE && OPENAI_KEY ? describe : describe.skip;
|
||||
|
||||
describeLive("pi embedded extra params (live)", () => {
|
||||
it("applies config maxTokens to openai streamFn", async () => {
|
||||
const model = getModel("openai", "gpt-5.2") as Model<"openai-completions">;
|
||||
const model = getModel("openai", "gpt-5.2") as unknown as Model<"openai-completions">;
|
||||
|
||||
const cfg: OpenClawConfig = {
|
||||
agents: {
|
||||
|
||||
@@ -4,13 +4,12 @@ import { describe, expect, it, vi } from "vitest";
|
||||
import { applyGoogleTurnOrderingFix } from "./pi-embedded-runner.js";
|
||||
|
||||
describe("applyGoogleTurnOrderingFix", () => {
|
||||
const makeAssistantFirst = () =>
|
||||
[
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "toolCall", id: "call_1", name: "exec", arguments: {} }],
|
||||
},
|
||||
] satisfies AgentMessage[];
|
||||
const makeAssistantFirst = (): AgentMessage[] => [
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "toolCall", id: "call_1", name: "exec", arguments: {} }],
|
||||
} as unknown as AgentMessage,
|
||||
];
|
||||
|
||||
it("prepends a bootstrap once and records a marker for Google models", () => {
|
||||
const sessionManager = SessionManager.inMemory();
|
||||
|
||||
@@ -14,9 +14,10 @@ function assistantToolCall(id: string): AgentMessage {
|
||||
describe("guardSessionManager integration", () => {
|
||||
it("persists synthetic toolResult before subsequent assistant message", () => {
|
||||
const sm = guardSessionManager(SessionManager.inMemory());
|
||||
const appendMessage = sm.appendMessage.bind(sm) as unknown as (message: AgentMessage) => void;
|
||||
|
||||
sm.appendMessage(assistantToolCall("call_1"));
|
||||
sm.appendMessage({
|
||||
appendMessage(assistantToolCall("call_1"));
|
||||
appendMessage({
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "followup" }],
|
||||
} as AgentMessage);
|
||||
|
||||
@@ -43,10 +43,11 @@ describe("flushPendingToolResultsAfterIdle", () => {
|
||||
|
||||
it("waits for idle so real tool results can land before flush", async () => {
|
||||
const sm = guardSessionManager(SessionManager.inMemory());
|
||||
const appendMessage = sm.appendMessage.bind(sm) as unknown as (message: AgentMessage) => void;
|
||||
const idle = deferred<void>();
|
||||
const agent = { waitForIdle: () => idle.promise };
|
||||
|
||||
sm.appendMessage(assistantToolCall("call_retry_1"));
|
||||
appendMessage(assistantToolCall("call_retry_1"));
|
||||
const flushPromise = flushPendingToolResultsAfterIdle({
|
||||
agent,
|
||||
sessionManager: sm,
|
||||
@@ -58,7 +59,7 @@ describe("flushPendingToolResultsAfterIdle", () => {
|
||||
expect(getMessages(sm).map((m) => m.role)).toEqual(["assistant"]);
|
||||
|
||||
// Tool completes before idle wait finishes.
|
||||
sm.appendMessage(toolResult("call_retry_1", "command output here"));
|
||||
appendMessage(toolResult("call_retry_1", "command output here"));
|
||||
idle.resolve();
|
||||
await flushPromise;
|
||||
|
||||
@@ -72,10 +73,11 @@ describe("flushPendingToolResultsAfterIdle", () => {
|
||||
|
||||
it("flushes pending tool call after timeout when idle never resolves", async () => {
|
||||
const sm = guardSessionManager(SessionManager.inMemory());
|
||||
const appendMessage = sm.appendMessage.bind(sm) as unknown as (message: AgentMessage) => void;
|
||||
vi.useFakeTimers();
|
||||
const agent = { waitForIdle: () => new Promise<void>(() => {}) };
|
||||
|
||||
sm.appendMessage(assistantToolCall("call_orphan_1"));
|
||||
appendMessage(assistantToolCall("call_orphan_1"));
|
||||
|
||||
const flushPromise = flushPendingToolResultsAfterIdle({
|
||||
agent,
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core";
|
||||
import { Type } from "@sinclair/typebox";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { splitSdkTools } from "./pi-embedded-runner.js";
|
||||
|
||||
function createStubTool(name: string): AgentTool<unknown, unknown> {
|
||||
function createStubTool(name: string): AgentTool {
|
||||
return {
|
||||
name,
|
||||
label: name,
|
||||
description: "",
|
||||
parameters: {},
|
||||
parameters: Type.Object({}),
|
||||
execute: async () => ({}) as AgentToolResult<unknown>,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import { vi } from "vitest";
|
||||
import type { ModelDefinitionConfig } from "../../config/types.js";
|
||||
import { discoverModels } from "../pi-model-discovery.js";
|
||||
|
||||
export const makeModel = (id: string) => ({
|
||||
export const makeModel = (id: string): ModelDefinitionConfig => ({
|
||||
id,
|
||||
name: id,
|
||||
reasoning: false,
|
||||
input: ["text"] as const,
|
||||
input: ["text"],
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
||||
contextWindow: 1,
|
||||
maxTokens: 1,
|
||||
|
||||
@@ -62,7 +62,7 @@ function expectUnknownModelError(provider: string, id: string) {
|
||||
|
||||
describe("buildInlineProviderModels", () => {
|
||||
it("attaches provider ids to inline models", () => {
|
||||
const providers = {
|
||||
const providers: Parameters<typeof buildInlineProviderModels>[0] = {
|
||||
" alpha ": { baseUrl: "http://alpha.local", models: [makeModel("alpha-model")] },
|
||||
beta: { baseUrl: "http://beta.local", models: [makeModel("beta-model")] },
|
||||
};
|
||||
@@ -86,7 +86,7 @@ describe("buildInlineProviderModels", () => {
|
||||
});
|
||||
|
||||
it("inherits baseUrl from provider when model does not specify it", () => {
|
||||
const providers = {
|
||||
const providers: Parameters<typeof buildInlineProviderModels>[0] = {
|
||||
custom: {
|
||||
baseUrl: "http://localhost:8000",
|
||||
models: [makeModel("custom-model")],
|
||||
@@ -100,7 +100,7 @@ describe("buildInlineProviderModels", () => {
|
||||
});
|
||||
|
||||
it("inherits api from provider when model does not specify it", () => {
|
||||
const providers = {
|
||||
const providers: Parameters<typeof buildInlineProviderModels>[0] = {
|
||||
custom: {
|
||||
baseUrl: "http://localhost:8000",
|
||||
api: "anthropic-messages",
|
||||
@@ -115,7 +115,7 @@ describe("buildInlineProviderModels", () => {
|
||||
});
|
||||
|
||||
it("model-level api takes precedence over provider-level api", () => {
|
||||
const providers = {
|
||||
const providers: Parameters<typeof buildInlineProviderModels>[0] = {
|
||||
custom: {
|
||||
baseUrl: "http://localhost:8000",
|
||||
api: "openai-responses",
|
||||
@@ -130,7 +130,7 @@ describe("buildInlineProviderModels", () => {
|
||||
});
|
||||
|
||||
it("inherits both baseUrl and api from provider config", () => {
|
||||
const providers = {
|
||||
const providers: Parameters<typeof buildInlineProviderModels>[0] = {
|
||||
custom: {
|
||||
baseUrl: "http://localhost:10000",
|
||||
api: "anthropic-messages",
|
||||
@@ -327,7 +327,7 @@ describe("resolveModel", () => {
|
||||
},
|
||||
},
|
||||
},
|
||||
} as OpenClawConfig;
|
||||
} as unknown as OpenClawConfig;
|
||||
|
||||
expectResolvedForwardCompatFallback({
|
||||
provider: "openai-codex",
|
||||
|
||||
@@ -52,6 +52,7 @@ import { log } from "./logger.js";
|
||||
import { runEmbeddedPiAgent } from "./run.js";
|
||||
import { makeAttemptResult } from "./run.overflow-compaction.fixture.js";
|
||||
import { runEmbeddedAttempt } from "./run/attempt.js";
|
||||
import type { EmbeddedRunAttemptResult } from "./run/types.js";
|
||||
import {
|
||||
sessionLikelyHasOversizedToolResults,
|
||||
truncateOversizedToolResultsInSession,
|
||||
@@ -171,7 +172,12 @@ describe("overflow compaction in run loop", () => {
|
||||
.mockResolvedValueOnce(
|
||||
makeAttemptResult({
|
||||
promptError: overflowError,
|
||||
messagesSnapshot: [{ role: "assistant", content: "big tool output" }],
|
||||
messagesSnapshot: [
|
||||
{
|
||||
role: "assistant",
|
||||
content: "big tool output",
|
||||
} as unknown as EmbeddedRunAttemptResult["messagesSnapshot"][number],
|
||||
],
|
||||
}),
|
||||
)
|
||||
.mockResolvedValueOnce(makeAttemptResult({ promptError: null }));
|
||||
@@ -362,7 +368,7 @@ describe("overflow compaction in run loop", () => {
|
||||
cacheWrite: 0,
|
||||
total: 2_000,
|
||||
},
|
||||
} as EmbeddedRunAttemptResult["lastAssistant"],
|
||||
} as unknown as EmbeddedRunAttemptResult["lastAssistant"],
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
@@ -17,8 +17,9 @@ describe("injectHistoryImagesIntoMessages", () => {
|
||||
const didMutate = injectHistoryImagesIntoMessages(messages, new Map([[0, [image]]]));
|
||||
|
||||
expect(didMutate).toBe(true);
|
||||
expect(Array.isArray(messages[0]?.content)).toBe(true);
|
||||
const content = messages[0]?.content as Array<{ type: string; text?: string; data?: string }>;
|
||||
const firstUser = messages[0] as Extract<AgentMessage, { role: "user" }> | undefined;
|
||||
expect(Array.isArray(firstUser?.content)).toBe(true);
|
||||
const content = firstUser?.content as Array<{ type: string; text?: string; data?: string }>;
|
||||
expect(content).toHaveLength(2);
|
||||
expect(content[0]?.type).toBe("text");
|
||||
expect(content[1]).toMatchObject({ type: "image", data: "abc" });
|
||||
@@ -35,7 +36,7 @@ describe("injectHistoryImagesIntoMessages", () => {
|
||||
const didMutate = injectHistoryImagesIntoMessages(messages, new Map([[0, [image]]]));
|
||||
|
||||
expect(didMutate).toBe(false);
|
||||
const first = messages[0];
|
||||
const first = messages[0] as Extract<AgentMessage, { role: "user" }> | undefined;
|
||||
if (!first || !Array.isArray(first.content)) {
|
||||
throw new Error("expected array content");
|
||||
}
|
||||
@@ -47,12 +48,13 @@ describe("injectHistoryImagesIntoMessages", () => {
|
||||
{
|
||||
role: "assistant",
|
||||
content: "noop",
|
||||
} as AgentMessage,
|
||||
} as unknown as AgentMessage,
|
||||
];
|
||||
|
||||
const didMutate = injectHistoryImagesIntoMessages(messages, new Map([[1, [image]]]));
|
||||
|
||||
expect(didMutate).toBe(false);
|
||||
expect(messages[0]?.content).toBe("noop");
|
||||
const firstAssistant = messages[0] as Extract<AgentMessage, { role: "assistant" }> | undefined;
|
||||
expect(firstAssistant?.content).toBe("noop");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
selectCompactionTimeoutSnapshot,
|
||||
@@ -31,8 +32,8 @@ describe("compaction-timeout helpers", () => {
|
||||
});
|
||||
|
||||
it("uses pre-compaction snapshot when compaction timeout occurs", () => {
|
||||
const pre = [{ role: "assistant", content: "pre" }] as const;
|
||||
const current = [{ role: "assistant", content: "current" }] as const;
|
||||
const pre = [{ role: "assistant", content: "pre" } as unknown as AgentMessage] as const;
|
||||
const current = [{ role: "assistant", content: "current" } as unknown as AgentMessage] as const;
|
||||
const selected = selectCompactionTimeoutSnapshot({
|
||||
timedOutDuringCompaction: true,
|
||||
preCompactionSnapshot: [...pre],
|
||||
@@ -46,7 +47,7 @@ describe("compaction-timeout helpers", () => {
|
||||
});
|
||||
|
||||
it("falls back to current snapshot when pre-compaction snapshot is unavailable", () => {
|
||||
const current = [{ role: "assistant", content: "current" }] as const;
|
||||
const current = [{ role: "assistant", content: "current" } as unknown as AgentMessage] as const;
|
||||
const selected = selectCompactionTimeoutSnapshot({
|
||||
timedOutDuringCompaction: true,
|
||||
preCompactionSnapshot: null,
|
||||
|
||||
@@ -274,7 +274,7 @@ describe("buildEmbeddedRunPayloads", () => {
|
||||
it("shows mutating tool errors even when assistant output exists", () => {
|
||||
const payloads = buildPayloads({
|
||||
assistantTexts: ["Done."],
|
||||
lastAssistant: { stopReason: "end_turn" } as AssistantMessage,
|
||||
lastAssistant: { stopReason: "end_turn" } as unknown as AssistantMessage,
|
||||
lastToolError: { toolName: "write", error: "file missing" },
|
||||
});
|
||||
|
||||
@@ -287,7 +287,7 @@ describe("buildEmbeddedRunPayloads", () => {
|
||||
it("does not treat session_status read failures as mutating when explicitly flagged", () => {
|
||||
const payloads = buildPayloads({
|
||||
assistantTexts: ["Status loaded."],
|
||||
lastAssistant: { stopReason: "end_turn" } as AssistantMessage,
|
||||
lastAssistant: { stopReason: "end_turn" } as unknown as AssistantMessage,
|
||||
lastToolError: {
|
||||
toolName: "session_status",
|
||||
error: "model required",
|
||||
@@ -312,7 +312,7 @@ describe("buildEmbeddedRunPayloads", () => {
|
||||
|
||||
const payloads = buildPayloads({
|
||||
assistantTexts: [warningText ?? ""],
|
||||
lastAssistant: { stopReason: "end_turn" } as AssistantMessage,
|
||||
lastAssistant: { stopReason: "end_turn" } as unknown as AssistantMessage,
|
||||
lastToolError: {
|
||||
toolName: "write",
|
||||
error: "file missing",
|
||||
|
||||
@@ -12,7 +12,7 @@ describe("sanitizeSessionHistory toolResult details stripping", () => {
|
||||
role: "assistant",
|
||||
content: [{ type: "toolUse", id: "call_1", name: "web_fetch", input: { url: "x" } }],
|
||||
timestamp: 1,
|
||||
} as AgentMessage,
|
||||
} as unknown as AgentMessage,
|
||||
{
|
||||
role: "toolResult",
|
||||
toolCallId: "call_1",
|
||||
@@ -29,7 +29,7 @@ describe("sanitizeSessionHistory toolResult details stripping", () => {
|
||||
role: "user",
|
||||
content: "continue",
|
||||
timestamp: 3,
|
||||
} as AgentMessage,
|
||||
} as unknown as AgentMessage,
|
||||
];
|
||||
|
||||
const sanitized = await sanitizeSessionHistory({
|
||||
|
||||
@@ -17,7 +17,7 @@ function makeToolResult(text: string, toolCallId = "call_1"): AgentMessage {
|
||||
content: [{ type: "text", text }],
|
||||
isError: false,
|
||||
timestamp: Date.now(),
|
||||
} as AgentMessage;
|
||||
} as unknown as AgentMessage;
|
||||
}
|
||||
|
||||
function makeUserMessage(text: string): AgentMessage {
|
||||
@@ -25,7 +25,7 @@ function makeUserMessage(text: string): AgentMessage {
|
||||
role: "user",
|
||||
content: text,
|
||||
timestamp: Date.now(),
|
||||
} as AgentMessage;
|
||||
} as unknown as AgentMessage;
|
||||
}
|
||||
|
||||
function makeAssistantMessage(text: string): AgentMessage {
|
||||
@@ -43,7 +43,7 @@ function makeAssistantMessage(text: string): AgentMessage {
|
||||
},
|
||||
stopReason: "end_turn",
|
||||
timestamp: Date.now(),
|
||||
} as AgentMessage;
|
||||
} as unknown as AgentMessage;
|
||||
}
|
||||
|
||||
describe("truncateToolResultText", () => {
|
||||
|
||||
Reference in New Issue
Block a user