chore(qa-lab): upgrade AIMock to 1.43.0 (#162705)

This commit is contained in:
Vincent Koc 2026-10-01 20:32:58 +07:00 • committed by GitHub
parent 23172d8b8c
commit d8a110b1a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 23 additions and 33 deletions

View file

@ -5,7 +5,7 @@
"description": "OpenClaw QA lab plugin with private debugger UI and scenario runner",
"type": "module",
"dependencies": {
"@copilotkit/aimock": "1.42.1",
"@copilotkit/aimock": "1.43.0",
"@modelcontextprotocol/sdk": "1.30.0",
"@openclaw/crabline": "0.1.27",
"@openclaw/fs-safe": "0.22.0",

View file

@ -1,11 +1,11 @@
import type { IncomingMessage, ServerResponse } from "node:http";
import * as AIMock from "@copilotkit/aimock";
import {
type Journal,
LLMock,
type ChatCompletionRequest,
type Fixture,
getTextContent,
isChatCompletionBody,
type JournalEntry,
type Mountable,
} from "@copilotkit/aimock";
@ -31,28 +31,17 @@ type AimockToolFacts = Pick<
AimockRequestFacts,
"plannedToolName" | "plannedToolCallId" | "toolOutputCallId"
>;
type AimockChatJournalEntry = Pick<JournalEntry, "response"> & {
body: ChatCompletionRequest;
};
type AimockJournalAdd = (
entry: Omit<JournalEntry, "id" | "timestamp">,
matchedFixture?: Fixture,
) => JournalEntry;
type AimockNamespaceWithChatCompletionBodyGuard = typeof AIMock & {
isChatCompletionBody?: (body: JournalEntry["body"]) => boolean;
};
type AimockRequestObservation =
| { kind: "retained-body"; tools: AimockToolFacts }
| { kind: "retained-body"; body: ChatCompletionRequest; tools: AimockToolFacts }
| { kind: "projected"; projection: AimockRequestProjection };
// SAFETY: AIMock 1.42 declarations omit this 1.43 export; runtime probing keeps the bridge compatible.
const upstreamIsChatCompletionBody = (AIMock as AimockNamespaceWithChatCompletionBodyGuard)
.isChatCompletionBody;
function isChatCompletionBody(body: JournalEntry["body"]): body is ChatCompletionRequest {
return (
upstreamIsChatCompletionBody?.(body) ??
(Array.isArray(body?.messages) && typeof body.model === "string")
);
}
function requestMessages(body: ChatCompletionRequest | null | undefined) {
return Array.isArray(body?.messages) ? body.messages : [];
}
@ -115,7 +104,7 @@ function countImageInputs(value: unknown): number {
return (imageLikeType ? 1 : 0) + nested;
}
function extractToolFacts(entry: Pick<JournalEntry, "response" | "body">): AimockToolFacts {
function extractToolFacts(entry: AimockChatJournalEntry): AimockToolFacts {
const response = entry.response.fixture?.response as
| {
toolCalls?: Array<{ name?: unknown; id?: unknown; callId?: unknown; toolCallId?: unknown }>;
@ -131,7 +120,7 @@ function extractToolFacts(entry: Pick<JournalEntry, "response" | "body">): Aimoc
}
function extractRequestFacts(
body: JournalEntry["body"],
body: ChatCompletionRequest,
tools: AimockToolFacts,
): AimockRequestFacts {
const model = typeof body?.model === "string" ? body.model : "";
@ -212,21 +201,22 @@ function createDebugMount(): Mountable {
// so the debug boundary remains monotonic after retained entries rotate.
journal.add = (entry, matchedFixture?: Fixture) => {
const recorded = addJournalEntry(entry, matchedFixture);
if (!isChatCompletionBody(entry.body)) {
const body = entry.body;
if (!isChatCompletionBody(body)) {
return recorded;
}
const tools = extractToolFacts(entry);
const tools = extractToolFacts({ response: entry.response, body });
// Upstream keeps <=64 KiB bodies intact; only discarded bodies need an
// extra bounded projection. Weak entry ownership follows eviction/reset.
observations.set(
recorded,
recorded.body === entry.body
? { kind: "retained-body", tools }
? { kind: "retained-body", body, tools }
: {
kind: "projected",
projection: boundRequestFacts({
complete: true,
facts: extractRequestFacts(entry.body, tools),
facts: extractRequestFacts(body, tools),
}),
},
);
@ -302,7 +292,7 @@ function createDebugMount(): Mountable {
const plannedToolCallId = plannedToolCallIds.get(index);
let projection: AimockRequestProjection =
observation.kind === "retained-body"
? { complete: true, facts: extractRequestFacts(entry.body, observation.tools) }
? { complete: true, facts: extractRequestFacts(observation.body, observation.tools) }
: observation.projection;
if (plannedToolCallId) {
projection = projection.complete
@ -316,7 +306,7 @@ function createDebugMount(): Mountable {
incomplete.push({ cursor, ...projection });
continue;
}
const body = entry.body ?? {};
const body = observation.kind === "retained-body" ? observation.body : (entry.body ?? {});
snapshots.push({ raw: JSON.stringify(body), body, ...projection.facts });
}
if (incomplete.length > 0) {

View file

@ -2312,7 +2312,7 @@
"@a2ui/lit": "0.11.0",
"@a2ui/web_core": "0.11.0",
"@babel/types": "8.0.6",
"@copilotkit/aimock": "1.42.1",
"@copilotkit/aimock": "1.43.0",
"@lit-labs/signals": "0.3.0",
"@lit/context": "1.1.6",
"@lit/task": "1.0.3",

14
pnpm-lock.yaml generated
View file

@ -433,8 +433,8 @@ importers:
specifier: 8.0.6
version: 8.0.6
'@copilotkit/aimock':
specifier: 1.42.1
version: 1.42.1(vitest@5.0.1)
specifier: 1.43.0
version: 1.43.0(vitest@5.0.1)
'@lit-labs/signals':
specifier: 0.3.0
version: 0.3.0
@ -1985,8 +1985,8 @@ importers:
extensions/qa-lab:
dependencies:
'@copilotkit/aimock':
specifier: 1.42.1
version: 1.42.1(vitest@5.0.1)
specifier: 1.43.0
version: 1.43.0(vitest@5.0.1)
'@modelcontextprotocol/sdk':
specifier: 1.30.0
version: 1.30.0(supports-color@10.2.2)(zod@4.6.5)
@ -3547,8 +3547,8 @@ packages:
'@codemirror/view@6.43.13':
resolution: {integrity: sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==}
'@copilotkit/aimock@1.42.1':
resolution: {integrity: sha512-Kc3a4sP89kDENdRypKdmlynnmmYsn96ZYHCPCRdbFd2kw0qg1XufzEWIemS0YP5b/f7ssuFm4Kt8KbGwlx2WkA==}
'@copilotkit/aimock@1.43.0':
resolution: {integrity: sha512-V8D8cjSMtAR4rHaD2ulp3DR/ZguXQjDNOqwKDNvjb/OJL/KR1I0SDf5xpRCd+TYKjhmf9fM8Xpg3QBKPmV9Kmw==}
engines: {node: '>=20.15.0'}
hasBin: true
peerDependencies:
@ -11309,7 +11309,7 @@ snapshots:
style-mod: 4.1.4
w3c-keyname: 2.2.8
'@copilotkit/aimock@1.42.1(vitest@5.0.1)':
'@copilotkit/aimock@1.43.0(vitest@5.0.1)':
optionalDependencies:
vitest: 5.0.1(patch_hash=90ba2969491e095cc2e92a4d38256dfcf64f85078ec29e1762b9429a00b35901)(@opentelemetry/api@1.9.1)(@types/node@26.6.2)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.3.0(@types/node@26.6.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1))