From d8a110b1a154466dd49acbf5d12ea8da45ec708d Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 1 Oct 2026 20:32:58 +0700 Subject: [PATCH] chore(qa-lab): upgrade AIMock to 1.43.0 (#162705) --- extensions/qa-lab/package.json | 2 +- .../qa-lab/src/providers/aimock/server.ts | 38 +++++++------------ package.json | 2 +- pnpm-lock.yaml | 14 +++---- 4 files changed, 23 insertions(+), 33 deletions(-) diff --git a/extensions/qa-lab/package.json b/extensions/qa-lab/package.json index b805b26e88c0..996c59da0e67 100644 --- a/extensions/qa-lab/package.json +++ b/extensions/qa-lab/package.json @@ -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", diff --git a/extensions/qa-lab/src/providers/aimock/server.ts b/extensions/qa-lab/src/providers/aimock/server.ts index 8574691215e3..cf5de293d862 100644 --- a/extensions/qa-lab/src/providers/aimock/server.ts +++ b/extensions/qa-lab/src/providers/aimock/server.ts @@ -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 & { + body: ChatCompletionRequest; +}; type AimockJournalAdd = ( entry: Omit, 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): 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): 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) { diff --git a/package.json b/package.json index 50bf8bb09ac1..ad24664163b1 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07ac4807a319..cce11e1e3bf5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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))