fix(tests): type cliproxy fallback test harness
Convert the cliproxy fallback matrix test to use typed harness helpers instead of so fallback coverage remains unchanged without violating test constraints. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -14,10 +14,55 @@ import { createEventHandler } from "./event"
|
|||||||
import { createChatMessageHandler } from "./chat-message"
|
import { createChatMessageHandler } from "./chat-message"
|
||||||
import { createModelFallbackHook } from "../hooks/model-fallback/hook"
|
import { createModelFallbackHook } from "../hooks/model-fallback/hook"
|
||||||
import { createRuntimeFallbackHook } from "../hooks/runtime-fallback"
|
import { createRuntimeFallbackHook } from "../hooks/runtime-fallback"
|
||||||
|
import type { RuntimeFallbackPluginInput } from "../hooks/runtime-fallback/types"
|
||||||
import { _resetForTesting } from "../features/claude-code-session-state"
|
import { _resetForTesting } from "../features/claude-code-session-state"
|
||||||
import { _resetForTesting as _resetModelFallbackForTesting } from "../hooks/model-fallback/hook"
|
import { _resetForTesting as _resetModelFallbackForTesting } from "../hooks/model-fallback/hook"
|
||||||
import { SessionCategoryRegistry } from "../shared/session-category-registry"
|
import { SessionCategoryRegistry } from "../shared/session-category-registry"
|
||||||
|
|
||||||
|
type EventHandlerArgs = Parameters<typeof createEventHandler>[0]
|
||||||
|
type ChatMessageHandlerArgs = Parameters<typeof createChatMessageHandler>[0]
|
||||||
|
type HarnessContext = EventHandlerArgs["ctx"] & RuntimeFallbackPluginInput
|
||||||
|
type HarnessEventInput = Parameters<ReturnType<typeof createHarness>["eventHandler"]>[0]
|
||||||
|
|
||||||
|
function asHarnessEventInput(input: unknown): HarnessEventInput {
|
||||||
|
return input as unknown as HarnessEventInput
|
||||||
|
}
|
||||||
|
|
||||||
|
function asHarnessContext(ctx: unknown): HarnessContext {
|
||||||
|
return ctx as unknown as HarnessContext
|
||||||
|
}
|
||||||
|
|
||||||
|
function createEventHandlerManagers(
|
||||||
|
overrides: Record<string, unknown> = {},
|
||||||
|
): EventHandlerArgs["managers"] {
|
||||||
|
return {
|
||||||
|
...({} as EventHandlerArgs["managers"]),
|
||||||
|
tmuxSessionManager: {
|
||||||
|
onSessionCreated: async () => {},
|
||||||
|
onSessionDeleted: async () => {},
|
||||||
|
},
|
||||||
|
...overrides,
|
||||||
|
} as unknown as EventHandlerArgs["managers"]
|
||||||
|
}
|
||||||
|
|
||||||
|
function createEventHandlerHooks(
|
||||||
|
overrides: Record<string, unknown>,
|
||||||
|
): EventHandlerArgs["hooks"] {
|
||||||
|
return {
|
||||||
|
...({} as EventHandlerArgs["hooks"]),
|
||||||
|
...overrides,
|
||||||
|
} as unknown as EventHandlerArgs["hooks"]
|
||||||
|
}
|
||||||
|
|
||||||
|
function createChatMessageHandlerHooks(
|
||||||
|
overrides: Record<string, unknown>,
|
||||||
|
): ChatMessageHandlerArgs["hooks"] {
|
||||||
|
return {
|
||||||
|
...({} as ChatMessageHandlerArgs["hooks"]),
|
||||||
|
...overrides,
|
||||||
|
} as unknown as ChatMessageHandlerArgs["hooks"]
|
||||||
|
}
|
||||||
|
|
||||||
const PRIMARY_MODEL = {
|
const PRIMARY_MODEL = {
|
||||||
providerID: PROVIDER_ID,
|
providerID: PROVIDER_ID,
|
||||||
modelID: "claude-opus-4-6",
|
modelID: "claude-opus-4-6",
|
||||||
@@ -59,7 +104,7 @@ function createPluginConfig(mode: HarnessMode) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
: {}),
|
: {}),
|
||||||
}
|
} as unknown as EventHandlerArgs["pluginConfig"]
|
||||||
}
|
}
|
||||||
|
|
||||||
function createHarness(args: {
|
function createHarness(args: {
|
||||||
@@ -72,7 +117,7 @@ function createHarness(args: {
|
|||||||
const promptAsyncCalls: PromptAsyncCall[] = []
|
const promptAsyncCalls: PromptAsyncCall[] = []
|
||||||
const pluginConfig = createPluginConfig(args.mode)
|
const pluginConfig = createPluginConfig(args.mode)
|
||||||
|
|
||||||
const ctx = {
|
const ctx = asHarnessContext({
|
||||||
directory: "/tmp",
|
directory: "/tmp",
|
||||||
client: {
|
client: {
|
||||||
session: {
|
session: {
|
||||||
@@ -119,7 +164,7 @@ function createHarness(args: {
|
|||||||
showToast: async () => ({}),
|
showToast: async () => ({}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as any
|
})
|
||||||
|
|
||||||
const hooks: Record<string, unknown> = {
|
const hooks: Record<string, unknown> = {
|
||||||
stopContinuationGuard: null,
|
stopContinuationGuard: null,
|
||||||
@@ -145,38 +190,34 @@ function createHarness(args: {
|
|||||||
timeout_seconds: args.sessionTimeoutMs ? 30 : 0,
|
timeout_seconds: args.sessionTimeoutMs ? 30 : 0,
|
||||||
notify_on_fallback: false,
|
notify_on_fallback: false,
|
||||||
},
|
},
|
||||||
pluginConfig,
|
pluginConfig: pluginConfig as unknown as EventHandlerArgs["pluginConfig"],
|
||||||
...(args.sessionTimeoutMs ? { session_timeout_ms: args.sessionTimeoutMs } : {}),
|
...(args.sessionTimeoutMs ? { session_timeout_ms: args.sessionTimeoutMs } : {}),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const eventHandler = createEventHandler({
|
const eventHandler = createEventHandler({
|
||||||
ctx,
|
ctx,
|
||||||
pluginConfig: pluginConfig as any,
|
pluginConfig: pluginConfig as unknown as EventHandlerArgs["pluginConfig"],
|
||||||
firstMessageVariantGate: {
|
firstMessageVariantGate: {
|
||||||
markSessionCreated: () => {},
|
markSessionCreated: () => {},
|
||||||
clear: () => {},
|
clear: () => {},
|
||||||
},
|
},
|
||||||
managers: {
|
managers: createEventHandlerManagers({
|
||||||
tmuxSessionManager: {
|
|
||||||
onSessionCreated: async () => {},
|
|
||||||
onSessionDeleted: async () => {},
|
|
||||||
},
|
|
||||||
skillMcpManager: {
|
skillMcpManager: {
|
||||||
disconnectSession: async () => {},
|
disconnectSession: async () => {},
|
||||||
},
|
},
|
||||||
} as any,
|
}),
|
||||||
hooks: hooks as any,
|
hooks: createEventHandlerHooks(hooks),
|
||||||
})
|
})
|
||||||
|
|
||||||
const chatMessageHandler = createChatMessageHandler({
|
const chatMessageHandler = createChatMessageHandler({
|
||||||
ctx,
|
ctx,
|
||||||
pluginConfig: pluginConfig as any,
|
pluginConfig: pluginConfig as unknown as ChatMessageHandlerArgs["pluginConfig"],
|
||||||
firstMessageVariantGate: {
|
firstMessageVariantGate: {
|
||||||
shouldOverride: () => false,
|
shouldOverride: () => false,
|
||||||
markApplied: () => {},
|
markApplied: () => {},
|
||||||
},
|
},
|
||||||
hooks: hooks as any,
|
hooks: createChatMessageHandlerHooks(hooks),
|
||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -192,7 +233,7 @@ async function primeMainSession(
|
|||||||
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
||||||
sessionID: string,
|
sessionID: string,
|
||||||
) {
|
) {
|
||||||
await eventHandler({
|
await eventHandler(asHarnessEventInput({
|
||||||
event: {
|
event: {
|
||||||
type: "session.created",
|
type: "session.created",
|
||||||
properties: {
|
properties: {
|
||||||
@@ -202,9 +243,9 @@ async function primeMainSession(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
}))
|
||||||
|
|
||||||
await eventHandler({
|
await eventHandler(asHarnessEventInput({
|
||||||
event: {
|
event: {
|
||||||
type: "message.updated",
|
type: "message.updated",
|
||||||
properties: {
|
properties: {
|
||||||
@@ -221,7 +262,7 @@ async function primeMainSession(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendNextMessage(
|
async function sendNextMessage(
|
||||||
@@ -241,7 +282,7 @@ async function triggerSessionError(
|
|||||||
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
||||||
sessionID: string,
|
sessionID: string,
|
||||||
) {
|
) {
|
||||||
await eventHandler({
|
await eventHandler(asHarnessEventInput({
|
||||||
event: {
|
event: {
|
||||||
type: "session.error",
|
type: "session.error",
|
||||||
properties: {
|
properties: {
|
||||||
@@ -256,14 +297,14 @@ async function triggerSessionError(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function triggerSessionStatusRetry(
|
async function triggerSessionStatusRetry(
|
||||||
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
||||||
sessionID: string,
|
sessionID: string,
|
||||||
) {
|
) {
|
||||||
await eventHandler({
|
await eventHandler(asHarnessEventInput({
|
||||||
event: {
|
event: {
|
||||||
type: "session.status",
|
type: "session.status",
|
||||||
properties: {
|
properties: {
|
||||||
@@ -279,14 +320,14 @@ async function triggerSessionStatusRetry(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function triggerAssistantMessageError(
|
async function triggerAssistantMessageError(
|
||||||
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
eventHandler: ReturnType<typeof createHarness>["eventHandler"],
|
||||||
sessionID: string,
|
sessionID: string,
|
||||||
) {
|
) {
|
||||||
await eventHandler({
|
await eventHandler(asHarnessEventInput({
|
||||||
event: {
|
event: {
|
||||||
type: "message.updated",
|
type: "message.updated",
|
||||||
properties: {
|
properties: {
|
||||||
@@ -307,7 +348,7 @@ async function triggerAssistantMessageError(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user